使 ffmpeg 处理第一个音频流的方式不同于其他所有音频流

使 ffmpeg 处理第一个音频流的方式不同于其他所有音频流

我正在尝试编写一个命令,以便 ffmpeg 对文件中的第一个音频流执行给定的指令,对任何其他音频流执行不同的指令。例如,在下面的测试用例中,我希望将第一个流复制到输出文件,并将所有其他流转换为单声道。如果我这样写

ffmpeg -i INPUT -map 0 -c copy -map 0:a:0 -c:a:0 copy -map -0:a:0? -c:a libfdk_aac -ac 1 OUTPUT

当命令行中稍后覆盖映射时,第一个音频流将被忽略。但如果我将该流的指令移到其他流的指令之后

ffmpeg -i INPUT -map 0 -c copy -map -0:a:0? -c:a libfdk_aac -ac 1 -map 0:a:0 -c:a:0 copy OUTPUT

它不再被忽视,而是成为最后的文件中的音频流。我知道我已经接近目标了;我只是看不出我做错了什么。

答案1

使用

ffmpeg -i INPUT -map 0 -c copy -c:a libfdk_aac -c:a:0 copy -ac 1 OUTPUT

您只需映射一次流。必须正确设置编解码器选项的顺序。首先设置为复制所有流。然后用编码器覆盖音频设置,然后重置第一个音频以再次复制。


这是适用于采用流说明符的选项的通用逻辑,例如-b:v, -c:a..等

假设您有三条视频流和三条音频流,按第一列的顺序映射。下表显示了按第一行的顺序应用选项时发生的情况:

(stream)    -c copy     -c:a:0 aac      -c:a libfdk_aac     -c:4 mp3
0:v:0       copy        copy            copy                copy
0:v:1       copy        copy            copy                copy
0:v:2       copy        copy            copy                copy
0:a:0       copy        aac             libfdk_aac          libfdk_aac
0:a:1       copy        copy            libfdk_aac          mp3
0:a:2       copy        copy            libfdk_aac          libfdk_aac

相关内容