一定ビット レート (CBR) エンコードでは、エンコーダーはエンコード セッションが開始される前に、出力メディア サンプルのビット レートとバッファー ウィンドウ (漏れバケット パラメーター) を認識します。 エンコーダーは、同じビット数を使用して、ストリームのターゲット ビット レートを実現するために、ファイルの期間を通してサンプルの各秒をエンコードします。 これにより、ストリーム サンプルのサイズの変動が制限されます。 また、エンコード セッション中、ビット レートは指定された値に正確には設定されませんが、ターゲット ビット レートに近いままです。
CBR エンコードは、ファイル全体を解析せずにファイルのビット レートまたはおおよその期間を知りたい場合に便利です。 これは、メディア コンテンツを予測可能なビット レートで一貫した帯域幅使用でストリーミングする必要があるライブ ストリーミング シナリオで必要です。
CBR エンコードの欠点は、エンコードされたコンテンツの品質が一定にならないということです。 一部のコンテンツは圧縮が困難であるため、CBR ストリームの一部は他のコンテンツよりも低品質になります。 たとえば、一般的な映画には、かなり静的なシーンと、アクションに満ちたシーンがあります。 CBR を使用してムービーをエンコードする場合、静的で効率的にエンコードしやすいシーンは、同じ品質を維持するためにより高いサンプル サイズを必要とするアクション シーンよりも高品質になります。
一般に、CBR ファイルの品質の変動はより低いビット レートで顕著になります。 ビットレートが高いほど、CBR でエンコードされたファイルの品質は変わりますが、品質の問題はユーザーにはあまり目立ちません。 CBR エンコードを使用する場合は、配信シナリオで可能な限り高い帯域幅を設定する必要があります。
CBR 構成設定
エンコード セッションの前にエンコードの種類とさまざまなストリーム固有の設定を指定して、エンコーダーを構成する必要があります。
CBR エンコード 用にエンコーダーを構成するには
CBR エンコード モードを指定します。
既定では、エンコーダーは CBR エンコードを使用するように構成されています。 エンコーダーの構成は、プロパティ値によって設定されます。 これらのプロパティは wmcodecdsp.h で定義されています。 このモードを明示的に指定するには、MFPKEY_VBRENABLED プロパティを VARIANT_FALSE に設定します。 エンコーダーのプロパティを設定する方法については、「エンコーダーの構成」を参照してください。
エンコード ビット レートを選択します。
CBR エンコードの場合、エンコード セッションが開始される前にストリームをエンコードするビット レートを把握しておく必要があります。 エンコーダーの構成中にビット レートを設定する必要があります。 これを行うには、メディア タイプ ネゴシエーションの実行中に、使用可能な出力メディアの種類の MF_MT_AUDIO_AVG_BYTES_PER_SECOND 属性 (オーディオ ストリームの場合) または MF_MT_AVG_BITRATE 属性 (ビデオ ストリームの場合) を確認し、達成するターゲット ビット レートに最も近い平均ビット レートを持つ出力メディアの種類を選択します。 詳細については、エンコーダー のメディア タイプ ネゴシエーションを参照してください。
次のコード例は、SetEncodingProperties の実装を示しています。 この関数は、CBR および 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;
}
漏れバケットの設定
CBR エンコードの場合、ストリームのリークバケットの平均値と最大値は同じです。 これらのパラメーターの詳細については、「リーク バケット バッファー モデル」を参照してください。
オーディオ ストリームを CBR エンコードするには、エンコーダーで出力メディアの種類をネゴシエートした後に、漏れバケット値を設定する必要があります。 エンコーダーは、出力メディアの種類に設定された平均ビット レートに基づいて、バッファー ウィンドウを内部的に計算します。
漏れバケット値を設定するには、DWORD の配列を作成し、メディア シンクのプロパティ ストアの MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET プロパティで次の値を設定できます。 詳細については、「ファイル シンク のプロパティの設定」を参照してください。
- 平均ビット レート: メディア タイプ ネゴシエーション中に選択された出力メディア タイプから平均ビット レートを取得します。 MF_MT_AUDIO_AVG_BYTES_PER_SECOND 属性を使用します。
- バッファー ウィンドウ: IWMCodecLeakyBucket インターフェイスをエンコーダーに照会し、IWMCodecLeakyBucket::GetBufferSizeBits(wmcodecifaces.h, wmcodecdspuuid.lib)呼び出します。
- 初期バッファー サイズ: 0 に設定します。
関連トピック
-
チュートリアル: CBR エンコード を使用した WMA ファイルの記述