Freigeben über


Datenfluss im DVD Navigator

[Das dieser Seite zugeordnete Feature DirectShow-ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngineund Audio/Video Capture in Media Foundationersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code MediaPlayer-, IMFMediaEngine und Audio-/Videoaufnahme in Media Foundation anstelle von DirectShow-verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, um die neuen APIs zu verwenden, falls möglich umgeschrieben werden.]

Der DVD Navigator verfügt über Methoden zum Beenden und Anhalten der Wiedergabe. Diese Methoden sind ähnlich , aber nicht identisch mit der Stop und Pause Methoden in IMediaControl. Dies ist der Unterschied zwischen ihnen:

  • Die IDvdControl2- Methoden ändern, was der DVD-Navigator vom Datenträger liest. Sie ändern nicht den Zustand des Diagramms.
  • Die IMediaControl- Methoden ändern den Zustand des Diagramms. Sie ändern nicht, was der DVD-Navigator von der Festplatte liest. (Es gibt eine wichtige Ausnahme, die im nächsten Abschnitt erläutert wird, im Zusammenhang mit der Stop-Methode.)

Beispielsweise gibt IDvdControl2::P ause Methode den Befehl "Anhang J Pause_On" aus, hält jedoch das Filterdiagramm nicht an. Die IMediaControl::P ause--Methode hält dagegen das Diagramm an, gibt jedoch keinen DVD-Befehl aus.

Verwenden Sie im Allgemeinen die methoden IMediaControl::P ause und Stop anstelle der entsprechenden IDvdControl2- Methoden. Die IMediaControl--Methoden weisen sehr geringe Latenzen auf, während die IDvdControl2- Methoden bis zu zwei Sekunden Latenz aufweisen können.

Beenden der Wiedergabe

Das Verhalten von IMediaControl::Stop hängt von einem Flag ab, das Sie mit der IDvdControl2::SetOption-Methode festlegen können.

  • Wenn das DVD_ResetOnStop Flag FALSEist, beendet IMediaControl::Stop das Diagramm, ändert jedoch nicht die Domäne des DVD-Navigators. Wenn Sie den Aufruf erneut ausführen, wird die Wiedergabe von der aktuellen Position fortgesetzt.
  • Wenn DVD_ResetOnStop TRUEist, bewirkt IMediaControl::Stop, dass der DVD-Navigator zurückgesetzt wird. Wenn Sie IMediaControl::Run erneut aufrufen, wird der DVD Navigator aus der Domäne "First Play" wiedergegeben, als ob Sie die DVD zum ersten Mal eingefügt haben.

Das DVD_ResetOnStop Flag ist standardmäßig TRUE, um Kompatibilität mit älteren Anwendungen zu gewährleisten. Im Allgemeinen sollten Sie jedoch die Standardeinstellung außer Kraft setzen und die Kennzeichnung auf FALSE-festlegen. Der Grund dafür ist, dass bestimmte Ereignisse dazu führen können, dass das Diagramm während der Wiedergabe beendet wird. Wenn sich beispielsweise die Anzeigeauflösung ändert, wird das Filterdiagramm beendet, der Videorenderer erneut verbunden und neu gestartet. Wenn DVD_ResetOnStop TRUE-ist, wird die Wiedergabe von Anfang an neu gestartet. Das ist wahrscheinlich nicht das, was der Benutzer erwartet.

Rufen Sie am Anfang der Anwendung daher SetOption- auf, wobei DVD_ResetOnStop auf FALSE-festgelegt ist. Wenn Sie die Wiedergabe beenden und an demselben Speicherort fortsetzen möchten, rufen Sie IMediaControl::Stop oder IMediaControl::P auseauf. Wenn Sie die Wiedergabe beenden und den Datenträger zurücksetzen möchten, rufen Sie SetOption- mit DVD_ResetOnStop gleich TRUE-auf; rufen Sie dann IMediaControl::Stopauf; Rufen Sie schließlich SetOption erneut auf, und setzen Sie DVD_ResetOnStop auf FALSEzurück.

Anhalten der Wiedergabe

Wenn Sie dem DVD-Navigator einen Befehl geben, während das Diagramm angehalten ist, wird der Befehl möglicherweise erst abgeschlossen, wenn das Diagramm erneut ausgeführt wird. In einigen Fällen kann dies zu einem Deadlock in Ihrer Anwendung führen. Es gibt zwei Regeln, die Sie befolgen sollten, um Deadlocks zu vermeiden:

  • Während angehalten, geben Sie nicht mehr als einen asynchronen DVD-Befehl aus.
  • Während angehalten, blockieren Sie nicht den UI-Thread der Anwendung oder den Thread, der den Zustand des Diagramms ändert.

Die zweite Regel lohnt sich genauer zu untersuchen. Hier sind einige bestimmte Szenarien, die zu einem Deadlock führen können:

  • Szenario: Während der Pause gibt die Anwendung einen DVD-Befehl mit dem Blockierungsflagge aus. Dies kann zu einem Deadlock führen, wenn der Thread, der den DVD-Befehl ausgibt, derselbe Thread ist, der den Ausführungsbefehl ausgibt. Der DVD-Befehl blockiert, bis das Diagramm ausgeführt wird, aber das Diagramm kann erst ausgeführt werden, wenn der Befehl abgeschlossen ist.

    Empfehlung: Geben Sie den DVD-Befehl in einem separaten Arbeitsthread aus, oder verwenden Sie nicht das Blockierungsflaggen.

  • Szenario: Während der Pause gibt die Anwendung einen DVD-Befehl aus und ruft dann IDvdCmd::WaitForEnd für das Befehlsobjekt auf. Diese Situation entspricht dem vorherigen Beispiel. Wenn Sie Wait aus dem UI-Thread aufrufen, kann der UI-Thread das Diagramm erst ausführen, wenn die Wait-Methode die Blockierung aufgehoben, aber die Wait-Methode wird die Blockierung erst aufgehoben, wenn das Diagramm ausgeführt wird.

    Empfehlungs-: Warten in einem Arbeitsthread aufrufen.

  • Szenario: Während das Diagramm ausgeführt wird, gibt die Anwendung einen DVD-Befehl mit dem Blockierungsflagge aus und ruft dann die Pause von einem anderen Thread auf. Dies ist eine mögliche Racebedingung, da das Diagramm möglicherweise angehalten wird, bevor der Befehl ausgegeben wird. Wenn einer der beiden Threads der UI-Thread ist, können Sie einen Deadlock ähnlich wie in den vorherigen beiden Beispielen verursachen. In diesem Beispiel wird die Bedeutung des Schreibens von threadsicherem Code veranschaulicht, wenn Ihre Anwendung mehrere Threads verwendet.

    Empfehlung: Wenn Sie Arbeitsthreads verwenden, stellen Sie sicher, dass Ihr Code threadsicher ist.

  • Szenario: Während der Pause deaktiviert die Anwendung den Ausführungsbefehl über die Benutzeroberfläche und gibt dann einen asynchronen DVD-Befehl aus. Dieser Fall ist nicht unbedingt ein Deadlock, da der Anwendungsthread noch ausgeführt wird. Der Benutzer wird jedoch jetzt daran gehindert, das Diagramm auszuführen, und daher wird der Befehl nie abgeschlossen.

    Empfehlung: Lassen Sie beim Anhalten immer den Befehl "Ausführen" aktiviert.

Suchen einer DVD zu einer angegebenen Zeit

Rufen Sie IMediaControl::Runauf, um eine bestimmte Zeit auf einem Datenträger genau zu suchen. Rufen Sie dann IDvdControl2::P layAtTime-auf, und geben Sie die Uhrzeit und Einstellung dwFlags- auf DVD_CMD_FLAG_Flush an.

DVD-Anwendungen