Partilhar via


Codificação de taxa de bits constante

Na codificação de taxa de bits constante (CBR), o codificador conhece a taxa de bits das amostras de mídia de saída e a janela de buffer (parâmetros de bucket com vazamento) antes do início da sessão de codificação. O codificador usa o mesmo número de bits para codificar cada segundo de amostra ao longo da duração do arquivo para atingir a taxa de bits de destino para um fluxo. Isso limita a variação no tamanho das amostras de fluxo. Além disso, durante a sessão de codificação, a taxa de bits não está exatamente no valor especificado, mas permanece próxima da taxa de bits de destino.

A codificação CBR é útil quando você deseja saber a taxa de bits ou a duração aproximada de um arquivo sem analisar o arquivo inteiro. Isso é necessário em cenários de transmissão ao vivo em que o conteúdo de mídia precisa ser transmitido a uma taxa de bits previsível e com uso consistente de largura de banda.

A desvantagem da codificação CBR é que a qualidade do conteúdo codificado não será constante. Como alguns conteúdos são mais difíceis de comprimir, partes de um fluxo CBR serão de qualidade inferior a outras. Por exemplo, um filme típico tem algumas cenas que são bastante estáticas e algumas cenas que são cheias de ação. Se você codificar um filme usando CBR, as cenas que são estáticas e, portanto, fáceis de codificar de forma eficiente, serão de maior qualidade do que as cenas de ação, o que exigiria tamanhos de amostra mais altos para manter a mesma qualidade.

Em geral, as variações na qualidade de um arquivo CBR são mais pronunciadas em taxas de bits mais baixas. Em taxas de bits mais altas, a qualidade de um arquivo codificado em CBR ainda variará, mas os problemas de qualidade serão menos percetíveis para o usuário. Ao usar a codificação CBR, você deve definir a largura de banda tão alta quanto o cenário de entrega permitir.

Definições de configuração do CBR

Você deve configurar um codificador especificando o tipo de codificação e as várias configurações específicas do fluxo antes da sessão de codificação.

Para configurar o codificador para codificação CBR

  1. Especifique o modo de codificação CBR.

    Por padrão, o codificador é configurado para usar a codificação CBR. A configuração do codificador é definida através de valores de propriedade. Essas propriedades são definidas em wmcodecdsp.h. Você pode especificar explicitamente esse modo definindo a propriedade MFPKEY_VBRENABLED como VARIANT_FALSE. Para obter informações sobre como definir propriedades em codificadores, consulte Configurando o codificador.

  2. Escolha a taxa de bits de codificação.

    Para codificação CBR, você deve saber a taxa de bits na qual deseja codificar o fluxo antes que a sessão de codificação comece. Você deve definir a taxa de bits durante a configuração do codificador. Para fazer isso, enquanto estiver executando a negociação de tipo de mídia, verifique o atributo MF_MT_AUDIO_AVG_BYTES_PER_SECOND (para fluxos de áudio) ou o atributo MF_MT_AVG_BITRATE (para fluxos de vídeo) dos tipos de mídia de saída disponíveis e escolha um tipo de mídia de saída que tenha a taxa de bits média mais próxima da taxa de bits de destino que você deseja alcançar. Para obter mais informações, consulte Negociação de tipo de mídia no codificador.

O exemplo de código a seguir mostra a implementação para SetEncodingProperties. Esta função define propriedades de codificação de nível de fluxo para CBR e 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;
}

Configurações do bucket com vazamento

Para a codificação CBR, os valores médios e máximos da caçamba com vazamento para o fluxo são os mesmos. Para obter mais informações sobre esses parâmetros, consulte The Leaky Bucket Buffer Model.

Para codificar fluxos de áudio CBR, você precisa definir os valores do bucket com vazamento depois de negociar o tipo de mídia de saída no codificador. O codificador calcula a janela de buffer internamente com base na taxa de bits média definida no tipo de mídia de saída.

Para definir valores de bucket com vazamento, crie uma matriz de DWORDs, pode definir os seguintes valores na propriedade MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET no repositório de propriedades do coletor de mídia. Para obter mais informações, consulte Propriedades de configuração noColetor de arquivos .

  • Taxa de bits média: obtenha a taxa de bits média do tipo de mídia de saída selecionado durante a negociação do tipo de mídia. Use o atributo MF_MT_AUDIO_AVG_BYTES_PER_SECOND.
  • Janela de buffer: consulte o codificador para a interface IWMCodecLeakyBucket e, em seguida, chame IWMCodecLeakyBucket::GetBufferSizeBits (wmcodecifaces.h, wmcodecdspuuid.lib).
  • Tamanho inicial do buffer: definido como 0.

Tipos de codificação ASF

Tutorial: 1-Pass Windows Media Encoding

Tutorial: Escrevendo um arquivo WMA usando a codificação CBR