如何用ffmpeg正确拼接25fps 1920x1080的普通视频与延时摄影视频
确认视频兼容性与正确拼接方法
一、先验证两个视频的兼容性
用ffmpeg自带的ffprobe工具检查核心参数是否完全匹配:
- 检查视频流关键参数:
分别执行以下命令分析两个视频:
重点核对以下字段必须完全一致:ffprobe -v error -show_streams input1.mp4 ffprobe -v error -show_streams input2.mp4codec_name(视频编码,例如h264)width/height(分辨率,需均为1920x1080)r_frame_rate(帧率,必须是25/1)pix_fmt(像素格式,例如yuv420p)
- 确认延时摄影视频的帧完整性:
检查输入2的实际帧数是否符合预期:
用ffprobe -v error -count_frames -show_entries stream=nb_read_frames input2.mp4ffprobe -v error -show_entries format=duration input2.mp4获取视频时长,计算理论帧数:时长×25,如果实际帧数远小于理论值,说明生成延时摄影时就出现了错误,需要重新生成。
二、正确拼接的解决方案
方案1:统一编码后用concat协议拼接(推荐)
如果两个视频参数存在差异,先转码为统一标准再拼接:
- 分别转码两个视频,确保参数一致:
(ffmpeg -i input1.mp4 -c:v libx264 -r 25 -s 1920x1080 -pix_fmt yuv420p -an temp1.mp4 ffmpeg -i input2.mp4 -c:v libx264 -r 25 -s 1920x1080 -pix_fmt yuv420p -an temp2.mp4-an用于移除音频,若要保留输入1的音频,去掉第一个命令中的-an即可) - 创建
filelist.txt文件,内容如下:file 'temp1.mp4' file 'temp2.mp4' - 执行拼接命令:
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
方案2:直接用concat滤镜拼接(参数完全匹配时使用)
如果确认两个视频所有核心参数一致,可直接用滤镜拼接,避免转码损耗:
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v][1:v]concat=n=2:v=1:a=0[v]" -map "[v]" output.mp4
(若要保留音频,将a=0改为a=1,并添加-map "[a]",前提是输入1的音频参数无异常)
内容的提问来源于stack exchange,提问作者tudors
相关产品推荐
相关产品推荐

