使用 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
选项更慢但更准确。
所以我的问题是:
为什么 -ss
选项的行为与输入 before/after 不同?
有没有办法避免使用 output seek ffmpeg 选项出现故障?
'more/less accurate'是什么意思?这是否意味着搜索可能太大或太小(bigger/less 比我们指定的)?这种差异有多大?
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 秒的帧,尽管带有负时间戳,因此它们不会被解码器显示。
这是可能会出现故障的地方。解码器不遵守这些负时间戳,并且仍然显示帧,然后这些帧看起来被破坏了,因为之前的关键帧不是流的一部分。一些解码器可能只播放音频而不显示视频。
在这种情况下,最好对视频进行转码。
我需要使用 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
选项更慢但更准确。
所以我的问题是:
为什么
-ss
选项的行为与输入 before/after 不同?有没有办法避免使用 output seek ffmpeg 选项出现故障?
'more/less accurate'是什么意思?这是否意味着搜索可能太大或太小(bigger/less 比我们指定的)?这种差异有多大?
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 秒的帧,尽管带有负时间戳,因此它们不会被解码器显示。
这是可能会出现故障的地方。解码器不遵守这些负时间戳,并且仍然显示帧,然后这些帧看起来被破坏了,因为之前的关键帧不是流的一部分。一些解码器可能只播放音频而不显示视频。
在这种情况下,最好对视频进行转码。