Verbesserungen der DVD-Wiedergabe in Windows Vista
[Bei dem dieser Seite zugeordneten Feature DirectShow handelt es sich um ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine sowie der Audio- und Videoaufnahme in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt für neuen Code nach Möglichkeit dringend die Verwendung von MediaPlayer, IMFMediaEngine sowie der Audio- und Videoaufnahme in Media Foundation anstelle von DirectShow. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, wenn möglich umgeschrieben wird, um die neuen APIs zu verwenden.]
In diesen Abschnitten werden die Verbesserungen der DVD-Wiedergabe und -Navigation in Windows Vista beschrieben.
Angeben eines Decoders
In früheren Versionen von DirectShow war es schwierig, beim Erstellen eines DVD-Wiedergabediagramms einen bestimmten MPEG-2-Decoder anzugeben. Ab Windows Vista kann eine Anwendung den Decoder folgendermaßen angeben:
- Fügen Sie den Decoder zum Diagramm hinzu, bevor Sie IDvdGraphBuilder::RenderDvdVideoVolume aufrufen.
- Rufen Sie die Methode RenderDvdVideoVolume auf, und legen Sie das AM_DVD_DO_NOT_CLEAR-Flag fest. Der DVD-Navigator bevorzugt daraufhin den von Ihnen hinzugefügten Decoder.
Unterstützung für den erweiterten Videorenderer
Es wird empfohlen, dass Anwendungen, die für Windows Vista oder höher entwickelt wurden, den erweiterten Videorenderer (Enhanced Video Renderer, EVR) für die Videowiedergabe verwenden. Legen Sie beim Aufrufen der Methode RenderDvdVideoVolume das AM_DVD_EVR_ONLY-Flag fest, um EVR in einer DVD-Wiedergabeanwendung zu verwenden.
Rufen Sie zum Konfigurieren von EVR vor dem Erstellen des Diagramms die Methode IDvdGraphBuilder::GetDvdInterface auf, und fragen Sie die Schnittstellen IEVRFilterConfig oder IMFVideoRenderer ab. (Diese Schnittstellen sind in der SDK-Dokumentation zu Media Foundation dokumentiert.) Weitere Informationen zum Konfigurieren des Videorenderers in einem DVD-Wiedergabediagramm finden Sie unter Erstellen des DVD-Filterdiagramms.
Der DVD-Navigator verwendet EVR lediglich dann, wenn die Methode IAMDecoderCaps::GetDecoderCaps das AM_GETDECODERCAP_QUERY_EVR_SUPPORT-Flag zurückgibt. Dieses Flag wird definiert, um sicherzustellen, dass Anwendungen mit vorhandenen Decodern kompatibel sind. Sollte die Methode RenderDvdVideoVolume mit dem AM_DVD_EVR_ONLY-Flag fehlschlagen, greifen Sie auf einen anderen Videorenderer zurück, indem Sie die Methode erneut ohne das Flag aufrufen.
Flüssige Rückwärtswiedergabe
Der DVD-Navigator kann nun eine flüssige Rückwärtswiedergabe durchführen. Bei der flüssigen Rückwärtswiedergabe sendet der DVD-Navigator ganze Videoobjekteinheiten (Video Object Units, VOBUs) an den Decoder, der die Frames in umgekehrter Reihenfolge ausgibt. Für dieses Feature müssen die Decoder die flüssige Rückwärtswiedergabe unterstützen.
Wenn die Anwendung die Wiedergabegeschwindigkeit auf einen negativen Wert festlegt, fragt der DVD-Navigator die Decoder nach der Eigenschaft AM_RATE_ReverseMaxFullDataRate ab. Bei dem Wert dieser Eigenschaft handelt es sich um den absoluten Wert der maximalen Rückwärtsgeschwindigkeit × 10.000. Wenn die maximale Rückwärtsgeschwindigkeit beispielsweise auf -2,0 festgelegt ist, liegt der Wert bei 20.000.
Der DVD-Navigator verwendet die flüssige Rückwärtswiedergabe, sofern der Decoder die Eigenschaft unterstützt. Eine Rückwärtswiedergabe des Audiodatenstroms erfolgt, wenn der Audiodecoder die Eigenschaft unterstützt – andernfalls wird der Audiodatenstrom stummgeschaltet. Wenn der Videodecoder die Eigenschaft nicht unterstützt oder die Wiedergaberate die maximale Rückwärtswiedergaberate des Videodecoders übersteigt, schaltet der DVD-Navigator in den Scanmodus um. Im Scanmodus sendet der DVD-Navigator lediglich I-Frames und keine B- und P-Frames an den Decoder.
Während der flüssigen Rückwärtswiedergabe sendet der DVD-Navigator vollständige VOBUs an den Decoder. Der DVD-Navigator sendet die VOBUs in umgekehrter Reihenfolge, die Frames innerhalb der einzelnen VOBUs jedoch in ihrer normalen Vorwärtswiedergabereihenfolge. Am Anfang jedes VOBUs legt der DVD-Navigator das AM_ReverseBlockStart-Flag für den Frame fest. Am Ende des VOBUs sendet der DVD-Navigator einen leeren Frame mit dem AM_ReverseBlockEnd-Flag. Rufen Sie zum Abrufen dieser Flags die Methode IMediaSample2::GetProperties für den Frame auf. Die Flags werden im dwTypeSpecificFlags-Element der Struktur AM_SAMPLE2_PROPERTIES festgelegt.
Der Decoder speichert die Videodaten zwischen, bis er den Frame mit dem AM_ReverseBlockEnd-Flag empfängt. Der Decoder sendet dann decodierte Frames in umgekehrter Reihenfolge. Wenn VOBU 1 beispielsweise die Frames 1–4 und VOBU 2 die Frames 5–8 enthält, sendet der DVD-Navigator die Frames in dieser Reihenfolge:
(Blockanfang) F5 F6 F7 F8 (Blockende) (Blockanfang) F1 F2 F3 F4 (Blockende)
Der Decoder sollte die Frames folgendermaßen verarbeiten:
- Decodieren von VOBU 2
- Ausgabeframes: F8 F7 F6 F5
- Decodieren von VOBU 1
- Ausgabeframes: F4 F3 F2 F1
Der DVD-Navigator legt den Zeitstempel für den ersten Frame in der VOBU (F1 und F5) fest. Der Zeitstempel enthält jedoch die Präsentationszeit des Blockanfangs, weswegen der Decoder diese Zeit auf den letzten Frame im Block (F4 und F8) anwenden sollte. Die Präsentationszeiten erhöhen sich während der Rückwärtswiedergabe.
In der Regel enthält eine VOBU bis zu 42 Frames und kann mehr als eine Bildgruppe (Group Of Pictures, GOP) enthalten. Damit die gesamte VOBU decodiert werden kann, sollte der Decoder die decodierten I- und P-Frames zwischenspeichern. Bei VOBUs auf DVDs handelt es sich um keine geschlossenen GOPs, weswegen für einen B-Frame in einer GOP möglicherweise alle Referenzframes in der vorherigen GOP decodiert werden müssen. Sollte der Decoder nicht über genügend Speicherplatz verfügen, um alle decodierten Frames zwischenzuspeichern, müssen bestimmte Frames möglicherweise neu decodiert werden.
Änderungen der Wiedergaberate
Standardmäßig leert der DVD-Navigator das Diagramm zwischen Änderungen der Wiedergaberate. Wenn der Decoder die Eigenschaft AM_RATE_ResetOnTimeDisc unterstützt, leert der DVD-Navigator das Diagramm jedoch nicht, was zu einem flüssigen Übergang zwischen den Wiedergaberaten führt.
Der DVD-Navigator gibt Zeitstempel immer unabhängig von der tatsächlichen Wiedergabegeschwindigkeit für die Wiedergabe von Frames mit einer einfachen Geschwindigkeit (1x) an. Der Decoder muss die Zeitstempel für die decodierten Frames anpassen, damit diese der tatsächlichen Wiedergabegeschwindigkeit entsprechen. (Ausführliche Informationen finden Sie unter AM_RATE_SimpleRateChange Property.) Bei einer Wiedergabegeschwindigkeit, die nicht bei 1 × liegt, unterscheiden sich daher die Zeitstempel für decodierte und codierte Frames. Wenn der DVD-Navigator das AM_SAMPLE_TIMEDISCONTINUITY-Flag für einen Frame festlegt, sollte der Decoder die Zeitstempel neu synchronisieren. Anders ausgedrückt sollte der decodierte Frame denselben Zeitstempel wie der Eingabeframe aufweisen. Rufen Sie zum Abrufen des AM_SAMPLE_TIMEDISCONTINUITY-Flags die Methode IMediaSample2::GetProperties für den Frame auf. Das Flag wird im dwSampleFlags-Member der Struktur AM_SAMPLE2_PROPERTIES festgelegt.
Energieverwaltung
In Windows Vista ermöglicht der DVD-Navigator die folgenden Verbesserungen für die Energieverwaltung:
- Höhere Timerauflösung
- Größerer Datencache
Timerauflösung: Anwendungen können eine minimale Timerauflösung anfordern, indem sie die timeBeginPeriod-Funktion aufrufen. Eine höhere Auflösung (kürzere Periode) erhöht die Reaktionsfähigkeit des Systems auf periodische Ereignisse wie Zeitüberschreitungen, sie kann jedoch ebenfalls die Häufigkeit von Wechseln des Threadkontexts erhöhen.
Standardmäßig legt die Referenzuhr in DirectShow die Timerauflösung auf eine Millisekunde fest. Bei dieser Auflösung wechselt die CPU nicht in den Stromsparmodus. Ab Windows Vista setzt der DVD-Navigator das Standardverhalten der Referenzuhr außer Kraft, indem er die Methode IReferenceClockTimerControl::SetDefaultTimerResolution für die Referenzuhr aufruft. Dadurch wird die Anforderung der Uhr für eine Timerauflösung von einer Millisekunde entfernt. So kann die CPU in den Stromsparmodus wechseln.
Bei der Timerauflösung handelt es sich um eine globale Einstellung, für die Windows den niedrigsten angeforderten Wert auswählt. Die VMR-Filter (Video Mixing Renderer, Videomischrenderer) VMR-7 und VMR-9 legen die Timerauflösung auf eine Millisekunde fest. EVR legt die Auflösung in der Regel auf einen Wert zwischen vier und acht Millisekunden fest. Die Festlegung hängt davon ab, ob die Desktopgestaltung aktiviert ist und EVR im Vollbildmodus ausgeführt wird. Andere Anwendungen können die Auflösung ebenfalls festlegen.
Cachegröße: Anwendungen können angeben, wie viele Daten der DVD-Navigator zwischenspeichert, indem sie die Option DVD_CacheSizeInMB in der Methode IDvdControl2::SetOption festlegen. Wenn die Anwendung dieses Flag auf einen großen Wert (über 50 MB) festlegt, kann das DVD-Laufwerk nach einem anfänglichen Vorababruf abhängig von der Hardware mit einer geringeren Geschwindigkeit fortfahren, wodurch der Stromverbrauch gesenkt werden kann.
Zugehörige Themen