Udostępnij przez


Stałe kodowanie szybkości bitów

W kodowaniu stałej szybkości transmisji bitów (CBR) koder zna szybkość transmisji bitów próbek multimediów wyjściowych i okno buforu (przeciekliwe parametry zasobnika) przed rozpoczęciem sesji kodowania. Koder używa tej samej liczby bitów do kodowania każdej sekundy próbki przez cały czas trwania pliku w celu osiągnięcia docelowej szybkości transmisji bitów dla strumienia. Ogranicza to różnice w rozmiarze przykładów strumienia. Ponadto podczas sesji kodowania szybkość bitów nie jest dokładnie określona wartość, ale pozostaje blisko docelowej szybkości bitów.

Kodowanie CBR jest przydatne, gdy chcesz znać szybkość bitów lub przybliżony czas trwania pliku bez analizowania całego pliku. Jest to wymagane w scenariuszach transmisji strumieniowej na żywo, w których zawartość multimediów musi być przesyłana strumieniowo z przewidywalną szybkością transmisji bitów i ze stałym użyciem przepustowości.

Wadą kodowania CBR jest to, że jakość zakodowanej zawartości nie będzie stała. Ponieważ część zawartości jest trudniejsza do skompresowania, części strumienia CBR będą mieć niższą jakość niż inne. Na przykład typowy film zawiera kilka scen, które są dość statyczne i niektóre sceny, które są pełne akcji. Jeśli kodujesz film przy użyciu języka CBR, sceny, które są statyczne, a tym samym łatwe do kodowania, będą miały wyższą jakość niż sceny akcji, co wymagałoby wyższych rozmiarów próbek w celu zachowania tej samej jakości.

Ogólnie rzecz biorąc, różnice w jakości pliku CBR są bardziej widoczne przy niższych szybkościach bitów. Przy wyższych szybkościach bitów jakość pliku zakodowanego w języku CBR nadal będzie się różnić, ale problemy z jakością będą mniej zauważalne dla użytkownika. W przypadku korzystania z kodowania CBR należy ustawić przepustowość tak wysoką, jak pozwala na to scenariusz dostarczania.

Ustawienia konfiguracji CBR

Koder należy skonfigurować, określając typ kodowania i różne ustawienia specyficzne dla strumienia przed sesją kodowania.

Aby skonfigurować koder do kodowania CBR

  1. Określ tryb kodowania CBR.

    Domyślnie koder jest skonfigurowany do używania kodowania CBR. Konfiguracja kodera jest ustawiana za pomocą wartości właściwości. Te właściwości są definiowane w pliku wmcodecdsp.h. Możesz jawnie określić ten tryb, ustawiając właściwość MFPKEY_VBRENABLED na VARIANT_FALSE. Aby uzyskać informacje o sposobie ustawiania właściwości koderów, zobacz Configuring the Encoder.

  2. Wybierz częstotliwość kodowania bitów.

    W przypadku kodowania CBR należy znać szybkość transmisji bitów, z jaką chcesz kodować strumień przed rozpoczęciem sesji kodowania. Podczas konfigurowania kodera należy ustawić szybkość transmisji bitów. Aby to zrobić, podczas przeprowadzania negocjacji typu nośnika 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 docelowej szybkości transmisji bitów, którą chcesz osiągnąć. Aby uzyskać więcej informacji, zobacz negocjacji typu nośnika wkodera.

Poniższy przykład kodu przedstawia implementację właściwości SetEncodingProperties. Ta funkcja ustawia właściwości kodowania na poziomie strumienia dla CBR i VBR.

//-------------------------------------------------------------------
//  SetEncodingProperties
//  Create a media source from a URL.
//
//  guidMT:  Major type of the stream, audio or video
//  pProps:  A pointer to the property store in which 
//           to set the required encoding properties.
//-------------------------------------------------------------------

HRESULT SetEncodingProperties (const GUID guidMT, IPropertyStore* pProps)
{
    if (!pProps)
    {
        return E_INVALIDARG;
    }

    if (EncodingMode == NONE)
    {
        return MF_E_NOT_INITIALIZED;
    }
   
    HRESULT hr = S_OK;

    PROPVARIANT var;

    switch (EncodingMode)
    {
        case CBR:
            // Set VBR to false.
            hr = InitPropVariantFromBoolean(FALSE, &var);
            if (FAILED(hr))
            {
                goto done;
            }

            hr = pProps->SetValue(MFPKEY_VBRENABLED, var);
            if (FAILED(hr))
            {
                goto done;
            }

            // Set the video buffer window.
            if (guidMT == MFMediaType_Video)
            {
                hr = InitPropVariantFromInt32(VIDEO_WINDOW_MSEC, &var);
                if (FAILED(hr))
                {
                    goto done;
                }

                hr = pProps->SetValue(MFPKEY_VIDEOWINDOW, var);    
                if (FAILED(hr))
                {
                    goto done;
                }
            }
            break;

        case VBR:
            //Set VBR to true.
            hr = InitPropVariantFromBoolean(TRUE, &var);
            if (FAILED(hr))
            {
                goto done;
            }

            hr = pProps->SetValue(MFPKEY_VBRENABLED, var);
            if (FAILED(hr))
            {
                goto done;
            }

            // Number of encoding passes is 1.

            hr = InitPropVariantFromInt32(1, &var);
            if (FAILED(hr))
            {
                goto done;
            }

            hr = pProps->SetValue(MFPKEY_PASSESUSED, var);
            if (FAILED(hr))
            {
                goto done;
            }

            // Set the quality level.

            if (guidMT == MFMediaType_Audio)
            {
                hr = InitPropVariantFromUInt32(98, &var);
                if (FAILED(hr))
                {
                    goto done;
                }

                hr = pProps->SetValue(MFPKEY_DESIRED_VBRQUALITY, var);    
                if (FAILED(hr))
                {
                    goto done;
                }
            }
            else if (guidMT == MFMediaType_Video)
            {
                hr = InitPropVariantFromUInt32(95, &var);
                if (FAILED(hr))
                {
                    goto done;
                }

                hr = pProps->SetValue(MFPKEY_VBRQUALITY, var);    
                if (FAILED(hr))
                {
                    goto done;
                }
            }
            break;

        default:
            hr = E_UNEXPECTED;
            break;
    }    

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

Przeciekowe ustawienia zasobnika

W przypadku kodowania CBR średniej i maksymalnej nieszczelności wartości zasobnika dla strumienia są takie same. Aby uzyskać więcej informacji na temat tych parametrów, zobacz Model buforu wycieku zasobnika.

Aby kodować strumienie audio CBR, należy ustawić nieszczelne wartości zasobnika po wynegocjowaniu typu nośnika wyjściowego w koderze. Koder oblicza okno buforu wewnętrznie na podstawie średniej szybkości transmisji bitów ustawionej na typ nośnika wyjściowego.

Aby ustawić nieszczelne wartości zasobnika, utwórz tablicę DWORDs można ustawić następujące wartości we właściwości MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET w magazynie właściwości ujścia multimediów. Aby uzyskać więcej informacji, zobacz właściwości ustawienia wujścia pliku.

typy kodowania ASF

samouczek : kodowanie 1-pass windows media

samouczek : pisanie pliku WMA przy użyciu kodowania CBR