Кодирование переменной скорости Quality-Based
В отличие от кодирования с постоянной скоростью (CBR), где кодировщик стремится поддерживать определенную скорость передачи закодированного носителя, в режиме переменной скорости (VBR), кодировщик стремится достичь наилучшего возможного качества закодированного носителя. Основное различие между CBR и VBR заключается в размере используемого буферного окна. Потоки в кодировке VBR обычно имеют большие буферные окна по сравнению с потоками в кодировке CBR.
Качество закодированного содержимого определяется объемом данных, которые теряются при сжатии содержимого. Многие факторы влияют на потерю данных в процессе сжатия; но в целом, чем сложнее исходные данные и чем выше коэффициент сжатия, тем больше деталей теряется в процессе сжатия.
В режиме VBR на основе качества вы не определяете скорость передачи данных или окно буфера, которым должен следовать кодировщик. Вместо этого вы указываете уровень качества для потока цифровых мультимедиа, а не скорость передачи. Кодировщик сжимает содержимое, чтобы все образцы были сравнимого качества; это гарантирует, что качество будет одинаковым на протяжении всего времени воспроизведения, независимо от требований к буферу результирующего потока.
Кодирование VBR на основе качества, как правило, создает большие сжатые потоки. Как правило, этот тип кодирования хорошо подходит для локального воспроизведения или сетевых подключений с высокой пропускной способностью (а также для скачивания и воспроизведения). Например, можно написать приложение для копирования песен с компакт-диска в ASF-файлы на компьютере. Использование кодирования VBR на основе качества гарантирует, что все скопированные песни будут одинакового качества. В таких случаях согласованное качество обеспечит лучшее взаимодействие с пользователем.
Недостаток кодирования VBR на основе качества заключается в том, что на самом деле невозможно узнать требования к размеру или пропускной способности закодированного носителя до сеанса кодирования, так как кодировщик использует один проход кодирования. Это может сделать файлы в кодировке VBR на основе качества неуместными в случаях, когда память или пропускная способность ограничены, например при воспроизведении содержимого на портативных проигрывателях мультимедиа или потоковой передаче по сети с низкой пропускной способностью.
Настройка кодировщика для Quality-Based кодировки VBR
Конфигурация кодировщика задается с помощью значений свойств. Эти свойства определяются в wmcodecdsp.h. Свойства конфигурации должны быть заданы в кодировщике перед согласованием типа выходного носителя. Сведения о том, как задать свойства кодировщика, см. в разделе Настройка кодировщика.
В следующем списке показаны свойства, которые необходимо задать для этого типа кодирования:
- Укажите режим кодирования VBR, задав для свойства MFPKEY_VBRENABLED значение VARIANT_TRUE.
- Задайте для MFPKEY_PASSESUSED значение 1, так как в этом режиме VBR используется один проход кодирования.
- Задайте требуемый уровень качества (от 0 до 100), задав свойство MFPKEY_DESIRED_VBRQUALITY . VBR на основе качества не кодирует содержимое в соответствии с предопределенными параметрами буфера. Этот уровень качества, который будет поддерживаться для всего потока, независимо от требований к скорости.
- Для видеопотоков задайте для средней скорости ненулевое значение в атрибуте 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;
}
Связанные темы