Udostępnij za pośrednictwem


Niekontrolowane kodowanie zmiennej szybkości bitów

W trybie kodowania bez ograniczeń zmiennej szybkości bitów (VBR) zawartość jest kodowana do najwyższej możliwej jakości przy zachowaniu określonej szybkości bitów.

Kodowanie VBR bez ograniczeń używa dwóch przebiegów kodowania. W przypadku korzystania z niekonsekwowanego kodowania VBR należy określić szybkość transmisji bitów dla strumienia, tak jak w przypadku kodowania stałej szybkości transmisji bitów . Jednak koder używa tej wartości tylko jako średniej szybkości transmisji bitów dla strumienia i koduje tak, aby jakość jest tak wysoka, jak to możliwe, przy zachowaniu średniej. Poszczególne próbki generowane przez koder różnią się rozmiarem bez żadnych jawnych limitów buforu. Jednak średnia szybkość transmisji bitów podczas sesji kodowania i czas trwania strumienia nie może być większa niż wartość określona przez Użytkownika. Rzeczywista szybkość transmisji bitów w dowolnym momencie w zakodowanym strumieniu może się znacznie różnić od średniej wartości. Nie ustawiasz okna buforu dla kodowania VBR w trybie nieograniczonym. Zamiast tego koder oblicza rozmiar wymaganego okna buforu na podstawie wymagań zakodowanych próbek. Oznacza to, że nie ma limitu rozmiaru poszczególnych próbek w strumieniu, o ile średnia szybkość transmisji bitów jest mniejsza lub równa ustawionej wartości.

Zaletą niekonsekwowanego kodowania VBR jest to, że skompresowany strumień ma najwyższą możliwą jakość, pozostając w przewidywalnej średniej przepustowości. Użyj tej opcji, gdy musisz określić przepustowość, ale wahania dotyczące określonej przepustowości są akceptowalne; na przykład w przypadku plików lokalnych lub pobierania tylko.

Wadą tego trybu kodowania jest to, że koder może ustawić okno buforu na dowolną wartość wymaganą po kodowaniu, zapewniając brak kontroli nad rozmiarem buforu. W większości przypadków, jeśli nie martwisz się o rozmiar buforu lub spójność użycia przepustowości, powinieneś użyć Quality-Based kodowanie ze zmienną przepływnością bitową

Konfigurowanie kodera dla nieograniczonego VBR

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 danych wyjściowych VBR i wybrać wymagany w koderze Media Foundation Transform (MFT) na podstawie średniej szybkości transmisji bitów.

Na poniższej liście przedstawiono właściwości, które należy ustawić 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ż nieograniczony tryb VBR używa dwóch przebiegów kodowania.
  • 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. Wybierz typ nośnika wyjściowego, który ma średnią szybkość transmisji bitów znajdującą się 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 Media Type Negotiation wkodera.

Aby uzyskać wartość okna buforu ustawioną przez koder, wywołaj metodę IWMCodecLeakyBucket::GetBufferSizeBits, zdefiniowaną w pliku wmcodecifaces.h i wmcodecdspuuid.lib, po zakończeniu sesji kodowania. Aby dodać nieograniczoną obsługę VBR dla strumieni, należy ustawić tę wartość w atrybucie MF_ASFSTREAMCONFIG_LEAKYBUCKET1 (średnie wartości nieszczelnego zasobnika) w obiekcie konfiguracji strumienia podczas konfigurowania profilu ASF.

Poniżej zmodyfikowano metodę SetEncodingType klasy przykładowej CEncoder, aby ustawić nieograniczony tryb VBR. 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 unconstrained VBR
//
/////////////////////////////////////////////////////////////////////////

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_Unconstrained)
    {
        //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);
    }

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

Typy kodowania ASF

modelu buforu wycieku zasobnika

Jak utworzyć topologię na potrzeby kodowania Two-Pass Windows Media