Freigeben über


So erstellen Sie ASF-Dateien mithilfe von Drittanbietercodecs

[Das dieser Seite zugeordnete Feature Windows Media Format 11 SDK ist ein Legacyfeature. Es wurde von Source Reader und Sink Writer abgelöst. Source Reader und Sink Writer wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit quellleser und Senkenschreiber anstelle des Windows Media Format 11 SDK verwendet. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

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 einen codec verwenden, der in diesem SDK enthalten ist, 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 mit dem in Schritt 1 verwendeten Codec codierten Inhalt zu identifizieren.
  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 den wichtigsten 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 KOMPONENTEN der SDK-Laufzeit überprüfen die Werte des Bitraten-/Pufferfensters und löschen bei Bedarf Beispiele, damit die angegebenen Daten in diese Werte 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 in der WMVIDEOINFOHEADER-Struktur 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 der Untertyp GUID wie folgt: 54455354-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
  4. Erstellen Sie ein Writer-Objekt, und laden Sie das im vorherigen Schritt erstellte Profil. Weitere Informationen zum Schreiben von Dateien finden Sie unter Schreiben von ASF-Dateien.
  5. Durchlaufen Sie die Eingaben der Datei, und weisen Sie ihnen wie gewohnt Eingabeeigenschaften zu. 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 mit 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 Beispiel-Dekomprimierung für den Stream verarbeiten.

Einfügen 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) im ASF-Dateicontainer zu platzieren.

 

Das Writer-Objekt erfordert, dass alle Eingabebeispiele Über Zeitstempel verfügen, und es wird davon ausgegangen, dass jedes Eingabebeispiel eine Präsentationszeit hat, die später als das vor dem Eingabebeispiel liegt. Während praktisch alle unkomprimierten Videos und sogar einige komprimierte Videostreams diese Bedingungen erfüllen, erfüllen MPEG-2-Streams dies nicht. In MPEG-2 sind nicht alle Beispiele mit Zeitstempel versehen, und wenn B-Frames vorhanden sind, entspricht die Reihenfolge der Beispieldecodierung nicht der Renderingreihenfolge. Wenn das Writer-Objekt auf Nichtreihenfolgen von Stichproben stößt, werden diese in der "richtigen" Reihenfolge neu angeordnet. 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 (DUE) mit fester Größe hinzu, die eine Struktur enthält, die die tatsächlichen MPEG-Zeitstempel-Start- und Stoppzeitwerte für das Beispiel enthält. Verwenden Sie -1 für diese Werte, wenn das Beispiel keinen Zeitstempel aufweist.
  2. Weisen Sie dem Writer-Objekt "dummy" Eingabezeitstempel zu, die immer größer werden, damit die Beispiele in der gleichen Reihenfolge in die 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 Dummyzeitstempel bilden den suchenden Zeitleiste. Wenn sie also relativ zu den Echtzeitstempeln abweichen, führen Suchvorgänge für die Datei zu unerwarteten Ergebnissen. Eine begrenzte Menge an Jitter zwischen den Stichprobenzeiten wirkt sich jedoch nicht ernsthaft auf Suchvorgänge aus.

Beim Lesen der Datei:

  • Untersuchen Sie für jedes Beispiel, das aus der Datei gelesen wird, das DUE.For each sample read from the file, examine the DUE. Wenn sie eine Startzeit enthält, die größer als oder gleich 0 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 wird dazu IMediaSample::SetTime(NULL,NULL) aufgerufen.

Puffern von Inhalten

IWMWriter-Schnittstelle

IWMWriterAdvanced-Schnittstelle

So übermitteln Sie komprimierte Beispiele mit dem asynchronen Reader

So rufen Sie Streambeispiele mit dem synchronen Reader ab

WMVIDEOINFOHEADER

Arbeiten mit Profilen

Schreiben von ASF-Dateien