codificação de taxa de bits variável Peak-Constrained
Na VBR (taxa de bits variáveis com restrição de pico), 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 bucket com vazamento de pico. 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 que o valor médio da taxa de bits que você especificou.
Normalmente, a taxa de bits de pico é bastante alta. O codificador garante que o valor médio da taxa de bits especificado seja mantido durante a duração do fluxo (taxa >média de bits = (tamanho total do fluxo em bits/duração do fluxo em segundos)). Considere o exemplo a seguir: configure um fluxo com uma taxa média de bits 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 média de bits 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 de VBR com restrição de pico é útil para dispositivos de reprodução com capacidade de buffer finito e restrições de taxa de dados. Um exemplo comum disso é a codificação usada para DVDs quando a decodificação é executada por um chip em um dispositivo, em que há limitações de hardware que devem ser consideradas.
Configurando o codificador para Peak-Constrained VBR
A VBR com restrição de pico é como uma VBR irrestrita , pois está restrita a uma taxa média de bits durante a duração do fluxo. Além disso, a VBR com restrição de pico 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. Esse modo usa duas passagens de codificação e dá ao codificador flexibilidade na forma como codifica amostras individuais ao aderir às limitações de pico.
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 na MFT (transformação media foundation ) do codificador com base na taxa média de bits.
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 com restrição de pico usa duas passagens de codificação.
- Defina MFPKEY_RMAX para especificar a taxa de bits de pico e definir MFPKEY_BMAX para especificar a janela de buffer de pico.
- 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 e escolha um tipo de mídia de saída que tenha a taxa média de bits mais próxima da taxa média de bits desejada 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.
Observação
É recomendável que você defina a taxa de bits de pico como pelo menos o dobro da taxa média de bits. Definir a taxa de pico como um valor mais baixo pode fazer com que o codificador codifique o conteúdo como CBR de duas passões em vez de VBR com restrição de pico.
Para obter o valor da janela do buffer definido pelo codificador, chame IWMCodecLeakyBucket::GetBufferSizeBits, definido em wmcodecifaces.h, 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_LEAKYBUCKET2 (valores de bucket com vazamento de pico) no objeto de configuração de fluxo ao configurar o perfil ASF.
O exemplo de código a seguir modifica o método SetEncodingType da classe de exemplo CEncoder para configurar o modo VBR com restrição de pico. 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 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;
}
Tópicos relacionados