问题描述
最近在使用ffmpeg命令时遇到了一处和官方文档描述不一致的地方:当使用自动流选择时,对于视频流来说会选择所有输入文件中分辨率最大的那个,对于音频流来说会选择所有输入文件中通道个数最多的那个。 但我运行的命令却并不是如此,最终通过扒源码才发现是官方的描述并不准确。
问题复现
测试命令如下
ffmpeg -i A.mp4 -i B.mp4 output.mp4
其中A.mp4包含两个视频流、两个音频流,如下图所示
B.mp4包含两个视频流、两个音频流,如下图所示
因为我们没有使用-map来手动选择流,所以会使用自动流选择,选择的流如下图所示,我们发现选择的视频流并不是分辨率最大的,音频流也不是通道数最多的
问题分析
因为ffmpeg这个进程就是ffmpeg.c及相关源文件编译出来的,所以可以通过扒代码的方式来进行分析,最终通过代码调试,发现问题出在自动流选择的score计算上,具体就是AVStream的disposition上,A.mp4和B.mp4都包含两个视频流和两个音频流,但第一个音频流和第一个视频流被ffmpeg当作是默认流(也就是具有AV_DISPOSITION_DEFAULT标识),所以默认流的得分要比非默认流的得分大5000000,因此解释了上面“不合理“的地方。
所以,当输入存在多个流时我们尽量使用-map选项去手动选择流,而不要使用自动流选择,比如在这里我们就可以通过以下命令选择分辨率最大的视频流和通道数最多的音频流
ffmpeg -i A.mp4 -i B.mp4 -map 1:1 -map 0:3 out.mp4