Udostępnij przez


Model buforu Leaky Bucket (Microsoft Media Foundation)

Podczas przesyłania strumieniowego multimediów za pośrednictwem sieci dekoder odbiera zakodowane dane z teoretycznie stałą szybkością (szybkość transmisji). Dekoder używa tych danych w celu wygenerowania zdekodowanych danych wyjściowych. W ogólnym przypadku jednak dekoder zużywa dane z zmienną prędkością, ponieważ wtedy koder może używać zmiennej prędkości kodowania.

Model "leaky bucket" to sposób modelowania wymagań buforowania na potrzeby płynnego odtwarzania. W tym modelu dekoder utrzymuje bufor. Zakodowane dane przechodzą z sieci do buforu i z buforu do dekodera. Jeśli występuje niedobór buforu, oznacza to, że dekoder usuwa dane z buforu szybciej niż sieć je dostarcza. Jeśli bufor przepełnia się, oznacza to, że sieć dostarcza dane szybciej niż dekoder je zużywa.

W tym temacie opisano model buforów „przeciekającego wiadra” na potrzeby kodowania i dekodowania.

Nieszczelne wiadro

Aby zrozumieć model cieknącego wiadra, rozważ wiadro z małą dziurą na dole. Trzy parametry definiują zasobnik:

  • Pojemność (B)
  • Szybkość przepływu wody z zasobnika (R)
  • Początkowa pełność wiadra (F)

W tej metaforze zasobnik jest buforem:

ilustracja przedstawiająca bufor jako wiadro, szybkość dopływu jako wodę wlewającą się do wiadra, a szybkość odpływu jako wodę wypływającą przez dziurę w wiadrze

Jeśli woda zostanie wlana do zasobnika dokładnie z szybkością R, zasobnik pozostanie na F, ponieważ szybkość wprowadzania jest równa szybkości wyjściowej. Jeśli szybkość wprowadzania wzrasta, podczas gdy R pozostaje stała, zasobnik gromadzi wodę. Jeśli szybkość wprowadzania jest większa niż R przez dłuższy czas, zasobnik ostatecznie się przepełni. Jednak tempo wprowadzania danych może się różnić w okolicach R bez przepełnienia zbiornika, o ile średnie tempo wprowadzania danych nie przekracza pojemności zbiornika. Im większa pojemność, tym bardziej tempo wprowadzania danych może się różnić w danym przedziale czasu.

W ASF, przeciekający kubełek jest definiowany przez trzy parametry:

  • Średnia szybkość bitów w bajtach na sekundę, która odpowiada szybkości danych wyjściowych (R)
  • Okno buforu mierzone w milisekundach, które odpowiada pojemności zasobnika (B).
  • Początkowa pełna pojemność buforu, która jest zwykle ustawiona na zero.

Szybkość transmisji bitów mierzy średnią liczbę bitów na sekundę w zakodowanym strumieniu. Okno buforu mierzy liczbę milisekund danych przy tej szybkości transmisji bitów, które mogą mieścić się w buforze. Rozmiar buforu w bitach jest równy R * (B / 1000).

Dane ładunku ASF mogą wpływać do nieszczelnego wiadra w nieregularnych momentach i w nieregularnych ilościach, ale muszą opuszczać je ze stałą dodatnią prędkością bitową. Ze względu na okno buforu istnieje możliwe opóźnienie między czasem, przez który ładunek przechodzi do zasobnika, a kiedy odejdzie. Maksymalne opóźnienie, które może wystąpić, to B/R. Dane ładunku wprowadzane do zasobnika są zgodne z czasem prezentacji i absolutnie nie mogą przepełniać zasobnika. Oprócz czasu prezentacji, każdy ładunek ma również czas wysyłania — czas, w którym dane ładunku opuszczają zasobnik buforowy zgodnie z przepustowością bitową. Czas wysyłania musi być wcześniejszy niż czas prezentacji, aby zapewnić, że gdy nieszczelny zbiornik zbliża się do pełnego, każdy ładunek opuszcza zbiornik przed lub w czasie prezentacji. W tym celu czasy prezentacji są przesuwane z wyprzedzeniem przez wartość B/R (preroll), a czasy wysyłania zaczynają się od zera. Czas wysyłania nie może być późniejszy niż czas prezentacji, ponieważ oznacza to, że ładunek wszedł do zasobnika za późno i nie może być uwzględniony w obiekcie danych. Wartość prerollu jest uwzględniona w obiektu nagłówka ASF.

Aby uniknąć zakłóceń podczas przesyłania strumieniowego przez sieć, należy utrzymywać stałą szybkość transmisji bitów w skompresowanych strumieniach zawartości multimedialnej przez cały czas trwania odtwarzania. Model przeciekającego wiadra ASF gwarantuje, że dane multimedialne są wysyłane przez sieć ze stałą szybkością bitów. Parametry nieszczelnego zasobnika są określone w obiekcie właściwości rozszerzonego strumienia obiektu nagłówka ASF. W programie Microsoft Media Foundation są one ustawiane jako atrybuty typu nośnika reprezentującego strumień.

Wartości algorytmu leaky bucket są definiowane zarówno w komponencie wyjściowym pliku ASF, jak i w bazowym obiekcie multipleksera ASF oraz w kodowaniu Windows Media. Te wartości mogą być takie same lub różne. Rozważmy na przykład scenariusz przesyłania strumieniowego, który wymaga dostarczenia próbek dźwięku później niż przykłady wideo, aby można było przesyłać strumieniowo plik bez opóźnień. Aby to osiągnąć, wyciekający zasobnik strumienia audio w obiorniku multimediów może być ustawiony na wartość wyższą niż ta ustawiona w koderze audio Windows Media.

Aby ustawić wartości B/R w koderze, aplikacja musi ustawić właściwości MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAXi MFPKEY_BMAX. Aby uzyskać informacje o ustawianiu właściwości w koderze, zobacz właściwości kodowania .

Zasobnik w użyciu

Celem kodera jest zapewnienie, że zawartość nigdy nie przepełnia buforu. Koder używa przepływności bitowej i wartości buforu jako wytycznych. Rzeczywista liczba bitów przekazywanych w dowolnym okresie równym oknie buforu nigdy nie może być większa niż dwa razy większa niż rozmiar buforu.

Rozważmy następujący przykład: Masz zasobnik 3-galonowy z otworem w nim, przez który 1 galon może przepływać na minutę. Wkładasz wiadro pod spigot i otwierasz zawór, aby wypuścić wodę w tempie 1 galon na minutę. Woda wypływa z wiadra tak szybko, jak się wlewa, nie pozostawiając nic dodatkowego w wiadrze. Następnie zwiększasz przepływ z spigotu do 2 galonów na minutę. Każda minuta, gdy woda przepływa w tym tempie, 2 galony trafiają do wiadra, a 1 galon wycieka, zostawiając 1 galon w wiadrze. Pod koniec 3 minut 6 galonów wody poszło do wiadra, 3 galony wyciekły, a wiadro jest pełne.

W praktyce teoretyczna maksymalna szybkość danych w interwale równym oknie buforu nigdy nie zostanie osiągnięta. W poprzednim przykładzie przyjęto stałą szybkość danych. Biorąc pod uwagę to samo 3-galonowe wiadro, można zwiększyć szybkość przepływu z kranu do 6 galonów na minutę przez minutę, a następnie zakręcić kran na dwie minuty. Mimo że łączna ilość wody umieszczonej w zasobniku mieści się w teoretycznym maksimum dla okna buforu, stężenie tej ilości w jednej części okna powoduje przepełnienie zasobnika. Przy przepływie 6 galonów na minutę, 3-galonowe wiadro przepełnia się wkrótce po upływie 30 sekund. W związku z tym rzeczywista maksymalna ilość danych, które mogą być dostarczane do buforu w czasie trwania dowolnego interwału równego ustawieniu okna buforu, zależy od rozmiaru poszczególnych próbek i ich dostarczenia.

Do tej pory przykłady omówiły tylko bufor używany przez dekoder, ale nieszczelny bufor zasobnika jest również używany przez koder, który tworzy skompresowaną zawartość. Koder dokonuje wszelkich niezbędnych dostosowań w algorytmach kompresji, aby zachować szybkość bitową skompresowanych próbek w granicach opisywanych przez szybkość transmisji bitów i okno buforu, przy założeniu, że próbki zostaną dostarczone do dekodera ze stałą szybkością. Zasobnik kodera można traktować jako dublowanie zasobnika dekodera. Zasobnik kodera jest wypełniany zmienną szybkością określoną przez rozmiar poszczególnych próbek i wycieka z stałą szybkością równą średniej przepływności bitów.

Rozważmy poniższy przykład kodera i dekodera połączonego razem za pośrednictwem sieci. Plik wideo można zakodować przy 30 klatkach na sekundę z szybkością bitów wynoszącą 6000 bitów na sekundę i oknem buforu wynoszącym 3 sekundy (łączny rozmiar buforu wynoszący 18 000 bitów). Pierwszy przykład jest zakodowany jako klatka kluczowa i zajmuje 7000 bitów. Bufor kodera zawiera teraz 7000 bitów. Następne 29 ramek to wszystkie ramki różnicowe, które łącznie wynoszą 3 000 bitów. Więc pierwsza sekunda zawartości (30 ramek) umieściłaby pełną bufor na 10 000 bitów, gdyby nic nie wyciekło. Wiemy, że szybkość transmisji bitów strumienia wynosi 6000 bitów na sekundę, więc po pierwszej sekundzie zakodowanej zawartości jest umieszczana w buforze kodera, pełna liczba bitów spada do 4000 bitów. W aplikacji dekodowania ten strumień jest dostarczany do buforu dekodera z prędkością 6000 bitów na sekundę. Po jednej sekundzie bufor zawiera 6000 bitów. Pierwsza próbka zawiera 7000 bitów, więc bufor dekodera musi być wypełniony więcej przed rozpoczęciem usuwania próbek.

Ustawianie wartości Leaky Bucket dla strumieni ASF

W scenariuszu kodowania plików aplikacja może ustawić nieszczelne wartości zasobnika podczas konfigurowania strumieni w profilu ASF.

Po utworzeniu strumienia i odwołaniu do interfejsu IMFASFStream Config można ustawić wartości przy użyciu następujących atrybutów:

Aby uzyskać informacje na temat dodawania strumieni i pobierania wskaźnika IMFASFStreamConfig, zobacz Dodawanie informacji o strumieniu do pliku wyjściowego ASF.

Te wartości zawierają następujący zestaw informacji:

  • Średnia szybkość bitów: pobierz średnią szybkość bitów z typu nośnika wyjściowego wybranego podczas negocjacji typu nośnika. Użyj atrybutu MF_MT_AUDIO_AVG_BYTES_PER_SECOND (dla strumieni audio) lub atrybutu MF_MT_AVG_BITRATE (w przypadku strumieni wideo).
  • Okno buforu: jeśli masz wystąpienie kodera i wynegocjowano typy multimediów wyjściowych, możesz zaktualizować tę wartość później, wysyłając zapytanie do kodera dla interfejsu IWMCodecLeakyBucket, a następnie wywołując IWMCodecLeakyBucket::GetBufferSizeBits (wmcodecifaces.h, wmcodecdspuuid.lib). W przeciwnym razie użyj wartości domyślnej 3000 milisekund.
  • Początkowy rozmiar buforu: ustaw wartość 0.

Wartości udostępniane przez aplikację zależą od typu kodowania i typu nośnika strumienia. Na przykład kodowanie stałych szybkości bitów wymaga wstępnie ustalonej stałej szybkości bitów i okna buforu. Aplikacja może określić te wartości nieszczelnego zasobnika, ustawiając właściwość kodowania MFPKEY_VIDEOWINDOW, oraz atrybut MF_ASFSTREAMCONFIG_LEAKYBUCKET1 w strumieniu. Określone wartości okna buforu są używane, aby upewnić się, że zakodowany plik ma poprawnie oznaczone czasy wysyłania na pakietach danych, a wartość preroll pojawia się w obiekcie nagłówkowym ASF. Wystarczy ustawić MF_ASFSTREAMCONFIG_LEAKYBUCKET1, ponieważ te określone wartości są kopiowane do atrybutu MF_ASFSTREAMCONFIG_LEAKYBUCKET2.

W przypadku trybów kodowania dwuprzepustowego należy ustawić oba te atrybuty, aby określić wartości średnie i maksymalne.

W przypadku kodowania VBR aplikacja może wykonywać zapytania dotyczące nieszczelnych wartości zasobnika używanych przez koder dopiero po zakończeniu przekazywania kodowania. W związku z tym podczas konfigurowania ujścia multimediów aplikacja może nie ustawiać atrybutów ani właściwości związanych z nieszczelnymi zasobnikami. Po kodowaniu aplikacja musi wysłać zapytanie do kodera dla MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAXi MFPKEY_BMAX właściwości i ustawić je w ujściu multimediów, aby dokładne wartości zostały odzwierciedlone w obiekcie nagłówka. Aby uzyskać przykład kodu dotyczący sposobu aktualizowania wartości kodowania VBR, zobacz "Update Encoding Properties in the File Sink" (Aktualizowanie właściwości kodowania w ujściu plików) w Tutorial: 1-Pass Windows Media Encoding.

Jeśli kopiujesz zawartość Windows Media ze źródła do odbiornika multimediów bez kodowania, w odbiorniku multimediów należy ustawić wartości leaky bucket.

Wartości algorytmu cieknącego kubełka w multiplekserze ASF

W programie Media Foundation nieszczelne wartości zasobnika są używane przez ASF Multiplexer do konfigurowania wewnętrznych nieszczelnych wartości zasobników używanych do generowania pakietów danych. Ładunek znajduje się w próbce multimedialnej, a seria próbek multimedialnych stanowi pakiet danych ASF. Na podstawie nieszczelnej wartości zasobnika i czasu prezentacji multiplekser przypisuje czas wysyłania dla każdego próbki multimediów, aby szybkość bitów pakietów wysyłanych przez sieć była stała (R).

Aplikacja nie może bezpośrednio ustawić wartości leaky bucket w multiplekserze. Wartości muszą być podane na wyjściu mediowym ASF, które ustawia odpowiednie wartości na multiplekserze. Wartości ustawione w MF_ASFSTREAMCONFIG_LEAKYBUCKET1 i MF_ASFSTREAMCONFIG_LEAKYBUCKET2 są używane przez multiplekser do weryfikacji, że próbki wysyłane do ujścia multimediów ASF są generowane przy użyciu wskazanych wartości.

Aktualizowanie wartości algorytmu Leaky Bucket w zlewni multimediów ASF

Aplikacja może zastąpić wartości zasobnika na poziomie strumienia (ustawione w profilu ASF podczas tworzenia strumienia), ustawiając właściwość MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET w magazynie właściwości ujścia multimediów. Aby uzyskać odwołanie do magazynu właściwości, użyj obiektu ContentInfo zaimplementowanego przez ujście multimediów. Aby uzyskać więcej informacji, zobacz Ustawianie właściwości w składniku docelowym pliku.

Uwaga Ta operacja jest dozwolona tylko dla strumieni audio.

Ta właściwość musi zostać ustawiona po ustawieniu typu danych wyjściowych w koderze. Na podstawie szybkości transmisji bitów ustawionej w typie nośnika koder oblicza rozmiar buforu, aby upewnić się, że wygenerowane próbki multimediów nigdy nie przepełnią buforu. Koder wprowadza niezbędne korekty podczas kompresji, aby utrzymać przepływność bitów skompresowanych próbek w granicach opisanych przez przepływność bitów i okno buforu.

Podobnie jak w przypadku atrybutów konfiguracji strumienia dla nieszczelnych kubełków, ustaw średnią szybkość transmisji bitów, rozmiar bufora oraz początkowe wypełnienie buforu w tablicy DWORD. Aby uzyskać więcej informacji, zobacz sekcję "Setting Leaky Bucket Values for ASF Streams" w tym temacie.

Obsługa ASF w Media Foundation

Windows Media Codecs