Udostępnij przez


Konfigurowanie obiektu rozdzielającego ASF

Obiekt rozdzielacz ASF jest obiektem warstwy WMContainer, który analizuje obiekt danych ASF pliku Formatu zaawansowanych systemów (ASF). Po utworzeniu demultipleksera i zainicjowaniu jego działania w celu analizy obiektu danych ASF pliku multimedialnego, należy skonfigurować go tak, aby generował próbki dla określonych strumieni. Wywołaj IMFASFSplitter::SelectStreams, aby wybrać wymagane strumienie.

Opcjonalnie aplikacja może również skonfigurować ją do generowania przykładów w odwrotnej kolejności lub generowania przykładów dla chronionej zawartości. Aby ustawić te opcje, wywołaj IMFASFSplitter::SetFlags i przekaż wymaganą kombinację bitową obsługiwanych flag. Przed wywołaniem tej metody klient musi pomyślnie wykonać wywołanie IMFASFSplitter::Initialize; w przeciwnym razie SetFlags kończy się niepowodzeniem z kodem błędu MF_E_NOT_INITIALIZED. Aby uzyskać informacje na temat inicjowania rozdzielacza, zobacz Tworzenie obiektu rozdzielacza ASF.

Aby sprawdzić, czy ta flaga jest obecnie ustawiona na rozdzielacz, wywołaj metodę IMFASFSplitter::GetFlags.

Wybieranie strumieni na potrzeby analizowania

Podczas procesu inicjowania za pośrednictwem wywołania IMFASFSplitter::Initialize, splitter określa liczbę strumieni i identyfikatorów strumieni w pliku ASF. Domyślnie żadne strumienie nie są wybierane przez rozdzielacz. Aplikacja musi wybrać strumienie, wywołując IMFASFSplitter::SelectStreams. Ta metoda przyjmuje tablicę numerów strumieni. Aby uzyskać numer strumienia, wywołaj IMFASFProfile::GetStream w profilu ASF lub wywołaj IMFStreamDescriptor::GetStreamIdentifier w deskryptorze strumienia. (Możesz uzyskać zarówno profil ASF, jak i deskryptor strumienia z obiektu ContentInfo). Jeśli klient przekazuje numer strumienia, który nie jest rozpoznawany przez rozdzielacz, kończy się niepowodzeniem z błędem MF_E_INVALIDSTREAMNUMBER.

Wywołanie SelectStreams usuwa poprzednie wybory. Nie wybrano żadnego strumienia, który nie jest określony w tablicy. Aby uzyskać listę aktualnie wybranych strumieni, wywołaj metodę IMFASFSplitter::GetSelectedStreams. Ta metoda przyjmuje wskaźnik do tablicy, którą metoda wypełnia numerami strumienia. Jeśli rozmiar tablicy jest mniejszy niż liczba wybranych strumieni, metoda kończy się niepowodzeniem z powodu błędu MF_E_BUFFERTOOSMALL. W tym przypadku metoda zwraca liczbę wybranych strumieni w parametrze pwNumStreams. Następnie możesz użyć tego numeru, aby przydzielić tablicę poprawnego rozmiaru i wywołać metodę ponownie.

Aby zobaczyć przykładowy kod, zobacz artykuł "Select a Stream for Parsing" ("Wybieranie strumienia do analizowania") w Tutorial: Reading an ASF File.

Ustawienie odtwarzania odwrotnego

Podczas procesu inicjalizacji rozdzielacza określa się, czy zawartość ASF obsługuje odtwarzanie wstecz. Jeśli tak, można skonfigurować rozdzielacz do generowania próbek w odwrotnej kolejności, ustawiając flagę MFASF_SPLITTER_REVERSE. Jeśli zawartość nie obsługuje odtwarzania odwrotnego, IMFASFSplitter::SetFlags zwraca MF_E_INVALIDREQUEST, ale flaga jest ustawiona na splitter.

Jeśli rozdzielacz jest skonfigurowany do analizowania w odwrotnym kierunku, splitter zawsze rozpoczyna analizowanie na końcu buforu zawierającego obiekt danych ASF. W związku z tym w przypadku odwrotnego analizowania przesunięcie danych i długość danych do przetworzenia należy odpowiednio ustawić. Aby uzyskać informacje na temat ustawiania prawidłowych wartości, zobacz Generowanie przykładów strumienia z istniejącego obiektu danych ASF.

Ustawienie chronionej zawartości

Rozdzielacz można skonfigurować do pracy z zawartością szyfrowania na poziomie pakietów, ustawiając MFASF_SPLITTER_WMDRM za pomocą IMFASFSplitter::SetFlags. Spowoduje to, że rozdzielacz dostarczy przykłady zawartości chronionej przez usługę Windows Media Digital Rights Management (DRM). Po ustawieniu tej flagi próbki wygenerowane przez rozdzielacz zawierają informacje wymagane do odszyfrowania danych multimedialnych i rekonstrukcji ramek, takich jak atrybut MFSampleExtension_PacketCrossOffsets. Ten atrybut jest obiektem blob zawierającym tablicę DWORDs. Każda DWORD zapewnia granice ładunku dla ramki względem początku ramki. Jeśli atrybut ten nie jest obecny, ramka znajduje się w jednym pakiecie. Zazwyczaj próbki generowane przez przekaźnik zawierają wiele multimedialnych buforów, aplikacja może skopiować wszystkie bufory do jednego ciągłego buforu, wywołując IMFSample::ConvertToContiguousBuffer. Wynikowy bufor zawiera szkielet, a wartość atrybutu zawiera przesunięcia w ramach tego bufora.

rozdzielacz ASF