首页 > 技术文章 > 影音同步的困惑和解决方案

hbg200 2017-01-11 21:32 原文

      由电影延续每秒播放帧数习惯,在Windows系统中因缺乏us级定时器支持,而出现不小的误差,比如每秒30帧的视频,误差为:1000ms / 30帧 = 33.3333ms减去可实现33ms定时延时,剩下每帧0.3333ms误差,当播放5秒时的误差为:0.3333ms * 30帧 * 5秒 = 49.995ms误差,每5秒掉一帧,为避免这种现象发生(积累误差),播放器必须进行同步。系统最小定时精度为1ms,Windows系统并没有可停止的定时器(实现帧间延时),系统提供两种,一种是普通定时器,级别不高,另一种是多媒体定时器,级别高一点,这两种定时器创建使用后,停止的方法就是删除。每一帧或几帧都要创建,删除,必须严格控制,重复创建或删除则引起崩溃。也有播放器通过底层驱动,实现帧间延时和多媒体加速,编写Windows底层驱动是一件很麻烦的事情。

通过系统提供的1ms定时器进行同步编程,发现很麻烦,在一个线程中解压,在另一线程刷新屏幕,还有一个发声系统,相互协调比较麻烦,最终放弃。

苦思冥想几天,想出一种方案,系统支持AC97标准,虽是声音标准,但已达到一定精度,比如48KHz,可达到10^6 / 48KHz = 20.8333us,已提高不少,DirectSound底层采用的就是这一时钟,和视频关联,则需借助通知系统,每隔一视频帧,发一通知,分析通知,是视频的就触发刷新屏幕,是声音的,则填充发声缓冲区。因为是同一个时钟系统,从而解决了“同步”问题。

 

推荐阅读