So schreiben Sie Beispiele
Wenn Sie die Eingaben für die geschriebene Datei identifiziert und konfiguriert haben, können Sie mit der Übergabe von Beispielen an den Writer beginnen. Sie sollten Beispiele nach Möglichkeit in der Reihenfolge der Präsentation übergeben, um den Schreibvorgang effizienter zu gestalten.
Vor dem Übergeben von Beispielen müssen Sie festlegen, dass der Writer sie akzeptiert, indem Sie IWMWriter::BeginWritingaufrufen.
Führen Sie die folgenden Schritte aus, um ein Beispiel an den Writer zu übergeben:
- Ordnen Sie einen Puffer zu, und rufen Sie einen Zeiger auf die INSSBuffer-Schnittstelle ab, indem Sie IWMWriter::AllocateSampleaufrufen.
- Rufen Sie die Adresse des in Schritt 1 erstellten Puffers ab, indem Sie INSSBuffer::GetBufferaufrufen.
- Kopieren Sie Ihre Beispieldaten an den Pufferspeicherort, und stellen Sie sicher, dass das übergebene Beispiel in den zugeordneten Puffer passt. Sie können eine beliebige Speicherkopierfunktion verwenden, um Ihre Daten zu kopieren. Eine gängige Wahl ist memcpy, die in der C-Standardlaufzeitbibliothek enthalten ist.
- Aktualisieren Sie die Im Puffer verwendete Datenmenge, um die tatsächliche Größe des Beispiels widerzuspiegeln, indem Sie INSSBuffer::SetLengthaufrufen.
- Übergeben Sie die Pufferschnittstelle zusammen mit der Eingabenummer und der Beispielzeit mithilfe der IWMWriter::WriteSample-Methode an den Writer. Alle Audiobeispiele für eine Eingabe stellen die gleiche Dauer des Inhalts dar, sodass Sie die Abtastzeit ermitteln können, indem Sie die Samplingdauer einem laufenden Gesamtwert hinzufügen. Für Videos müssen Sie die Zeit basierend auf der Bildfrequenz berechnen.
WriteSample funktioniert asynchron und beendet möglicherweise nicht das Schreiben der Daten aus dem Puffer, bevor Ihre Anwendung bereit ist, die Methode erneut aufzurufen. Daher ist es wichtig, AllocateSample einmal für jeden Aufruf von WriteSample aufzurufen. Sie können die INSSBuffer-Schnittstelle jedoch sofort nach dem Aufruf von WriteSample freigeben.
Wenn Sie die Übergabe von Beispielen abgeschlossen haben, rufen Sie IWMWriter::EndWritingauf.
Hinweis Es ist wichtig, dass Stichproben aus allen Datenströmen in der Datei in Synchronisierung miteinander an den Writer übergeben werden. Das heißt, wenn möglich, sollten Sie Stichproben in der Präsentationszeitreihenfolge innerhalb der in IWMWriterAdvanced::SetSyncToleranceangegebenen Synchronisierungstoleranz an den Writer übergeben. Die besten Ergebnisse werden erzielt, wenn Daten in Einheiten von einer Sekunde oder weniger an jeden Stream übermittelt werden.
Streams sollte ebenfalls ungefähr zur gleichen Zeit enden. Beispielsweise sollten Sie keine Datei mit einem Audiostream mit einer Länge von 45 Sekunden und einem Videostream mit einer Länge von 50 Sekunden schreiben. Wenn Sie eine solche Datei mit unveränderten Eingaben codieren, werden einige der Audiodaten am Ende des Streams gelöscht (obwohl es sich um den kürzeren Stream handelt). Damit die Dateicodierung funktioniert, sollten Sie der Audioeingabe fünf Sekunden Stille hinzufügen, damit ein Stream nicht mehrere Sekunden vor einem anderen endet. Es ist nicht erforderlich, dass Datenstromtypen mit zeitweiligen Stichproben wie Text- oder Bildstreams auf diese Weise aufgefüllt werden. Skriptbefehlsstreams sollten auch all diesen Regeln folgen.