由電影延續每秒播放幀數習慣,在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底層采用的就是這一時鐘,和視訊關聯,則需借助通知系統,每隔一視訊幀,發一通知,分析通知,是視訊的就觸發重新整理螢幕,是聲音的,則填充發聲緩沖區。因為是同一個時鐘系統,進而解決了“同步”問題。
