用风行播一段MP4电影,画面总比声音慢半拍,这不是你的错觉,而是播放器在处理音视频同步时踩了坑。视频和音频本该在各自的时间线上并排前进,可视频解码的负担比音频重太多,稍不留神就被甩在后面。
MP4文件内部,视频轨和音频轨是分开存储的,每一条都带着精确的时间戳。播放器读到这些时间戳之后,会对着时钟把画面和声音送到输出设备。问题在于,音频解码是流水线作业,视频解码却是重体力活。拿常见的AAC音频来说,一帧只有1024个采样点,在44.1kHz采样率下对应大约23.2毫秒,解码器几乎不需要等待,CPU占用不到一个百分点。而电影视频,特别是1080p的高清片子,一帧画面有1920乘1080个像素,如果编码器还开了B帧,解码器得先把后面几帧取出来做重排,单帧处理时间很容易突破几十毫秒。
一部24帧的电影,每一帧允许的间隔是41.7毫秒。假如视频解码平均需要45毫秒,那么系统就永远慢着一口气。这口气会随着播放时间一点一点累积,音频依然按自己的节奏走,画面却跟不上。风行在解码过程中如果选择软件解码,你的处理器又不够快,那每秒都会产生几毫秒的延迟。别小看这几毫秒,一部两个小时的长片,累积下来足以让口型对不上台词的嘴。
这里还牵扯到播放器的同步基准。大多数播放器习惯把音频当成主时钟,因为人的耳朵对声音断裂更敏感,而对画面小幅度卡顿容忍度稍高。风行也沿用了这个策略,音频设备靠着自身内部晶振的时钟,连续不断地往外送声音,不存在等待数据的情况。视频则处在被动地位,播放器会问音频“现在到了什么时间”,再去决定该显示哪一帧。如果视频帧还没准备好,播放器宁可重复上一帧或者直接丢帧,也要维持声音不中断。所以你听见的永远是及时的声音,看见的却是拖泥带水的画面。
风行自身的一些默认设置也让问题恶化。早先几个版本的播放器对硬件加速支持很保守,自动检测显卡不通过就退回软件解码。硬解和软解在性能上差距极大,同一个H.264文件,硬解占用也许只有百分之十,软解可以飙到百分之七十以上。一旦风行的解码器用软解去撑高码率视频,画面速度自然被拖住。另外,风行为了减少卡顿,启动时会给音频播放留很小的缓冲,给视频却留更长缓冲,数据读进来先从视频缓冲区过一道,音画起步就已经不在同一条线上。

电脑当前的状态也起着作用。你一边用风行看片,一边还开着浏览器、下载工具或者后台游戏,CPU时间片被抢走,视频解码线程的优先级又不高,系统调度时总会把它往后排。声卡却走自己的独立通道,几乎不与CPU抢资源。笔记本的节能模式同样会让处理器降频,本来就已经吃紧的解码能力变得更加捉襟见肘。显示器刷新率也是个变量,电影是23.976帧每秒,而很多显示器固定在60Hz,播放器要把帧率错位地映射到刷新率上,如果转换算法做得糙,就会让视频输出产生额外等待。
文件本身也可能带着问题。有些MP4是转码软件粗制滥造的产物,视频轨和音频轨的起始时间戳不统一,或者PTS和DTS的排列顺序混乱。风行遇到这种不规范的封装,为了不出错会保守等待视频数据,而不去修正音频时间戳,于是声音稳稳地走,画面却始终追不上。
说到底,视频解码永远比音频更费力气,风行又选择优先保声音,硬件配置、播放器设置、文件封装任何一环出毛病,都会变成你在屏幕上看到的慢半拍。这不是单一故障,而是解码性能与同步机制共同作用的结果。想解决它,打开硬件加速,关掉多余程序,或者换一个解码内核更利索的播放器,情况立刻就能改善。