我正在尝试将多个视频合并起来并通过中间加入淡入淡出效果。
我知道我可以简单地用所需的淡入淡出效果重新编码每个视频,然后将它们连接起来。看起来就像这样:
ffmpeg -i video1.mp4 -y -vf fade=in:st=0:d=5,fade=out:st=273.72:d=5 -af afade=in:st=0:d=5,afade=out:st=273.72:d=5 out.mp4
但这当然需要重新编码整个视频。
我的想法是为每个视频创建一个淡入淡出片段,时长为 5 秒,然后删除整个视频开头和结尾的 5 秒,对每个视频重复此操作,然后按顺序合并它们(视频 1、视频 1-淡出、视频 2-淡入、视频 2、视频 2-淡出,...)。这样,我只需要重新编码淡入/淡出,就可以按原样重新使用大部分原始视频。
这基本上可行,但视频与淡入淡出之间的切换并不清晰。可能是由于关键帧或之后不同编码视频的串联。
有谁做过类似的事情或者能够帮助实现这一点吗?
编辑1:
好的,我有点搞定了。关键之一是只从关键帧到关键帧进行裁剪。我通过使用 ffprobe 来获取最近的关键帧来实现这一点,因此例如fprobe -read_intervals 10.8%+10 -select_streams v -skip_frame nokey -show_frames -show_entries frame=pkt_pts_time -of csv=print_section=0 <video>
返回从 10.8 秒到 20.8 秒的关键帧列表,然后我可以将第一个结果用作我的关键帧。
现在更有趣的事情来了:
如果我现在使用拆分-ss
前 -i
它仍然很乱除非我从所有关键帧时间中减去一个值(第一帧的 PTS?avidemux 在第一帧显示的值,在我的情况下是 0.080 秒)。然后它就可以正常工作并且仍然很快。但这个值正确吗?没有 avidemux 我如何获得它?
另一种方法是使用-ss
后 -i
然后它就可以工作了,无需在时间戳上添加或减去任何东西,但速度当然会更慢(根据https://trac.ffmpeg.org/wiki/Seeking)。
因此,我现在被困在一个看似正确的慢速变体或一个带有我无法解释的神奇数字的快速变体中(暂时)。