关于ffmpeg/ffprobe报告错误SAR值及与QuickTime Player、VLC显示差异的技术问询
嘿,这个问题我碰到过好多次,尤其是处理老NTSC DVD文件的时候,咱们慢慢捋清楚:
首先得掰扯清楚SAR和PAR的关系——虽然很多人会把这俩混着说,但严格来讲:
- SAR(Sample Aspect Ratio)是样本宽高比,指视频流里存储的像素样本的宽高比例
- PAR(Pixel Aspect Ratio)是像素宽高比,指单个像素本身的物理宽高比例
不过在实际应用中,这俩经常被用来指代同一个核心属性:描述“像素不是正方形”这个特点。
回到你的问题:为什么ffprobe的SAR和QuickTime的PAR不一样,连VLC和QuickTime的DAR都有差异?
核心原因:不同工具对元数据的解析逻辑/遵循的规范不一样
ffprobe的解析逻辑
ffprobe是直接读取MPEG-2视频流里内嵌的像素比例元数据,从你提供的输出来看:Input #0, mpeg, from 'VTS_01_1.mpeg': Duration: 00:22:00.07, start: 0.280633, bitrate: 20558 kb/s Stream #0:0[0x1bf]: Data: dvd_nav_packet Stream #0:1[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, top first), 720x480 [SAR 8:9 DAR 4:3], 29.97 fps, 29.97 tbr, 90k tbn Side data: cpb: bitrate max/min/avg: 9396000/0/0 buffer size: 1835008 vbv_delay: N/A Stream #0:2[0x80]: Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s Stream #0:3[0x81]: Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s Stream #0:4[0x21]: Subtitle: dvd_subtitle (dvdsub)它算出来的DAR是4:3(720*(8/9)=640,640/480=4:3),这是完全基于流内原始数据计算的结果。但有些DVD制作工具在编码时,可能会把SAR/PAR值写得和NTSC标准有偏差,ffprobe只会如实读取这些数据。
QuickTime的处理逻辑
QuickTime会优先遵循NTSC DVD的行业标准:标准720x480的NTSC DVD对应的PAR是10:11(换算成SAR就是9:8),它会直接套用这个标准值来计算显示比例,而不是完全依赖流内的元数据——这就是为什么它显示的PAR和ffprobe不一样,但最终画面比例还是符合DVD标准的。VLC的差异
VLC的逻辑介于两者之间:它有时候会读取流内的SAR值计算DAR,有时候也会根据文件类型(比如DVD)自动调整,甚至允许用户手动设置显示比例,所以它的DAR显示和QuickTime有差异也很正常。
怎么验证/修正?
如果你想让不同工具的显示统一,可以用ffmpeg强制设置标准的SAR/PAR:
ffmpeg -i VTS_01_1.mpeg -vf "setsar=9/8, setdar=4:3" output.mpeg
转换后再用ffprobe、QuickTime、VLC查看,应该就能得到一致的比例信息了。另外也可以查看DVD的IFO文件,里面会存储最准确的DVD规格信息,ffprobe默认不会读取IFO的元数据,只会解析视频流本身。
备注:内容来源于stack exchange,提问作者user218669

