So erstellen Sie ASF-Dateien mithilfe von Codecs von Drittanbietern

Sie können das Windows Media Format SDK verwenden, um ASF-Dateien zu erstellen, die digitale Medien enthalten, die mit einem beliebigen Codec codiert sind. Wenn Sie einen anderen Codec als den in diesem SDK enthaltenen verwenden, müssen Sie die folgenden Schritte ausführen.

  1. Codieren Sie den Inhalt mit dem gewünschten Codec.
  2. Suchen oder erstellen Sie einen GUID-Wert, um Inhalte zu identifizieren, die mit dem in Schritt 1 verwendeten Codec codiert wurden.
  3. Erstellen Sie ein neues Profil, oder ändern Sie ein vorhandenes Profil für die Verwendung mit dem codierten Inhalt.
    • Erstellen Sie einen Stream für den codierten Inhalt mit dem entsprechenden Haupttyp. Weitere Informationen zu wichtigen Medientypen finden Sie unter Medientypen. Verwenden Sie die in Schritt 2 identifizierte GUID als Medienuntertyp.
    • Legen Sie die Bitrate und das Pufferfenster für den Stream auf Werte fest, die nicht zu einem Pufferüberlauf führen. Sie sollten diese Werte zum Zeitpunkt der Codierung aus dem Codec abrufen können. Die SDK-Laufzeitkomponenten überprüfen die Werte für bitrate/buffer window und verdringen bei Bedarf Stichproben, damit die angegebenen Daten mit diesen Werten in die Daten passen. Wenn Sie die Werte falsch festlegen, wird die Datei nicht ordnungsgemäß gestreamt, was zu einer schlechten Wiedergabe führt.
    • Für Videostreams müssen Sie den biCompression-Member der BITMAPINFOHEADER-Struktur, die in der WMVIDEOINFOHEADER-Struktur enthalten ist, auf den entsprechenden FOURCC-Wert für den Inhalt festlegen. Dieser Wert muss gleich den ersten vier Bytes der Untertyp-GUID sein. Wenn biCompression beispielsweise MAKEFOURCC('T','E','S','T')=0x54455354 ist, beginnt die UNTERTYP-GUID wie die folgende: 54455354-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
  4. Erstellen Sie ein Writer-Objekt, und laden Sie das profil, das Sie im vorherigen Schritt erstellt haben. Weitere Informationen zum Schreiben von Dateien finden Sie unter Schreiben von ASF-Dateien.
  5. Schleife durch die Eingaben der Datei und Zuweisen von Eingabeeigenschaften für jede wie gewohnt. Weitere Informationen zu Eingaben finden Sie unter Arbeiten mit Eingaben. Legen Sie für den mit einem Drittanbietercodec codierten Stream den IWMInputMediaProps-Schnittstellenzeiger auf NULL fest, bevor Sie IWMWriter::BeginWriting aufrufen.
  6. Verwenden Sie das im vorherigen Schritt erstellte neue Profil, um die Datei zu schreiben. Übergeben Sie die komprimierten Beispiele mitHILFE von IWMWriterAdvanced::WriteStreamSample anstelle von IWMWriter::WriteSample. Für Videos müssen Sie angeben, welche Beispiele Keyframes sind, indem Sie WM _ SF _ CLEANPOINT als dwFlags-Parameter übergeben.

Um den mit einem Drittanbietercodec codierten Stream zu verarbeiten und zu dekomprimieren, müssen Sie komprimierte Streambeispiele lesen. Ihre Leseanwendung muss auch die Beispieldekomprimierung für den Stream verarbeiten.

Verwenden von MPEG-2-Streams in ASF

Hinweis

Dieses Thema gilt für Anwendungen, die das Windows Media Format SDK verwenden, um MPEG-2 (oder andere Komprimierungsformate, die B-Frames verwenden) in den ASF-Dateicontainer zu integrieren.

Das Writer-Objekt erfordert, dass alle Eingabebeispiele Zeitstempel haben, und es wird davon ausgegangen, dass jede Eingabestichprobe eine Präsentationszeit nach der vorherigen hat. Obwohl praktisch alle unkomprimierten Videodatenströme und sogar einige komprimierte Videostreams diese Bedingungen erfüllen, ist dies bei MPEG-2-Streams nicht der Standard. In MPEG-2 werden nicht alle Stichproben mit einem Zeitstempel versehen, und wenn B-Frames vorhanden sind, ist die Reihenfolge der Beispieldecodierung nicht mit der Rendering reihenfolge identisch. Wenn das Writer-Objekt auf falsch geordnete Stichproben trifft, werden diese in der richtigen Reihenfolge neu geordnet. Daher müssen Sie die folgenden Schritte ausführen, um MPEG-2-Streams nativ (nicht decodiert) in einem ASF-Container zu speichern:

Beim Schreiben der Datei:

  1. Fügen Sie jedem Eingabebeispiel eine Dateneinheitserweiterung mit fester Größe (DUE) hinzu, die eine -Struktur enthält, die die tatsächlichen Mpeg-Zeitstempel-Startzeit- und Endzeitwerte für das Beispiel enthält. Verwenden Sie -1 für diese Werte, wenn das Beispiel über keinen Zeitstempel verfügt.
  2. Geben Sie dem Writerobjekt "Dummy"-Eingabezeitstempel, die immer zunehmen, sodass die Beispiele in genau der Reihenfolge in der Datei geschrieben werden, in der sie empfangen werden. Die Dummyzeitstempel sollten ungefähr den tatsächlichen Präsentationszeiten entsprechen, wie im Laufe der Zeit gemittelt. Die Zeitstempel der Dummys bilden die Zeitachse für die Suche. Wenn sie also relativ zu den Echtzeitstempeln abweichen, führen Suchvorgänge für die Datei zu unerwarteten Ergebnissen. Eine begrenzte Jittermenge zwischen den Beispielzeiten wirkt sich jedoch nicht schwer auf Suchvorgänge aus.

Beim Lesen der Datei:

  • Überprüfen Sie für jedes aus der Datei gelesene Beispiel due. Wenn sie eine Startzeit enthält, die größer oder gleich 0 (null) ist, kopieren Sie diesen Wert in den Zeitstempel für das Ausgabebeispiel, bevor er an den Decoder übermittelt wird. Legen Sie alle anderen Zeitstempel für die Ausgabebeispiele auf NULL fest. In DirectShow erfolgt dies durch Aufrufen von IMediaSample::SetTime(**NULL,**NULL).

Puffern von Inhalt

IWMWriter-Schnittstelle

IWMWriterAdvanced-Schnittstelle

So stellen Sie komprimierte Beispiele mit dem asynchronen Reader zur Verfügung

So rufen Sie Streambeispiele mit dem synchronen Reader ab

WMVIDEOINFOHEADER

Arbeiten mit Profilen

Schreiben von ASF-Dateien