Partilhar via


Peak-Constrained Codificação de taxa de bits variável

Na taxa de bits variável restrita por pico (VBR), o conteúdo é codificado para uma taxa de bits especificada e valores de pico: uma taxa de bits de pico e uma janela de buffer de pico. Esses valores de pico também são chamados de valores de pico do algoritmo Leaky Bucket. O arquivo é codificado para estar em conformidade com um buffer descrito pelos valores de pico, de modo que a taxa de bits média geral do fluxo seja igual ou menor do que o valor médio da taxa de bits especificado.

Normalmente, a taxa de bits de pico é bastante alta. O codificador garante que o valor médio da taxa de bits especificado seja mantido ao longo da duração do fluxo (taxa de bits média >= (tamanho total do fluxo em bits / duração do fluxo em segundos)). Considere o seguinte exemplo: Você configura um fluxo com uma taxa de bits média de 16.000 bits por segundo, uma taxa de bits de pico de 48.000 bits por segundo e uma janela de buffer de pico de 3.000 (3 segundos). O tamanho do buffer usado para o fluxo é de 144.000 bits (48.000 bits por segundo * 3 segundos), conforme determinado pelos valores de pico. O codificador compacta os dados para estar em conformidade com esse buffer. Além disso, a taxa de bits média do fluxo deve ser de 16.000 ou menos. Se o codificador precisar criar amostras grandes para lidar com um segmento complexo de conteúdo, ele poderá aproveitar o tamanho do buffer grande. Mas outras partes do fluxo devem ser codificadas a uma taxa de bits mais baixa para reduzir a média para o nível especificado. A codificação VBR restrita a picos é útil para dispositivos de reprodução com uma capacidade de buffer finita e restrições de taxa de dados. Um exemplo comum disso é a codificação usada para DVDs quando a decodificação é realizada por um chip em um dispositivo, onde há limitações de hardware que devem ser consideradas.

Configurando o codificador para Peak-Constrained VBR

VBR com restrição de pico é como VBR sem restrições na medida em que está confinado a uma taxa de bits média ao longo da duração do fluxo. Além disso, o VBR restrito a picos está em conformidade com um buffer de pico. Esse buffer é descrito usando uma taxa de bits de pico e uma janela de buffer de pico. Este modo usa duas passagens de codificação e dá ao codificador flexibilidade na forma como codifica amostras individuais enquanto adere às limitações de pico.

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.

Você deve definir as seguintes propriedades 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 restrito a picos usa dois passos de codificação.
  • Defina MFPKEY_RMAX para especificar a taxa de bits de pico e defina MFPKEY_BMAX para especificar a janela de buffer de pico.
  • 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 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 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.

Observação

É recomendável que você defina a taxa de bits de pico para pelo menos duas vezes a taxa de bits média. Definir a taxa de pico para um valor mais baixo pode fazer com que o codificador codifique o conteúdo como CBR em duas passagens, em vez de VBR com restrição de pico.

 

Para obter o valor da janela de buffer definido pelo codificador, chame IWMCodecLeakyBucket::GetBufferSizeBits, definido em wmcodecifaces.h, 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_LEAKYBUCKET2 (valores de bucket de pico de vazamento) no objeto de configuração de fluxo durante a configuração do perfil ASF.

O exemplo de código a seguir modifica o método SetEncodingType da classe de exemplo CEncoder para configurar o modo VBR restrito a pico. 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 peak-constrained VBR mode.
//
/////////////////////////////////////////////////////////////////////////

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_Peak)
    {
        // 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);

        // Set the peak bit rate.
        var.vt = VT_I4;
        var.lVal  =48000;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_RMAX, var));
        PropVariantClear(&var);

        // Set the peak buffer window.
        var.vt = VT_I4;
        var.lVal  =3000;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_BMAX, 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 de codificação do Windows Media