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.
Ao contrário Constant Bit Rate Encoding (CBR), onde o codificador se esforça para manter uma taxa de bits específica da mídia codificada, no modo de taxa de bits variável (VBR), 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 os fluxos codificados em CBR.
A qualidade do conteúdo codificado é determinada pela quantidade de dados que é perdida quando o conteúdo é compactado. Muitos fatores afetam a perda de dados no processo de compressão; Mas, em geral, quanto mais complexos os dados originais e maior a taxa de compressão, mais detalhes são perdidos no processo de compressã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 comprime o conteúdo para que todas as amostras 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, este tipo de codificação é adequado para reprodução local ou conexões de rede de alta largura de banda (ou download e reprodução). Por exemplo, você pode escrever um aplicativo para copiar músicas de CD para arquivos ASF em um computador. Usar a codificação VBR baseada em qualidade garantiria que todas as músicas copiadas tivessem a mesma qualidade. Nesses casos, a qualidade consistente proporcionará uma melhor experiência ao usuário.
A desvantagem da codificação VBR baseada em qualidade é que não há realmente nenhuma maneira de saber o tamanho ou os requisitos de largura de banda da mídia codificada antes da sessão de codificação, porque o codificador usa um único passo de codificação. Isso pode tornar os arquivos codificados em VBR com base em qualidade inadequados para circunstâncias em que a memória ou a largura de banda são restritas, como a reprodução de conteúdo em players de mídia portáteis ou streaming em uma rede de baixa largura de banda.
Configurar o codificador para a codificação VBR Quality-Based
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.
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 um passo de codificação.
- Defina o nível de qualidade desejado (de 0 a 100) definindo a propriedade MFPKEY_DESIRED_VBRQUALITY. VBR baseado em qualidade não codifica o conteúdo para quaisquer parâmetros de buffer predefinidos. Este nível de qualidade será mantido para todo o fluxo, independentemente dos requisitos de taxa de bits resultantes.
- Para fluxos de vídeo, defina a taxa de bits média para um valor não-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 para SetEncodingProperties. Esta função define propriedades de codificação de nível de 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