如何做3次操作而不渲染3次?

如何做3次操作而不渲染3次?

如何做3次操作而不渲染3次?

我想做三个过滤操作ffmpeg,但无需编码三次:Microsoft Windows [版本 10.0.18362.959]

  1. 视频剪裁

  2. 在图像上添加裁剪的视频

  3. 在结果视频中添加文字

可视化操作:

我想要...(图片)

我当前的代码(可以工作但需要 3 次渲染):

ffmpeg -i kare.mp4 -filter:v "crop=in_w:in_h-472" -c:a copy kirp.mp4 && ffmpeg -y -loop 1 -i 1.jpg -i kirp.mp4 -filter_complex "[0:v]setpts=PTS-STARTPTS[V1]; [1:v]setpts=PTS-STARTPTS, scale=1080:608[V2]; [V1][V2]overlay=shortest=1:x=0:y=600" sablon.mp4  && ffmpeg -i sablon.mp4 -vf "drawtext=fontfile=Be.ttf:text='123asd':fontcolor=white:fontsize=105:x=(w-text_w)/2:y=(h-text_h)/3.8" -codec:a copy output.mp4 && del "kirp.mp4" del "sablon.mp4"

答案1

您是否尝试过将过滤器链接在一起?类似这样的操作应该可行:

ffmpeg -loop 1 -i 1.jpg -i kare.mp4 -filter_complex \
"[0]setpts=PTS-STARTPTS[s0];[1:v]crop=in_w:in_h-472, \
setpts=PTS-STARTPTS,scale=1080:608[s3]; \
[s0][s3]overlay=eof_action=repeat:shortest=1:x=0:y=600, \
drawtext=fontcolor=white:fontfile=Be.ttf:fontsize=105: \
text='(MyText)':x=(w-text_w)/2:y=(h-text_h)/3.8[s5]" \
-map "[s5]" -map 1:a -c:a copy output.mp4

编辑:由于您使用的是 Windows,请尝试以下操作(无需进行任何修改):

ffmpeg -loop 1 -i 1.jpg -i kare.mp4 -filter_complex "[0]setpts=PTS-STARTPTS[s0];[1:v]crop=in_w:in_h-472,setpts=PTS-STARTPTS,scale=1080:608[s3];[s0][s3]overlay=eof_action=repeat:shortest=1:x=0:y=600,drawtext=fontcolor=white:fontfile=Be.ttf:fontsize=105:text='(MyText)':x=(w-text_w)/2:y=(h-text_h)/3.8[s5]" -map "[s5]" -map 1:a -c:a copy output.mp4

分别在 Ubuntu 20.04 和 Windows 10 上使用最新版本的 FFmpeg 进行测试。

答案2

在我看来,第二步你要把裁剪后的视频缩放,然后放到顶部图像。我没有检查您使用的所有其他值是否符合您的要求。无论如何,在这种情况下有效的是:

ffmpeg -i kare.mp4 -loop 1 -i 1.jpg -filter_complex "[0:a]anull[audio]; \
[0:v]crop=in_w:in_h-472[cropped];[cropped]setpts=PTS-STARTPTS[V1]; \
[1:v]setpts=PTS-STARTPTS, scale=1080:608[V2]; \
[V1][V2]overlay=shortest=1:x=0:y=600[overlaid]; \
[overlaid]drawtext=fontfile=Be.ttf:text='(MyText)':fontcolor=white: \
fontsize=105:x=(w-text_w)/2:y=(h-text_h)/3.8[videout]" -map [videout] \
-map [audio] -c:a aac output.mp4 

这里,过滤图中的第一个链只是传递音频而不进行篡改。第二部分对视频进行裁剪(第一个输入流 0)。第三部分设置 PTS(显示时间戳)。第四部分为第二个输入(即图像)设置 PTS 并对其进行缩放。(这是你想要的吗?

第五部分将图像叠加在裁剪后的视频上。如果想将视频叠加在图像上,则必须反转[v1][v2]叠加滤镜之前的顺序。在叠加滤镜中,第二个 pad 始终位于顶部。

第六部分在此合成图上绘制文本。在我的系统上,字体设置有所不同,但基本上这种格式是可行的。

在 bash 4.4 和 ffmpeg 4.4 上测试。

相关内容