使用 FFmpeg 的 HEVC 视频切割问题

HEVC video cutting issues using FFmpeg

我需要使用 FFmpeg 剪切视频,但我无法对原始视频进行编码(由于性能原因)运行。我 运行 遇到了来自 IPhone 的 HEVC 视频的问题:剪切视频的开头有问题。

以下是我们在发布之前转换视频的方式:

ffmpeg.exe -i original.MOV -c:v copy -c:a aac -ss 4 -y good.mp4

但是对于 HEVC 视频,在剪切视频的开头有 1 秒的故障:

然后我尝试在输入视频之前添加搜索选项:

ffmpeg.exe -ss 4 -i original.MOV -c:v copy -c:a aac -y good.mp4

结果似乎不错:

经过一些谷歌搜索后发现 -ss 输入之前的选项更快但不太准确,而输入之后和输出之前的 -ss 选项更慢但更准确。

所以我的问题是:

Why -ss option behaves differently then it is put before/after input?

当用作输入选项(-ss … -i …)时,ffmpeg 首先寻找输入流中的指定位置,然后开始解码帧。

在输入 (-i) 之后使用时,ffmpeg 将从头解码流并丢弃给定时间戳之前的所有帧。

请注意,通常在 -i 之前使用 -ss 时会重置时间戳,这意味着:

  • -ss 10 -i … -t 10 生成从 00:00:10、
  • 开始的 10 秒剪辑
  • -i … -ss 10 -to 20也是一样,
  • -ss 10 -i … -to 10 也一样。

Is there a way to avoid glitches using output seek ffmpeg option?

是的。转码时应该没有任何问题,因为流将首先被解码,包括所有需要的先前帧,即使不在搜索范围内也是如此。然后,转码开始,新的时间戳将分配给输出帧。

What does 'more/less accurate' mean? Does it mean that the seek may be too big or to little (bigger/less than we specified)? How big may be this difference?

在 FFmpeg 2.1 之前,这是一个更大的问题,但现在在您转码时寻找输入选项之前是否准确。有关详细信息,请参阅 Seeking wiki entry

准确性问题仅适用于流复制 (-c copy)。在这里,您只能从 keyframe 开始生成有效输出;之前的所有帧都没有用。

因此,如果您在第 2、4、6 秒等处有关键帧,但您指定在第 5 秒剪切,则 ffmpeg 将只能从第 6 秒开始输出。但是它将包括第 5–6 秒的帧,尽管带有负时间戳,因此它们不会被解码器显示。

这是可能会出现故障的地方。解码器不遵守这些负时间戳,并且仍然显示帧,然后这些帧看起来被破坏了,因为之前的关键帧不是流的一部分。一些解码器可能只播放音频而不显示视频。

在这种情况下,最好对视频进行转码。