为何FFmpeg/FFprobe会误报原始MPEG-2视频的帧率?
为何FFmpeg/FFprobe会误报原始MPEG-2视频的帧率?
这种情况其实挺常见的,核心原因在于原始MPEG-2视频流本身可能没有携带明确的恒定帧率元数据。FFprobe在解析这类没有明确帧率标记的视频时,会默认采用一个“兜底”的帧率——25fps,这是PAL制式的标准帧率,也是FFmpeg对无明确帧率的MPEG-2视频的默认假设。
但你仔细看输出的话,真实帧率其实已经藏在tbr字段里了:比如你提供的示例中,23.98 tbr就是视频实际的帧率(对应24000/1001≈23.976fps),这个值是FFmpeg通过分析视频流的帧间隔计算出来的,比显示的25 fps更准确。
这个错误的帧率标记还会带来连锁问题:当你用这个视频进行封装时,封装器(muxer)会直接沿用FFprobe识别到的错误帧率,导致最终生成的文件(比如你示例里的MKV)也被标记为25fps,后续播放或者处理时就可能出现速度异常、时长计算错误等问题。
给你两个实用的解决方向:
- 精准获取真实帧率:用更针对性的ffprobe命令提取
tbr对应的实际帧率,比如:
输出的结果就是视频的真实帧率,你可以直接用这个值来修正后续的封装参数。ffprobe -v error -select_streams v:0 -show_entries stream=tbr -of default=noprint_wrappers=1:nokey=1 input.m2v - 强制设置正确帧率封装:如果要重新封装视频又不想重新编码,可以手动指定正确的帧率,比如针对24000/1001的情况:
这样封装后的MKV就会携带正确的帧率元数据了。ffmpeg -i input.m2v -r 24000/1001 -c:v copy output.mkv
附你提供的示例输出:
原始MPEG-2视频的ffprobe输出:
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
封装后的MKV视频的ffprobe输出:
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/...
备注:内容来源于stack exchange,提问作者Tom Yan




