我可以在一次操作中混合复制和编码以实现准确而快速的剪切吗?

我可以在一次操作中混合复制和编码以实现准确而快速的剪切吗?

我尝试了很多基于 ffmpeg 的视频剪辑器,它们都存在同样的问题:如果不重新编码,快速剪辑就不准确。我在自己的应用程序中尝试了许多解决方案,但没有一个能达到我想要的效果。所以,我有这个想法来解决这个问题:假设我想生成一个不包含从 t1 到 t2 的片段的新视频。我希望 ffmpeg 这样做,将片段 (t1, t2) 分成 3 个部分:

  1. 部分 (t1-x, t1+y),这是一个完整的编码块,应该重新编码才能精确复制部分 (t1, y)。
  2. 部分 (t2-z, t3+w),这是一个完整的编码块,应该重新编码才能精确复制部分 (z, t2)。
  3. 中间部分(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

相关内容