ffmpeg - 视频部分的无缝淡入淡出循环
ffmpeg - seamless crossfade loop for the part of video
我需要对视频的最后 X 帧和前 X 帧应用交叉淡入淡出以获得无缝循环,但将其用于视频的必要部分。
目前我有:
(整个视频持续时间 = 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 文档,尝试对“trim/fade”的“start/end”参数进行一些操作,同时更改“setpts”,但我总是遇到另一批错误。
在花了更多时间之后,我决定从更容易理解(更简单的逻辑)的东西开始。我只是删除 -ss
/-to
并通过将原始视频拆分为 3 个流来修改 -filter_complex
,然后从中剪切出相应的部分。我使用我的问题中的方法将最后 2 个相同长度的流相互叠加。之后,我按照正确的顺序重新组合了它们。
(为了清楚起见,我用 more 和 less 符号括起了变量。)
-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]"
我需要对视频的最后 X 帧和前 X 帧应用交叉淡入淡出以获得无缝循环,但将其用于视频的必要部分。
目前我有: (整个视频持续时间 = 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 文档,尝试对“trim/fade”的“start/end”参数进行一些操作,同时更改“setpts”,但我总是遇到另一批错误。
在花了更多时间之后,我决定从更容易理解(更简单的逻辑)的东西开始。我只是删除 -ss
/-to
并通过将原始视频拆分为 3 个流来修改 -filter_complex
,然后从中剪切出相应的部分。我使用我的问题中的方法将最后 2 个相同长度的流相互叠加。之后,我按照正确的顺序重新组合了它们。
(为了清楚起见,我用 more 和 less 符号括起了变量。)
-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]"