Verwenden der Window Media Codecs in DirectShow

Die Audio- und Videoencoder- und Decoderobjekte von Windows Media wurden ursprünglich für die Verwendung des ASF-Dateicontainerformats und des Windows Media Format SDK entwickelt und optimiert. Die Codecobjekte funktionieren in DirectShow gut für bestimmte Szenarien, d. h. one-pass CBR und qualitätsbasierte VBR-Codierung von Videostreams. Wenn Sie jedoch erwägen, die Codecobjekte direkt in DirectShow mit anderen Dateicontainern als ASF zu verwenden, gibt es bestimmte Verhaltensweisen und Probleme, die Sie im Voraus beachten sollten.

Hinweis

Wenn Sie eigenständige Codecs mit DirectShow verwenden möchten, sollten Sie diese wahrscheinlich nur als DMOs verwenden. Anders ausgedrückt: Sie verwenden die IMediaObject-Schnittstelle anstelle von IMFTransform.

 

WM-Audio in AVI-Dateien

Sie können DirectShow verwenden, um WMA-Datenströme in ein beliebiges Dateicontainerformat zu codieren, für das Sie über einen Multiplexerfilter verfügen. Die Audio- und Videocodecschnittstellen von Windows Media unterstützen jedoch WMA in AVI-Dateien nicht, da es unmöglich ist, die Audio-Video-Synchronisierung in einer AVI-Datei mit einem WMA-Stream mit den Standardmäßigen DirectShow AVI-Wiedergabefiltern aufrechtzuerhalten. Weitere Informationen finden Sie unter Speichern komprimierter Medien in AVI-Dateien.

Der DMO-Audioencoder gibt Beispiele mit unterschiedlicher Dauer aus, auch wenn er sich im Modus "konstante Bitrate" befindet. Es funktioniert daher am besten mit Dateicontainerformaten, die Zeitstempel verwenden. AVI-Dateien enthalten keinen Zeitstempel für jedes Audiobeispiel oder jede Gruppe von Beispielen. In DirectShow erstellt der AVI Splitter-Filter Zeitstempel für jede Gruppe von Beispielen (jeden Audioframe) basierend auf dem nAvgBytesPerSec-Wert in der WAVEFORMATEX-Struktur im AVI-Streamheader.

Die dieser Berechnung zugrunde liegende Annahme ist, dass alle Audiobeispiele im Stream die gleiche Dauer haben; Die vom DMO ausgegebenen Stichproben sind jedoch nicht gleich lang, sodass die vom AVI-Splitter angewendeten Zeitstempel nicht korrekt sind. Daher ist es nicht möglich, ohne den AVI-Splitter oder den Audiodecoder DMO zu ändern, eine DirectShow-basierte Anwendung zu verwenden, um AVI-Dateien mit synchronisierten Audio- und Videodatenströmen wiederzugeben. Der Windows Media Audio 9 Voice-Codec funktioniert in einigen Fällen, aber selbst dies verliert die Synchronisierung nach jedem Suchvorgang, sodass er nicht als praktikable Lösung angesehen werden kann.

Wenn Sie über einen MP3-Encoder verfügen, können Sie AVI-Dateien mit WMV und MP3 für den Audiostream erstellen. Solche Dateien werden in Windows Medienwiedergabe und anderen DirectShow-basierten Anwendungen wiedergegeben und ordnungsgemäß gesucht, da der AVI Splitter speziellen Verarbeitungscode für MP3-Streams enthält. Eine weitere Möglichkeit besteht darin, unkomprimiertes PCM-Audio zu verwenden, obwohl die resultierende Dateigröße offensichtlich viel größer ist als bei einem komprimierten Audiodatenstrom. Da die DirectShow-Beispielanwendung AVI-Dateien erstellt, wird nicht veranschaulicht, wie der Audioencoder DMO verwendet wird.

One-Pass-Codierung

Der Videoencoder DMO funktioniert problemlos in DirectShow für zwei Codierungsmodi: CBR und qualitätsbasierte VBR. Solange Sie beim Erstellen des Filterdiagramms die richtige Reihenfolge der Vorgänge befolgen, wie in der Beispielanwendung gezeigt, ist es relativ einfach, WMV-Inhalte mithilfe des AVI-Multiplexers und des Dateischreibers in eine AVI-Datei zu platzieren.

Zwei-Pass-Codierung

Die Codierungsmodi mit zwei Durchlauf erfordern einen komplexeren Ansatz zum Erstellen und Streamen von Diagrammen, um zu verhindern, dass der DMO seine Inhalte aus dem ersten Durchlauf vor Beginn des zweiten Durchlaufs leert. Bei der Codierung mit zwei Durchläufen ist es erforderlich, den Graphen einmal auszuführen, damit der DMO seine Vorverarbeitungsanalyse der Dateidaten durchführen kann, und dann den Graphen zurückspulen und erneut ausführen kann, damit die DMO die tatsächliche Codierung durchführen kann.

Wenn der Graph für den zweiten Durchlauf in einen Ausführungszustand wechselt, legt der DMO-Wrapper das Diskontinuitätsflag für das erste Beispiel fest, da der Zeitstempel nicht sequenziell mit dem letzten Zeitstempel beim ersten Durchlauf ist. Wenn die DMO, die nicht für die Verwendung in DirectShow auf diese Weise konzipiert wurde, das Diskontinuitätsflag empfängt, führt sie eine Leerung durch und verliert die beim ersten Durchlauf gespeicherten Daten. Um dieses Problem zu umgehen, besteht die beste Lösung wahrscheinlich darin, einen benutzerdefinierten DMO-Wrapperfilter zu schreiben, der das DISKONTINUITÄTsflag nicht festgelegt, wenn das Diagramm nach dem ersten Durchlauf gesucht wird. Im Beispiel Video für Windows (VfW) in diesem SDK wird veranschaulicht, wie die Zwei-Pass-Codierung ausgeführt wird.

Interlaced Content

Der WMV-Encoder DMO ist in der Lage, Interlaced-Inhalte zu codieren, während die Interlacing beibehalten wird. Dies ist nützlich für Inhalte, die von einem Fernseher erfasst werden und möglicherweise auch auf einem Fernseher wiedergegeben werden. Es ist jedoch nicht möglich, interlacing mit dem standardmäßigen DMO-Wrapper beizubehalten, da dieser Filter INSSBuffer in seinen Eingabebeispielen nicht unterstützt.

Der DMO verwendet diese Schnittstelle, um die Interlaced-Einstellungen für jedes Beispiel abzurufen, das er empfängt. Wenn die Schnittstelle nicht gefunden wird, wie dies beim DMO-Wrapper der Fall ist, behandelt der DMO die Eingabebeispiele einfach als nicht interlaced. Um die Interlaced-Codierung in DirectShow auszuführen, gibt es mehrere Alternativen. Der einfachste Ansatz besteht wahrscheinlich darin, das Windows Media Format 9 Series SDK entweder direkt oder den WM ASF Writer DirectShow-Filter zu verwenden, um eine INTERLAC-ASF-Datei zu erstellen. Anschließend können Sie diese Datei in ein anderes Format transcodieren. Wenn Sie in AVI transcodieren, verfügen Sie über eine Interlac-Datei, aber die Standardmäßigen DirectShow AVI-Wiedergabefilter erkennen sie nicht als solche, da sie VIDEOINFOHEADER2 nicht unterstützen. Ein weiterer Ansatz besteht darin, einen eigenen DMO-Wrapperfilter zu schreiben, der die INSSBuffer-Schnittstelle unterstützt.

Arbeiten mit Codec-DMOs