使用FFmpeg调整MKV流顺序并新增DTS转AAC音频流
正确命令及原理说明
原命令问题分析
-map 0会直接导入输入的全部5条流,但你需要新增一条转码后的AAC流,必须额外映射一次输入的3号流才能生成新流,仅修改编码参数无法新增流。- 你重复设置了
-c:3 aac和-c:3 copy,FFmpeg会以最后一次设置为准,导致原3号流仍被直接复制,没有生成新的AAC版本,最终输出还是5条流。 -map 0会按输入流的默认顺序输出,完全不符合你指定的流排序要求。
正确命令
ffmpeg \ -i input.mkv \ -map 0:0 \ # 保留原视频流(第0号) -map 0:3 \ # 映射原3号DTS流,用于转码成AAC -map 0:3 \ # 保留原3号DTS流 -map 0:4 \ # 保留原4号AAC流 -map 0:1 \ # 保留原1号DTS流 -map 0:2 \ # 保留原2号AC3流 -c:0 copy \ # 视频流直接复制 -c:1 aac -vbr 3 \ # 对第1条输出流(第二个-map的0:3)转码为AAC,VBR级别3 -c:2 copy \ # 第2条输出流(原3号DTS)直接复制 -c:3 copy \ # 第3条输出流(原4号AAC)直接复制 -c:4 copy \ # 第4条输出流(原1号DTS)直接复制 -c:5 copy \ # 第5条输出流(原2号AC3)直接复制 output.mkv
原理说明
- 流映射顺序决定输出顺序:
每个-map参数对应输出文件中的一条流,输出顺序完全和你写的-map顺序一致。这里的6个-map正好匹配你要的顺序:原视频、3号的AAC副本、原3号、原4号、原1号、原2号。 - 编码参数对应输出流索引:
-c:N中的N是输出流的索引(从0开始),不是输入流的索引。所以:-c:0 copy对应第一个-map的视频流,直接复制不转码;-c:1 aac -vbr 3对应第二个-map的流,把它转成AAC,用VBR级别3平衡音质和体积;- 后面的
-c:2到-c:5都是直接复制对应的输出流,保留原有编码格式。
- 避免参数覆盖:
每条输出流的编码参数单独设置,不会出现重复设置覆盖的问题,确保新增的AAC流被正确生成,同时所有原流都被保留。
内容的提问来源于stack exchange,提问作者SU3
相关产品推荐
相关产品推荐

