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


Неограниченное кодирование переменной скорости

В режиме кодирования без ограничений переменной скорости (VBR) содержимое кодируется в максимально возможном качестве при сохранении указанной скорости.

Неограниченное кодирование VBR использует два прохода кодирования. При использовании неограниченной кодировки VBR необходимо указать скорость потока, как и при кодировании с постоянной скоростью. Однако кодировщик использует это значение только в качестве средней скорости потока и кодирует, чтобы качество было как можно более высоким при сохранении среднего. Отдельные образцы, созданные кодировщиком, различаются по размеру без каких-либо явных ограничений буфера. Однако средняя скорость передачи данных во время сеанса кодирования и длительность потока не должны превышать указанное значение. Фактическая скорость передачи данных в любой точке закодированного потока может сильно отличаться от среднего значения. Окно буфера не настраивает для неограниченного кодирования VBR. Вместо этого кодировщик вычисляет размер требуемого окна буфера на основе требований закодированных примеров. Это означает, что размер отдельных выборок в потоке не ограничен, если средняя скорость потока меньше или равна заданному значению.

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

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

Настройка кодировщика для неограниченного ограничения VBR

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

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

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

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

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

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

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

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