ffmpeg:极其精确地提取视频片段

ffmpeg:极其精确地提取视频片段

我想提取具有极其精确的开始点和结束点的视频片段。不幸的是,我只能看到百分之一秒的精度。

ffmpeg -i kayak.mp4 -ss 00:00:00 -t 2.86953 kayak_segment.mp4

虽然我预计该片段的持续时间为2.86953,但对输出片段的分析显示2.891

ffprobe -i kayak_segment.mp4 -show_format -v quiet | sed -n 's/duration=//p'

(返回2.891000

我如何才能确保提取的视频片段的持续时间尽可能接近指定值?我不关心音频。

谢谢!

答案1

视频和音频流不是连续的而是量化的,因此对于恒定的 25 fps 视频流,持续时间可以取0.04 s x NN 为帧数的值。如果音频编解码器是 AAC @ 48000 采样率,那么每帧有 1024 个样本,音频持续时间将是1024/48000 = 0.021333 s* 的倍数。

由于 AAC 编码方式的原因,音频流开头有一个静音/填充音频帧,其持续时间为,0.021333 s但显示时间为-0.21333。在 中format,该数据包被考虑在内(但不包含在stream持续时间内)。

t用于修剪剪辑时,所有显示时间戳小于的帧都会t被拉出。最后一个视频帧的持续时间不会被修剪,但最后一个音频帧的持续时间可能会被修剪,但这也会被量化。因此,format据我所知,最终的持续时间将是Sum of all durations of packets of the stream featuring the greatest PTS

如果您不关心音频,您可以将其剥离(使用-an),并查看您的t值是否与视频流类似地量化。

相关内容