Kopieren von Streams ohne Dekomprimieren der Daten
Die einfachste und gängigste Methode zum Kopieren eines Streams aus einer Datei in eine andere besteht im Abrufen der Beispiele im komprimierten Zustand und anschließenden Schreiben in die neue Datei, ohne sie zu dekomprimieren und erneut zu dekomprimieren. Beispiele, die aus einer Datei in ihrem komprimierten Zustand erhalten werden, werden als Streambeispiele bezeichnet, da sie von ihrer Darstellung im Stream nicht geändert werden. Es wird empfohlen, Datenströme immer mithilfe von Streambeispielen zu kopieren, da das Dekomprimieren und Erneute Dekomprimieren digitaler Mediendaten die Qualität beeinträchtigt. Wenn Sie einen Stream aus dekomprimierten Daten kopieren müssen, finden Sie weitere Informationen unter Copying Streams Using Decompressed Samples (Kopieren von Daten mit dekomprimierten Beispielen).
Es ist möglich, zwei oder mehr Datenströme mithilfe komprimierter Stichproben in einem einzelnen Stream zu verketten, jedoch nur, wenn die Bitraten identisch sind. Der Prozess ist im Wesentlichen mit den unten beschriebenen Schritten identisch, mit der Ausnahme, dass Sie mehrere Originaldateien lesen müssen, um alle benötigten Inhalte zu erhalten. Sie können jedoch nur komprimierte Stichproben aus mehreren Dateien in einen einzelnen Stream schreiben, wenn die WM _ MEDIA _ TYPE-Strukturen (einschließlich aller pbFormat-Strukturmitglieder) aller komprimierten Datenströme identisch sind. Um Daten aus mehreren Streams zu kombinieren, die nicht das gleiche Format haben, müssen Sie den Inhalt dekomprimieren und in den Zielstream erneut dekomprimieren. Darüber hinaus müssen Sie beim Kombinieren von Daten aus zwei oder mehr Streams in einem einzelnen Stream die Pufferfensterwerte für alle Streams hinzufügen, um das Pufferfenster für den neuen Stream zu erhalten. Dies liegt daran, dass es unmöglich ist zu bestimmen, wie viel des Puffers am Ende eines Streams und am Anfang eines anderen Datenstroms aufgenommen wird.
Sie können Streambeispiele mit dem asynchronen Reader mithilfe von IWMReaderAdvanced::SetReceiveStreamSamples abrufen. Streambeispiele werden an IWMReaderCallbackAdvanced::OnStreamSampleund nicht an IWMReaderCallback::OnSample übermittelt. Wenn Sie eine Datei lesen und einige komprimierte und dekomprimierte Streams abrufen, müssen Sie beide Rückrufmethoden implementieren.
Der synchrone Reader bietet mehr Flexibilität beim Abrufen von Beispielen. Sie können mitHILFE von IWMSyncReader::SetReadStreamSamplesfrei zwischen komprimierten und dekomprimierten Beispielen während der Wiedergabe wechseln.
Führen Sie die folgenden Schritte aus, um einen gesamten Stream aus einer ASF-Datei in eine neue ASF-Datei zu kopieren. Diese Schritte verwenden den synchronen Reader, da es viel einfacher ist, für diese Art von Vorgang zu verwenden.
- Erstellen Sie ein synchrones Readerobjekt, indem Sie die WMCreateSyncReader-Funktion aufrufen.
- Öffnen Sie eine Datei im Reader mit einem Aufruf von IWMSyncReader::Open.
- Rufen Sie einen Zeiger auf die IWMProfile-Schnittstelle des synchronen Readerobjekts ab, indem Sie IWMSyncReader::QueryInterface aufrufen.
- Rufen Sie die Eigenschaften des gewünschten Streams ab, indem Sie IWMProfile::GetStreamByNumber aufrufen. Dadurch wird ein Zeiger auf die IWMStreamConfig-Schnittstelle des Streamkonfigurationsobjekts für den Stream abgerufen, den Sie wünschen.
- Hier erhalten Sie eine Kopie der WM _ MEDIA _ TYPE-Struktur für den Stream. Führen Sie zwei Aufrufe von IWMMediaProps::GetMediaTypeaus: der erste aufruft die Größe der Struktur, den zweiten, um die Struktur selbst zu erhalten.
- Erstellen Sie ein Profil-Manager-Objekt, indem Sie die WMCreateProfileManager-Funktion aufrufen.
- Rufen Sie IWMProfileManager::CreateEmptyProfile auf, um ein neues Profil zu erstellen (oder öffnen Sie ein vorhandenes Profil, dem Sie den Stream hinzufügen möchten). Rufen Sie IWMProfile::AddStream für das neue Profil auf, um den Stream aus der vorhandenen Datei hinzuzufügen. Verwenden Sie beim Hinzufügen des Streams den IN Schritt 4 erhaltenen IWMStreamConfig-Zeiger.
- Erstellen Sie ein Writerobjekt mit einem Aufruf der WMCreateWriter-Funktion. Legen Sie das neu erstellte Profil als aktives Profil im Writer fest, indem Sie IWMWriter::SetProfile aufrufen. Erstellen Sie eine Datei für die Ausgabe, indem Sie IWMWriter::SetOutputFilename aufrufen.
- Rufen Sie für jede Eingabe, die dem Stream oder den Streams zugeordnet ist, die Sie kopieren, IWMWriter::SetInputPropsauf, und übergeben Sie NULL für die IWMInputMediaProps-Schnittstelle. Dadurch wird das Writer-Objekt darüber informiert, dass es die übergebenen Daten nicht überprüfen muss. Sie müssen diesen Aufruf vor dem Aufrufen von BeginWriting (Schritt 14) erstellen. Andernfalls kann ein Leseobjekt den Inhalt möglicherweise nicht decodieren.
- Legen Sie den synchronen Reader fest, um komprimierte Streambeispiele für den ausgewählten Stream zu liefern, indem Sie IWMSyncReader::SetReadStreamSamples aufrufen, während der Parameter fCompressed auf True festgelegt ist.
- Abrufen von Codecinformationen für jeden kopierten Stream und Hinzufügen der Codecinformationen zum Header vor dem Schreiben. Um die Codecinformationen zu erhalten, rufen Sie IWMHeaderInfo2::GetCodecInfoCount und IWMHeaderInfo2::GetCodecInfo auf, um die Codecs zu aufzählen, die der Datei im Reader zugeordnet sind. Wählen Sie die Codecinformationen aus, die der Streamkonfiguration entspricht. Legen Sie dann die Codecinformationen im Writer fest, indem Sie IWMHeaderInfo3::AddCodecInfoaufrufen und die vom Reader erhaltenen Informationen übergeben.
- Rufen Sie einen Zeiger auf die IWMWriterAdvanced-Schnittstelle ab, indem Sie IWMWriter::QueryInterface aufrufen.
- Legen Sie den Writer auf den Schreibmodus fest, indem Sie IWMWriter::BeginWriting aufrufen.
- Führen Sie wiederholte Aufrufe an IWMSyncReader::GetNextSampleaus, und geben Sie dabei die gewünschte Streamnummer an. Wenn Beispiele empfangen werden, übergeben Sie sie mit Aufrufen von IWMWriterAdvanced::WriteStreamSamplean den Writer. Für Videostreams sollten Sie die Flags (sofern diese vom Writer bei jedem Aufruf von GetNextSample festgelegt werden) überprüfen. Wenn WM SF CLEANPOINT festgelegt ist, müssen Sie es auch bei Ihrem Aufruf von _ _ WriteStreamSample festlegen.
- Wenn das Lesen abgeschlossen ist, rufen Sie IWMWriter::EndWriting auf. Der Stream sollte übertragen werden.
Hinweis
Bildstreams können nicht mithilfe von Streambeispielen aus einer Datei in eine andere kopiert werden. Um Bilddatenstromdaten zu kopieren, rufen Sie die Beispiele unkomprimiert ab und verarbeiten sie dann wie gewohnt über den Writer.