我正在从一部电影中生成一堆 jpg,并希望将水印应用于所有 jpg。这对所有帧都有效,但对第一帧无效,我不知道为什么。
这是我使用的命令
ffmpeg -vframes 16 -ss 00:00:01 -i a.mov -t 00:00:17 -r 1 -s 1280x720 -vf "movie=watermark.png,scale=1280:720 [wm];[in][wm] overlay=0:0 [out]" '/tmp/output%d.jpg'
这将给我这些文件:
output1.jpg
output2.jpg
output3.jpg
output4.jpg
output5.jpg
output6.jpg
output7.jpg
output8.jpg
output9.jpg
output10.jpg
其中所有,但 output1.jpg 已应用水印。
我不明白为什么 ffmpeg 没有在第一个上应用水印。
我在 Debian 上使用 ffmpeg 1.2
答案1
如果您使用-ss
before -i
,它将搜索关键帧。这很快,但如果在指定时间没有关键帧,则它不是帧精确的,并且您可能会在搜索时间之前得到一些帧,这实际上将具有负时间戳。由于您的水印电影叠加从时间 0 开始,因此具有负时间戳的帧将没有水印。
如果将该-ss
选项移到输入文件之后,速度会比较慢,因为它必须处理并丢弃到该点的所有帧,但它将寻找您指定的精确时间戳,而不会留下指定时间之前的帧。
另一个选择是坚持快速基于关键帧的搜索,然后使用select
过滤器消除任何不需要的帧。例如:
ffmpeg -ss 00:00:01 -i a.mov -t 00:00:17 -r 1 -s 1280x720 -vf "[in] select=gte(t\,0) [sel];movie=watermark.png,scale=1280:720 [wm];[sel][wm] overlay=0:0 [out]" '/tmp/output%d.jpg'