DVD 導覽器中的數據流
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
DVD 導覽器有停止和暫停播放的方法。 這些方法與 IMediaControl中的 Stop 和 Pause 方法類似,但並不相同。 以下是它們之間的差異:
- IDvdControl2 方法會變更 DVD 導覽器從磁碟讀取的內容。 它們不會變更圖形的狀態。
- IMediaControl 方法會變更圖形的狀態。 它們不會變更 DVD 導覽器從磁碟讀取的內容。 (下一節說明與 Stop 方法有關的重要例外狀況。
例如,IDvdControl2::P ause 方法會發出附錄 J “Pause_On” 命令,但不會暫停篩選圖表。 另一方面,IMediaControl::P ause 方法會暫停圖形,但不會發出任何 DVD 命令。
一般而言,請使用 IMediaControl::P ause 和 Stop 方法,而不是對應的 IDvdControl2 方法。 IMediaControl 方法有非常小的延遲,而 IDvdControl2 方法 最多可以有兩秒的延遲。
停止播放
IMediaControl::Stop 的行為取決於您可以使用 IDvdControl2::SetOption 方法來設定的旗標。
- 如果DVD_ResetOnStop旗標 FALSE,IMediaControl::Stop 會停止圖形,但不會變更 DVD 導覽器的網域。 當您再次呼叫執行時,播放會從目前的位置繼續播放。
- 如果DVD_ResetOnStop TRUE,IMediaControl::Stop 會導致 DVD 導覽器重設。 當您再次呼叫 IMediaControl::Run 時,DVD 導覽器會從第一個播放網域播放,就像您第一次插入 DVD 一樣。
根據預設,DVD_ResetOnStop旗標會 TRUE,以與較舊的應用程式相容。 不過,一般而言,您應該覆寫預設值,並將旗標設定為 FALSE。 原因是某些事件可能會導致圖形在播放期間停止。 例如,如果顯示解析度變更,篩選圖形會停止、重新連接視訊轉譯器,然後重新啟動。 如果DVD_ResetOnStop TRUE,則播放會從光碟開頭重新啟動。這可能不是使用者預期的情況。
因此,在應用程式的開頭,呼叫 setOption,並將 DVD_ResetOnStop 設定為 FALSE。 如果您要停止播放並從相同位置繼續播放,請呼叫 IMediaControl::Stop 或 IMediaControl::P ause。 如果您想要停止播放並重設磁碟,請呼叫 SetOption,DVD_ResetOnStop等於 TRUE;然後呼叫 IMediaControl::Stop;最後,再次呼叫 SetOption,並將 DVD_ResetOnStop 重設為 FALSE。
暫停播放
如果您在圖形暫停時提供 DVD 導覽器命令,則命令在圖形再次執行之前可能無法完成。 在某些情況下,這可能會造成應用程式中的死結。 您應該遵循兩個規則來避免死結:
- 暫停時,請勿發出多個異步 DVD 命令。
- 暫停時,請勿封鎖應用程式的UI線程或變更圖形狀態的線程。
第二個規則值得更詳細地檢查。 以下是可能導致死結的一些特定案例:
案例:暫停時,應用程式會發出具有封鎖旗標的 DVD 命令。 如果發出 DVD 命令的線程與發出執行命令的線程相同,這可能會導致死結。 DVD 命令會封鎖直到圖形執行,但圖形必須等到命令完成才能執行。
建議:在個別的背景工作線程上發出 DVD 命令,或不使用封鎖旗標。
案例:暫停時,應用程式會發出 DVD 命令,然後在命令對象上呼叫 IDvdCmd::WaitForEnd。 這種情況相當於上一個範例。 如果您從 UI 線程呼叫 Wait,UI 線程將無法執行圖形,直到 Wait 方法解除封鎖為止,但直到圖形執行後,Wait 方法才會解除封鎖。
建議:在背景工作線程上呼叫 等候。
案例:當圖形執行時,應用程式會發出具有封鎖旗標的 DVD 命令,然後從另一個線程呼叫暫停。 這是可能的競爭條件,因為圖表可能會在發出命令之前暫停。 如果兩個線程之一是UI線程,您可能會造成類似前兩個範例的死結。 此範例說明如果您的應用程式使用多個線程,撰寫安全線程程序代碼的重要性。
建議:如果您使用背景工作線程,請確定您的程式代碼是安全線程。
案例:暫停時,應用程式會從UI停用執行命令,然後發出異步 DVD 命令。 此案例並非完全死結,因為應用程式線程仍在執行中。 不過,用戶現在無法執行圖形,因此命令永遠不會完成。
建議:暫停時,一律保持啟用執行命令。
搜尋 DVD 到指定的時間
若要準確搜尋光碟上的指定時間,請呼叫 IMediaControl::Run。 然後呼叫 IDvdControl2::P layAtTime,並指定 dwFlags 設定為 DVD_CMD_FLAG_Flush。
相關主題