codificación de velocidad de bits variable Peak-Constrained
En la velocidad de bits variable restringida máxima (VBR), el contenido se codifica en una velocidad de bits y valores máximos especificados: una velocidad de bits máxima y una ventana de búfer máxima. Estos valores máximos también se denominan valores de cubo de pérdida máxima. El archivo se codifica para que se ajuste a un búfer descrito por los valores máximos, de modo que la velocidad de bits media global de la secuencia sea igual o menor que el valor de velocidad de bits promedio que especificó.
Normalmente, la velocidad de bits máxima es bastante alta. El codificador garantiza que el valor medio de velocidad de bits especificado se mantiene durante la duración de la secuencia (velocidad >de bits promedio = (tamaño total de la secuencia en bits o duración de la secuencia en segundos). Considere el ejemplo siguiente: configure una secuencia con una velocidad de bits media de 16 000 bits por segundo, una velocidad de bits máxima de 48 000 bits por segundo y una ventana de búfer máxima de 3000 (3 segundos). El tamaño del búfer utilizado para la secuencia es de 144 000 bits (48 000 bits por segundo * 3 segundos), según lo determinado por los valores máximos. El codificador comprime los datos para que se ajusten a ese búfer. Además, la velocidad media de bits de la secuencia debe ser de 16 000 o menos. Si el codificador debe crear muestras grandes para controlar un segmento complejo de contenido, puede aprovechar el tamaño de búfer grande. Sin embargo, otras partes de la secuencia deben codificarse a una velocidad de bits inferior para reducir el promedio al nivel especificado. La codificación VBR restringida máxima es útil para los dispositivos de reproducción con una capacidad de búfer finita y restricciones de velocidad de datos. Un ejemplo común de esto es la codificación usada para DVDs cuando un chip de un dispositivo realiza la descodificación, donde hay limitaciones de hardware que se deben tener en cuenta.
Configuración del codificador para Peak-Constrained VBR
VBR con restricciones máximas es como VBR sin restricciones en que se limita a una velocidad media de bits durante la duración de la secuencia. Además, VBR con restricción máxima se ajusta a un búfer máximo. Este búfer se describe mediante una velocidad de bits máxima y una ventana de búfer máxima. Este modo usa dos pasos de codificación y proporciona la flexibilidad del codificador en cómo codifica muestras individuales mientras se adhiere a las limitaciones máximas.
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 la transformación de Media Foundation del codificador (MFT) en función de la velocidad de bits media.
Debe establecer las siguientes propiedades 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 restringido de pico usa dos pasos de codificación.
- Establezca MFPKEY_RMAX para especificar la velocidad de bits máxima y establecer MFPKEY_BMAX para especificar la ventana del búfer máximo.
- 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 y 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.
Nota
Se recomienda establecer la velocidad de bits máxima en al menos dos veces la velocidad media de bits. Establecer la velocidad máxima en un valor inferior puede hacer que el codificador codifique el contenido como CBR de dos pasos en lugar de VBR con restricción máxima.
Para obtener el valor de ventana de búfer establecido por el codificador, llame a IWMCodecLeakyBucket::GetBufferSizeBits, definido en wmcodecifaces.h, 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_LEAKYBUCKET2 (valores de cubo de pérdida máxima) en el objeto de configuración de flujo al configurar el perfil de ASF.
En el ejemplo de código siguiente se modifica el método SetEncodingType de la clase de ejemplo CEncoder para configurar el modo VBR con restricción máxima. 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 peak-constrained VBR mode.
//
/////////////////////////////////////////////////////////////////////////
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_Peak)
{
// 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);
// Set the peak bit rate.
var.vt = VT_I4;
var.lVal =48000;
CHECK_HR(hr = pProp->SetValue(MFPKEY_RMAX, var));
PropVariantClear(&var);
// Set the peak buffer window.
var.vt = VT_I4;
var.lVal =3000;
CHECK_HR(hr = pProp->SetValue(MFPKEY_BMAX, var));
PropVariantClear(&var);
}
done:
PropVariantClear(&var);
SAFE_RELEASE (pProp);
return hr;
}
Temas relacionados