即時來源

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

即時來源也稱為 推送來源,可即時接收資料。 範例包括影片擷取和網路廣播。 一般而言,即時來源無法控制資料抵達的速率。

如果下列任一條件成立,則會將篩選視為即時來源:

如果即時來源篩選器提供時鐘,篩選圖形管理員會在選擇圖形參考時鐘時偏好該時鐘。 如需詳細資訊 ,請參閱參考時鐘

延遲

篩選準則的延遲是篩選處理範例所需的時間量。 對於即時來源,延遲取決於用來保存樣本的緩衝區大小。 例如,假設篩選圖表的視訊來源延遲為 33 毫秒, (毫秒) ,以及延遲為 500 毫秒的音訊來源。 每個視訊畫面會在相符的音訊範例到達音訊轉譯器之前,到達視訊轉譯器大約 470 毫秒。 除非圖表補償差異,否則不會同步處理音訊和視訊。

即時來源可以透過 IAMPushSource 介面進行同步處理。 除非應用程式藉由呼叫 IAMGraphStreams::SyncUsingStreamOffset 方法來啟用同步處理,否則 Filter Graph 管理員不會同步處理即時來源。 如果啟用同步處理,篩選圖形管理員會查詢 IAMPushSource的每個來源篩選。 如果篩選支援 IAMPushSource,Filter Graph 管理員會呼叫 IAMLatency::GetLatency 來擷取篩選的預期延遲。 (IAMPushSource 介面繼承 IAMLatency.) 從合併的延遲值,篩選圖形管理員會決定圖表中預期的延遲上限。 然後它會呼叫 IAMPushSource::SetStreamOffset ,為每個來源篩選提供資料流程位移,該篩選會新增至其產生的時間戳記。

這個方法主要是用於即時預覽。 不過請注意,即時擷取裝置上的預覽釘選 (例如相機) 不會在所傳遞的範例上設定時間戳記。 因此,若要搭配即時擷取裝置使用此方法,您必須從擷取釘選預覽。 如需詳細資訊,請參閱 DirectShow 影片擷取篩選

VFW 擷取篩選器和音訊擷取篩選器目前支援IAMPushSource介面。

速率比對

如果轉譯器篩選會使用一個參考時鐘排程樣本,但來源篩選準則會使用不同的時鐘產生樣本,則播放時可能會發生問題。 轉譯器的執行速度可能會比來源快,導致資料間距。 或者,其執行速度可能會比來源慢,導致樣本「大量」,直到圖形在某個時間點卸載樣本為止。 一般而言,即時來源無法控制其生產速率,因此轉譯器應該比對速率與來源。

目前,只有音訊轉譯器會執行速率比對,因為音訊播放中的問題比視訊中的問題更明顯。 若要執行速率比對,音訊轉譯器必須選取其將會比對速率的專案。 它會使用下列演算法:

  • 如果圖表未使用參考時鐘,音訊轉譯器不會嘗試比對速率。 (每當圖表沒有參考時鐘時,範例一律會在抵達時立即轉譯。)
  • 否則,如果圖形有參考時鐘,音訊轉譯器會使用先前所述的準則,檢查是否有即時來源上游。 如果沒有,音訊轉譯器與速率不符。
  • 如果有即時來源上游,且該來源在其輸出釘選上公開 IAMPushSource 介面,音訊轉譯器會呼叫 IAMPushSource::GetPushSourceFlags。 它會尋找下列其中一個旗標:
    • AM_PUSHSOURCECAPS_INTERNAL_RM。 此旗標表示來源篩選器有自己的速率比對機制,因此音訊轉譯器不符合速率。
    • AM_PUSHSOURCECAPS_NOT_LIVE。 此旗標表示來源篩選不是真正的即時來源,即使它公開 IAMPushSource 介面也一樣。 因此,音訊轉譯器不符合速率。
    • AM_PUSHSOURCECAPS_PRI加值稅E_CLOCK。 此旗標表示來源篩選準則使用私人時鐘來產生時間戳記。 在此情況下,音訊轉譯器會比對時間戳記的速率。 (如果範例沒有時間戳記,轉譯器會忽略此旗標。)
  • 如果 GetPushSourceFlags 未傳回任何旗標 (零) ,音訊轉譯器的行為取決於圖形時鐘,以及樣本是否有時間戳記:
    • 如果音訊轉譯器不是圖形時鐘,而且樣本有時間戳記,音訊轉譯器就會比對時間戳記的速率。
    • 如果範例沒有時間戳記,音訊轉譯器會嘗試比對傳入音訊資料的速率。
    • 如果音訊轉譯器是圖形時鐘,它會嘗試比對傳入的資料速率。

最後一個案例的原因如下:如果音訊轉譯器是參考時鐘,而且來源篩選準則使用相同的時鐘來產生時間戳記,則音訊轉譯器無法比對時間戳記的速率。 如果這麼做,實際上會嘗試比對速率與本身,這可能會導致時鐘漂移。 因此,在此情況下,轉譯器會比對傳入音訊資料的速率。

DirectShow 中的時間和時鐘