Aby utworzyć pliki ASF przy użyciu kodeków innych firm
[Funkcja skojarzona z tą stroną, windows Media Format 11 SDK, jest starszą funkcją. Został zastąpiony przez Odczytywanie źródła i Zapisnik źródła . Source Reader i Sink Writer 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.]
Możesz użyć zestawu SDK formatu Windows Media do tworzenia plików ASF, które zawierają media cyfrowe zakodowane dowolnym wybranym kodekiem. W przypadku używania kodu innego niż koder dołączony do tego zestawu SDK należy wykonać następujące kroki.
- Zakoduj zawartość za pomocą żądanego kodera.
- Znajdź lub utwórz wartość identyfikatora GUID, aby zidentyfikować zawartość zakodowaną przy użyciu kodeka użytego w kroku 1.
- Utwórz nowy profil lub zmodyfikuj istniejący profil do użycia z zakodowaną zawartością.
- Utwórz strumień dla zakodowanej zawartości z odpowiednim typem głównym. Aby uzyskać więcej informacji na temat głównych typów multimediów, zobacz Typy multimediów. Użyj identyfikatora GUID określonego w kroku 2 jako podtypu nośnika.
- Ustaw szybkość transmisji bitów i okno buforu dla strumienia na wartości, które nie spowodują przepełnienia buforu. W momencie kodowania powinno być możliwe uzyskanie tych wartości z kodera. Składniki środowiska uruchomieniowego zestawu SDK sprawdzają wartości okien przepływności bitów/buforu i w razie potrzeby odrzucają próbki, aby dane były zgodne z tymi wartościami. Jeśli ustawisz wartości niepoprawnie, plik nie będzie prawidłowo przesyłany strumieniowo, co spowoduje słabe odtwarzanie.
- W przypadku strumieni wideo należy ustawić człon biCompression struktury BITMAPINFOHEADER zawartej w strukturze WMVIDEOINFOHEADER na odpowiednią wartość FOURCC dla zawartości. Ta wartość musi być równa pierwszym czterem bajtom identyfikatora GUID podtypu. Jeśli na przykład biCompression to MAKEFOURCC('T','E','S','T')=0x54455354, identyfikator GUID podtypu rozpocznie się następująco: 54455354-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
- Utwórz obiekt pisarza i załaduj profil utworzony w poprzednim kroku. Aby uzyskać więcej informacji na temat pisania plików, zobacz Zapisywanie plików ASF.
- Iteruj po wejściach pliku i przypisz właściwości wejściowe dla każdego tak, jak zwykle. Aby uzyskać więcej informacji na temat danych wejściowych, zobacz Praca z danymi wejściowymi. W przypadku strumienia zakodowanego przy użyciu kodeka innej firmy ustaw wskaźnik interfejsu IWMInputMediaProps na NULL przed wywołaniem IWMWriter::BeginWriting.
- Użyj nowego profilu utworzonego w poprzednim kroku, aby zapisać plik. Przekaż skompresowane przykłady przy użyciu IWMWriterAdvanced::WriteStreamSample zamiast IWMWriter::WriteSample. W przypadku wideo należy określić, które klatki są kluczowe, poprzez przekazanie WM_SF_CLEANPOINT jako parametru dwFlags.
Aby przetworzyć i zdekompresować strumień zakodowany za pomocą kodera codec innej firmy, należy odczytać skompresowane próbki strumienia. Twoja aplikacja do czytania musi również obsługiwać dekompresję próbek dla strumienia.
Umieszczanie strumieni MPEG-2 w ASF
Notatka
Ten temat dotyczy aplikacji korzystających z zestawu Windows Media Format SDK do umieszczenia mpeg-2 (lub innych formatów kompresji korzystających z ramek B) do kontenera plików ASF.
Obiekt zapisywania wymaga, aby wszystkie próbki danych wejściowych miały sygnatury czasowe i zakłada, że każda próbka danych wejściowych ma czas prezentacji później niż ten, który go poprzedzał. Chociaż praktycznie wszystkie nieskompresowane wideo, a nawet niektóre skompresowane strumienie wideo spełniają te warunki, strumienie MPEG-2 nie. W formacie MPEG-2 nie wszystkie próbki są oznaczone sygnaturą czasową, a gdy są obecne ramki B, kolejność dekodowania próbki nie jest taka sama jak kolejność renderowania. Kiedy obiekt zapisu napotka próbki w niewłaściwej kolejności, ustawia je w "poprawnej" kolejności. W związku z tym, aby strumienie MPEG-2 przechowywać natywnie (nie dekodowane) w kontenerze ASF, należy wykonać następujące kroki:
Podczas zapisywania pliku:
- Dodaj rozszerzenie jednostki danych o stałym rozmiarze (DUE) do każdej próbki wejściowej, które będzie przechowywać strukturę zawierającą rzeczywiste wartości czasu rozpoczęcia i zakończenia znacznika czasowego MPEG dla próbki. Użyj -1 dla tych wartości, jeśli próbka nie ma sygnatury czasowej.
- Nadaj obiektowi zapisywania fikcyjne sygnatury czasowe, które są zawsze rosnące, aby mógł zapisywać próbki do pliku w dokładnie takiej samej kolejności, w jakiej są odbierane. Fikcyjne sygnatury czasowe powinny w przybliżeniu odpowiadać rzeczywistym czasom prezentacji, uśrednionym w czasie. Fikcyjne sygnatury czasowe będą tworzyć szukaną oś czasu, więc jeśli będą one rozbieżne względem sygnatur czasu rzeczywistego, operacje wyszukiwania w pliku spowodują nieoczekiwane wyniki. Jednak ograniczona ilość drgań między czasami próby nie wpłynie poważnie na działanie operacji wyszukiwania.
Podczas odczytywania pliku:
- Dla każdej próbki odczytanej z pliku sprawdź DUE. Jeśli zawiera godzinę rozpoczęcia większą lub równą zero, skopiuj ją do sygnatury czasowej dla próbki wyjściowej, zanim zostanie dostarczona do dekodera. Ustaw wszystkie inne sygnatury czasowe dla przykładów wyjściowych na wartość null. W programie DirectShow jest to wykonywane przez wywołanie IMediaSample::SetTime(null,null).
Tematy pokrewne
-
dostarczenie skompresowanych próbek za pomocą czytnika asynchronicznego
-
aby pobrać przykłady strumienia za pomocą synchronicznego czytnika