ffmpeg - 视频部分的无缝交叉淡入淡出循环

Posted

技术标签:

【中文标题】ffmpeg - 视频部分的无缝交叉淡入淡出循环【英文标题】:ffmpeg - seamless crossfade loop for the part of video 【发布时间】:2021-01-13 18:22:52 【问题描述】:

我需要对带有前 X 帧的视频的最后 X 帧应用交叉淡入淡出,以便获得无缝循环,但将其用于视频的必要部分。

Here's the answer for looping the entire video.

目前我拥有的: (整个视频时长 = 25。剪切(结果)部分 = 15 秒(从 5 秒到 20 秒)。过渡 = 1 秒。)

ffmpeg -i input.mp4 -ss 5 -to 20 -filter_complex
    "[0]split[body][pre];
     [pre]trim=duration=1,format=yuva420p,fade=d=1:alpha=1,setpts=PTS+( (15+(5-1)) /TB)[jt];
     [body]trim=1,setpts=PTS-STARTPTS[main];
     [main][jt]overlay"  -c:v libx264 -preset veryslow -b:v 2500K output.mp4
 

在这种情况下,一切正常,但在生成的视频结束时,会叠加原始视频中的一段,从 0 到 1 秒开始,而不是从原始视频的 4 到 5 秒开始,因为它应该是。

我阅读了官方的 ffmpeg 文档,尝试通过更改“setpts”对“trim/fade”的“start/end”参数进行一些操作,但我总是遇到另一批错误。

【问题讨论】:

ssto 作为输出选项会影响过滤后的输出。将它们放在输入之前,应更正您的第一个 setpts 以考虑第二个修剪段的 setpts。 【参考方案1】:

花了更多时间后,我决定从更容易理解(更简单的逻辑)的东西开始。我只是删除-ss/-to 并修改-filter_complex,将原始视频分成3 个流,从中剪下相应的部分。我使用我的问题中的方法将最后两个相同长度的流叠加在一起。之后,我以正确的顺序重新组合它们。

(为清楚起见,我将变量用越来越少的符号括起来。)

-filter_complex "[0]split=3[var1][var2][var3];
[var1]trim= <cut_start> : (<cut_start> + <duration> - <fade_time>),setpts=PTS-STARTPTS[v0];
[var2]trim= (<cut_start> + <duration> - <fade_time>) : (<cut_start> + <duration>),setpts=PTS-STARTPTS[v1];
[var3]trim= (<cut_start> - <fade_time>) : <cut_start> ,format=yuva420p,fade=start_time= (<cut_start> - <fade_time>) :duration= <fade_time> :alpha=1,setpts=PTS-STARTPTS[v2];
[v1][v2]overlay[v3];
[v0][v3]concat=n=2:v=1:a=0[out]" -map "[out]"

【讨论】:

以上是关于ffmpeg - 视频部分的无缝交叉淡入淡出循环的主要内容,如果未能解决你的问题,请参考以下文章

使用 FFMPEG 高效连接和交叉淡化 .ts 文件

Audiokit 交叉淡入淡出声音循环

在循环中更改 div 元素的背景颜色交叉淡入淡出

AVMutableVideoComposition 中的交叉淡入淡出

looper.js 插件 - 交叉淡入淡出动画之间不可见的图像

如何创建交叉淡入淡出,以便我可以使用 javascript 调用 css 中的关键帧?