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

key*_*ons 5 video ffmpeg

我想以极其精确的起点和终点提取视频片段。不幸的是,我只能看到百分之一秒的准确度。

ffmpeg -i kayak.mp4 -ss 00:00:00 -t 2.86953 kayak_segment.mp4
Run Code Online (Sandbox Code Playgroud)

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

ffprobe -i kayak_segment.mp4 -show_format -v quiet | sed -n 's/duration=//p'
Run Code Online (Sandbox Code Playgroud)

(返回2.891000

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

谢谢!

Gya*_*yan 7

视频和音频流不是连续的而是量化的,因此对于恒定的 25 fps 视频流,持续时间可以采用以下值,0.04 s x N其中 N 是帧数。如果音频编解码器是 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值与视频流类似地量化。