Неограниченная кодировка с переменной битовой скоростью
В режиме кодирования без ограничений скорости передачи (VBR) содержимое закодировано на максимально возможное качество при сохранении указанной скорости.
Кодирование неограниченного VBR использует два цикла кодирования. При использовании кодировки VBR без ограничений вы указываете скорость передачи для потока, как и при использовании кодировки константной скорости битов. Однако кодировщик использует это значение только в качестве средней скорости для потока и кодирует, чтобы качество было максимально высоким при сохранении среднего. Отдельные примеры, создаваемые кодировщиком, различаются по размеру без явных ограничений на буфер. Однако средняя скорость битов во время сеанса кодирования и длительность потока не должна превышать указанное вами значение. Фактическая скорость бита в любой точке в кодированном потоке может значительно отличаться от среднего значения. Вы не задали окно буфера для несвязанного кодирования VBR. Вместо этого кодировщик вычисляет размер требуемого буферного окна на основе требований кодированных примеров. Это означает, что размер отдельных выборок в потоке не ограничен, если средняя скорость бита меньше или равно заданному значению.
Преимущество кодирования без ограничений VBR заключается в том, что сжатый поток имеет максимально возможное качество, оставаясь в прогнозируемой средней пропускной способности. Используйте это, если необходимо указать пропускную способность, но колебания вокруг указанной пропускной способности допустимы; например, для локальных файлов или только для скачивания.
Недостатком этого режима кодирования является то, что кодировщик может задать окно буфера для любого значения, необходимого после кодирования, что позволяет не контролировать размер буфера. В большинстве случаев, если вы не обеспокоены размером буфера или согласованностью использования пропускной способности, следует использовать Quality-Based кодирование с переменной скоростью передачи данных
Настройка кодировщика для неограниченного 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;
}
Связанные разделы