DVD 導覽器中的資料流程

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

DVD 導覽器有停止和暫停播放的方法。 這些方法與IMediaControl中的StopPause方法類似,但不相同。 以下是兩者之間的差異:

  • IControl2方法會變更 DVD 導覽器從磁片讀取的內容。 它們不會變更圖形的狀態。
  • IMediaControl方法會變更圖形的狀態。 它們不會變更 DVD 導覽器從磁片讀取的內容。 (下一節說明與 Stop 方法相關的一個重要例外狀況。)

例如, IControl2::P ause 方法會發出附錄 J 「Pause_On」 命令,但不會暫停篩選圖形。 另一方面, IMediaControl::P ause 方法會暫停圖形,但不會發出任何 DVD 命令。

一般而言,請使用 IMediaControl::P auseStop 方法,而不是對應的 IMyControl2 方法。 IMediaControl方法的延遲非常小,而IControl2方法最多可以有兩秒的延遲。

停止播放

IMediaControl::Stop的行為取決於您可以使用IControl2::SetOption方法設定的旗標。

  • 如果DVD_ResetOnStop旗標為 FALSEIMediaControl::Stop 會停止圖形,但不會變更 DVD 導覽器的網域。 當您再次呼叫 Run 時,播放會從目前的位置繼續執行。
  • 如果DVD_ResetOnStop為 TRUEIMediaControl::Stop 會導致 DVD 導覽器重設。 當您再次呼叫 IMediaControl::Run 時,DVD 導覽器會從 First Play 網域播放,就像您第一次插入 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 命令,然後在命令物件上呼叫 IFoxCmd::WaitForEnd 。 這種情況相當於上一個範例。 如果您從 UI 執行緒呼叫 Wait ,則在 Wait 方法解除封鎖之前,UI 執行緒無法執行圖形,但在圖形執行之前 ,Wait 方法將不會解除封鎖。

    建議:在背景工作執行緒上呼叫 等候

  • 案例:當圖形執行時,應用程式會發出具有封鎖旗標的 DVD 命令,然後從另一個執行緒呼叫暫停。 這是可能的競爭條件,因為圖形可能會在發出命令之前暫停。 如果兩個執行緒的其中一個是 UI 執行緒,您可能會造成類似前兩個範例的死結。 此範例說明如果您的應用程式使用多個執行緒,撰寫安全線程程式碼的重要性。

    建議:如果您使用背景工作執行緒,請確定您的程式碼是安全線程。

  • 案例:暫停時,應用程式會從 UI 停用執行命令,然後發出非同步 DVD 命令。 這種情況並非完全死結,因為應用程式執行緒仍在執行中。 不過,使用者現在無法執行圖形,因此命令永遠不會完成。

    建議:暫停時,請一律讓執行命令保持啟用狀態。

搜尋 DVD 到指定的時間

若要精確地搜尋光碟上的指定時間,請呼叫 IMediaControl::Run。 然後呼叫 IMyControl2::P layAtTime,並指定時間並將 dwFlags 設定為 DVD_CMD_FLAG_Flush。

DVD 應用程式