Udostępnij za pośrednictwem


Źródło multimediów ASF

Program Media Foundation udostępnia źródło multimediów ASF, za pomocą którego aplikacja może reprezentować plik ASF w warstwie potoku architektury.

Aby odtworzyć plik ASF, aplikacja może użyć źródła multimediów ASF do uwzględnienia danych w potoku odtwarzania. W scenariuszu kodowania aplikacja może użyć źródła multimediów ASF jako źródła, aby przekonwertować na inny format lub przekonwertować plik o wyższej szybkości bitów na plik o niższej szybkości bitów bez zmieniania formatów. Źródło multimediów ASF musi być używane w warstwie potoku, czyli aplikacja musi używać sesji multimediów do kontrolowania operacji. Ten poziom dostępu umożliwia aplikacjom pobieranie zdarzeń, gdy trwa sesja multimediów. Aby uzyskać niższy poziom dostępu do zawartości asf, aplikacja musi używać składników ASF warstwy WMContainer.

Źródło multimediów ASF implementuje interfejs IMFMediaSource, który jest interfejsem ogólnym źródeł multimediów w programie Media Foundation. Podobnie jak każde inne źródło multimediów, źródło multimediów ASF udostępnia deskryptor prezentacji, który przede wszystkim opisuje obiekt nagłówka ASF. Ponadto źródło multimediów ASF udostępnia deskryptory strumienia, które reprezentują każdy strumień w zawartości multimedialnej. Aby uzyskać więcej informacji, zobacz struktura plików ASF.

Tworzenie źródła multimediów ASF

Aby utworzyć źródło multimediów ASF, aplikacja musi użyć Source Resolver. Aby utworzyć źródło multimediów ASF, aplikacja musi podać źródło, dla którego program rozpoznawania źródeł tworzy źródło multimediów ASF. Informacje źródłowe muszą być udostępniane przez określenie adresu URL pliku źródłowego lub strumienia bajtów zawierającego nośnik. Jeśli aplikacja zdecyduje się utworzyć źródło multimediów ASF, określając adres URL, musi wywołać IMFSourceResolver::CreateObjectFromURL dla operacji synchronicznej lub IMFSourceResolver::Begin... EndCreateObjectFromURL dla operacji asynchronicznej. Proces tworzenia źródła multimediów ze strumienia bajtów jest podobny. Aplikacja musi wywołać IMFSourceResolver::CreateObjectFromByteStream na potrzeby operacji synchronicznej lub IMFSourceResolver::Begin... EndCreateObjectFromBytestream dla operacji asynchronicznej. Te wywołania muszą określać MF_RESOLUTION_MEDIASOURCE w parametrze dwFlags. Aby uzyskać więcej informacji na temat korzystania z tej flagi, zobacz Using the Source Resolver (Używanie narzędzia rozpoznawania źródła).

Jeśli aplikacja określa adres URL, dla pliku lokalnego ciąg adresu URL może zawierać ścieżkę pliku multimedialnego lub może być poprzedzony ciągiem "file: "scheme". Rozszerzenie nazwy pliku musi mieć wartość ".asf", ".wm", L".wma" lub ".wmv". W przypadku pliku ASF w sieci program rozpoznawania źródeł tworzy źródło sieci , które używa źródła multimediów ASF.

Podczas procesu tworzenia obiektu program rozpoznawania źródła wyszukuje listę programów obsługi schematów i programów obsługi strumieni bajtów w rejestrze systemowym i ładuje najbliższą zgodną procedurę obsługi, która może analizować zawartość nośnika, a także utworzyć obiekt źródłowy nośnika poniżej. Niezależnie od metody użytej do utworzenia źródła multimediów (adresu URL i strumienia bajtów) narzędzie rozpoznawania źródła tworzy strumień bajtów i odczytuje zawartość nośnika źródłowego do strumienia bajtów. Aby uzyskać więcej informacji, zobacz Scheme Handlers and Byte-Stream Handlers.

Aby zapoznać się z przykładem kodu dotyczącym tworzenia źródła multimediów, zobacz Using the Source Resolver.

Ustawienia konfiguracji źródła multimediów ASF

Źródłowa funkcja rozpoznawania nazw zapytań dotyczących możliwości bazowego strumienia bajtów i określa, że operacje są dozwolone w nowo utworzonym źródle multimediów. Jedną z takich możliwości jest poszukiwanie. Jeśli operacja wyszukiwania jest dozwolona, aplikacja może określić tryb wyszukiwania używany przez źródło multimediów podczas poszukiwania określonego punktu w prezentacji.

Aplikacja może ustawić tryb wyszukiwania, aby źródło multimediów było używane podczas tworzenia obiektu. Po utworzeniu źródła multimediów ASF przy użyciu określonego trybu wyszukiwania nie można go modyfikować w źródle multimediów ani dynamicznie zmieniać podczas prezentacji. Wyszukiwanie preferencji jest określane jako właściwości w wywołaniu aplikacji do odpowiednich metod rozpoznawania źródła, które są używane do tworzenia źródła multimediów. Ten zestaw właściwości jest ustawiany w magazynie właściwości i przekazywany do parametru pProps. Jeśli te właściwości nie zostaną przekazane, funkcje źródła multimediów z ustawieniami domyślnymi. Aby uzyskać więcej informacji na temat ustawiania tych właściwości, zobacz Configuring a Media Source.

Jeśli wyszukiwanie jest dozwolone, źródło multimediów ASF obsługuje następujące tryby wyszukiwania:

  • Dokładne wyszukiwanie: W tym trybie źródło multimediów ASF opiera się na obiekcie indeksu ASF pliku ASF. Jeśli plik nie ma obiektu indeksu, dokładne wyszukiwanie jest wyłączone, a jeden z innych trybów jest używany w zależności od właściwości określonych przez aplikację, które są ustawione na źródle multimediów.
  • Przybliżone szukanie: Ten tryb jest żądany przez aplikację przez przekazanie MFPKEY_ASFMediaSource_ApproxSeek w magazynie właściwości do odpowiednich metod rozpoznawania źródła. Jednak przybliżone wyszukiwanie jest używane tylko wtedy, gdy strumień bajtów nie obsługuje wyszukiwania opartego na czasie. W tym trybie źródło multimediów określa czas rozpoczęcia, który jest stosunkowo bliżej czasu wyszukiwania. Jeśli plik ASF zawiera obiekt indeksu ASF, służy do obliczania czasu rozpoczęcia. Przybliżone wyszukiwanie jest mniej dokładne, ale szybsze niż dokładne wyszukiwanie, ponieważ czas potrzebny na renderowanie pierwszej próbki w wcześniej określonym czasie rozpoczęcia jest szybszy.
  • Wyszukiwanie iteracyjne: aby ustawić ten tryb, aplikacja musi ustawić właściwość MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex. Wyszukiwanie iteracyjne to algorytm znajdowania pozycji w pliku ASF, który nie zawiera obiektu indeksu ASF. W tym trybie źródło multimediów określa przybliżone oszacowanie punktu wyszukiwania przez odczytanie przesunięcia strumienia bajtowego. Używa serii przybliżeń opartych na średniej szybkości bitów, aby stopniowo zbliżać się do docelowego czasu wyszukiwania. (Algorytm jest podobny do wyszukiwania binarnego). Wyszukiwanie iteracyjne może trwać dłużej niż wyszukiwanie przy użyciu obiektu indeksu, więc jest domyślnie wyłączone. Jeśli ustawisz tę właściwość, użyj następujących właściwości, aby ustawić parametry wyszukiwania: MFPKEY_ASFMediaSource_IterativeSeek_Max_CountMFPKEY_ASFMediaSource_IterativeSeek_Tolerance_In_MilliSecond. Te właściwości ustawiają odpowiednio maksymalną liczbę iteracji i tolerancję. Algorytm zatrzymuje się, gdy osiągnie maksymalną liczbę iteracji lub gdy znajdzie pakiet, którego odległość od czasu wyszukiwania mieści się w określonej tolerancji.

W skrócie aplikacja ma możliwość wybrania przybliżonego lub iteracyjnego wyszukiwania, gdy plik ASF nie zawiera obiektu indeksu ASF.

Model obiektów źródłowych multimediów ASF

Źródło multimediów ASF implementuje interfejs IMFMediaSource i uwidacznia następujące interfejsy. Aplikacja może uzyskać odwołanie do tych interfejsów, wywołując IMFMediaSource::QueryInterface w źródle multimediów ASF.

Interfejs Opis
IMFMediaSource Wymagane dla wszystkich źródeł multimedialnych.
IMFMediaEventGenerator Wymagane dla wszystkich źródeł multimedialnych. Umożliwia aplikacjom pobieranie zdarzeń ze źródła multimediów za pośrednictwem sesji multimediów.
IMFGetService Wysyła zapytanie do źródła multimediów dla określonego interfejsu usługi.
IPropertyStore Ustawia i pobiera właściwości w źródle multimediów. Każda właściwość zawiera opisową nazwę i wartość.
IMFMetadata Opisuje metadane pliku ASF.
IMFMetadataProvider Pobiera kolekcję metadanych dla całej prezentacji lub dla jednego strumienia w prezentacji.
IMFRateSupport Wykonuje zapytania dotyczące zakresu obsługiwanych współczynników odtwarzania, w tym odtwarzania odwrotnego.
IMFRateControl Pobiera lub ustawia częstotliwość odtwarzania.
MFWTrustedInput Pobiera ita dla każdego strumieni ASF zawartego w źródle.
IMFPMPClient Umożliwia źródło multimediów odbieranie wskaźnika do interfejsu IMFPMPHost, który służy do tworzenia obiektów w procesie PMP.
IMFTimecodeTranslate Konwertuje między kodami czasu Society of Motion Picture i Television Engineers (SMPTE) i 100-nanosekundowymi jednostkami czasu.

 

ASF Media Source Services

Źródło multimediów ASF udostępnia różne usługi, które są objęte zakresem pliku ASF. Aby uzyskać wskaźnik do określonej usługi, aplikacja musi użyć jednego z następujących identyfikatorów usługi w wywołaniu do MFGetService. Aby uzyskać informacje, zobacz Service Interfaces.

Identyfikator usługi Opis
MF_RATE_CONTROL_SERVICE Za pomocą tego identyfikatora aplikacja może uzyskać wskaźnik do interfejsów IMFRateSupport lub interfejsów IMFRateControlIMFRateControl. Korzystając z obiektu obsługi szybkości zaimplementowanego przez źródło multimediów, aplikacja może sprawdzić, czy określona stawka jest obsługiwana przez bazowy plik multimedialny ASF również uzyskać najszybszy i najwolniejszy współczynnik. Za pomocą obiektu kontroli szybkości aplikacja może uzyskać i ustawić szybkość odtwarzania. Jeśli aplikacja określa konkretną szybkość odtwarzania, źródło multimediów ASF najpierw sprawdza, czy żądana szybkość mieści się w granicach szybkości (określonych przez szybkość i najwolniejsze stawki), a następnie ustawia szybkość. Nie sprawdza to warunków zmiennych, ponieważ szybkość transmisji bitów może ulec zmianie w zależności od przepustowości sieci. Aby uzyskać więcej informacji, Rate Control.
MF_METADATA_PROVIDER_SERVICE Za pomocą tego identyfikatora aplikacja może uzyskać wskaźnik do interfejsu IMFMetadataProvider źródła multimediów ASF. Ten interfejs zapewnia dostęp do informacji o pliku ASF w szczególności obiektów nagłówka ASF i strumieni zawartych w zawartości multimedialnej. Informacje nagłówka są udostępniane za pośrednictwem atrybutów deskryptora prezentacji, a informacje o strumieniu są udostępniane za pośrednictwem atrybutów deskryptora strumienia. Aby uzyskać więcej informacji na temat tych atrybutów, zobacz Media Foundation Attributes for ASF Header Objects. Oprócz informacji udostępnianych za pomocą atrybutów istnieją również metadane opisowe, które są ustawiane jako właściwości.
MF_PROPERTY_HANDLER_SERVICE Za pomocą tego identyfikatora aplikacja może uzyskać wskaźnik do interfejsu IPropertyStore źródła multimediów ASF. Magazyn właściwości zawiera wszystkie metadane powiązane z plikiem ASF. Ten identyfikator jest nowy w systemie Windows 7 i zastępuje MF_METADATA_PROVIDER_SERVICE na potrzeby pobierania właściwości metadanych.
MFNETSOURCE_STATISTICS_SERVICE Aby uzyskać więcej informacji, zobacz Pobieranie statystyk sieci w rejestrowanie klienta.
MF_TIMECODE_SERVICE Za pomocą tego identyfikatora aplikacja może uzyskać wskaźnik do interfejsu IMFTimecodeTranslate źródła multimediów. Ta implementacja może służyć do wykonywania tłumaczeń kodu czasu, takich jak konwertowanie kodu czasu SMPTE na 100-nano sekundowe jednostki i z powrotem.

 

Tłumaczenie kodu czasowego

Źródło multimediów ASF udostępnia usługę tłumaczenia kodu czasowego, która umożliwia aplikacji konwertowanie kodu czasu SMPTE na najbliższy czas prezentacji (w jednostce 100 nanosekundowej). Z drugiej strony aplikacja może również uzyskać kod czasu dla żądanego czasu prezentacji. Usługa jest dostępna za pośrednictwem interfejsu IMFTimecodeTranslate, który implementuje źródło multimediów ASF. Wywołania metody dla tego wskaźnika interfejsu są asynchroniczne, które można uruchomić z głównego wątku aplikacji bez blokowania interfejsu użytkownika aplikacji.

Poniższe kroki zawierają podsumowanie procedury tłumaczenia kodu czasowego:

  1. Pobierz wskaźnik do interfejsu IMFTimecodeTranslate źródła multimediów ASF, wywołując MFGetService i określając identyfikator MF_TIMECODE_SERVICE.
  2. Wywołaj IMFTimecodeTranslate::BeginConvertTimecodeToHNS lub IMFTimecodeTranslate::BeginConvertHNSToTimecode i określ czas, który ma zostać przetłumaczony. W przypadku BeginConvertTimecodeToHNS kod czasu musi być określony jako zmienna PROPVARIANT z typem danych VT_I8. Metoda BeginConvertHNSToTimecode wymaga czasu w 100-nanosekundowych jednostkach jako typu MFTIME.
  3. Ukończ operację asynchroniczną, wywołując IMFTimecodeTranslate::EndConvertTimecodeToHNS lub IMFTimecodeTranslate::EndConvertTimecodeToHNS odpowiednio.

Podczas tworzenia źródła multimediów program rozpoznawania źródła tworzy strumień bajtów dla pliku, z którego źródło multimediów odczytuje zawartość asf. Aby konwersje czasu zakończyły się pomyślnie, strumień bajtów skojarzony z plikiem ASF musi mieć możliwości wyszukiwania; w przeciwnym razie aplikacja pobiera błąd MF_E_BYTESTREAM_NOT_SEEKABLE z wywołania Begin.... Innym wymaganiem do konwersji czasu jest to, że plik ASF reprezentowany przez źródło multimediów ASF musi mieć obiekty indeksu ASF. Czas prezentacji i kody czasu są wyodrębniane z obiektów indeksu ASF, które utrzymują wszystkie indeksy i odpowiednie punkty wyszukiwania dla pliku ASF. W przypadku tłumaczenia kodu czas-czas prezentacji plik ASF musi zawierać obiekt prostego indeksu; w przypadku tłumaczenia czasu z kodem do prezentacji plik ASF musi mieć obiekt indeksu. Operacje konwersji polegają na podstawowym indeksatorze (składnik WMContainer), aby przeanalizować i odczytać obiekt indeksu skojarzony z plikiem ASF. Jeśli plik nie zawiera obiektu indeksu, aplikacja asynchronicznie odbiera kod błędu MF_E_NO_INDEX.

Aby przetłumaczyć czas żądany przez aplikację, źródło multimediów wylicza strumienie w pliku i znajduje strumień zawierający odpowiedni obiekt indeksu ASF. Jeśli taki strumień zostanie znaleziony, źródło multimediów analizuje pakiety ASF strumienia są analizowane do momentu osiągnięcia poprawnego kodu czasu. Po znalezieniu poprawnego przykładu pobiera odpowiedni czas prezentacji lub kod czasu z przykładu i zwraca go do obiektu wywołującego.

Obsługa poleceń skryptu

Podczas tworzenia topologii ASF zawierającej strumień skryptu węzeł strumienia skryptu jest dodawany do topologii. Ten węzeł będzie wysyłać pliki IMFSamples w odpowiednim czasie. IMFSample dostarczone przez węzeł źródłowy skryptu przechowuje dane w IMFMediaBuffer skojarzone z przykładem. Możesz wywołać metodę CopyToBuffer w przykładzie, aby pobrać iMFMediaBuffer, a następnie wywołać metodę Lock on the buffer (Blokada w buforze), aby pobrać dane.

Ładunki strumienia skryptu są pakowane do buforu jako ciąg typu, po którym następuje wartość NULL, a następnie ciąg polecenia, po którym następuje wartość NULL. Ciągi są unicode w formacie ASF.

Na przykład ładunek może wyglądać następująco (gdzie \0 wskazuje znak NULL):

adres URL \0http://contoso.com\0

Text\0This to podpis\0

Składniki ASF warstwy potoku

asf support in Media Foundation