我对使用 FFMPEG 非常陌生,我想要实现的是在特定位置和时间应用叠加图形,并剪切出单个输入视频的各个部分。
我已经计算出了叠加图形,因此此代码可以运行:
ffmpeg -i /Users/username/projectdir/static/video.mp4 -I overlay.png -i overlay2.png -filter_complex "[0:v][1:v] overlay=192:108:enable='between(t, 0, 5)'[ov0]; [ov0] overlay=192:108:enable='between(t, 5, 10)'" -pix_fmt yuv420p output_overlayed.mp4
但是当我尝试使用此代码剪切部分时:
ffmpeg -i /Users/username/projectdir/static/video.mp4 -I overlay.png -i overlay2.png -filter_complex "[0:v][1:v] overlay=192:108:enable='between(t, 0, 5)'[ov0]; [ov0] overlay=192:108:enable='between(t, 5, 10)', select='between(t,0,5)+between(t,10,15)', setpts='N/FRAME_RATE/TB'" -pix_fmt yuv420p output_overlayed_trimmed.mp4
似乎剪辑得当,所以原始视频从 0 秒开始播放到 5 秒,然后从 10 秒播放到 15 秒并剪辑。但在视频剪辑之后,视频播放期间屏幕全黑。我似乎无法让它工作,所以它影响了视频的整体时长。
(顺便说一下,传入的值只是示例,例如,我让它在 5 秒内开始覆盖,但也在 5 秒内切断)
我有叠加层应在未修剪的视频上出现的时间戳,因此应该先进行叠加,然后再进行修剪。如果先修剪视频,则叠加层会出现在错误的时间。
目前正在实现此目的的另一种方法是执行第一行代码(仅生成一个带有覆盖的新视频文件),然后单独获取这个新文件并独立执行修剪:
ffmpeg -ss 0 -to 5 -i /Users/username/projectdir/static/output_overlayed.mp4 -ss 15 -to 20 -i /Users/username/projectdir/static/output_overlayed.mp4 -filter_complex "[0][1]concat=n=2:v=1:a=1" output_trimmed.mp4
但这意味着要处理 2 个单独的文件,然后在第二次执行完成后必须删除第一个文件。理想情况下,我会将它们合并为一个不会产生多个文件的命令。
非常感激任何帮助-谢谢!
答案1
假设video.mp4
有一个音频流,结果的长度与音频流的长度匹配。
- 添加用于选择音频流相关部分的过滤器
aselect
:asetpts
[0:a]aselect='between(t,0,5)+between(t,10,15)',asetpts='N/SAMPLE_RATE/TB'
- 因为有两个流,我们可以给视频流临时名称
[v]
,给音频流临时名称[a]
,并应用流映射:-map "[v]" -map "[a]"
。
更新的命令:
ffmpeg -y -i video.mp4 -i overlay.png -i overlay2.png -filter_complex "[0:v][1:v]overlay=192:108:enable='between(t,0,5)'[ov0];[ov0][2:v] overlay=192:108:enable='between(t,5,10)',select='between(t,0,5)+between(t,10,15)',setpts='N/FRAME_RATE/TB'[v]; [0:a]aselect='between(t,0,5)+between(t,10,15)',asetpts='N/SAMPLE_RATE/TB'[a]" -shortest -map "[v]" -map "[a]" -pix_fmt yuv420p output_overlayed_trimmed.mp4
测试:
使用 FFmpeg 构建输入视频和图像:
ffmpeg -y -f lavfi -i testsrc=size=384x216:rate=25 -f lavfi -i sine=frequency=400 -t 30 video.mp4
ffmpeg -y -f lavfi -i mandelbrot=size=192x108 -v:frames 1 overlay.png
ffmpeg -y -f lavfi -i color=blue:size=192x108 -v:frames 1 overlay2.png
使用上述输入执行“更新的命令”。
输出视频的总长度为10 秒。