首页 > 解决方案 > ffmpeg,将静态图像添加到过渡的开头和结尾

问题描述

ffmpeg noob 在这里,试图帮助我母亲制作一些房地产演练视频。我想建立一个简单的管道,我可以通过它运行视频并输出如下:

注意事项:

我得到了一个没有过渡的样本:

ffmpeg -loop 1 -t 5 -i title_card.jpg \
    -i walkthrough.MOV \
    -f lavfi -t 0.1 -i anullsrc \
    -filter_complex "[0][2][1:v][1:a][0][2]concat=n=3:v=1:a=1[v][a]" \
    -map "[v]" -map "[a]" \
    -vcodec libx265 \
    -crf 18 \
    -vsync 2 \
    output_without_transitions.mp4

我一直无法让它与过渡一起工作。最新版本见下文:

ffmpeg -loop 1 -t 5 -r 60 -i title_card.jpg \
    -r 60 -i walkthrough.MOV \
    -f lavfi -t 0.1 -i anullsrc \
    -filter_complex \
    "[0][1:v]xfade=transition=fade:duration=0.5:offset=4.5[v01]; \
    [v01][0]xfade=transition=fade:duration=0.5:offset=12.8[v]" \
    -map "[v]" \
    -vcodec libx265 \
    -crf 18 \
    -vsync 2 \
    output_with_transitions.mp4

这一半有效,导致初始标题卡淡入视频,但第二个标题卡从未出现。请注意,我还删除了对音频的任何引用,以使过渡单独工作。

我一直在努力解决这个问题,所以我们将不胜感激:)

标签: ffmpeg

解决方案


假设walkthrough.MOV是 10 秒长:

ffmpeg -loop 1 -t 5 -framerate 30 -i title_card.jpg -i walkthrough.MOV -filter_complex "[0]settb=AVTB,split[begin][end];[1:v]settb=AVTB[main];[begin][main]xfade=transition=fade:duration=1:offset=4[xf];[xf][end]xfade=transition=fade:duration=1:offset=13,format=yuv420p[v];[1:a]adelay=4s:all=1,afade=t=in:start_time=4:duration=1,afade=t=out:start_time=13:duration=1,apad=pad_dur=4[a]" -map "[v]" -map "[a]" -c:v libx265 -crf 18 -movflags +faststart output.mp4
  • 您需要升级您ffmpeg的才能使其正常工作。当前版本(截至本答案的 4.3)太旧了,所以从 git master 分支获取构建。请参阅FFmpeg 下载以获取针对您的操作系统的构建链接,或参阅FFmpeg Wiki:编译指南
  • title_card.jpg帧速率、宽度和高度必须匹配walkthrough.MOV
  • 请参阅使用 ffmpeg 和 xfade 过滤器合并多个视频文件以了解如何计算 xfade 和淡入淡出偏移量。
  • 有关每个过滤器的详细信息,请参阅FFmpeg 过滤器文档
  • 请参阅如何以秒为单位获取视频持续时间?它可以帮助您通过脚本自动执行此操作。
  • apad 应该自动与 一起使用-shortest,但它不与-filter_complex. Sopad_dur用于将额外的静音添加到最后一个标题图像,但whole_dur如果这对您来说更容易,可以使用它来代替。另一种方法是在您的问题中使用 anullsrc,然后仅使用 concat 过滤器连接音频,但我想展示 adelay+apad 作为可行的替代方案。

推荐阅读