Codificación de velocidad de bits constante

En la codificación de velocidad de bits constante (CBR), el codificador conoce la velocidad de bits de las muestras de medios de salida y la ventana de búfer (parámetros de cubo filtradas) antes de que comience la sesión de codificación. El codificador usa el mismo número de bits para codificar cada segundo de muestra a lo largo de la duración del archivo para lograr la velocidad de bits de destino de una secuencia. Esto limita la variación en el tamaño de las muestras de flujo. Además, durante la sesión de codificación, la velocidad de bits no está exactamente en el valor especificado, pero permanece cerca de la velocidad de bits de destino.

La codificación CBR es útil cuando desea saber la velocidad de bits o la duración aproximada de un archivo sin tener que analizar todo el archivo. Esto es necesario en los escenarios de transmisión por secuencias en directo en los que el contenido multimedia debe transmitirse a una velocidad de bits predecible y con un uso de ancho de banda coherente.

La desventaja de la codificación CBR es que la calidad del contenido codificado no será constante. Dado que algunos contenidos son más difíciles de comprimir, las partes de una secuencia CBR serán de menor calidad que otras. Por ejemplo, una película típica tiene algunas escenas que son bastante estáticas y algunas escenas que están llenas de acción. Si codifica una película mediante CBR, las escenas que son estáticas y, por lo tanto, fáciles de codificar de forma eficaz, serán de mayor calidad que las escenas de acción, que habrían requerido tamaños de muestra más altos para mantener la misma calidad.

En general, las variaciones en la calidad de un archivo CBR se pronuncian más a velocidades de bits más bajas. A velocidades de bits más altas, la calidad de un archivo codificado en CBR seguirá variando, pero los problemas de calidad serán menos notables para el usuario. Al usar la codificación CBR, debe establecer el ancho de banda tan alto como permita el escenario de entrega.

Opciones de configuración de CBR

Debe configurar un codificador especificando el tipo de codificación y las distintas opciones de configuración específicas de la secuencia antes de la sesión de codificación.

Para configurar el codificador para la codificación CBR

  1. Especifique el modo de codificación CBR.

    De forma predeterminada, el codificador está configurado para usar la codificación CBR. La configuración del codificador se establece mediante valores de propiedad. Estas propiedades se definen en wmcodecdsp.h. Puede especificar explícitamente este modo estableciendo la propiedad MFPKEY_VBRENABLED en VARIANT_FALSE. Para obtener información sobre cómo establecer propiedades en codificadores, consulte Configuración del codificador.

  2. Elija la velocidad de bits de codificación.

    Para la codificación CBR, debe conocer la velocidad de bits a la que desea codificar la secuencia antes de que comience la sesión de codificación. Debe establecer la velocidad de bits durante la configuración del codificador. Para ello, mientras realiza la negociación de tipos de medios, 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 objetivo que desea lograr. Para obtener más información, consulte Negociación de tipos de medios en el codificador.

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 flujo 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;
}

Configuración del cubo filtrada

En el caso de la codificación CBR, el promedio y el número máximo de valores de cubo de fuga para la secuencia son los mismos. Para obtener más información sobre estos parámetros, vea El modelo de búfer de cubos con fugas.

Para codificar las secuencias de audio CBR, debe establecer los valores de cubo filtrados después de negociar el tipo de medio de salida en el codificador. El codificador calcula la ventana de búfer internamente en función de la velocidad de bits media establecida en el tipo de medio de salida.

Para establecer valores de cubo de pérdida, cree una matriz de DWORDs puede establecer los valores siguientes en la propiedad MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET del almacén de propiedades del receptor de medios. Para obtener más información, vea Establecer propiedades en el receptor de archivos.

Tipos de codificación asf

Tutorial: Codificación de Windows Media de 1 paso

Tutorial: Escritura de un archivo WMA mediante la codificación CBR