Bagikan melalui


Pengodean Laju Bit Konstan

Dalam pengodean laju bit konstan (CBR), encoder mengetahui laju bit sampel media output dan jendela buffer (parameter wadah bocor) sebelum sesi pengodean dimulai. Encoder menggunakan jumlah bit yang sama untuk mengodekan setiap detik sampel selama durasi file untuk mencapai laju bit target untuk aliran. Ini membatasi variasi dalam ukuran sampel aliran. Selain itu, selama sesi pengodean, laju bit tidak persis pada nilai yang ditentukan tetapi tetap dekat dengan laju bit target.

Pengodean CBR berguna ketika Anda ingin mengetahui laju bit atau perkiraan durasi file tanpa mengurai seluruh file. Ini diperlukan dalam skenario streaming langsung di mana konten media perlu dialirkan pada laju bit yang dapat diprediksi dan dengan penggunaan bandwidth yang konsisten.

Kerugian dari pengodean CBR adalah bahwa kualitas konten yang dikodekan tidak akan konstan. Karena beberapa konten lebih sulit dikompresi, bagian dari aliran CBR akan memiliki kualitas yang lebih rendah daripada yang lain. Misalnya, film biasa memiliki beberapa adegan yang cukup statis dan beberapa adegan yang penuh dengan aksi. Jika Anda mengodekan film menggunakan CBR, adegan yang statis, dan karenanya mudah dikodekan secara efisien, akan memiliki kualitas yang lebih tinggi daripada adegan tindakan, yang akan membutuhkan ukuran sampel yang lebih tinggi untuk mempertahankan kualitas yang sama.

Secara umum, variasi dalam kualitas file CBR lebih jelas pada laju bit yang lebih rendah. Pada laju bit yang lebih tinggi, kualitas file yang dikodekan CBR masih akan bervariasi, tetapi masalah kualitas akan kurang terlihat oleh pengguna. Saat menggunakan pengodean CBR, Anda harus mengatur bandwidth setinggi yang diizinkan skenario pengiriman Anda.

Pengaturan Konfigurasi CBR

Anda harus mengonfigurasi encoder dengan menentukan jenis pengodean dan berbagai pengaturan khusus aliran sebelum sesi pengodean.

Untuk mengonfigurasi encoder untuk pengodean CBR

  1. Tentukan mode pengodean CBR.

    Secara default, encoder dikonfigurasi untuk menggunakan pengodean CBR. Konfigurasi encoder diatur melalui nilai properti. Properti ini didefinisikan dalam wmcodecdsp.h. Anda dapat secara eksplisit menentukan mode ini dengan mengatur properti MFPKEY_VBRENABLED ke VARIANT_FALSE. Untuk informasi tentang cara mengatur properti pada encoder, lihat Mengonfigurasi Encoder.

  2. Pilih laju bit pengodean.

    Untuk pengodean CBR, Anda harus mengetahui laju bit tempat Anda ingin mengodekan aliran sebelum sesi pengodean dimulai. Anda harus mengatur laju bit selama mengonfigurasi encoder. Untuk melakukan ini, saat Anda melakukan negosiasi jenis media, periksa atribut MF_MT_AUDIO_AVG_BYTES_PER_SECOND (untuk aliran audio) atau atribut MF_MT_AVG_BITRATE (untuk aliran video) dari jenis media output yang tersedia dan pilih jenis media output yang memiliki laju bit rata-rata terdekat dengan laju bit target yang ingin Anda capai. Untuk informasi selengkapnya, lihat Negosiasi Jenis Media pada Encoder.

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

Pengaturan Wadah Bocor

Untuk pengodean CBR, nilai rata-rata dan wadah kebocoran maksimum untuk aliran sama. Untuk informasi selengkapnya tentang parameter ini, lihat Model Buffer Wadah Bocor.

Untuk mengodekan aliran audio CBR, Anda perlu mengatur nilai wadah bocor setelah menegosiasikan jenis media output pada encoder. Encoder menghitung jendela buffer secara internal berdasarkan laju bit rata-rata yang ditetapkan pada jenis media output.

Untuk mengatur nilai wadah bocor, buat array DWORD dapat mengatur nilai berikut di properti MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET di penyimpanan properti sink media. Untuk informasi selengkapnya, lihat Mengatur Properti di Sink File.

Jenis Pengodean ASF

Tutorial: Pengodean Media Windows 1-Pass

Tutorial: Menulis File WMA dengan Menggunakan Pengodean CBR