Udostępnij za pośrednictwem


kodowanie zmiennej szybkości bitów Peak-Constrained

W zmiennej szybkości bitów ze zmienną ograniczeniami szczytu (VBR) zawartość jest zakodowana w określonej szybkości bitów i wartości szczytowe: szczytowa szybkość bitów i okno buforu szczytowego. Te wartości szczytowe są również nazywane wartościami szczytowymi koszyka upływowego . Plik jest zakodowany tak, aby pasował do bufora opisanego przez wartości szczytowe, tak aby ogólna średnia szybkość bitowa strumienia była równa lub mniejsza niż określona wartość średnia szybkości bitowej.

Zazwyczaj szczytowa szybkość bitów jest dość wysoka. Koder gwarantuje, że określona średnia wartość szybkości transmisji bitów jest utrzymywana w czasie trwania strumienia (średnia szybkość transmisji bitów >= (łączny rozmiar strumienia w bitach/ czas trwania strumienia w sekundach)). Rozważmy następujący przykład: Możesz skonfigurować strumień ze średnią szybkością transmisji bitów wynoszącą 16 000 bitów na sekundę, szczytową szybkością transmisji bitów wynoszącą 48 000 bitów na sekundę i szczytowym oknem buforu wynoszącym 3000 (3 sekundy). Rozmiar buforu używanego dla strumienia wynosi 144 000 bitów (48 000 bitów na sekundę * 3 sekundy) zgodnie z wartościami szczytowymi. Koder kompresuje dane zgodnie z tym buforem. Ponadto średnia szybkość transmisji bitów strumienia musi wynosić 16 000 lub mniej. Jeśli koder musi utworzyć duże próbki do obsługi złożonego segmentu zawartości, może skorzystać z dużego rozmiaru buforu. Jednak inne części strumienia muszą być kodowane z niższą szybkością transmisji bitów, aby obniżyć średnią do określonego poziomu. Kodowanie VBR z ograniczeniem szczytowym jest przydatne w przypadku odtwarzania urządzeń z ograniczoną pojemnością buforu i ograniczeniami szybkości danych. Typowym przykładem tego jest kodowanie używane na płytach DVD, gdy dekodowanie jest wykonywane przez układ scalony w urządzeniu, gdzie należy uwzględnić istniejące ograniczenia sprzętowe.

Konfigurowanie kodera dla Peak-Constrained VBR

VBR z ograniczeniem szczytowym przypomina nieograniczony VBR, ponieważ jest ograniczone do średniej szybkości transmisji bitów w czasie trwania strumienia. Ponadto vBR z ograniczeniem szczytowym jest zgodne z buforem szczytowym. Ten bufor jest opisany przy użyciu szczytowej szybkości bitów i przedziału buforu szczytowego. Ten tryb używa dwóch przebiegów kodowania i zapewnia elastyczność kodera w sposobie kodowania poszczególnych próbek przy zachowaniu szczytowych ograniczeń.

Konfiguracja kodera jest ustawiana za pomocą wartości właściwości. Te właściwości są definiowane w pliku wmcodecdsp.h. Właściwości konfiguracji należy ustawić na koderze przed wynegocjowaniem typu nośnika wyjściowego. Aby uzyskać informacje o sposobie ustawiania właściwości w koderze, zobacz Configuring the Encoder. Na podstawie określonych wartości właściwości można wyliczyć obsługiwane typy wyjściowe VBR i wybrać wymagany typ kodera transformacji Media Foundation (MFT) na podstawie średniego bitrate'u.

Należy ustawić następujące właściwości dla tego typu kodowania:

  • Określ tryb kodowania VBR, ustawiając właściwość MFPKEY_VBRENABLED na VARIANT_TRUE.
  • Ustaw MFPKEY_PASSESUSED na 2, ponieważ tryb VBR z ograniczeniem szczytowym używa dwóch przejść kodowania.
  • Ustaw MFPKEY_RMAX, aby określić szczytową szybkość bitów i ustawić MFPKEY_BMAX, aby określić okno buforu szczytowego.
  • Podczas wyliczania typu nośnika wyjściowego sprawdź atrybut MF_MT_AUDIO_AVG_BYTES_PER_SECOND (dla strumieni audio) lub atrybut MF_MT_AVG_BITRATE (w przypadku strumieni wideo) dostępnych typów nośników wyjściowych i wybierz typ nośnika wyjściowego, który ma średnią szybkość transmisji bitów najbliżej żądanej średniej szybkości transmisji bitów, którą koder ma zachować w zakodowanej zawartości. Aby uzyskać więcej informacji na temat wybierania typu nośnika wyjściowego, zobacz negocjowanie typu nośnika na enkodera.

Notatka

Zaleca się ustawienie maksymalnej szybkości bitów na co najmniej dwa razy większą niż średnia szybkość bitów. Ustawienie maksymalnej szybkości na niższą wartość może spowodować, że koder może zaszyfrować treść jako CBR w dwóch przejściach zamiast VBR z ograniczeniem szczytowym.

 

Aby uzyskać wartość okna buforu ustawioną przez koder, wywołaj metodę IWMCodecLeakyBucket::GetBufferSizeBits, zdefiniowaną w wmcodecifaces.h, wmcodecdspuuid.lib, po sesji kodowania. Aby dodać nieskrępowaną obsługę VBR dla strumieni, należy ustawić tę wartość w atrybucie MF_ASFSTREAMCONFIG_LEAKYBUCKET2 (szczytowe wartości zasobnika wycieku) w obiekcie konfiguracji strumienia podczas konfigurowania profilu ASF.

Poniższy przykładowy kod modyfikuje metodę SetEncodingType klasy przykładowej CEncoder w celu skonfigurowania trybu VBR ograniczonego szczytowo. Aby uzyskać informacje o tej klasie, zobacz przykładowy kod kodowy . Aby uzyskać informacje o makrach pomocnika używanych w tym przykładzie, zobacz Using the Media Foundation Code Examples (Używanie przykładów kodu programu Media Foundation).

//////////////////////////////////////////////////////////////////////////
//  Name: SetEncodingType
//  Description: Sets the encoding type to peak-constrained VBR mode.
//
/////////////////////////////////////////////////////////////////////////

HRESULT CEncoder::SetEncodingType(EncodeMode mode)
{
    if (!m_pMFT)
    {
        return MF_E_NOT_INITIALIZED;
    }

    HRESULT hr = S_OK;

    IPropertyStore* pProp = NULL;

    PROPVARIANT var;
    PropVariantInit(&var);

    // Query the encoder for its property store.
    CHECK_HR(hr = m_pMFT->QueryInterface(__uuidof(IPropertyStore), (void**)&pProp));
    
    if (mode == EncodeMode_VBR_Peak)
    {
        // Set the VBR property to TRUE, which indicates VBR encoding.
        var.vt = VT_BOOL;
        var.boolVal = TRUE;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_VBRENABLED, var));
        PropVariantClear(&var);

        // Set number of passes.
        var.vt = VT_I4;
        var.lVal  =2;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_PASSESUSED, var));
        PropVariantClear(&var);

        // Set the peak bit rate.
        var.vt = VT_I4;
        var.lVal  =48000;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_RMAX, var));
        PropVariantClear(&var);

        // Set the peak buffer window.
        var.vt = VT_I4;
        var.lVal  =3000;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_BMAX, var));
        PropVariantClear(&var);
    }

done:
    PropVariantClear(&var);
    SAFE_RELEASE (pProp);
    return hr;
    
}

Typy Kodowania ASF

modelu buforu wycieku zasobnika

Jak utworzyć topologię dla kodowania Two-Pass Windows Media