codificación de velocidad de bits variable Quality-Based
A diferencia de la codificación de velocidad de bits constante (CBR), donde el codificador se esfuerza por mantener una velocidad de bits determinada del medio codificado, en el modo de velocidad de bits variable (VBR), el codificador se esfuerza por lograr la mejor calidad posible de los medios codificados. La diferencia principal entre CBR y VBR es el tamaño de la ventana de búfer utilizada. Las secuencias codificadas en VBR suelen tener ventanas de búfer grandes en comparación con las secuencias codificadas en CBR.
La calidad del contenido codificado viene determinada por la cantidad de datos que se pierden cuando se comprime el contenido. Muchos factores afectan a la pérdida de datos en el proceso de compresión; pero en general, cuanto más complejos sean los datos originales y mayor será la relación de compresión, más detalles se pierden en el proceso de compresión.
En el modo VBR basado en calidad, no se define una velocidad de bits ni una ventana de búfer que el codificador debe seguir. En su lugar, especifique un nivel de calidad para una secuencia multimedia digital en lugar de una velocidad de bits. El codificador comprime el contenido para que todas las muestras sean de calidad comparable; esto garantiza que la calidad sea coherente durante toda la duración de la reproducción, independientemente de los requisitos de búfer de la secuencia resultante.
La codificación VBR basada en la calidad tiende a crear grandes flujos comprimidos. En general, este tipo de codificación es adecuado para la reproducción local o conexiones de red de ancho de banda alto (o descarga y reproducción). Por ejemplo, puede escribir una aplicación para copiar canciones de CD a archivos ASF en un equipo. El uso de la codificación VBR basada en la calidad garantizaría que todas las canciones copiadas sean de la misma calidad. En esos casos, la calidad coherente proporcionará una mejor experiencia de usuario.
La desventaja de la codificación vbR basada en la calidad es que realmente no hay ninguna manera de conocer los requisitos de tamaño o ancho de banda del medio codificado antes de la sesión de codificación, ya que el codificador usa un solo paso de codificación. Esto puede hacer que los archivos codificados en VBR basados en calidad sean inadecuados para las circunstancias en las que la memoria o el ancho de banda están restringidos, como reproducir contenido en reproductores multimedia portátiles o transmitirlos a través de una red de ancho de banda bajo.
La configuración del codificador se establece a través de valores de propiedad. Estas propiedades se definen en wmcodecdsp.h. Las propiedades de configuración deben establecerse en el codificador antes de negociar el tipo de medio de salida. Para obtener información sobre cómo establecer propiedades en el codificador, consulte Configuración del codificador.
En la lista siguiente se muestran las propiedades que debe establecer para este tipo de codificación:
- Especifique el modo de codificación VBR estableciendo la propiedad MFPKEY_VBRENABLED en VARIANT_TRUE.
- Establezca el MFPKEY_PASSESUSED en 1 porque este modo VBR usa un paso de codificación.
- Establezca el nivel de calidad deseado (de 0 a 100) estableciendo la propiedad MFPKEY_DESIRED_VBRQUALITY . VBR basado en calidad no codifica el contenido en ningún parámetro de búfer predefinido. Este nivel de calidad que se mantendrá para toda la secuencia, independientemente de los requisitos de velocidad de bits resultantes.
- En el caso de las secuencias de vídeo, establezca la velocidad de bits promedio en un valor distinto de cero en el atributo MF_MT_AVG_BITRATE en el tipo de medio de salida del codificador. La velocidad de bits precisa se actualiza una vez completada la sesión de codificación.
En el ejemplo de código siguiente se muestra la implementación de SetEncodingProperties. Esta función establece las propiedades de codificación de nivel de secuencia para CBR y 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;
}