定数ビット レート エンコード

定数ビット レート (CBR) エンコードでは、エンコーダーは、エンコード セッションが開始される前に、出力メディア サンプルのビット レートとバッファー ウィンドウ (漏れバケット パラメーター) を認識します。 エンコーダーは、同じビット数を使用して、ストリームのターゲット ビット レートを実現するために、ファイルの期間中、サンプルの 1 秒ごとにエンコードします。 これにより、ストリーム サンプルのサイズの変動が制限されます。 また、エンコード セッション中に、ビット レートは指定された値に正確には設定されませんが、ターゲット ビット レートに近いままです。

CBR エンコードは、ファイル全体を解析せずにファイルのビット レートまたはおおよその期間を知るには便利です。 これは、帯域幅の使用量の一貫性を維持して予測可能なビット レートでメディア コンテンツをストリーミングする、ライブ ストリーミング シナリオで必要です。

CBR エンコードの欠点は、エンコードされたコンテンツの品質が一定でないことを示しています。 一部のコンテンツは圧縮が困難であるため、CBR ストリームの一部の品質は他のコンテンツよりも低くなります。 たとえば、一般的な映画には、かなり静的なシーンと、アクションに満ちたシーンがあります。 CBR を使用してムービーをエンコードする場合、静的で効率的にエンコードしやすいシーンは、同じ品質を維持するためにより高いサンプル サイズを必要とするアクション シーンよりも高品質になります。

一般に、CBR ファイルの品質のバリエーションは、ビット レートが低いほど顕著になります。 ビット レートが高い場合でも、CBR でエンコードされたファイルの品質は変わりますが、品質の問題はユーザーにはあまり目立ちません。 CBR エンコードを使用する場合は、配信シナリオで可能な限り高い帯域幅を設定する必要があります。

CBR 構成設定

エンコード セッションの前にエンコードの種類とさまざまなストリーム固有の設定を指定して、エンコーダーを構成する必要があります。

CBR エンコード用にエンコーダーを構成するには

  1. CBR エンコード モードを指定します。

    既定では、エンコーダーは CBR エンコードを使用するように構成されています。 エンコーダーの構成は、プロパティ値によって設定されます。 これらのプロパティは wmcodecdsp.h で定義されています。 このモードを明示的に指定するには、MFPKEY_VBRENABLED プロパティを VARIANT_FALSE に設定します。 エンコーダーのプロパティを設定する方法については、「エンコーダーの 構成」を参照してください。

  2. エンコード ビット レートを選択します。

    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 プロパティで次の値を設定できます。 詳細については、「 ファイル シンクでのプロパティの設定」を参照してください。

ASF エンコードの種類

チュートリアル: 1 パス Windows メディア エンコード

チュートリアル: CBR エンコードを使用した WMA ファイルの書き込み