Поделиться через


Кодировка с постоянной скоростью

При кодировании с постоянной скоростью (CBR) кодировщик знает скорость выходных примеров носителей и окно буфера (параметры контейнера с утечкой) до начала сеанса кодирования. Кодировщик использует одинаковое количество битов для кодирования каждую секунду выборки на протяжении всего файла, чтобы достичь целевой скорости потока. Это ограничивает изменение размера потоковых выборок. Кроме того, во время сеанса кодирования скорость передачи данных не соответствует заданному значению, но остается близкой к целевой скорости.

Кодирование CBR полезно, если вам нужно узнать битрейт или примерную длительность файла, не анализируя весь файл. Это необходимо в сценариях потоковой передачи, когда содержимое мультимедиа должно передаваться с прогнозируемым битрейтом и постоянной пропускной способностью.

Недостаток кодирования CBR заключается в том, что качество закодированного содержимого не будет постоянным. Поскольку некоторые содержимое сложнее сжимать, части потока CBR будут иметь более низкое качество, чем другие. Например, типичный фильм содержит некоторые сцены, которые являются довольно статическими, а некоторые сцены, полные действий. Если вы закодируете фильм с помощью CBR, сцены, которые являются статическими и поэтому легко кодируются эффективно, будут иметь более высокое качество, чем сцены действий, что потребовало бы более высоких размеров выборки для поддержания того же качества.

Как правило, различия в качестве файла CBR более выражены при более низкой скорости битов. При более высокой скорости качество файла в кодировке CBR по-прежнему будет отличаться, но проблемы с качеством будут менее заметны для пользователя. При использовании кодирования CBR следует задать пропускную способность, насколько это позволяет сценарий доставки.

Параметры конфигурации CBR

Необходимо настроить кодировщик, указав тип кодирования и различные параметры потока перед сеансом кодирования.

Настройка кодировщика для кодирования CBR

  1. Укажите режим кодирования CBR.

    По умолчанию кодировщик настроен для использования кодировки CBR. Конфигурация кодировщика задается с помощью значений свойств. Эти свойства определены в wmcodecdsp.h. Этот режим можно явно указать, задав свойству MFPKEY_VBRENABLED значение VARIANT_FALSE. Сведения о настройке свойств кодировщиков см. в разделе Настройка кодировщика.

  2. Выберите скорость кодирования.

    Для кодирования CBR необходимо знать скорость, с которой требуется кодировать поток до начала сеанса кодирования. При настройке кодировщика необходимо задать скорость передачи данных. Для этого при согласовании типов мультимедиа проверка атрибут MF_MT_AUDIO_AVG_BYTES_PER_SECOND (для аудиопотоков) или атрибут MF_MT_AVG_BITRATE (для видеопотоков) доступных типов выходных носителей и выберите тип выходного носителя со средней скоростью передачи данных, ближайшей к целевой скорости. Дополнительные сведения см. в разделе Согласование типов мультимедиа в кодировщике.

В следующем примере кода показана реализация setEncodingProperties. Эта функция задает свойства кодирования на уровне потока для CBR и 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;
}

Параметры нечеткого контейнера

Для кодирования CBR среднее и максимальное значения сегментов утечки для потока совпадают. Дополнительные сведения об этих параметрах см. в разделе Модель буфера нечеткого контейнера.

Чтобы кодировать аудиопотоки CBR, необходимо задать значения утечки контейнеров после согласования типа выходного носителя в кодировщике. Кодировщик вычисляет окно буфера на основе средней скорости, заданной для типа выходного носителя.

Чтобы задать значения нечетких сегментов, создайте массив DWORD, чтобы задать следующие значения в свойстве MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET в хранилище свойств приемника мультимедиа. Дополнительные сведения см. в разделе Настройка свойств в приемнике файлов.

  • Средняя скорость передачи данных. Получение средней скорости от выходного типа носителя, выбранного во время согласования типа носителя. Используйте атрибут MF_MT_AUDIO_AVG_BYTES_PER_SECOND .
  • Окно буфера. Запросите кодировщик для интерфейса IWMCodecLeakyBucket , а затем вызовите IWMCodecLeakyBucket::GetBufferSizeBits (wmcodecifaces.h, wmcodecdspuuid.lib).
  • Начальный размер буфера: установите значение 0.

Типы кодировки ASF

Руководство по 1-проходной кодировке Windows Media

Руководство по написанию WMA-файла с использованием кодировки CBR