Aracılığıyla paylaş


Sabit Bit Hızı Kodlaması

Sabit bit hızı (CBR) kodlamasında kodlayıcı, kodlama oturumu başlamadan önce çıkış medyası örneklerinin bit hızını ve arabellek penceresini (sızdıran demet parametreleri) bilir. Kodlayıcı, bir akış için hedef bit hızına ulaşmak üzere dosyanın süresi boyunca örneğin her saniyesini kodlamak için aynı sayıda bit kullanır. Bu, akış örneklerinin boyutundaki varyasyonu sınırlar. Ayrıca, kodlama oturumu sırasında bit hızı tam olarak belirtilen değerde değildir, ancak hedef bit hızına yakın kalır.

CBR kodlaması, dosyanın tamamını ayrıştırmadan dosyanın bit hızını veya yaklaşık süresini bilmek istediğinizde kullanışlıdır. Bu, medya içeriğinin tahmin edilebilir bir bit hızında ve tutarlı bant genişliği kullanımıyla akışa alınması gereken canlı akış senaryolarında gereklidir.

CBR kodlamasının dezavantajı, kodlanmış içeriğin kalitesinin sabit olmamasıdır. Bazı içerikleri sıkıştırmak daha zor olduğundan, CBR akışının bölümleri diğerlerinden daha düşük kalitede olacaktır. Örneğin, tipik bir film oldukça statik olan bazı sahnelere ve eylemle dolu bazı sahnelere sahiptir. CBR kullanarak bir filmi kodlarsanız, statik olan ve bu nedenle verimli bir şekilde kodlaması kolay sahneler, aynı kaliteyi korumak için daha yüksek örnek boyutları gerektiren eylem sahnelerinden daha yüksek kalitede olacaktır.

Genel olarak, CBR dosyasının kalitesindeki varyasyonlar daha düşük bit hızlarında daha belirgindir. Daha yüksek bit hızlarında, CBR ile kodlanmış bir dosyanın kalitesi yine de değişir, ancak kalite sorunları kullanıcı tarafından daha az fark edilir. CBR kodlamasını kullanırken bant genişliğini teslim senaryonuzun izin verdiği kadar yüksek ayarlamanız gerekir.

CBR Yapılandırma Ayarları

Kodlama oturumundan önce kodlama türünü ve çeşitli akışa özgü ayarları belirterek bir kodlayıcı yapılandırmanız gerekir.

CBR kodlama için kodlayıcıyı yapılandırmak için

  1. CBR kodlama modunu belirtin.

    Kodlayıcı varsayılan olarak CBR kodlamasını kullanacak şekilde yapılandırılır. Kodlayıcı yapılandırması özellik değerleri aracılığıyla ayarlanır. Bu özellikler wmcodecdsp.h içinde tanımlanır. MFPKEY_VBRENABLED özelliğini VARIANT_FALSE olarak ayarlayarak bu modu açıkça belirtebilirsiniz. Kodlayıcılarda özellikleri ayarlama hakkında bilgi için bkz. Kodlayıcıyı yapılandırma.

  2. Kodlama bit hızını seçin.

    CBR kodlaması için, kodlama oturumu başlamadan önce akışı kodlamak istediğiniz bit hızını bilmeniz gerekir. Kodlayıcıyı yapılandırırken bit hızını ayarlamanız gerekir. Bunu yapmak için, medya türü anlaşması gerçekleştirirken, kullanılabilir çıktı medya türlerinin MF_MT_AUDIO_AVG_BYTES_PER_SECOND özniteliğini (ses akışları için) veya MF_MT_AVG_BITRATE özniteliğini (video akışları için) denetleyin ve ulaşmak istediğiniz hedef bit hızına en yakın ortalama bit hızına sahip bir çıkış medya türü seçin. Daha fazla bilgi için bkz. Kodlayıcı'da Medya Türü Anlaşması'nı.

Aşağıdaki kod örneği SetEncodingProperties uygulamasını gösterir. Bu işlev CBR ve VBR için akış düzeyi kodlama özelliklerini ayarlar.

//-------------------------------------------------------------------
//  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;
}

Sızdıran Demet Ayarları

CBR kodlaması için akış için ortalama ve maksimum sızıntı demet değerleri aynıdır. Bu parametreler hakkında daha fazla bilgi için bkz. The Leaky Bucket Buffer Model.

CBR kodlama ses akışlarını kodlamak için kodlayıcıda çıkış medya türünü görüştükten sonra sızdıran demet değerlerini ayarlamanız gerekir. Kodlayıcı, çıkış medya türü üzerinde ayarlanan ortalama bit hızına göre arabellek penceresini dahili olarak hesaplar.

Sızdıran demet değerlerini ayarlamak için bir DWORD dizisi oluşturun, ortam havuzu özellik deposundaki MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET özelliğinde aşağıdaki değerleri ayarlayabilir. Daha fazla bilgi için bkz. Dosya HavuzuÖzellikleri Ayarlama.

ASF Kodlama Türleri

Öğreticisi: 1-Windows Media Kodlama

Öğreticisi: CBR Kodlama Kullanarak WMA Dosyası Yazma