Codificación de velocidad de bits variable sin restricciones
En modo de codificación de velocidad de bits variable (VBR) sin restricciones, el contenido se codifica a la máxima calidad posible manteniendo una velocidad de bits especificada.
La codificación VBR sin restricciones usa dos pasos de codificación. Al usar la codificación VBR sin restricciones, se especifica una velocidad de bits para la secuencia, como lo haría con la codificación de velocidad de bits constante. Sin embargo, el codificador usa este valor solo como la velocidad media de bits para la secuencia y codifica para que la calidad sea lo más alta posible mientras se mantiene el promedio. Las muestras individuales producidas por el codificador varían en tamaño sin límites explícitos de búfer. Sin embargo, la velocidad media de bits durante la sesión de codificación y la duración de la secuencia no debe ser superior al valor especificado por usted. La velocidad de bits real en cualquier punto de la secuencia codificada puede variar considerablemente del valor medio. No establece una ventana de búfer para la codificación VBR sin restricciones. En su lugar, el codificador calcula el tamaño de la ventana de búfer necesaria en función de los requisitos de los ejemplos codificados. Esto significa que no hay ningún límite en el tamaño de las muestras individuales de la secuencia, siempre y cuando la velocidad de bits promedio sea menor o igual que el valor establecido.
La ventaja de la codificación VBR sin restricciones es que la secuencia comprimida tiene la máxima calidad posible mientras permanece dentro de un ancho de banda promedio predecible. Úselo cuando necesite especificar un ancho de banda, pero las fluctuaciones alrededor del ancho de banda especificado son aceptables; por ejemplo, para archivos locales o solo para descargar.
La desventaja de este modo de codificación es que el codificador puede establecer la ventana del búfer en cualquier valor necesario después de la codificación, lo que le da ningún control sobre el tamaño del búfer. En la mayoría de los casos, si no le preocupa el tamaño del búfer o la coherencia del uso del ancho de banda, debe usar la codificación de velocidad de bits variable basada en calidad.
Configuración del codificador para VBR sin restricciones
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 función de los valores de propiedad especificados, puede enumerar los tipos de salida de VBR admitidos y seleccionar el necesario en el codificador Media Foundation Transform (MFT) en función de la velocidad de bits media.
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 2 porque el modo VBR sin restricciones usa dos pasos de codificación.
- Al enumerar el tipo de medio de salida, compruebe el atributo MF_MT_AUDIO_AVG_BYTES_PER_SECOND (para secuencias de audio) o el atributo MF_MT_AVG_BITRATE (para secuencias de vídeo) de los tipos de medios de salida disponibles. Elija un tipo de medio de salida que tenga la velocidad de bits media más cercana a la velocidad de bits media deseada que desea que el codificador mantenga en el contenido codificado. Para obtener más información sobre cómo seleccionar el tipo de medio de salida, vea Negociación de tipos de medios en el codificador.
Para obtener el valor de la ventana del búfer se establece mediante el codificador, llame a IWMCodecLeakyBucket::GetBufferSizeBits, definido en wmcodecifaces.h y wmcodecdspuuid.lib, después de la sesión de codificación. Para agregar compatibilidad con VBR sin restricciones para las secuencias, debe establecer este valor en el atributo MF_ASFSTREAMCONFIG_LEAKYBUCKET1 (valores de cubo de pérdida promedio) en el objeto de configuración de flujo al configurar el perfil de ASF.
A continuación se modifica el método SetEncodingType de la clase de ejemplo CEncoder para configurar el modo VBR sin restricciones. Para obtener información sobre esta clase, vea Código de ejemplo del codificador. Para obtener información sobre las macros auxiliares que se usan en este ejemplo, vea Uso de los ejemplos de código de 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;
}
Temas relacionados