Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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;
}
Tópicos relacionados
-
como criar uma topologia para Two-Pass de codificação do Windows Media