我有 2 个 ac3 格式的音频文件,并且都只包含一个通道(audio1.ac3 和 audio2.ac3)
另一方面,我有一个包含视频和 2 个音频流的 mkv 文件 (video.mkv)
音频流 1 为 ac3 格式,有 4 个通道(我们称之为 L1 R1 C1 LFE1)
音频流 2 为 ac3 格式,也有 4 个通道。(我们称之为 L2 R2 C2 LFE2)
我想使用之前提到的 ac3 文件替换音频流 1 和音频流 2 中的中央声道。我希望最终输出的是包含以下 2 个音频流的 mkv 文件:
Audio stream 1 -> L1 R1 (audio1.ac3 as center C1) LFE1
Audio stream 2 -> L2 R2 (audio2.ac3 as center C2) LFE2
我想保留 mkv 文件中已经存在的这些音频流名称的元数据标签,并在不造成质量损失的情况下完成所有过程,并从命令行使用 FFmpeg(我在 Windows 上,但也可以从 Ubuntu 上执行此操作)
我找到的所有信息都是关于完全替换流的,而不是在通道级别。也许这是无法做到的事情。
注意:所有音频文件都具有与 mkv 文件中的流相同的采样率、参数。
答案1
使用外部音频文件替换音频中的频道
一种方法是使用加入筛选:
ffmpeg -i input.mkv -i audio1.ac3 -i audio2.ac3 -filter_complex "[0:a:0][1:a]join=inputs=2:channel_layout=5.1:map=0.0-FL|0.1-FR|1.0-FC|0.3-LFE|0.4-BL|0.5-BR[a0];[0:a:1][2:a]join=inputs=2:channel_layout=5.1:map=0.0-FL|0.1-FR|1.0-FC|0.3-LFE|0.4-BL|0.5-BR[a1]" -map 0:v -map "[a0]" -map "[a1]" -c:v copy -c:a flac output.mkv
我对频道排序做了一些假设。您可能需要进行调整。请参阅ffmpeg -layouts
频道布局信息。
保留元数据标签
来自文档(根据-map_metadata
选项):
默认情况下,全局元数据从第一个输入文件复制,每个流和每个章节的元数据与流/章节一起复制。
您没有提供有关文件或元数据的任何详细信息(完整的输出ffmpeg -i input.mkv -i audio1.ac3 -i audio2.ac3
就足够了),所以我假设默认行为应该有效。
无质量损失
过滤需要重新编码,因此示例中使用了无损格式(flac)。