Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W przeciwieństwie do kodowania przy stałej szybkości transmisji bitów (CBR), gdzie koder stara się utrzymać określoną szybkość transmisji bitów zakodowanego materiału, w trybie zmiennej szybkości transmisji bitów (VBR) koder dąży do osiągnięcia najlepszej możliwej jakości zakodowanego materiału. Podstawową różnicą między CBR i VBR jest rozmiar używanego okna buforu. Strumienie zakodowane w formacie VBR zwykle mają duże okna buforu w porównaniu z strumieniami zakodowanymi w formacie CBR.
Jakość zakodowanej zawartości jest określana przez ilość danych, które zostaną utracone po skompresowaniu zawartości. Wiele czynników wpływa na utratę danych w procesie kompresji; ale ogólnie rzecz biorąc, im bardziej złożone oryginalne dane i im wyższy współczynnik kompresji, tym więcej szczegółów zostanie utraconych w procesie kompresji.
W trybie VBR opartym na jakości nie określa się ani szybkości transmisji bitów, ani okna buforu, które koder musi uwzględniać. Zamiast tego należy określić poziom jakości strumienia multimediów cyfrowych zamiast szybkości transmisji bitów. Koder kompresuje zawartość tak, aby wszystkie próbki były porównywalnej jakości; Gwarantuje to, że jakość jest spójna przez cały czas trwania odtwarzania, niezależnie od wymagań buforu wynikowego strumienia.
Kodowanie VBR oparte na jakości zwykle tworzy duże skompresowane strumienie. Ogólnie rzecz biorąc, ten typ kodowania jest odpowiedni dla lokalnego odtwarzania lub połączeń sieciowych o wysokiej przepustowości (lub pobierania i odtwarzania). Na przykład można napisać aplikację do kopiowania piosenek z dysku CD do plików ASF na komputerze. Użycie kodowania VBR opartego na jakości zapewni, że wszystkie skopiowane utwory będą miały taką samą jakość. W takich przypadkach spójna jakość zapewni lepsze środowisko użytkownika.
Wadą kodowania VBR opartego na jakości jest to, że naprawdę nie ma możliwości poznania wymagań dotyczących rozmiaru lub przepustowości zakodowanego nośnika przed sesją kodowania, ponieważ koder używa pojedynczego przekazywania kodowania. Może to sprawić, że pliki zakodowane w jakości VBR będą nieodpowiednie w sytuacjach, gdy pamięć lub przepustowość są ograniczone, takie jak odtwarzanie zawartości na przenośnych odtwarzaczach multimedialnych lub przesyłanie strumieniowe za pośrednictwem sieci o niskiej przepustowości.
Konfigurowanie kodera na potrzeby kodowania Quality-Based VBR
Konfiguracja kodera jest ustawiana za pomocą wartości właściwości. Te właściwości są definiowane w pliku wmcodecdsp.h. Właściwości konfiguracji należy ustawić na koderze przed wynegocjowaniem typu nośnika wyjściowego. Aby uzyskać informacje o sposobie ustawiania właściwości w koderze, zobacz Configuring the Encoder.
Na poniższej liście przedstawiono właściwości, które należy ustawić dla tego typu kodowania:
- Określ tryb kodowania VBR, ustawiając właściwość MFPKEY_VBRENABLED na VARIANT_TRUE.
- Ustaw MFPKEY_PASSESUSED na 1, ponieważ ten tryb VBR używa jednego przebiegu kodowania.
- Ustaw żądany poziom jakości (od 0 do 100), ustawiając właściwość MFPKEY_DESIRED_VBRQUALITY. VBR oparte na jakości nie koduje zawartości do żadnych wstępnie zdefiniowanych parametrów buforu. Ten poziom jakości będzie utrzymywany dla całego strumienia, niezależnie od wynikających wymagań dotyczących szybkości transmisji bitów.
- W przypadku strumieni wideo ustaw średnią szybkość transmisji bitów na wartość niezerową w atrybucie MF_MT_AVG_BITRATE na wyjściowym typie nośnika kodera. Dokładna szybkość bitów jest aktualizowana po zakończeniu sesji kodowania.
Poniższy przykład kodu przedstawia implementację właściwości SetEncodingProperties. Ta funkcja ustawia właściwości kodowania na poziomie strumienia dla CBR i 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;
}
Tematy pokrewne