FFmpeg分割、修剪、图片转视频及拼接操作问题排查
FFmpeg分割、修剪、图片转视频及拼接操作问题排查
我刚仔细看了你的FFmpeg脚本和遇到的问题,帮你梳理下问题根源和修正方案~
你的原始PowerShell脚本
ffmpeg -hide_banner ` -loop 1 -t 3 -i image.jpg ` -i input.mp4 ` -filter_complex "` [1:v] split=2 [v1][v2]; [1:a] asplit=2 [a1][a2]; ` [v1] trim=start=10:duration=10, setpts=PTS-STARTPTS [ov1];` [a1] atrim=start=10:duration=10, asetpts=PTS-STARTPTS [oa1];` [v2] trim=start=40:duration=10, setpts=PTS-STARTPTS [ov2];` [a2] atrim=start=40:duration=10, asetpts=PTS-STARTPTS [oa2];` [0][ov1][ov2] concat=n=3:v=1:a=0 [v]; ` [oa1][oa2] concat=n=2:v=0:a=1 [ca]; ` [ca] adelay=3s|3s|3s|3s|3s|3s, asetpts=PTS-STARTPTS [a]; ` "` -map "[v]" -map "[a]" ` -c:v libx264 -preset slow -crf 20 ` -c:a aac -b:a 128k ` output.mp4
你遇到的错误提示
Non-monotonic DTS; previous: 1024, current: 0; changing to 1025. This may result in incorrect timestamps in the output file.
核心问题分析
你的需求逻辑是完全对的:3秒图片视频 + 两段10秒的修剪视频拼接成23秒总时长,音频延迟3秒同步视频。但问题出在两个关键点:
- 图片流缺少帧率指定:你转图片为视频时没指定帧率,FFmpeg会用默认值,和原视频的25fps不匹配,直接导致时间戳混乱,出现DTS警告,甚至拼接时后续视频流被忽略,只输出图片。
- 流参数不统一:concat滤镜对输入流的像素格式、帧率等参数一致性要求极高,图片流和原视频流的隐性参数差异,会导致拼接失效。
修正后的PowerShell脚本
ffmpeg -hide_banner ` # 给图片指定和原视频一致的25fps,从根源对齐时间戳 -framerate 25 -loop 1 -t 3 -i image.jpg ` -i input.mp4 ` -filter_complex "` [1:v] split=2 [v1][v2];` [1:a] asplit=2 [a1][a2];` # 修剪视频并重置时间戳 [v1] trim=start=10:duration=10, setpts=PTS-STARTPTS [ov1];` [a1] atrim=start=10:duration=10, asetpts=PTS-STARTPTS [oa1];` [v2] trim=start=40:duration=10, setpts=PTS-STARTPTS [ov2];` [a2] atrim=start=40:duration=10, asetpts=PTS-STARTPTS [oa2];` # 统一图片流的像素格式,和原视频的yuv420p完全匹配 [0] format=yuv420p [imgv];` # 拼接3段视频流:图片+两段修剪后的视频 [imgv][ov1][ov2] concat=n=3:v=1:a=0, setpts=PTS-STARTPTS [v];` # 拼接音频流并延迟3秒(5.1声道需要6个延迟值,用毫秒更稳定) [oa1][oa2] concat=n=2:v=0:a=1, adelay=3000|3000|3000|3000|3000|3000, asetpts=PTS-STARTPTS [a];` "` -map "[v]" -map "[a]" ` -c:v libx264 -preset slow -crf 20 ` -c:a aac -b:a 128k ` output.mp4
修正点说明
- 强制对齐帧率:添加
-framerate 25让图片转视频的帧率和原视频完全一致,彻底解决时间戳不连续的DTS警告。 - 统一像素格式:用
format=yuv420p确保图片流和原视频流的像素格式匹配,满足concat滤镜的严格要求。 - 简化音频处理:把音频拼接和延迟合并到一个滤镜链,减少中间节点,避免额外的时间戳问题。
- 明确时间单位:把
3s改成3000(毫秒),FFmpeg对毫秒单位的解析更稳定,避免跨环境兼容问题。
预期效果
修正后运行脚本,你会看到:
- 输出视频时长正确为23秒(3秒图片+10秒+10秒)
- 音频会在第3秒开始播放,和后续视频片段完美同步
- 不再出现DTS时间戳警告
备注:内容来源于stack exchange,提问作者Celdor
相关产品推荐
相关产品推荐

