Peak-Constrained可変ビット レート エンコード
ピーク制約変数ビット レート (VBR) では、コンテンツは、指定されたビット レートと ピーク値 (ピーク ビット レートとピーク バッファー ウィンドウ) にエンコードされます。 これらのピーク値は、 ピーク リーク バケット値とも呼ばれます。 ファイルは、ストリームの全体的な平均ビット レートが指定した平均ビット レート値以下になるように、ピーク値によって記述されたバッファーに準拠するようにエンコードされます。
通常、ピーク ビット レートは非常に高くなります。 エンコーダーは、指定された平均ビット レート値がストリームの期間にわたって維持されるようにします (平均ビット レート >= (合計ストリーム サイズ (ビット単位/ストリーム期間秒単位))。 次の例を考えてみましょう。1 秒あたり平均ビット レートが 16,000 ビット、ピーク ビット レートが 48,000 ビット/秒、ピーク バッファー ウィンドウが 3,000 (3 秒) のストリームを構成します。 ストリームに使用されるバッファーのサイズは、ピーク値によって決定される 144,000 ビット (48,000 ビット/秒 * 3 秒) です。 エンコーダーは、そのバッファーに準拠するようにデータを圧縮します。 また、ストリームの平均ビット レートは 16,000 以下である必要があります。 エンコーダーがコンテンツの複雑なセグメントを処理するために大きなサンプルを作成する必要がある場合は、大きなバッファー サイズを利用できます。 ただし、平均を指定したレベルに下げるには、ストリームの他の部分を低いビット レートでエンコードする必要があります。 ピーク制約付き VBR エンコードは、有限のバッファー容量とデータ レート制約を持つ再生デバイスに役立ちます。 この一般的な例は、デコードがデバイス内のチップによって実行されるときに DVD に使用されるエンコードであり、考慮する必要があるハードウェアの制限があります。
Peak-Constrained VBR 用エンコーダーの構成
ピーク制約付き VBR は、ストリームの期間中の平均ビット レートに限定されるという点で、 制約のない VBR に似ています。 さらに、ピーク制約付き VBR はピーク バッファーに準拠しています。 このバッファーは、ピーク ビット レートとピーク バッファー ウィンドウを使用して記述されます。 このモードでは、2 つのエンコード パスを使用し、ピークの制限に従いながら個々のサンプルをエンコードする方法を柔軟にエンコーダーに提供します。
エンコーダーの構成は、プロパティ値によって設定されます。 これらのプロパティは wmcodecdsp.h で定義されています。 出力メディアの種類をネゴシエートする前に、エンコーダーで構成プロパティを設定する必要があります。 エンコーダーのプロパティを設定する方法については、「エンコーダーの 構成」を参照してください。 指定したプロパティ値に基づいて、サポートされている VBR 出力の種類を列挙し、平均ビット レートに基づいてエンコーダー Media Foundation 変換 (MFT) で必要なものを選択できます。
この種類のエンコードには、次のプロパティを設定する必要があります。
- MFPKEY_VBRENABLED プロパティを VARIANT_TRUE に設定して、VBR エンコード モードを指定します。
- ピーク制約付き VBR モードでは 2 つのエンコード パスが使用されるため、MFPKEY_PASSESUSEDを 2 に設定します。
- MFPKEY_RMAXを設定してピーク ビット レートを指定し、MFPKEY_BMAXを設定してピーク バッファー ウィンドウを指定します。
- 出力メディアの種類を列挙するときに、使用可能な出力メディアの種類のMF_MT_AUDIO_AVG_BYTES_PER_SECOND属性 (オーディオ ストリームの場合) またはMF_MT_AVG_BITRATE属性 (ビデオ ストリームの場合) をチェックし、エンコードされたコンテンツでエンコーダーが維持する目的の平均ビット レートに最も近い平均ビット レートを持つ出力メディアの種類を選択します。 出力メディアの種類の選択の詳細については、「 エンコーダーのメディア タイプ ネゴシエーション」を参照してください。
注意
ピーク ビット レートを平均ビット レートの少なくとも 2 倍に設定することをお勧めします。 ピーク レートを低い値に設定すると、エンコーダーがピーク制約付き VBR ではなく 2 パス CBR としてコンテンツをエンコードする場合があります。
エンコーダーによって設定されたバッファー ウィンドウの値を取得するには、エンコード セッションの後に wmcodecifaces.h、wmcodecdspuuid.lib で定義されている IWMCodecLeakyBucket::GetBufferSizeBits を呼び出します。 ストリームの制約のない VBR サポートを追加するには、ASF プロファイルの構成中に、ストリーム構成オブジェクトの MF_ASFSTREAMCONFIG_LEAKYBUCKET2 属性 (ピーク リーク バケット値) にこの値を設定する必要があります。
次のコード サンプルでは、ピーク制約付き VBR モードを設定するように、サンプル クラス CEncoder の SetEncodingType メソッドを変更します。 このクラスの詳細については、「 Encoder Example Code」を参照してください。 この例で使用されるヘルパー マクロの詳細については、「Using the Media Foundation Code Examples」を参照してください。
//////////////////////////////////////////////////////////////////////////
// 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;
}
関連トピック