在 ffmpeg 中进行精确剪切时添加覆盖

在 ffmpeg 中进行精确剪切时添加覆盖

我有很长的视频文件,我想根据精确的时间戳剪切它们,还需要添加水印。在我需要添加水印之前,我使用过这个命令,效果很好:

ffmpeg -ss 00:00:20.480 -i "INPUT.mp4" -ss 00:00:10.000 -t 00:11:39.960 -c:a copy -c:v libx264 -filter:v "scale=1280:-1" -preset slow -crf 25 "OUTPUT.mp4"

但现在我需要添加水印。我尝试使用覆盖过滤器(使用第二个输入文件)。我使用 apng 文件格式来实现透明度:

ffmpeg -ss 00:01:00.680 -i "INPUT.mp4" -ss 00:00:10.000 -t 00:11:39.759 -i overlay.apng -c:a copy -c:v libx264 -filter_complex "crop=in_w-8:in_h-8,overlay,scale=1280:-1" -preset slow -crf 25 "OUTPUT.mp4"

不幸的是,在这种情况下,ffmpeg 会忽略第二个 -ss 开关。没有此开关,就无法进行精确剪切。即使我为第一个 -ss 开关提供了正确的时间戳,在播放视频文件的前几秒时也会出现一些帧冻结的情况。

我通过链接两个 ffmpeg 进程找到了一些不太好的解决方案,如下所示:

ffmpeg -ss 00:00:15.640 -i "INPUT.mp4" -ss 00:00:10.000 -t 00:11:39.800 -c:a copy -c:v huffyuv -f matroska - | ffmpeg -i pipe:0 -i overlay.apng -filter_complex "crop=in_w-8:in_h-8,overlay=y=main_h-overlay_h:x=0,scale=1280:-1" -c:a copy -c:v libx264 -preset slow -crf 25 "OUTPUT.mp4"

这种情况下整个编码性能下降了30%。

我的目标是在单个命令中完成剪切和添加水印。请帮忙。

答案1

选项顺序很重要。请参阅https://ffmpeg.org/ffmpeg.html#Description

使用

ffmpeg -ss 00:01:00.680 -i "INPUT.mp4" -i overlay.apng -ss 00:00:10.000 -t 00:11:39.759
       -filter_complex "[0]crop=in_w-8:in_h-8[a];[a][1]overlay,scale=1280:-1"
       -c:a copy -c:v libx264 -preset slow -crf 25 "OUTPUT.mp4"

不清楚您要将裁剪应用到什么地方。我假设这是第一个输入,因为这是 ffmpeg 目前处理您当前命令的方式。如果不是,请将其提供[1]给裁剪和[0][a]叠加层。

相关内容