FFmpeg添加overlay的enable时间条件后叠加视频变为静态帧问题求助
问题原因与解决方案
1. 叠加视频变静态帧的问题
静态帧问题的核心原因是overlay的输入流默认和主视频时间轴同步推进,在你设置的57秒触发叠加之前,overlay视频已经在后台正常播放完毕,等到57秒启用叠加时,只能取到它的最后一帧显示。
解决方案是给overlay视频的时间轴设置偏移,让它延迟到叠加起始点再开始播放,有两种常用实现方式:
- 方式一:给overlay输入加
-itsoffset参数,直接偏移整个输入流的时间轴
对应命令:ffmpeg -i video.mp4 -itsoffset 57 -i overlay.mov -filter_complex "[0][1]overlay=0:0:enable='gt(t,57)'" output.mp4 - 方式二:用setpts滤镜在滤镜链内调整overlay流的时间戳
对应命令:ffmpeg -i video.mp4 -i overlay.mov -filter_complex "[1]setpts=PTS+57/TB[over];[0][over]overlay=0:0:enable='gt(t,57)'" output.mp4
如果需要叠加到主视频结束就停止,可以给overlay参数加shortest=1,避免主视频结束后overlay还继续播放拉长输出时长。
2. 时长相关内置变量使用
FFmpeg 4.0及以上版本的滤镜表达式支持stream_duration(index)函数获取指定输入流的时长,不需要提前在Java中探测计算。比如你要把overlay视频刚好叠加在主视频的末尾,不需要手动计算57秒的数值,可以直接用函数实现:
对应命令:
ffmpeg -i video.mp4 -i overlay.mov -filter_complex "[1]setpts=PTS+(stream_duration(0)-stream_duration(1))/TB[over];[0][over]overlay=0:0:enable='gt(t,stream_duration(0)-stream_duration(1))'" output.mp4
注:stream_duration的参数是输入流的序号,从0开始计数,对应你输入文件的顺序,stream_duration(0)就是主视频video.mp4的时长,stream_duration(1)是overlay.mov的时长,单位为秒。如果运行时提示函数不存在,请升级FFmpeg到4.0及以上版本即可。
内容的提问来源于stack exchange,提问作者Teddy Tsai
相关产品推荐
相关产品推荐

