共用方式為


即時來源

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

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

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

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

延遲

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

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

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

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

速率比對

如果轉譯器篩選會使用一個參考時鐘來排程樣本,但來源篩選條件會使用不同的時鐘產生樣本,則播放時可能會發生問題。 轉譯器的執行速度可能會比來源快,導致數據間距。 或者,它的執行速度可能會比來源慢,導致樣本「堆起來」,直到圖形在某些時候才會卸除樣本。 一般而言,即時來源無法控制其生產速率,因此轉譯器應該比對來源的速率。

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

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

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

DirectShow 中的 時間和時鐘