记一次ffmpeg自动流选择遇到的问题

问题描述

最近在使用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

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值