如何使用FFmpeg vstack滤镜保留两个视频的音轨?
FFmpeg vstack垂直拼接视频并保留双音轨解决方案
问题背景
需要用FFmpeg的vstack滤镜将两个视频垂直拼接,同时保留两个视频的音轨。
最初使用的命令:
ffmpeg -i e:\tt140_H.mp4 -i e:\tt140_m.mp4 -vsync 2 -filter_complex vstack e:\tt140+.mp4
仅保留了第一个视频的音轨,第二个视频的音轨丢失。
后续尝试的命令:
ffmpeg -i e:\tt140_H.mp4 -i e:\tt140_m.mp4 -vsync 2 -filter_complex "[0:v][1:v]vstack,amerge[a]" -c:a aac e:\tt140+.mp4
出现错误:
媒体类型不匹配:'Parsed_vstack_0'滤镜输出端口0是视频,而'Parsed_amerge_1'滤镜输入端口0是音频
错误原因
vstack是视频滤镜,输出的是视频流;而amerge是音频滤镜,仅能接收音频流。直接将视频滤镜的输出接入音频滤镜输入,必然导致媒体类型不匹配。
正确命令
需要在滤镜链中分别处理视频和音频流,再将处理后的流映射到输出文件:
ffmpeg -i e:\tt140_H.mp4 -i e:\tt140_m.mp4 -vsync 2 -filter_complex "[0:v][1:v]vstack[v];[0:a][1:a]amerge[a]" -map "[v]" -map "[a]" -c:a aac -ac 2 e:\tt140+.mp4
参数说明
[0:v][1:v]vstack[v]:将第一个输入的视频流(0:v)和第二个输入的视频流(1:v)垂直拼接,输出标记为[v][0:a][1:a]amerge[a]:将第一个输入的音频流(0:a)和第二个输入的音频流(1:a)合并,输出标记为[a]-map "[v]" -map "[a]":明确指定输出文件使用处理后的视频流和音频流-ac 2:强制将合并后的音频转为双声道,避免部分播放器不支持多声道音频
特殊场景处理
如果两个视频时长不一致,想要以较短的视频时长为准结束输出,可添加-shortest参数:
ffmpeg -i e:\tt140_H.mp4 -i e:\tt140_m.mp4 -vsync 2 -filter_complex "[0:v][1:v]vstack[v];[0:a][1:a]amerge[a]" -map "[v]" -map "[a]" -c:a aac -ac 2 -shortest e:\tt140+.mp4
内容的提问来源于stack exchange,提问作者Peter.k
相关产品推荐
相关产品推荐

