当我运行 时ffprobe input.m2v
,即使已知视频流的帧速率具有(恒定)帧速率,例如 24000/1001 fps,fps
也会报告为:25
Input #0, mpegvideo, from 'test.m2v':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: mpeg2video (mpeg1video) (Main), yuv420p(tv, progressive), 720x480 [SAR 8:9 DAR 4:3], 25 fps, 23.98 tbr, 1200k tbn
Side data:
cpb: bitrate max/min/avg: 8600000/0/0 buffer size: 1835008 vbv_delay: N/A
(请注意,正确的帧速率由 提示tbr
。)
fps
这也会导致所选复用器使用错误。例如:
Input #0, matroska,webm, from 'output.mkv':
Metadata:
ENCODER : Lavf61.1.100
Duration: 00:23:22.32, start: 0.042000, bitrate: 7965 kb/s
Stream #0:0: Video: mpeg2video (Main), yuv420p(tv, progressive), 720x480 [SAR 8:9 DAR 4:3], 25 fps, 25 tbr, 1k tbn
Metadata:
DURATION : 00:23:22.318000000
Side data:
cpb: bitrate max/min/avg: 8600000/0/0 buffer size: 1835008 vbv_delay: N/A
fps
在这种情况下,如何正确设置原始 MPEG-2 视频的解复用器,即fps
具有与 相同的值tbr
?
感谢这个答案,我发现了源代码中
fps
的引用。AVStream.avg_frame_rate
然后我意识到原始 MPEG 视频解复用器(用于原始 MPEG-1 和 MPEG-2 视频)是由一组原始解复用器共享的通用代码创建的: [1] [2] [3]
原始视频解复用器有一个通用
framerate
选项,其默认值为25
,AVStream.avg_frame_rate
可通过以下方式设置为选项的值ff_raw_video_read_header()
: [4] [5]因此,
-framerate 24000/1001
可用于允许多路复用器继承正确的fps
/AVStream.avg_frame_rate
。请注意,选项必须放在之前-i input.m2v
(-i file
如果有其他选项,则放在其他选项之后),以便将其用作该特定输入文件的解复用器选项。例如:PS
AVStream.avg_frame_rate
,如果未设置(即),则在某个点处0/0
将被设置为AVStream.r_frame_rate
(tbr
如果已设置)。但是,即使的为,显然也是不可接受的。我的猜测是,当选项类型为时,选项解析代码禁止这样做。必须设置的原因可能是因为并非所有原始视频流/文件都像原始 MPEG-1/2 视频一样带有帧速率元数据(显然用于设置),并且函数/方法在设置之前被调用。-framerate 0(/0)
min
AVOption
0
0(/0)
AV_OPT_TYPE_VIDEO_RATE
ff_raw_video_read_header()
AVStream.avg_frame_rate
AVStream.r_frame_rate
AVStream.r_frame_rate