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


Кодировка Peak-Constrained переменной скорости

В ограниченной пиковой переменной скорости (VBR) содержимое кодируется в соответствии с заданной скоростью и пиковой скоростью: пиковой скоростью и окном пиковой буферной нагрузки. Эти пиковые значения также называются значениями сегмента с пиковой утечкой. Файл закодирован в соответствии с буфером, описанным в пиковых значениях, таким образом, чтобы общая средняя скорость потока была равна или меньше указанной средней скорости.

Как правило, пиковая скорость достаточно высока. Кодировщик гарантирует, что указанное среднее значение скорости потока сохраняется в течение всего потока (средняя скорость >потока = (общий размер потока в битах / длительность потока в секундах)). Рассмотрим следующий пример: вы настраиваете поток со средней скоростью 16 000 бит в секунду, пиковой скоростью 48 000 бит в секунду и 3000 (3 секунды). Размер буфера, используемого для потока, составляет 144 000 бит (48 000 бит в секунду * 3 секунды), что определяется пиковых значений. Кодировщик сжимает данные в соответствии с этим буфером. Кроме того, средняя скорость потока должна быть 16 000 или меньше. Если кодировщик должен создавать большие образцы для обработки сложного сегмента содержимого, он может воспользоваться преимуществами большого размера буфера. Но другие части потока должны быть закодированы с более низкой скоростью, чтобы привести среднее значение к указанному уровню. Кодирование VBR с пиковой нагрузкой полезно для устройств воспроизведения с ограниченным объемом буфера и ограничениями скорости передачи данных. Распространенным примером этого является кодировка, используемая для DVD-дисков, когда декодирование выполняется микросхемой на устройстве, где существуют аппаратные ограничения, которые необходимо учитывать.

Настройка кодировщика для Peak-Constrained VBR

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

Конфигурация кодировщика задается с помощью значений свойств. Эти свойства определены в wmcodecdsp.h. Свойства конфигурации должны быть заданы в кодировщике перед согласованием типа выходного носителя. Сведения о настройке свойств в кодировщике см. в разделе Настройка кодировщика. На основе указанных значений свойств можно перечислить поддерживаемые типы выходных данных VBR и выбрать необходимый тип в кодировщике Преобразования Media Foundation (MFT) на основе средней скорости передачи данных.

Для этого типа кодирования необходимо задать следующие свойства:

  • Укажите режим кодирования VBR, задав для свойства MFPKEY_VBRENABLED значение VARIANT_TRUE.
  • Присвойте MFPKEY_PASSESUSED значение 2, так как режим VBR с ограничением пиковых значений использует два прохода кодирования.
  • Задайте MFPKEY_RMAX, чтобы указать пиковую скорость передачи, и задайте MFPKEY_BMAX, чтобы указать окно буфера пиков.
  • При перечислении типа выходного носителя проверка атрибут MF_MT_AUDIO_AVG_BYTES_PER_SECOND (для аудиопотоков) или атрибут MF_MT_AVG_BITRATE (для видеопотоков) доступных типов выходных носителей и выберите тип выходного носителя со средней скоростью передачи данных, ближайшей к нужной средней скорости, которую кодировщик должен поддерживать в закодированном содержимом. Дополнительные сведения о выборе типа выходного носителя см. в разделе Согласование типов мультимедиа в кодировщике.

Примечание

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

 

Чтобы получить значение окна буфера, заданное кодировщиком, вызовите IWMCodecLeakyBucket::GetBufferSizeBits, определенное в wmcodecifaces.h, wmcodecdspuuid.lib, после сеанса кодирования. Чтобы добавить поддержку потоков без ограничений VBR, необходимо задать это значение в атрибуте MF_ASFSTREAMCONFIG_LEAKYBUCKET2 (значения контейнера с пиковой утечкой) в объекте конфигурации потока при настройке профиля ASF.

Следующий пример кода изменяет метод SetEncodingType примера класса CEncoder, чтобы настроить режим VBR с ограничением на пиковую нагрузку. Сведения об этом классе см. в разделе Кодировщик Пример кода. Сведения о вспомогательных макросах, используемых в этом примере, см. в разделе Использование примеров кода Media Foundation.

//////////////////////////////////////////////////////////////////////////
//  Name: SetEncodingType
//  Description: Sets the encoding type to peak-constrained VBR mode.
//
/////////////////////////////////////////////////////////////////////////

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_Peak)
    {
        // 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);

        // Set the peak bit rate.
        var.vt = VT_I4;
        var.lVal  =48000;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_RMAX, var));
        PropVariantClear(&var);

        // Set the peak buffer window.
        var.vt = VT_I4;
        var.lVal  =3000;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_BMAX, var));
        PropVariantClear(&var);
    }

done:
    PropVariantClear(&var);
    SAFE_RELEASE (pProp);
    return hr;
    
}

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

Модель буфера нечеткого контейнера

Создание топологии для Two-Pass кодировки Windows Media