我对 FFmpeg 修剪视频的方式非常困惑,所以如果有人能帮助我,我将非常感激。
基本上,我想做的是:我有一个视频序列,我希望它在某一秒停止,将图像冻结几秒钟(如暂停),然后从同一帧再次再现。我可以说我正在处理三个视频:A.mp4(视频序列的第一部分)、B.mp4(冻结图像)和C.mp4(视频序列的第二部分)。此外,我还使用 filter_complex 执行叠加。
从静态图像生成视频的部分不是问题,我主要关心的是找到准确修剪和连接视频的方法。从其他帖子和来源中,我发现 FFmpeg 从那些可以强制关键帧的帧中进行修剪。然而,我得到的结果并不合适,因为我的视频A结束帧与开始帧不同C.
我正在使用的命令如下:
ffmpeg -y -i VideoSequence.mp4 -c:v libx264 -pix_fmt yuv420p \
-force_key_frames "expr: gte(t,n_forced * 15)" -t 30 VideoOut.mp4
[请注意,Filter Complex 内的所有内容都与 Overlay 有关,效果很好]
据我所知,生成的视频应该每 15 秒就有一个关键帧。现在,我想将视频切成两部分(“第 15 秒之前”和“第 15 秒之后”):
ffmpeg -y -ss 00:00:01 -i VideoOut.mp4 -t 14 -c copy A.mp4
ffmpeg -y -ss 00:00:15 -i VideoOut.mp4 -t 5 -c copy C.mp4
如前所述,我希望 A.mp4 的结尾与 C.mp4 的开头“匹配”(以帧精度),但我获得的结果远非完美。
非常感谢您,任何形式的帮助将不胜感激!
假设你的最终目标是我希望它在某一秒停止,将图像冻结几秒钟(如暂停),然后从同一帧再次再现。,当前的方法具有多个视频生成,是不必要的浪费。
以下是使用一个命令执行此操作的方法(假设视频为 25 FPS)。
ffmpeg -i original.mp4 -filter_complex
"[0]split[a][b];
[a]trim=1:15,loop=75:1:349,setpts=N/FRAME_RATE/TB[pre];
[b]trim=15,setpts=N/FRAME_RATE/TB[post];
[0]atrim=1:15,asetpts=N/SR/TB[apre];
[0]atrim=15,asetpts=N/SR/TB[apost];
[pre][apre][post][apost]concat=a=1[v][a]"
-map "[v]" -map "[a]" paused.mp4
以下是过滤图中发生的情况:
首先,视频被分割成两个相同的流。然后第一个流从第 2 秒开始到第 15 秒结束被修剪。在环路滤波器中,1
从(最后一帧)开始的帧#349
循环播放 75 帧。然后时间戳会被规范化,因为修剪或循环过滤器不会这样做。第二个分割流被修剪为从第 16 秒开始,其时间戳重置,并且两个流使用 concat 连接。如果您需要在联合流之上覆盖某些内容,请插入一个overlay
concat后过滤。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)