Partilhar via


Codificação de taxa de bits variável irrestrita

No modo de codificação de VBR (taxa de bits variáveis irrestrita), o conteúdo é codificado para a qualidade mais alta possível, mantendo uma taxa de bits especificada.

A codificação de VBR irrestrita usa duas passagens de codificação. Ao usar a codificação de VBR irrestrita, você especifica uma taxa de bits para o fluxo, como faria com a Codificação de Taxa de Bits Constante. No entanto, o codificador usa esse valor apenas como a taxa média de bits para o fluxo e codifica para que a qualidade seja o mais alta possível, mantendo a média. Amostras individuais produzidas pelo codificador variam de tamanho sem limites de buffer explícitos. No entanto, a taxa média de bits durante a sessão de codificação e a duração do fluxo não devem ser mais do que o valor especificado por você. A taxa de bits real em qualquer ponto no fluxo codificado pode variar muito do valor médio. Você não define uma janela de buffer para codificação de VBR irrestrita. Em vez disso, o codificador calcula o tamanho da janela de buffer necessária com base nos requisitos dos exemplos codificados. Isso significa que não há limite para o tamanho de amostras individuais no fluxo, desde que a taxa média de bits seja menor ou igual ao valor definido.

A vantagem da codificação de VBR irrestrita é que o fluxo compactado tem a maior qualidade possível, mantendo-se dentro de uma largura de banda média previsível. Use isso quando precisar especificar uma largura de banda, mas as flutuações em torno da largura de banda especificada forem aceitáveis; por exemplo, para arquivos locais ou apenas para download.

A desvantagem desse modo de codificação é que o codificador pode definir a janela de buffer como qualquer valor necessário após a codificação, não oferecendo controle sobre o tamanho do buffer. Na maioria dos casos, se você não estiver preocupado com o tamanho do buffer ou com a consistência do uso da largura de banda, deverá usar a Codificação de Taxa de Bits Variável Baseada em Qualidade

Configurando o codificador para VBR irrestrito

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. Com base nos valores de propriedade especificados, você pode enumerar os tipos de saída de VBR com suporte e selecionar o necessário no codificador MFT (Media Foundation Transform ) com base na taxa média de bits.

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 2 porque o modo VBR irrestrito usa duas passagens de codificação.
  • Ao enumerar o tipo de mídia de saída, marcar 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. Escolha um tipo de mídia de saída que tenha a taxa média de bits mais próxima da taxa de bits média desejada que você deseja que o codificador mantenha no conteúdo codificado. Para obter mais informações sobre como selecionar o tipo de mídia de saída, consulte Media Type Negotiation no Codificador.

Para obter o valor da janela do buffer definido pelo codificador, chame IWMCodecLeakyBucket::GetBufferSizeBits, definido em wmcodecifaces.h e wmcodecdspuuid.lib, após a sessão de codificação. Para adicionar suporte irrestrito à VBR para os fluxos, você deve definir esse valor no atributo MF_ASFSTREAMCONFIG_LEAKYBUCKET1 (valores médios de bucket com vazamento) no objeto de configuração de fluxo ao configurar o perfil ASF.

O seguinte modifica o método SetEncodingType da classe de exemplo CEncoder para configurar o modo VBR irrestrito. Para obter informações sobre essa classe, consulte Código de exemplo do codificador. Para obter informações sobre as macros auxiliares usadas neste exemplo, consulte Usando os exemplos de código do 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;
    
}

Tipos de codificação ASF

O modelo de buffer de bucket com vazamento

Como criar uma topologia para Two-Pass codificação do Windows Media