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

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

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

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

添加后-af "pan=stereo|c0=FL|c1=FR"会给出正确的音量,但是由于未包含中央声道,因此不会出现对话。

因此解决方案可能是将左/中/右混合成立体声,并扔掉后端低音炮通道?(我猜是这样的......)

所以问题是:我如何以与 VLC 相同的方式使 ffmpeg 将 5.1 混音为立体声,并在最终结果中获得相同的音量?

答案1

这个问题的答案现在变得有点混乱,很多答案包含冗余信息,还有一些答案完全不准确。这个答案试图精简这些答案中的信息,同时消除其中的问题。

最重要的是,值得记住的是,格雷戈里的回答(目前是该问题得票最高的答案)与使用开关没有什么不同-ac 2- 更多信息请参见下文。


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

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

注意:ffmpeg 集成了默认的下混(和上混)系统,除非您有非常特殊的需求,否则应该优先使用(选项-ac)平移滤镜。

切换-ac 2器的工作原理是将源的 6 声道流的前 5 个声道(后左、后右、前左、前右和前中)的比例混合到输出立体声流的前左和前右声道中:

在此处输入图片描述

执行此操作时,LFE 声道(.1在 5.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 的回答)

截至发布此答案时,该问题得票最高的答案是格雷戈里的,这使得公式从ATSC 规范(见第 7.8.2 节,混音至两个声道) 转换为 FFmpeg 音频过滤器。此规范本身直接链接到请参阅 FFmpeg 文档中有关此主题的内容,这表明它很可能与 FFmpeg 已经为其-ac 2开关实现的公式相同。如果这是真的,那么在 Gregory 的回答中输入整个公式与使用开关没有什么不同-ac 2,因此是浪费时间。

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

然后,我比较了生成的输出文件的大小,发现它们每个字节的大小都是相同的:

在此处输入图片描述

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

在此处输入图片描述

因此,Gregory 的回答中详述的 ATSC 公式似乎相当有说服力,即FFmpeg 已经实现了同一个,并且当它不执行任何操作时使用它是完全多余的-ac 2,并且是一个更为麻烦的命令。

不丢弃 LFE 通道的情况下进行下混 (Dave_750 的答案)

在答案中包含的几个答案中,这是唯一一个将 LFE 通道混合到输出立体声中而不是完全丢弃它的混音公式,因此,可确保源声音丢失最少。

总体音量比 更高、更饱满-ac 2,但仍低于下面的夜间模式对话混音。然而,音乐音量比夜间模式对话混音更接近源,并且由于包含 LFE 音轨,在使用此混音公式时增加输出音量可以创建比我测试的所有其他公式更接近 5.1 源的输出流。

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

使用此公式将 5.1 音轨混音为立体声将其音量增加到 425(其中 256 是原始源音量的 100%):

ffmpeg -i "sourcetrack.dts" -c dca -vol 425 -af "pan=stereo|c0=0.5*c2+0.707*c0+0.707*c4+0.5*c3|c1=0.5*c2+0.707*c1+0.707*c5+0.5*c3" "outputstereo.dts"

使用 Robert Collier 的夜间模式对话进行混音(Shane Harrelson 的答案)

夜间模式对话公式由罗伯特·科利尔毁灭战士9论坛中引用并由 Shane Harrelson 在他的回答中引用,产生了比切换更好的混音效果-ac 2- 它不会产生过于安静的对话,而是将它们带回到更接近源头的水平。

来自罗伯特·科利尔(Robert Collier)对该混合物的描述:

在使用 eac3to 将许多 DTS 电影音轨从 5.1 转换为 2.0 后,我发现默认的 eac3to 声道映射会导致对话非常安静,音乐和动作场景过于响亮。尽管 eac3to 声道下混系数有科学依据,但由于对话音量低,它们在实践中听起来往往不太好。此预设适用于那些希望对话清晰,同时左右声道音乐仍可听见但更多是在背景中的人。

如您所见 - 前中置(对话)现在正确进入并保持在原始水平 - 而音乐和爆炸仍然是背景效果,不会压倒您。此预设解决了您在观看 DTS 5.1 转换为 2.0 的电影时必须不断摆弄音量旋钮才能听到对话的问题。(特别是在晚上看电影时,您不想吵醒别人,但仍然希望能够听到对话)。

不幸的是,这种混音方案的音乐比 5.1 源中的音乐低得多(考虑到 Collier 想要创建“夜间模式”混音的意图,这可能是设计使然),并且由于完全丢失了 LFE 音轨,整体输出音频听起来不像 Dave_750 的方案那样饱满或接近源音量增大

但是,如果出于某种原因您想要避免提高流的整体音量,那么夜间模式对话可能是您的最佳选择 - 不过,我再次强烈建议您将音频流编码为两者并仔细比较两者的波形。

要使用 FFmpeg 中的夜间模式对话公式进行下混:

ffmpeg -i "sourcetrack.dts" -c dca -af "pan=stereo|c0=c2+0.30*c0+0.30*c4|c1=c2+0.30*c1+0.30*c5" "stereotrack.dts" 

Tarc 的回答

此答案只是将 Shane Harrelson 答案中的夜间模式对话混音公式放入命令中,以转换 MKV 容器中的音频流。虽然此答案中给出的命令在这样的音频流上可以正常工作,但将其调整为独立音轨会出现错误:

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

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

该命令还包含一个-ac 2FFmpeg 会忽略的冗余开关。


测试命令

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

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

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

Gregory 的回答使用的测试命令:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -af "pan=stereo|c0 < 1.0*c0 + 0.707*c2 + 0.707*c4|c1 < 1.0*c1 + 0.707*c2 + 0.707*c5" "Audio 2 (ATSC Algorithm Downmix).wav"

Dave_750 的回答使用的测试命令:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -vol 425 -af "pan=stereo|c0=0.5*c2+0.707*c0+0.707*c4+0.5*c3|c1=0.5*c2+0.707*c1+0.707*c5+0.5*c3" "Audio 4 (Dave750 Downmix).wav"

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

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -af "pan=stereo|c0=c2+0.30*c0+0.30*c4|c1=c2+0.30*c1+0.30*c5" "Audio 3 (Nightmode Dialogue Downmix).wav"

答案2

我发现Shane 给出的答案提供的其他声道太少,而中心声道太多。用耳机看电影听起来不平衡,全是对话,背景音乐/效果不够。

根据ATSC 标准(第 7.8 节,第 91 页),以下公式用于将 5.1 下混为传统立体声(而不是矩阵):

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

根据上述文档中的表 5.9 和 5.10,假设中心/环绕混合水平为 0,clev 和 slev 应该是 .707。这些表中提供了其他值,这些值减少了中心混合的量,我认为这没什么用。

考虑到这一点,以下 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,从而避免削波噪声。

答案3

尝试一下这种混音:

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

作为由 Robert Collier 推荐在 Doom9 论坛中。

答案4

因此,通过结合@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部分意味着视频流没有被触及(我猜理念Codec 设置正在警察ied)。没有它,将花费更长的时间。为了完整起见,重复上面的答案,-ac 2意味着两个音频通道并-af指定一个音频过滤器。

在稍微研究了命令之后,我发现它设置了两个立体声通道的组成方式;FL(前左通道)取自原始FC(前中)加上0.30*FL(左前 30%)加上0.30*BL(左后 30%)等等。

相关内容