天天看點

OpenCores學習(5) -- A/V同步機制

PVPlayer 在渲染 (render) 所有多媒體資料是都需要保持一個暫時的同步,也就是通常所說的 A/V 同步。為了達到同步,需要如下一些資訊:媒體回放的時鐘,媒體資料的時間戳,從 Sink 中擷取的時間資訊(比如從音頻裝置設定的特定的采樣率來擷取的播放速率)。圖 1 描述了與同步相關的 PVPlayer 子產品之間的關系。

OpenCores學習(5) -- A/V同步機制

圖 1 與同步相關的子產品及關系

一、媒體時鐘

PVMFMediaClock ,媒體時鐘主要負責維持一個時間的引用,進而保持媒體回放的節奏,擷取和實作媒體播放的同步。

1 、媒體時鐘的特點

1.1時間源

媒體時鐘可以作為一個時間源提供給多媒體,它本身可能來自于系統時鐘或其他時間源(比如音頻裝置時鐘)。它可以給多媒體提供一個時間基準,同時來維護該時間基準。

1.2時鐘觀察者

媒體時鐘可以把自己作為一個觀察者,來通知對象時鐘狀态的改變。以下接口實作了其作為觀察者的角色:

PVMFMediaClockObserver :用來通知時鐘基值,時鐘計數的更新,時鐘的調整;

PVMFMediaClockStateObserver :用來通知時鐘狀态的改變;

PVMFMediaClockNotificationsObs :用來擷取回調通知。

1.3NPT 映射

媒體時鐘是一個單調遞增的時鐘,而媒體在播放時卻可能需要 Seek 到任意位置,為了控制媒體的播放,使其正确 Render ,媒體時鐘需要在媒體時鐘時間和 NPT 之間維護一個 NPT ( normal play time )映射,任意對媒體播放位置的改變将會通知進行一次映射。圖 2 描述了媒體時鐘和 NPT 之間的映射。

圖中的箭頭和帶顔色的區段描述了 Seek 的次序以及每次播放的時間段, Media clock 和 NPT 之間相同的顔色區間即對應了相應的映射。由此可以看出其映射公式為(以第二段為例): NPT = ( media_time - 5550 + 380) 。

OpenCores學習(5) -- A/V同步機制

1.4 時鐘的回調

在媒體時鐘上設定回調是元件采取動作的基礎,這些回調可以減少在時鐘發生 改變時,元件自己需要設定他們的時鐘。媒體時鐘采用輸入特定時間視窗來取 代絕對時間,這樣可以使得處于競争狀态的任務或線程可以盡可能早的得到響 應。

1.5 延遲處理

當內建了多個不同媒體流的 Sinks 來輸出一個多媒體時,每個 Sink 都可能會有 不同程度的延遲,為了彌補不同媒體流之間的延遲進而同步播放,就需要進行 延遲處理。每個 Sink 都向媒體時鐘注冊自己的延遲,最後由媒體時鐘來調整最 終的排程的延遲。

1.6 NPT 時鐘轉換

當一個新的 NPT 開始時,使用者可以給媒體時間設定一個絕對時間。使用者還可以 任意調整 NPT 的方向(比如向前,向後)。

二、時間戳

為了及時準确地輸出媒體資料,就不得不考慮媒體資料中包含的時間戳資訊以及媒體回放時鐘。如果時間戳值等于目前回放時間,則媒體資料是同步的,需要進行 Render ;如果時間戳小于目前回放時間,則說明媒體資料到達時間晚了;反之,如果時間戳大于目前回放時間,則說明媒體資料到達時間早了。如何處理這些來早的或來晚的媒體資料則取決于 PVPlayer 引擎的配置,通常情況下,來早的資料需要等待,直到播放時間到達;來晚的資料則會被丢棄而不被 Render 。但有時候來晚的資料也會被 Render 。

三、同步音頻

音頻資料的 Render 通常不需要外部時鐘來進行同步,因為音頻裝置通常會被配置一定的采樣率來消化音頻資料。是以,音頻裝置被配置的這個采樣率通常也作為媒體回放時鐘的速率。

1 、 Render 開始時的同步

一旦媒體時鐘開始後,就必須要求媒體資料盡可能快地被 Render ,然而硬體在 Render 時很可能需要額外的時間,或者硬體需要等到更多的媒體資料被緩存。是以會導緻媒體時鐘的開始時間與媒體資料真正被輸出的時間不一緻,進而導緻 PVPlayer 報告給應用程式的播放進度與真實播放進度産生誤差。為了解決這一問題,采用了在硬體沒有開始輸出媒體資料時,媒體時鐘就處于暫停狀态,當硬體開始輸出媒體資料時給媒體時鐘發一個消息來通知媒體時鐘也開始運作。這樣就可以保證在媒體時鐘開始的時候,媒體資料也開始進行輸出。

OpenCores學習(5) -- A/V同步機制

圖 3 開始輸出的同步示例

圖 3 描述了在有一定初始延遲時開始輸出的同步例子。

作為一個主動态的 MIO 元件,無論時鐘狀态為暫停還是運作, PVPlayer 都向 MIO 元件傳送資料,而 MIO 元件也應該繼續接受和緩存資料,并決定何時把資料發送到硬體。

而作為一個被動态的 MIO 元件,隻有當時鐘狀态為運作時, PVPlayer 才向 MIO 元件發送資料,而接收到資料的 MIO 元件也需要将收到的資料立即發送給硬體。

2 、重新定位後的同步

當應用程式請求重新定位媒體播放位置時, MIO 元件和硬體緩存的資料需要被立即釋放,并且在新的位置開始播放。

圖 4 描述了重新定位後如何實作媒體的同步的示例。

OpenCores學習(5) -- A/V同步機制

3 、播放中的同步

盡管硬體消費資料的速率應該與媒體時鐘的速率是一緻的,但畢竟他們是單獨運作的,是以不可避免的會有一些不同。通常情況下,這中差距是很小的,然而随着播放的進行,差距将會被積累,最終導緻不同步。

OpenCores學習(5) -- A/V同步機制

是以,為了控制在短時間内播放時鐘與音頻輸出程序差距在很小的範圍内,需要不時地調整兩者之間的差,使之小于一個特定的門檻值。

四、同步視訊

與音頻輸出相比,視訊的輸出需要參考一個時鐘來決定何時輸出一個特定的視訊幀,視訊幀的輸出要盡可能的與該幀的時間戳相一緻。 PVPlayer 維護了一個與音頻播放同步的播放時鐘,是以,一旦視訊輸出與播放時鐘同步,那麼也就意味着視訊輸出與音頻輸出同步。

五、音視訊同步

音視訊同步是音頻同步和視訊同步的終極目标。在 PVPlayer 架構中,媒體時鐘需要調整以便與音頻輸出過程相一緻,而對于視訊輸出來說,在輸出一個視訊幀時要使得該幀的時間戳與媒體時鐘同步。是以音頻輸出裝置、視訊幀的時間戳與媒體時鐘的結合便造就了 A/V 同步。

圖 6 描述了參與音視訊同步子產品之間的互動過程。

OpenCores學習(5) -- A/V同步機制

圖 6 A/V 同步互動過程