所以我有一个恒定的59.94 fps (i.e. 60000/1001)
视频,当我尝试提取一秒时:
ffmpeg -y -i input60fps.avi -ss 0 -t 1 -c:v huffyuv -an output60fps.avi
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 ./output60fps.avi
它返回1.001秒,我现在理解这是合适的,因为它是视频的最短帧时间(60000/1001 seconds)
的倍数。
在以前从29.97 fps来源转换的59.94 fps视频上重复此实验,我预计会有类似的结果,但我发现事实并非如此:
ffmpeg -i input30fps.avi -vcodec huffyuv -r 60000/1001 -an output60fps.avi
ffmpeg -i ./output60fps.avi -ss 0 -t 1 -c:v huffyuv -an test.avi
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 ./test.avi
这实际上导致0.984317秒。
为什么这种行为有所不同?有没有办法让我控制总帧的均匀分布方式,使每个边界每60000/1001毫秒出现一次?我的期望是,由于我只是将帧速率加倍,我应该期望每1001/60000秒一帧。
答案 0 :(得分:1)
AVI是一种可变帧速率复用器。除了-r
之外,还需要启用恒定帧速率
ffmpeg -i input30fps.avi -vcodec huffyuv -r 60000/1001 -vsync cfr -an output60fps.avi