Image processing 使用ffmpeg在视频上叠加alpha图像
我有以下ffmpeg cli命令,它不会产生文档中描述的效果。这可能是一个bug,或者我的命令有问题Image processing 使用ffmpeg在视频上叠加alpha图像,image-processing,ffmpeg,overlay,libav,Image Processing,Ffmpeg,Overlay,Libav,我有以下ffmpeg cli命令,它不会产生文档中描述的效果。这可能是一个bug,或者我的命令有问题 ffmpeg \ -y \ -i small.mp4 \ -i monkey/monkey_%04d.png \ -filter_complex "[0:v][1:v]overlay=enable='between(t,1,5)'[out1]" \ -map '[out1]' \ output.mp4 我希望它在1秒到5秒之间将#1流覆盖在#0之
ffmpeg \
-y \
-i small.mp4 \
-i monkey/monkey_%04d.png \
-filter_complex "[0:v][1:v]overlay=enable='between(t,1,5)'[out1]" \
-map '[out1]' \
output.mp4
我希望它在1秒到5秒之间将#1流覆盖在#0之上
您可以从以下链接下载测试tarball:
- ffmpeg-3.0.2-64位静态(在线提供)
- FFmpeg是一种基于时间的处理器,即它通过时间戳对齐数据包,因此您必须将图像序列的开始与覆盖的开始对齐
ffmpeg \
-y \
-i small.mp4 \
-i monkey/monkey_%04d.png \
-filter_complex "[1:v]setpts=PTS-STARTPTS+(1/TB)[1v]; \
[0:v][1v]overlay=enable='between(t,1,5)'[out1]" \
-map '[out1]' \
output.mp4
FFmpeg是一种基于时间的处理器,即它通过时间戳对齐数据包,因此您必须将图像序列的开始与覆盖的开始对齐
ffmpeg \
-y \
-i small.mp4 \
-i monkey/monkey_%04d.png \
-filter_complex "[1:v]setpts=PTS-STARTPTS+(1/TB)[1v]; \
[0:v][1v]overlay=enable='between(t,1,5)'[out1]" \
-map '[out1]' \
output.mp4
图像序列为21帧,ffmpeg输入的帧速率为25,图像流在覆盖开始之前结束。图像应该以多快的速度运行,它们应该循环?这是一个测试用例,因此它们不必循环,如果在启用选项中指定的时间之前完成,则可以。无论如何,输出视频没有任何叠加序列,这是我目前关心的。您的图像序列为21帧,ffmpeg输入的帧率为25,图像流在叠加开始之前结束。图像应该以多快的速度运行,它们应该循环?这是一个测试用例,因此它们不必循环,如果在启用选项中指定的时间之前完成,则可以。无论如何,输出的视频没有任何叠加序列,这是我目前关心的。哇,谢谢。你能详细说明一下你用于进一步澄清的过滤器吗?当然可以。setpts生成新的时间戳。表达式表示获取当前相对时间戳
PTS-STARTPTS
,并向其添加1秒TB
是时基单位,即滴答间隔,它是视频流的最小时间测量单位,因此3/TB
将表示3秒的间隔。哦,是否可以指定精确的帧数而不是秒作为时间戳(或至少毫秒精度)?因为我有帧编号来覆盖图像序列,而不是秒(尽管我可以很容易地将它们转换为毫秒,如果必要的话)。实际上,帧是可能的PTS-STARTPTS+(3/TB)+(11/FRAME_RATE*TB)
对于3s的延迟,11fNo,n与帧索引一起工作,因此(n,30,40)介于过滤器处理的第30帧和第40帧之间。哇,谢谢。你能详细说明一下你用于进一步澄清的过滤器吗?当然可以。setpts生成新的时间戳。表达式表示获取当前相对时间戳PTS-STARTPTS
,并向其添加1秒TB
是时基单位,即滴答间隔,它是视频流的最小时间测量单位,因此3/TB
将表示3秒的间隔。哦,是否可以指定精确的帧数而不是秒作为时间戳(或至少毫秒精度)?因为我有帧编号来覆盖图像序列,而不是秒(尽管我可以很容易地将它们转换为毫秒,如果必要的话)。实际上,帧是可能的PTS-STARTPTS+(3/TB)+(11/FRAME_RATE*TB)
对于3s的延迟,11fNo,n与帧索引一起工作,因此(n,30,40)介于过滤器处理的第30帧和第40帧之间。