Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie opisano, jak Sequencer Source obsługuje czasy prezentacji podczas odtwarzania.
Przegląd
Źródło programu Sequencer obsługuje dwa różne tryby: sekwencje listy odtwarzania i sekwencje edycji.
W sekwencji edycji aplikacja określa czas trwania każdego segmentu z wyprzedzeniem przed rozpoczęciem odtwarzania. W sekwencji listy odtwarzania aplikacja nie określa z wyprzedzeniem czasu trwania. (W rzeczywistości czas trwania może nie być znany).
W obu przypadkach można określić czas rozpoczęcia nośnika segmentu i czas zatrzymania multimediów. Te czasy określają położenie w pliku źródłowym, w którym zaczyna się i kończy segment. Załóżmy na przykład, że plik źródłowy ma długość 90 sekund. Jeśli chcesz przyciąć pierwsze 10 sekund i ostatnie 10 sekund, określ następujące wartości:
- Uruchamianie multimediów: 10 sekund
- Zatrzymywanie multimediów: 80 sekund
Aby określić czas rozpoczęcia nośnika, ustaw atrybut MF_TOPONODE_MEDIASTART w węźle źródłowym. Aby określić czas zatrzymania nośnika, ustaw atrybut MF_TOPONODE_MEDIASTOP w węźle źródłowym.
Aby utworzyć sekwencję edycji, ustaw atrybut MF_SESSION_GLOBAL_TIME podczas tworzenia sesji multimediów. W przeciwnym razie sesja multimediów oczekuje sekwencji odtwarzania. W sekwencji edycji każda topologia segmentu musi mieć atrybut MF_TOPOLOGY_PROJECTSTART i atrybut MF_TOPOLOGY_PROJECTSTOP.
Sekwencje listy odtwarzania
W sekwencji odtwarzania zegar prezentacji zaczyna się od zera i kontynuuje się przez granice segmentów. Źródła natywne dostarczają przykłady z sygnaturami czasowymi równymi czasowi nośnika. Potok konwertuje sygnatury czasowe na prawidłowy czas prezentacji w następujący sposób:
- Nowa sygnatura czasowa = czas nośnika + przesunięcie − początek multimediów
Wartość przesunięcia to czas prezentacji, w którym zakończył się poprzedni segment. W przypadku pierwszego segmentu przesunięcie wynosi zero. Poniżej przedstawiono dwa przykłady sposobu obliczania tych konwersji sygnatur czasowych:
- Przykład 1: Załóżmy, że pierwszy segment (S1) ma długość 10 sekund, a drugi segment (S2) ma czas rozpoczęcia nośnika o wartości zero. Źródło macierzyste używa czasu nośnika dla sygnatur czasowych, więc pierwsza próbka z S2 ma sygnaturę czasową zero. Przesunięcie wynosi 10 sekund (czas trwania S1), więc skorygowana sygnatura czasowa to:0 + 10 − 0 = 10 sekund.
- Przykład 2: Załóżmy, że segment S1 ma długość 10 sekund, a S2 ma czas rozpoczęcia multimediów 5 sekund. Pierwszy przykład z S2 ma sygnaturę czasową 5 sekund (czas nośnika). Przesunięcie wynosi 10 sekund, więc skorygowana sygnatura czasowa to:5 + 10 − 5 = 10 sekund.
Wszystkie składniki potoku podrzędne z węzłów źródłowych otrzymują przykłady z dostosowanymi sygnaturami czasu. Węzły źródłowe w topologii mogą mieć różne czasy rozpoczęcia nośnika, dlatego korekty są obliczane oddzielnie dla każdej gałęzi topologii.
Gdy prezentacja przełączy się do następnego segmentu, zegar prezentacji nie zostanie zatrzymany lub zresetowany, a czas prezentacji wzrasta monotonicznie. Przed rozpoczęciem nowego segmentu sesja multimediów wysyła aplikacji zdarzenie MESessionNotifyPresentationTime. Zdarzenie określa godzinę rozpoczęcia segmentu, względem zegara prezentacji i wartość przesunięcia. Po uruchomieniu nowego segmentu potok wywołuje Start w źródle programu Sequencer z wartością VT_EMPTY. Źródło programu Sequencer wysyła zdarzenie MESourceStarted bez czasu rozpoczęcia.
Aby wyszukać, aplikacja określa identyfikator segmentu oraz przesunięcie czasu w segmencie. Po wyszukiwaniu zegar prezentacji zaczyna się od segmentu przesunięcia. Oto przykład działania tego procesu:
- Przykład 3: Aplikacja próbuje segmentować S3 z przesunięciem segmentu 10 sekund. Zegar prezentacji rozpoczyna się od 10 sekund (przesunięcie segmentu). Przesunięcie nie obejmuje czasu trwania segmentów S1 i S2. Źródło programu Sequencer wysyła zdarzenie MESourceStarted z czasem rozpoczęcia równym przesunięciom segmentu, 10 sekund.
Jeśli odtwarzanie będzie kontynuowane w następnym segmencie, przejście działa podobnie jak w poprzednich przykładach, z tą różnicą, że przesunięcie nie zawiera pominiętych segmentów.
Poniżej przedstawiono kilka dodatkowych szczegółów, które mają wpływ na sposób oznaczania próbek sygnaturą czasową:
- Dekodatory mogą potrzebować danych poza czasem zatrzymania nośnika. Potok pobiera tyle danych ze źródła, ile wymaga dekodera, a następnie przycina próbki wyjściowe dekodera.
- Przekształcenia mogą buforać dane. Na przykład może być konieczne wykonanie efektu dźwiękowego. Po zakończeniu segmentu sygnatura czasowa ostatniego przykładu z przekształcenia jest wcześniejsza niż koniec segmentu, ponieważ przekształcenie powstrzymuje pewne dane. Po uruchomieniu następnego segmentu sygnatura czasowa pierwszego przykładu jest nieco wcześniejsza niż początek segmentu. Nie ma przerwy w sygnaturach czasowych, więc dane, które docierają do ujścia multimediów, są ciągłe. Po zakończeniu końcowego segmentu potok opróżnia transformację, więc żadne dane nie zostaną utracone.
- Źródło może wymagać nieco wcześniejszego uruchomienia niż czas rozpoczęcia nośnika, aby pobrać poprzednią ramkę klucza. W związku z tym po dostosowaniu pierwsza próbka może mieć negatywny czas prezentacji.
Edytowanie sekwencji
W sekwencji edycji aplikacja określa z wyprzedzeniem granice segmentu, ustawiając atrybuty MF_TOPOLOGY_PROJECTSTART i MF_TOPOLOGY_PROJECTSTOP. Potok oblicza korekty sygnatur czasowych w niemal taki sam sposób jak w przypadku sekwencji listy odtwarzania:
W przypadku przesunięcia używa wartości MF_TOPOLOGY_PROJECTSTART, zamiast używać obserwowanego końca segmentu.
W przypadku wyszukiwania przesunięcie używa wartości równej wartości MF_TOPOLOGY_PROJECTSTART segmentu oraz przesunięcia segmentu.
W związku z tym czas prezentacji w sekwencji edycji jest zawsze powiązany z rozpoczęciem prezentacji, nawet jeśli aplikacja będzie dążyć do innego segmentu.
Tematy pokrewne
-
źródło Sequencer