由电影延续每秒播放帧数习惯,在Windows系统中因缺乏us级定时器支持,而出现不小的误差,比如每秒30帧的视频,误差为:1000ms / 30帧 = 33.3333ms减去可实现33ms定时延时,剩下每帧0.3333ms误差,当播放5秒时的误差为:0.3333ms * 30帧 * 5秒 = 49.995ms误差,每5秒掉一帧,为避免这种现象发生,采用声音播放缓冲区每秒触发矫正一次,避免累积误差,或叫影音同步。
Windows系统提供了一个QueryPerformanceCounter函数,用于获取系统计数频率,虽然可提供us级的计数频率,但应用目的是查询。由于缺乏事件支持,无法做定时器应用,网上通过循环比较是不可取的,因比较时间大于定时精度,Windows是多任务系统,挂起就无法比较了,循环比较只做一件事,系统被死循环,无法运行。
Windows系统还提供了ms级多媒体定时器,但启动后无法停止,只能删除,需要时重建,频繁删除重建不但消耗时间、资源,还容易引起崩溃,不可取。
Timer定时器可实现ms级,但定时精度差,优先级低,随时被打扰,优点是可启停,实现影音同步,是无奈之选。同步过程:音频播放缓冲区事件启动Timer视频帧间隔定时器延时播放每一帧,当播放一秒的帧数后停止,等待下次音频播放缓冲区事件启动。
原文:http://www.cnblogs.com/hbg200/p/6275290.html