Bagikan melalui


Quality-Based Pengodean Laju Bit Variabel

Tidak seperti Pengodean Laju Bit Konstan (CBR), di mana encoder berusaha untuk mempertahankan laju bit tertentu dari media yang dikodekan, dalam mode laju bit variabel (VBR), encoder berusaha untuk mencapai kualitas terbaik dari media yang dikodekan. Perbedaan utama antara CBR dan VBR adalah ukuran jendela buffer yang digunakan. Aliran yang dikodekan VBR biasanya memiliki jendela buffer besar dibandingkan dengan aliran yang dikodekan CBR.

Kualitas konten yang dikodekan ditentukan oleh jumlah data yang hilang saat konten dikompresi. Banyak faktor yang memengaruhi hilangnya data dalam proses pemadatan; tetapi secara umum, semakin kompleks data asli dan semakin tinggi rasio kompresi, semakin banyak detail yang hilang dalam proses kompresi.

Dalam mode VBR berbasis kualitas, Anda tidak menentukan laju bit atau jendela buffer yang harus diikuti encoder. Sebagai gantinya, Anda menentukan tingkat kualitas untuk aliran media digital alih-alih laju bit. Encoder mengompresi konten sehingga semua sampel memiliki kualitas yang sebanding; ini memastikan bahwa kualitas konsisten sepanjang durasi pemutaran, terlepas dari persyaratan buffer aliran yang dihasilkan.

Pengodean VBR berbasis kualitas cenderung membuat aliran terkompresi besar. Secara umum, jenis pengodean ini sangat cocok untuk pemutaran lokal atau koneksi jaringan bandwidth tinggi (atau mengunduh dan memutar). Misalnya, Anda dapat menulis aplikasi untuk menyalin lagu dari CD ke file ASF di komputer. Menggunakan pengodean VBR berbasis kualitas akan memastikan bahwa semua lagu yang disalin memiliki kualitas yang sama. Dalam kasus tersebut, kualitas yang konsisten akan memberikan pengalaman pengguna yang lebih baik.

Kerugian dari pengodean VBR berbasis kualitas adalah bahwa benar-benar tidak ada cara untuk mengetahui persyaratan ukuran atau bandwidth media yang dikodekan sebelum sesi pengodean, karena encoder menggunakan satu pass pengodean. Ini dapat membuat file yang dikodekan VBR berbasis kualitas tidak pantas untuk keadaan di mana memori atau bandwidth dibatasi, seperti memutar konten pada pemutar media portabel atau streaming melalui jaringan bandwidth rendah.

Mengonfigurasi Encoder untuk pengodean VBR Quality-Based

Konfigurasi encoder diatur melalui nilai properti. Properti ini didefinisikan dalam wmcodecdsp.h. Properti konfigurasi harus diatur pada encoder sebelum menegosiasikan jenis media output. Untuk informasi tentang cara mengatur properti pada encoder, lihat Mengonfigurasi Encoder.

Daftar berikut ini memperlihatkan properti yang harus Anda atur untuk jenis pengodean ini:

  • Tentukan mode pengodean VBR dengan mengatur properti MFPKEY_VBRENABLED ke VARIANT_TRUE.
  • Atur MFPKEY_PASSESUSED ke 1 karena mode VBR ini menggunakan satu pass pengodean.
  • Atur tingkat kualitas yang diinginkan (dari 0 hingga 100) dengan mengatur properti MFPKEY_DESIRED_VBRQUALITY . VBR berbasis kualitas tidak mengodekan konten ke parameter buffer yang telah ditentukan sebelumnya. Tingkat kualitas ini yang akan dipertahankan untuk seluruh aliran, terlepas dari persyaratan laju bit yang dihasilkan.
  • Untuk aliran video, atur laju bit rata-rata ke nilai bukan nol di atribut MF_MT_AVG_BITRATE pada jenis media output encoder. Laju bit yang akurat diperbarui setelah sesi pengodean selesai.

Contoh kode berikut menunjukkan implementasi untuk SetEncodingProperties. Fungsi ini mengatur properti pengodean tingkat aliran untuk CBR dan 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;
}

Jenis Pengodean ASF