我需要使用FFmpeg剪切视频,我无法对原始视频进行转码(因为性能原因)。我遇到了来自iPhone的HEVC视频的问题:切割视频的开头有一些闪光。
以下是我们在发布前转换视频的方式:
ffmpeg.exe -i original.MOV -c:v copy -c:aac -ss 4 -y good.mp4
但是对于HEVC视频,在剪切视频的开头有1秒的毛刺:
然后我尝试在输入视频之前设置搜索选项:
ffmpeg.exe -ss 4 -i original.MOV -c:v copy -c:aac -y good.mp4
结果似乎很好:
经过一些谷歌搜索后,结果显示-ss
选项在输入之前更快但不太准确,而输入之后和输出之前-ss
选项更慢但更准确。
所以我的问题是:
为什么-ss
选项的行为不同于输入之前/之后?
有没有办法使用输出搜索ffmpeg选项来避免毛刺?
“更多/更不准确”是什么意思?是否意味着寻求可能太大或太小(比我们指定的更大/更小)?这种差异有多大?
答案 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,虽然时间戳为负,这样他们就不会被解码器显示出来。
这可能是故障发生的地方。解码器不会尊重这些负时间戳,并且仍会显示帧,然后这些帧会出现断开,因为前一个关键帧不是流的一部分。有些解码器可能只播放音频而不显示视频。
在这种情况下,最好对视频进行转码。