使用FFmpeg的HEVC视频剪辑问题

时间:2017-11-03 16:21:38

标签: ios ffmpeg transcoding hevc

我需要使用FFmpeg剪切视频,我无法对原始视频进行转码(因为性能原因)。我遇到了来自iPhone的HEVC视频的问题:切割视频的开头有一些闪光。

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

  

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

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

enter image description here

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

  

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

结果似乎很好:

enter image description here

经过一些谷歌搜索后,结果显示-ss选项在输入之前更快但不太准确,而输入之后和输出之前-ss选项更慢但更准确。

所以我的问题是:

  • 为什么-ss选项的行为不同于输入之前/之后?

  • 有没有办法使用输出搜索ffmpeg选项来避免毛刺?

  • “更多/更不准确”是什么意思?是否意味着寻求可能太大或太小(比我们指定的更大/更小)?这种差异有多大?

1 个答案:

答案 0 :(得分:2)

  

为什么-ss选项的行为不同于输入之前/之后?

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

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

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

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

有没有办法使用output seek ffmpeg选项来避免毛刺?

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

  

'更多/更不准确'意思?是否意味着寻求可能太大或太小(比我们指定的更大/更小)?这种差异有多大?

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

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

因此,如果你有关键帧,例如,秒2,4,6,...,但是你指定第二个5的切割,ffmpeg将只能从第二个6产生输出。但是它将包括来自第二个的输出。秒5-6,虽然时间戳为负,这样他们就不会被解码器显示出来。

这可能是故障发生的地方。解码器不会尊重这些负时间戳,并且仍会显示帧,然后这些帧会出现断开,因为前一个关键帧不是流的一部分。有些解码器可能只播放音频而不显示视频。

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