我尝试了很多基于 ffmpeg 的视频剪辑器,它们都存在同样的问题:如果不重新编码,快速剪辑就不准确。我在自己的应用程序中尝试了许多解决方案,但没有一个能达到我想要的效果。所以,我有这个想法来解决这个问题:假设我想生成一个不包含从 t1 到 t2 的片段的新视频。我希望 ffmpeg 这样做,将片段 (t1, t2) 分成 3 个部分:
- 部分 (t1-x, t1+y),这是一个完整的编码块,应该重新编码才能精确复制部分 (t1, y)。
- 部分 (t2-z, t3+w),这是一个完整的编码块,应该重新编码才能精确复制部分 (z, t2)。
- 中间部分(y,z)包含完整的编码块,可以按原样复制。
然后将上述步骤得到的 3 个部分合并起来。请注意,前两个部分应该很小(其中一个或两个都可以是零长度),因此重新编码过程会很快。这将使我们能够以稍慢的操作进行精确的剪切,但仍然比重新编码整个视频快得多。如果我们可以用一个命令进行多次剪切,速度会更快,因此我们遍历帧一次。
那么,我现在可以用 ffmpeg 做到这一点吗?或者,ffmpeg 很快就能支持它吗?我希望有人能应用它,并告诉我们如何应用,或者提及一些 ffmpeg 团队,或者无论如何将它交给他们。
答案1
ffmpeg支持使用参数进行关键帧的剪切ss
,但是其位置非常重要。
关键帧寻找示例:
ffmpeg -ss 30 -i input_vid.mp4 -t 60 -c copy output_clip.mp4
所有帧搜索的示例:
ffmpeg -i input_vid.mp4 -ss 30 -t 60 -c copy output_clip.mp4
这里的参数-copy
很重要,因为它会导致
流复制。在某些情况下,您需要添加参数-noaccurate_seek
。
更多信息请参阅:
大多数视频使用执行时间压缩的编解码器,因此指定的截断点可能依赖于该截断点之前(和之后)的帧才能正确解码。因此,当您使用 ffmpeg 修剪带有该copy
模式的视频时,ffmpeg 必须包含修剪片段之前和之后的所有帧,这些帧是正确解码片段所需的。这可能会导致起始黑场。
要仍然使用复印模式但避免出现黑段,您需要设置开关-avoid_negative_ts
。