使用ffmpeg将5.1正确缩混为立体声


27

我有一部电影的5.1音轨,其中左前和右前包含音乐,中间包含对话。在VLC中播放5.1曲目可以将所有内容很好地融合在一起。

我正在尝试使用将5.1音轨转换为立体声ffmpeg -ac 2,但是生成的立体声混音的音量比本地播放5.1音轨的音量弱得多。

添加-af "pan=stereo|c0=FL|c1=FR"会给出正确的音量,但是由于没有包括中央通道,因此没有对话。

因此,解决方案可能是将左/中/右混入立体声,并丢弃后端低音炮声道?(我猜这里...)

因此,问题是:如何以VLC的方式使ffmpeg下混5.1转换为立体声,并最终获得相同的音量?


您确定VLC实际上正在播放其他频道吗?缩混会导致归一化,因此每个输出通道的每个输入之和不会导致过载,因此可以防止削波。这可以使其听起来更安静。
llogan 2014年

基础知识:我的文件是5.1。我的扬声器是立体声的。我不知道VLC会做什么,但是它会从5.1源数据(强劲的音量,包括音乐和对话)为我的立体声扬声器带来出色的最终结果。另一方面,ffmpeg在使用时会产生“低音量”结果-ac 2。所以我在问如何使ffmpeg生成与VLC相同的良好结果。

Answers:


29

我发现Shane提供的答案提供的其他渠道太少,而中心也太多。戴着耳机的电影听起来不平衡,无法进行所有对话并且没有足够的背景音乐/效果。

根据ATSC标准(第91页第7.8节),以下公式用于将5.1缩混为常规立体声(与矩阵相反):

Lo = 1.0 * L + clev * C + slev * Ls ;
Ro = 1.0 * R + clev * C + slev * Rs ;

根据上述文档中的表5.9和5.10,clev和slev应该为.707,假定中心/周围混合水平为0。这些表中提供了其他值,可减少中心混合的量,我找不到有用。

考虑到这一点,以下ffmpeg选项可产生良好的平衡声音并带有可听见的对话。请注意,无需指定音频通道。

-af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR"

平移滤镜文档中关于小于符号的使用说明

如果将通道规范中的“ =”替换为“ <”,则该规范的增益将重新归一化,以使总数为1,从而避免了削波噪声。


5
您在此处链接的ATSC标准已从FFmpeg Wiki上与该主题相关联,因此毫不奇怪的是,此处使用的公式与FFmpeg通过其ac -2开关实现的公式相同。换句话说,使用此过滤器与执行操作之间的唯一区别ac -2是键入更多。
Hashim

@Hashim不仅输入。从客观上讲,对基础有详尽解释的答案要好于“键入此内容以得到答案”。
Sevastyan Savanyuk

18

此后,这个问题的答案变得一团糟,其中许多包含冗余信息,而另一些则完全不准确。此答案是为了简化这些答案中的信息,同时消除其中的问题。

最重要的是,值得牢记的是,格雷戈里的答案(目前是该问题最受好评的答案)与使用-ac 2开关没有什么不同-下文将对此进行更多说明。

将5.1声道音频流缩混为立体声 -ac 2

FFmpeg带有将5.1音轨缩混为立体声的内置功能,这也是FFmpeg自己的文档建议的解决方案:

注意:ffmpeg集成了默认的下混音(和上混音)系统,-ac除非您有非常特定的需求,否则该系统应优先于声像过滤器(该选项)。

所述-ac 2开关通过混合从所述源的6通道流的第一5个信道的比例-左后,右后,前左,前右和前中心-到输出立体声流的前左和前右声道:

在此处输入图片说明

这样做时,使用此选项时,将完全丢弃 LFE通道(5.1中的.1,保留用于低音炮并用于深低频效果)中的音频。

不幸的是,在我的测试-ac 2中,音乐和对话的整体水平与信号源最不同,这使它成为缩混公式,在我测试的所有公式中输出效果最差,尽管您可以对其进行测试并发现它为您提供完全合适的缩混以满足您的需求,在这种情况下,使用任何其他公式对您来说都是过大的。


要对DTS音轨进行缩混-ac 2 而不进行代码转换(即保持其编解码器和扩展名相同):

ffmpeg -i "sourcetrack.dts" -c:a dca -ac 2 "stereotrack.dts"

正如Mephisto在他的回答中指出的那样,如果对话和音乐在彼此之间听起来很平衡,但只是音量不足,则可以在降低流的同时增加音量:

ffmpeg -i "sourcetrack.dts" -c:a dca -ac 2 -vol 425 "stereotrack.dts"

对于-vol开关,源中的100%音量等于整数值256,并且使用比此更大的值将增加音频流的整体音量。但是,请注意,做得太多可能会导致失真或伪影,尤其是在声音较大的部分。

要将音频流缩混为立体声并将其转码为AC3编解码器,例如:

ffmpeg -i "sourcetrack.dts" -c:a ac3 -ac 2 "stereotrack.ac3"

使用自定义混合算法将5.1声道音频流缩混为立体声

如果您想获得更高质量的缩混,或者绝对必须在输出中包含LFE流,则可以使用FFmpeg的音频滤波器开关(-af)使用自定义混音公式对音频进行缩混。

与ATSC公式进行缩混(Gregory的答案)

在发布此答案时,对该问题的最高评价是Gregory的答案,该答案将来自ATSC规范的公式(请参见第7.8.2节“ 向下混入两个通道”)放入FFmpeg音频滤波器。与此主题相关的FFmpeg文档直接将此规范链接至该文档,这表明它很可能与FFmpeg为其-ac 2开关实现的公式相同。如果是这样,那么在Gregory的答案中键入整个公式与使用-ac 2开关没有什么不同,因此浪费时间。

我决定通过使用Gregory的答案-ac 2-af过滤器对相同的输入音频进行重新编码来进行一定的测试(使用的确切命令可以在该答案的脚注中看到)。

然后,我比较了所产生的输出文件的大小,发现它们逐字节的大小相同:

在此处输入图片说明

最后,我在Audacity中打开了两个输出文件,并比较了它们的波形以确认它们是相同的(单击放大):

在此处输入图片说明

因此,看起来非常有说服力,格雷戈里答案中详细说明的ATSC公式与FFmpeg已经实现相同,并且在不做任何不做的事情时使用它完全是多余的-ac 2,并且是一个更加麻烦的命令。

缩混而不丢弃LFE通道(Dave_750的回答)

在答案中包含的几个中,这是唯一一个看起来似乎会将LFE声道混入输出立体声而不是将其完全丢弃的缩混公式之一,因此,确保从源头发出最少声音的缩混公式是丢失。

总体的音量水平要比更高和更饱满-ac 2,但仍然低于下面的Nightmode Dialogue缩混。但是,音乐电平比Nightmode Dialogue向下混音更接近源,并且由于包含LFE音轨,在使用此向下混音公式的同时增加输出的音量可以创建比其他所有听起来更真实的5.1流源我测试过的公式。

如果您有能力,我强烈建议您使用此缩混公式和Nightmode Dialogue缩混对您的音频流进行编码,并仔细比较两者的波形以确定哪个更好。

要使用此公式将5.1音轨缩混为立体声并将其音量提高到425(其中256是原始信号源音量的100%):

ffmpeg -i "sourcetrack.dts" -c dca -vol 425 -af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE" "outputstereo.dts"

与Robert Collier的Nightmode对话进行缩混(Shane Harrelson的回答)

Robert CollierDoom9论坛上创建并由Shane Harrelson在其回答中提供的Nightmode Dialogue公式产生的降混效果远好于-ac 2切换效果-而不是过于安静的对话,它使对话回到了更接近于水平的水平。资源。

从Robert Collier对混合的描述中:

使用eac3to将许多DTS电影轨道从5.1转换为2.0后,我发现默认的eac3to通道映射导致非常安静的对话以及过大的音乐和动作场景。尽管eac3to通道降混系数具有科学依据,但由于对话音量低,在实践中它们通常听起来并不好。此预设适用于那些希望与左右声道音乐进行清晰对话的声音,但仍可听到,但更多是在后台。

如您所见-前中央(对话)现在可以正常使用并保持原始水平-音乐和爆炸声仍然是背景效果,不会使您感到过分强大。此预设解决了您在观看DTS 5.1转换为2.0影片以收听对话时必须不断调大音量旋钮的问题。(特别是在不想唤醒别人但仍然希望能够听到对话的夜晚看电影的人)。

不幸的是,此缩混公式的音乐远低于5.1音源(这可能是设计时考虑到Collier打算创建“夜间模式”混音的),并且由于LFE音轨完全丢失,因此总的输出音频不会声音与Dave_750的公式一样,完全或接近音源,但音量增加了

但是,如果出于某种原因想要避免增加流的总音量,则“夜模式对话”可能是您的最佳选择-尽管我再次强烈建议将您的音频流编码为两者并仔细比较两者的波形。

要在FFmpeg中与Nightmode Dialogue公式进行缩混,请执行以下操作:

ffmpeg -i "sourcetrack.dts" -c dca -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" "stereotrack.dts" 

塔克的答案

该答案只是将Shane Harrelson的答案中的Nightmode Dialogue缩混公式放入将MKV容器中的音频流转换为命令的命令中。尽管此答案中给出的命令在这样的音频流上可以正常工作,但将其改编为独立的音轨会产生错误:

过滤和流复制不能一起使用

这是因为缩混时无法复制音频编解码器-就像FFmpeg对输出流所做的所有其他更改一样,缩混要求重新编码轨道以应用更改。

该命令还包括-ac 2FFmpeg将忽略的冗余开关。


测试命令

为了证明我对此答案进行测试的可靠性,以下是我用于测试每个缩混公式的所有命令。

用于该-ac 2选项的测试命令:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -ac 2 "Audio 1 (-ac 2).wav"

用于格雷戈里答案的测试命令:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR" "Audio 2 (ATSC Algorithm Downmix).wav"

用于Dave_750的答案的测试命令:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -vol 425 -af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE" "Audio 4 (Dave750 Downmix).wav"

Shane Harrelson的答案使用的测试命令:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" "Audio 3 (Nightmode Dialogue Downmix).wav"

1
深刻的见识!感谢您抽出宝贵的时间分享此内容。奇怪的是,-ac 2从一开始我就得到了一个次等的结果,这提示了原始帖子。我将再试一次,如果可能的话,请分享一个5.1摘录,它与内置的缩混效果不令人满意。也很高兴知道您可以不进行转码就进行缩混!

@forthrin请记住,编码和转码是两回事。代码转换从一种编解码器/扩展名转换为另一种,并且编码转换为相同的编解码器/扩展名。您可以不对代码进行缩混并将其他FFmpeg效果应用于流,而无需进行代码转换,但不能不进行编码。该ac -2选项也给了我所有缩混公式中最差的结果,我认为这只是ATSC标准公式的失败。
Hashim

我现在尝试了。似乎可行ffmpeg -i 5.1.mp4 -ac 2 2.mp4,但ffplay -i 5.1.mp4 -ac 2无效。

9

试试这个缩混:

-ac 2 -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" 

正如Robert Collier在《 Doom9》论坛中所建议的那样


2
所有这些选项意味着什么?如果您对它们进行解释,人们将能够使用您的答案来解决不同的问题,而不仅仅是复制粘贴。
David Richerby

2
@DavidRicherby -ac =音频通道(立体声为2),
af

3
试过5.1电影,至少对我来说输出立体声听起来不错。明确的对话,似乎没有其他遗漏。如果具有VLC知识的人可以完全共享那里默认的5.1到2.0缩混的效果,那就太好了。

2
@DavidRicherby:音频过滤器(-af)内的选项是:FL =左前;BL =左后方;FC =前中央;FR =右前;BR =右后方。浮点是减少(<1)或增加(> 1)倍增通道体积的线性因子。FL = FC + 0.30 * FL + 0.30 * BL将左前声道设置为前中声道,再加上前左声道的30%和左后声道的30%。
kronenpj

1
FWIW:与音乐和环境声音相比,这种混合使对话显得太大声。Tarc的答案给出的技术上更正确的搭配对我来说更令人愉悦。因此,我想您可能不得不尝试最适合自己的方法,具体取决于情况。
jlh

3

因此,通过将@Shane Harrelson的问题与@Jordan Harris的另一个问题答案结合在一起- 启用了惰性模式-在这里需要将input_51.mkv(5.1)转换为output_stereo.mkv(立体声):

ffmpeg -i input_51.mkv -c:v copy \
    -ac 2 -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" \
    output_stereo.mkv

-c:v copy部分意味着视频流未被触摸(我猜测,v IDEO Ç ODEC设置正被警察 IED)。没有它,将花费更长的时间。为了完整起见,仅重复上述回答即可,它-ac 2意味着两个音频通道并-af指定一个音频滤波器。

仔细研究一下命令后,我发现它正在设置两个立体声通道的组成方式。在FL(前左声道)被从原始拍摄FC(前方中央)加上0.30*FL(当从左前方30%)加0.30*BL(从背面左30%)等。


这样可以保持中央声道的一致性和可听性吗?
Freedo

2

现在这是一个老问题,但向我指出了正确的方向,并希望分享我的结果:

-af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE"

将左右一半的FC和LFE放进去,两个扬声器的有效音量总计为1。使用.707 *前/后左/右将这些通道降低到一个不错的水平,以使它们不会使中心过压。


1

如果-ac 2选项为您提供均衡的缩混效果,其中音乐和语音听起来都没有比其他组件多太多,您只需要通过以下方法提高音量即可:

-vol 512

在示例中,我使用了512,这会使声音增大两倍。规则是256等于100%

请勿将其设置得过高,并确保检查电影中那些带有爆炸或高声噪点的部分的结果。使用太高的值很容易引起失真。


1

-ac 2

使用浮点编解码器-> pcm_f32le,aac,降混中的通道数量保持不变

使用整数编码解码器-> pcm_s16le,libfdk_aac时,缩混的音量(5.1至2.0,不带LFE)减少了1 / 2.5 = -7.96 dB

电影的声音指向一个方向,并且所有声道都没有最大声压。因此,降低缩混音量是错误的,小幅度压缩是正确的方法。这就是杜比所做的。


0

在阅读了整个页面并进行了一些实验之后,我想到了一个名为“ down_mix”的脚本:

#!/bin/bash -x

FL="0.5*FC + 0.707*FL + 0.707*BL + 0.5*LFE"
FR="0.5*FC + 0.707*FR + 0.707*BR + 0.5*LFE"
AUDIO_FMT="libopus"
CONTAINER="mkv"

ffmpeg -i "$1" -c:v copy -c:s copy \
    -c:a $AUDIO_FMT \
    -af "pan=stereo|FL=$FL|FR=$FR" \
    "${1%.*}"_dm.$CONTAINER

    # how to test a snippet of movie
    # -ss 41:07.0 -t 4 \

根据您的喜好调整上面的变量。我没有低音量的问题,因此可以忽略不计,但可以轻松添加。


0

ffmpeg过滤器“ -ac 2”只要您的目标是pcm_s16le编码的就可以正常工作。当以wav格式编码为pcm_f32le时,音量增加9dB以上。因此:在这种情况下,请勿使用“ -ac 2”过滤器。


为什么音量增加?您从哪里学到的?
凌晨

不知道为什么。但是我是一个非常频繁的ffmpeg用户(自己编译)。只需获取任何5.1(side)源,然后两次都使用“ -ac 2”将其转换为pcm_s16le und也转换为pcm_f32le wav文件。比较两个wav文件的峰值音量,您将看到(听到):
Frank-Michael Fischer

使用ffmpeg版本N-93636-g6829c3c会发生这种情况
Frank-Michael Fischer,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.