Udostępnij za pośrednictwem


Aby napisać przykłady

[Funkcja skojarzona z tą stroną, windows Media Format 11 SDK, jest starszą funkcją. Został zastąpiony przez Source Reader i Sink Writer. czytnik źródła i zapisywanie danych wyjścia zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał czytnika źródeł i modułu zapisywania ujścia zamiast zestawu SDK Windows Media Format 11 , jeśli jest to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Po zidentyfikowaniu i skonfigurowaniu danych wejściowych dla zapisywanego pliku można rozpocząć przekazywanie przykładów do zapisującego. Jeśli to możliwe, należy przekazać przykłady w kolejności czasu prezentacji, aby proces pisania był bardziej wydajny.

Przed przekazaniem jakichkolwiek próbek należy ustawić moduł zapisujący tak, aby je akceptował, wywołując IWMWriter::BeginWriting.

Aby przekazać próbkę do modułu zapisywania, wykonaj następujące kroki:

  1. Przydziel bufor i pobierz wskaźnik do interfejsu INSSBuffer, wywołując IWMWriter::AllocateSample.
  2. Pobierz adres buforu utworzonego w kroku 1, wywołując INSSBuffer::GetBuffer.
  3. Skopiuj przykładowe dane do lokalizacji buforu, upewniając się, że próbka przekazana będzie mieścić się w przydzielonym buforze. Do skopiowania danych można użyć dowolnej funkcji kopiowania pamięci. Typowym wyborem jest memcpy, który jest zawarty w standardowej bibliotece C.
  4. Zaktualizuj ilość danych używanych w buforze, aby odzwierciedlić rzeczywisty rozmiar próbki, wywołując INSSBuffer::SetLength.
  5. Przekaż interfejs buforu do składnika zapisywania wraz z numerem wejściowym i czasem próbkowania przy użyciu metody IWMWriter::WriteSample. Wszystkie próbki audio dla danych wejściowych reprezentują ten sam czas trwania zawartości, więc możesz określić czas próbki, dodając czas trwania próbki do bieżącej sumy. W przypadku wideo należy obliczyć czas na podstawie szybkości klatek.

writeSample działa asynchronicznie i może nie zakończyć zapisywania danych z buforu, zanim aplikacja będzie gotowa ponownie wywołać metodę. Dlatego ważne jest, aby wywołać AllocateSample raz dla każdego wywołania WriteSample. Można jednak zwolnić interfejs INSSBuffer bezpośrednio po wywołaniu WriteSample.

Po zakończeniu przesyłania próbek wywołaj IWMWriter::EndWriting.

Uwaga Ważne jest, aby próbki ze wszystkich strumieni w pliku były przekazywane do mechanizmu zapisującego w wzajemnej synchronizacji. Oznacza to, że zawsze, gdy to możliwe, należy przekazywać próbki do modułu zapisywania zgodnie z kolejnością czasową prezentacji, w granicach tolerancji synchronizacji określonej w IWMWriterAdvanced::SetSyncTolerance. Najlepsze wyniki są osiągane, gdy dane są dostarczane do każdego strumienia w jednostkach nie dłuższych niż jedna sekunda.

Strumienie powinny również kończyć się w przybliżeniu w tym samym czasie. Na przykład nie należy pisać pliku ze strumieniem audio o długości 45 sekund i strumieniem wideo o długości 50 sekund. Jeśli kodujesz taki plik z niezmienionymi danymi wejściowymi, niektóre dane audio na końcu strumienia zostaną utracone (mimo że jest to krótszy strumień). Aby kodowanie pliku działało, należy dodać 5 sekund ciszy do danych wejściowych audio, aby jeden strumień nie kończył się kilka sekund przed drugim. Nie jest konieczne, aby typy strumieni z przerywanymi próbkami, takimi jak strumienie tekstowe czy obrazowe, były w ten sposób uzupełniane. Strumienie poleceń skryptu powinny również przestrzegać wszystkich tych reguł.

INSSBuffer Interfejs

Interfejs IWMWriter

Zapisywanie plików ASF