我想提取具有极其精确的开始点和结束点的视频片段。不幸的是,我只能看到百分之一秒的精度。
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 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
值是否与视频流类似地量化。