Compartilhar via


codificação de taxa de bits variável Quality-Based

Ao contrário da CBR ( Constante Taxa de Bits ), em que o codificador se esforça para manter uma taxa de bits específica da mídia codificada, no modo VBR (taxa de bits variável), o codificador se esforça para alcançar a melhor qualidade possível da mídia codificada. A principal diferença entre CBR e VBR é o tamanho da janela de buffer usada. Os fluxos codificados em VBR geralmente têm grandes janelas de buffer em comparação com fluxos codificados em CBR.

A qualidade do conteúdo codificado é determinada pela quantidade de dados perdidos quando o conteúdo é compactado. Muitos fatores afetam a perda de dados no processo de compactação; mas, em geral, quanto mais complexos forem os dados originais e maior a taxa de compactação, mais detalhes serão perdidos no processo de compactação.

No modo VBR baseado em qualidade, você não define uma taxa de bits ou uma janela de buffer que o codificador deve seguir. Em vez disso, você especifica um nível de qualidade para um fluxo de mídia digital em vez de uma taxa de bits. O codificador compacta o conteúdo para que todos os exemplos sejam de qualidade comparável; isso garante que a qualidade seja consistente durante toda a duração da reprodução, independentemente dos requisitos de buffer do fluxo resultante.

A codificação VBR baseada em qualidade tende a criar grandes fluxos compactados. Em geral, esse tipo de codificação é adequado para conexões de rede de reprodução local ou de alta largura de banda (ou baixar e reproduzir). Por exemplo, você pode escrever um aplicativo para copiar músicas de arquivos CD para ASF em um computador. O uso da codificação VBR baseada em qualidade garantiria que todas as músicas copiadas sejam da mesma qualidade. Nesses casos, a qualidade consistente fornecerá uma melhor experiência do usuário.

A desvantagem da codificação VBR baseada em qualidade é que realmente não há como saber os requisitos de tamanho ou largura de banda da mídia codificada antes da sessão de codificação, porque o codificador usa um único passe de codificação. Isso pode tornar os arquivos codificados em VBR baseados em qualidade inadequados para circunstâncias em que a memória ou a largura de banda são restritas, como reproduzir conteúdo em players de mídia portáteis ou transmitir por uma rede de baixa largura de banda.

Configurando o codificador para codificação de Quality-Based VBR

A configuração do codificador é definida por meio de valores de propriedade. Essas propriedades são definidas em wmcodecdsp.h. As propriedades de configuração devem ser definidas no codificador antes de negociar o tipo de mídia de saída. Para obter informações sobre como definir propriedades no codificador, consulte Configurando o codificador.

A lista a seguir mostra as propriedades que você deve definir para esse tipo de codificação:

  • Especifique o modo de codificação VBR definindo a propriedade MFPKEY_VBRENABLED como VARIANT_TRUE.
  • Defina o MFPKEY_PASSESUSED como 1 porque esse modo VBR usa uma passagem de codificação.
  • Defina o nível de qualidade desejado (de 0 a 100) definindo a propriedade MFPKEY_DESIRED_VBRQUALITY . A VBR baseada em qualidade não codifica o conteúdo para nenhum parâmetro de buffer predefinido. Esse nível de qualidade que será mantido para todo o fluxo, independentemente dos requisitos de taxa de bits resultantes.
  • Para fluxos de vídeo, defina a taxa média de bits como um valor diferente de zero no atributo MF_MT_AVG_BITRATE no tipo de mídia de saída do codificador. A taxa de bits precisa é atualizada após a conclusão da sessão de codificação.

O exemplo de código a seguir mostra a implementação de SetEncodingProperties. Essa função define as propriedades de codificação no nível do 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;
}

Tipos de codificação ASF