FFmpeg音频流选择报错求助:无法选中索引为2的音频流
嘿,我一眼就瞅到问题出在哪了!你这是踩了FFmpeg流索引规则的一个小坑😅
先给你拆解核心矛盾:FFmpeg的-map参数有两种索引逻辑,但你搞混了全局流索引和同类型流的局部索引!
先看你贴的输入流信息:
- 全局索引0:视频流(h264)
- 全局索引1:第一个音频流(aac)
- 全局索引2:第二个音频流(mp3)
你命令里写的-map 0:a:2,这里的a:2指的是输入文件0的第3个音频流(局部索引从0开始计数),但你输入里明明只有2个音频流啊!FFmpeg找不到对应流,自然直接报错。
两种正确的修改方式:
方式1:用全局流索引(更直观,不容易出错)
直接指定全局索引的音频流,也就是-map 0:2(因为全局索引2就是你要的那个mp3音频流),不用加a:前缀,彻底避开局部索引的计数陷阱。
方式2:用同类型流的局部索引
如果你偏爱用a:前缀的写法,第二个音频流的局部索引是1(第一个音频流的局部索引是0),所以应该写成-map 0:a:1。
顺带修正你命令里的另一个小错误
你命令里写了-codec:a:2 AAC,这里的a:2也是错的!因为你最终只输出了一个音频流,输出流的局部索引是0,所以应该改成-codec:a AAC或者-codec:a:0 AAC。
另外,原命令里的libx264前面漏了-c:v参数,FFmpeg可能会把它当成无效参数,补上后应该是-c:v libx264。
修正后的完整命令参考:
ffmpeg.exe -y -i "C:\Temp\MultiAudio\Test0V1A2A.mkv" -map 0:v:0 -map 0:2 -map_metadata -1 -metadata title="Test0V1A2A" -sn -dn -f MP4 -preset veryslow -crf 18 -c:v libx264 -profile:v baseline -level 3.0 -maxrate 500k -minrate 450k -bufsize 1000k -vf scale=960:540 -pix_fmt yuv420p -codec:a AAC -b:a 128k "C:\Temp\MultiAudio\Test0V1A2A.MP4" -loglevel error
关于速度骤降的问题
你提到用-map后速度从3x跌到0.5x,大概率是因为之前没指定map时,FFmpeg自动跳过了不需要处理的流,而指定map后,FFmpeg会严格按照你的映射规则重新处理所有选中的流;再加上你用了-preset veryslow(这个预设本身就是质量优先,速度极慢),速度下降是正常的。如果想兼顾速度,可以换成-preset medium或者fast,画质损失微乎其微但速度会快很多。
对了,你也可以再跑一遍ffmpeg -i "C:\Temp\MultiAudio\Test0V1A2A.mkv"确认下流信息,确保索引没看错——不过从你贴的内容看流信息是对的,按上面改应该就能解决问题了!
备注:内容来源于stack exchange,提问作者MACE1

