Partilhar via


Codificação de taxa de bits variável sem restrições

No modo de codificação VBR (taxa de bits variável) sem restrições, o conteúdo é codificado com a mais alta qualidade possível, mantendo uma taxa de bits especificada.

A codificação VBR sem restrições utiliza duas passagens de codificação. Ao usar a codificação VBR sem restrições, você especifica uma taxa de bits para o fluxo, como faria com Constant Bit Rate Encoding. No entanto, o codificador usa esse valor apenas como a taxa de bits média para o fluxo e codifica para que a qualidade seja a mais alta possível, mantendo a média. As amostras individuais produzidas pelo codificador variam em tamanho sem limites explícitos de buffer. No entanto, a taxa de bits média 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 do fluxo codificado pode variar muito do valor médio. Você não define uma janela de buffer para codificação VBR sem restrições. Em vez disso, o codificador calcula o tamanho da janela de buffer necessária com base nos requisitos das amostras codificadas. Isso significa que não há limite para o tamanho de amostras individuais no fluxo, desde que a taxa de bits média seja menor ou igual ao valor definido.

A vantagem da codificação VBR sem restrições é que o fluxo compactado tem a mais alta qualidade possível, permanecendo dentro de uma largura de banda média previsível. Utilize esta configuração quando for necessário especificar uma largura de banda e as flutuações em torno da largura de banda especificada forem aceitáveis; por exemplo, para ficheiros locais ou apenas para descarregamentos.

A desvantagem deste modo de codificação é que o codificador pode definir a janela de buffer para qualquer valor necessário após a codificação, não lhe dando nenhum controle sobre o tamanho do buffer. Na maioria dos casos, se você não estiver preocupado com o tamanho do buffer ou a consistência do uso da largura de banda, você deve usar Quality-Based codificação de taxa de bits variável

Configurando o codificador para VBR sem restrições

A configuração do codificador é definida através 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 VBR suportados e selecionar o necessário no codificador Media Foundation Transform (MFT) com base na taxa de bits média.

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 sem restrições usa dois passos de codificação.
  • Ao enumerar o tipo de mídia de saída, 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. Escolha um tipo de mídia de saída que tenha a taxa de bits média 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 Negociação de tipo de mídia no codificador.

Para obter o valor da janela de 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 VBR irrestrito 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 durante a configuração do perfil ASF.

O seguinte modifica o método SetEncodingType da classe de exemplo CEncoder para configurar o modo VBR sem restrições. Para obter informações sobre essa classe, consulte Encoder Example Code. 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 codificação do Windows Media Two-Pass