Aracılığıyla paylaş


Kısıtlanmamış Değişken Bit Hızı Kodlaması

Kısıtlanmamış değişken bit hızı (VBR) kodlama modunda içerik, belirtilen bit hızı korunurken mümkün olan en yüksek kaliteye kodlanır.

Kısıtlanmamış VBR kodlaması iki kodlama geçişi kullanır. Kısıtlanmamış VBR kodlaması kullanırken, Sabit Bit Hızı Kodlamagibi akış için bir bit hızı belirtirsiniz. Ancak kodlayıcı bu değeri yalnızca akış için ortalama bit hızı olarak kullanır ve ortalamayı korurken kalitenin mümkün olduğunca yüksek olması için kodlar. Kodlayıcı tarafından üretilen bireysel örnekler, herhangi bir açık arabellek sınırı olmadan boyutları değişir. Ancak, kodlama oturumu sırasında ortalama bit hızı ve akışın süresi sizin belirttiğiniz değerden fazla olmamalıdır. Kodlanmış akışın herhangi bir noktasındaki gerçek bit hızı, ortalama değerden büyük ölçüde farklılık gösterebilir. Kısıtlanmamış VBR kodlaması için arabellek penceresi ayarlamazsınız. Bunun yerine kodlayıcı, kodlanmış örneklerin gereksinimlerine göre gerekli arabellek penceresinin boyutunu hesaplar. Bu, ortalama bit hızı ayarladığınız değerden küçük veya buna eşit olduğu sürece akıştaki tek tek örneklerin boyutuyla ilgili bir sınır olmadığı anlamına gelir.

Kısıtlanmamış VBR kodlamasının avantajı, sıkıştırılmış akışın mümkün olan en yüksek kaliteye sahip olması ve tahmin edilebilir ortalama bant genişliği içinde kalmasıdır. Bir bant genişliği belirtmeniz gerektiğinde ancak belirtilen bant genişliği etrafındaki dalgalanmalar kabul edilebilir olduğunda bunu kullanın; örneğin, yerel dosyalar veya yalnızca indirme için.

Bu kodlama modunun dezavantajı, kodlayıcının arabellek penceresini kodlama işleminden sonra gerekli olan herhangi bir değere ayarlayabilmesi ve bu nedenle arabellek boyutu üzerinde kontrol sahibi olamamanızdır. Çoğu durumda, arabelleğin boyutu veya bant genişliği kullanımının tutarlılığı konusunda endişeniz yoksa, Quality-Based Değişken Bit Hızı Kodlaması kullanmalısınız

Kısıtlanmamış VBR için Kodlayıcıyı Yapılandırma

Kodlayıcı yapılandırması özellik değerleri aracılığıyla ayarlanır. Bu özellikler wmcodecdsp.h içinde tanımlanır. Çıkış medya türü üzerinde anlaşmadan önce yapılandırma özellikleri kodlayıcıda ayarlanmalıdır. Kodlayıcıda özellikleri ayarlama hakkında bilgi için bkz. Kodlayıcıyı yapılandırma. Belirtilen özellik değerlerine bağlı olarak, desteklenen VBR çıkış türlerini numaralandırabilir ve ortalama bit hızına göre Media Foundation Dönüştürme (MFT) kodlayıcıda gerekli olanı seçebilirsiniz.

Aşağıdaki liste, bu tür kodlama için ayarlamanız gereken özellikleri gösterir:

  • MFPKEY_VBRENABLED özelliğini VARIANT_TRUE olarak ayarlayarak VBR kodlama modunu belirtin.
  • Kısıtlanmamış VBR modu iki kodlama geçişi kullandığından MFPKEY_PASSESUSED 2 olarak ayarlayın.
  • Çıkış medya türünü numaralandırırken, kullanılabilir çıkış 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. Kodlayıcının kodlanmış içerikte tutmasını istediğiniz ortalama bit hızına en yakın ortalama bit hızına sahip bir çıkış medya türü seçin. Çıktı medya türünü seçme hakkında daha fazla bilgi için bkz. Medya Türü Anlaşması.

Arabellek penceresi değerinin kodlayıcı tarafından ayarlanması için, kodlama oturumundan sonra wmcodecifaces.h ve wmcodecdspuuid.lib içinde tanımlanan IWMCodecLeakyBucket::GetBufferSizeBitsçağrısı yapın. Akışlar için kısıtlanmamış VBR desteği eklemek için, ASF profilini yapılandırırken bu değeri akış yapılandırma nesnesindeki MF_ASFSTREAMCONFIG_LEAKYBUCKET1 özniteliğinde (ortalama sızıntı demet değerleri) ayarlamanız gerekir.

Aşağıdaki, CEncoder örnek sınıfının SetEncodingType yöntemini değiştirerek kısıtlanmamış VBR modunu ayarlar. Bu sınıf hakkında bilgi için bkz. Kodlayıcı Örnek Kodu. Bu örnekte kullanılan yardımcı makrolar hakkında bilgi için bkz. Media Foundation Kod Örneklerini Kullanma.

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

ASF Kodlama Türleri

Sızdıran Kova Arabellek Modeli

Two-Pass Windows Media Kodlama için Topoloji Oluşturma