codificação de taxa de bits variável Quality-Based
Ao contrário da CBR ( Constante Taxa de Bits ), em que o codificador se esforça para manter uma taxa de bits específica da mídia codificada, no modo VBR (taxa de bits variável), o codificador se esforça para alcançar a melhor qualidade possível da mídia codificada. A principal diferença entre CBR e VBR é o tamanho da janela de buffer usada. Os fluxos codificados em VBR geralmente têm grandes janelas de buffer em comparação com fluxos codificados em CBR.
A qualidade do conteúdo codificado é determinada pela quantidade de dados perdidos quando o conteúdo é compactado. Muitos fatores afetam a perda de dados no processo de compactação; mas, em geral, quanto mais complexos forem os dados originais e maior a taxa de compactação, mais detalhes serão perdidos no processo de compactação.
No modo VBR baseado em qualidade, você não define uma taxa de bits ou uma janela de buffer que o codificador deve seguir. Em vez disso, você especifica um nível de qualidade para um fluxo de mídia digital em vez de uma taxa de bits. O codificador compacta o conteúdo para que todos os exemplos sejam de qualidade comparável; isso garante que a qualidade seja consistente durante toda a duração da reprodução, independentemente dos requisitos de buffer do fluxo resultante.
A codificação VBR baseada em qualidade tende a criar grandes fluxos compactados. Em geral, esse tipo de codificação é adequado para conexões de rede de reprodução local ou de alta largura de banda (ou baixar e reproduzir). Por exemplo, você pode escrever um aplicativo para copiar músicas de arquivos CD para ASF em um computador. O uso da codificação VBR baseada em qualidade garantiria que todas as músicas copiadas sejam da mesma qualidade. Nesses casos, a qualidade consistente fornecerá uma melhor experiência do usuário.
A desvantagem da codificação VBR baseada em qualidade é que realmente não há como saber os requisitos de tamanho ou largura de banda da mídia codificada antes da sessão de codificação, porque o codificador usa um único passe de codificação. Isso pode tornar os arquivos codificados em VBR baseados em qualidade inadequados para circunstâncias em que a memória ou a largura de banda são restritas, como reproduzir conteúdo em players de mídia portáteis ou transmitir por uma rede de baixa largura de banda.
Configurando o codificador para codificação de Quality-Based VBR
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.
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 1 porque esse modo VBR usa uma passagem de codificação.
- Defina o nível de qualidade desejado (de 0 a 100) definindo a propriedade MFPKEY_DESIRED_VBRQUALITY . A VBR baseada em qualidade não codifica o conteúdo para nenhum parâmetro de buffer predefinido. Esse nível de qualidade que será mantido para todo o fluxo, independentemente dos requisitos de taxa de bits resultantes.
- Para fluxos de vídeo, defina a taxa média de bits como um valor diferente de zero no atributo MF_MT_AVG_BITRATE no tipo de mídia de saída do codificador. A taxa de bits precisa é atualizada após a conclusão da sessão de codificação.
O exemplo de código a seguir mostra a implementação de SetEncodingProperties. Essa função define as propriedades de codificação no nível do fluxo para CBR e VBR.
//-------------------------------------------------------------------
// SetEncodingProperties
// Create a media source from a URL.
//
// guidMT: Major type of the stream, audio or video
// pProps: A pointer to the property store in which
// to set the required encoding properties.
//-------------------------------------------------------------------
HRESULT SetEncodingProperties (const GUID guidMT, IPropertyStore* pProps)
{
if (!pProps)
{
return E_INVALIDARG;
}
if (EncodingMode == NONE)
{
return MF_E_NOT_INITIALIZED;
}
HRESULT hr = S_OK;
PROPVARIANT var;
switch (EncodingMode)
{
case CBR:
// Set VBR to false.
hr = InitPropVariantFromBoolean(FALSE, &var);
if (FAILED(hr))
{
goto done;
}
hr = pProps->SetValue(MFPKEY_VBRENABLED, var);
if (FAILED(hr))
{
goto done;
}
// Set the video buffer window.
if (guidMT == MFMediaType_Video)
{
hr = InitPropVariantFromInt32(VIDEO_WINDOW_MSEC, &var);
if (FAILED(hr))
{
goto done;
}
hr = pProps->SetValue(MFPKEY_VIDEOWINDOW, var);
if (FAILED(hr))
{
goto done;
}
}
break;
case VBR:
//Set VBR to true.
hr = InitPropVariantFromBoolean(TRUE, &var);
if (FAILED(hr))
{
goto done;
}
hr = pProps->SetValue(MFPKEY_VBRENABLED, var);
if (FAILED(hr))
{
goto done;
}
// Number of encoding passes is 1.
hr = InitPropVariantFromInt32(1, &var);
if (FAILED(hr))
{
goto done;
}
hr = pProps->SetValue(MFPKEY_PASSESUSED, var);
if (FAILED(hr))
{
goto done;
}
// Set the quality level.
if (guidMT == MFMediaType_Audio)
{
hr = InitPropVariantFromUInt32(98, &var);
if (FAILED(hr))
{
goto done;
}
hr = pProps->SetValue(MFPKEY_DESIRED_VBRQUALITY, var);
if (FAILED(hr))
{
goto done;
}
}
else if (guidMT == MFMediaType_Video)
{
hr = InitPropVariantFromUInt32(95, &var);
if (FAILED(hr))
{
goto done;
}
hr = pProps->SetValue(MFPKEY_VBRQUALITY, var);
if (FAILED(hr))
{
goto done;
}
}
break;
default:
hr = E_UNEXPECTED;
break;
}
done:
PropVariantClear(&var);
return hr;
}
Tópicos relacionados