Share via


Quality-Based可変ビット レート エンコード

エンコーダーがエンコードされたメディアの特定のビット レートを維持するように努める 定数ビット レート エンコード (CBR) とは異なり、可変ビット レート (VBR) モードでは、エンコーダーはエンコードされたメディアの最高の品質を実現するように努めています。 CBR と VBR の主な違いは、使用されるバッファー ウィンドウのサイズです。 VBR でエンコードされたストリームには、通常、CBR でエンコードされたストリームと比較して大きなバッファー ウィンドウがあります。

エンコードされたコンテンツの品質は、コンテンツが圧縮されるときに失われるデータの量によって決まります。 多くの要因は、圧縮プロセスでのデータの損失に影響します。一般に、元のデータが複雑になり、圧縮率が高いほど、圧縮プロセスの詳細が失われます。

品質ベースの VBR モードでは、エンコーダーが従う必要があるビット レートやバッファー ウィンドウは定義しません。 代わりに、ビット レートではなくデジタル メディア ストリームの品質レベルを指定します。 エンコーダーは、すべてのサンプルが同等の品質になるようにコンテンツを圧縮します。これにより、結果として得られるストリームのバッファー要件に関係なく、再生期間全体で品質が一貫しています。

品質ベースの VBR エンコードでは、大きな圧縮ストリームが作成される傾向があります。 一般に、この種類のエンコードは、ローカル再生または高帯域幅ネットワーク接続 (またはダウンロードして再生) に適しています。 たとえば、CD からコンピューター上の ASF ファイルに曲をコピーするアプリケーションを作成できます。 品質ベースの VBR エンコードを使用すると、コピーされるすべての曲の品質が同じになります。 そのような場合、一貫した品質により、ユーザー エクスペリエンスが向上します。

品質ベースの VBR エンコードの欠点は、エンコード セッションの前にエンコードされたメディアのサイズまたは帯域幅の要件を知る方法が実際に存在しないということです。これは、エンコーダーが 1 つのエンコード パスを使用するためです。 これにより、ポータブル メディア プレーヤーでのコンテンツの再生や低帯域幅ネットワーク経由でのストリーミングなど、メモリや帯域幅が制限されている状況では、品質ベースの VBR でエンコードされたファイルが不適切になる可能性があります。

Quality-Based VBR エンコード用のエンコーダーの構成

エンコーダーの構成は、プロパティ値によって設定されます。 これらのプロパティは wmcodecdsp.h で定義されています。 出力メディアの種類をネゴシエートする前に、エンコーダーで構成プロパティを設定する必要があります。 エンコーダーのプロパティを設定する方法については、「エンコーダーの 構成」を参照してください。

次の一覧は、この種類のエンコードに設定する必要があるプロパティを示しています。

  • MFPKEY_VBRENABLED プロパティを VARIANT_TRUE に設定して、VBR エンコード モードを指定します。
  • この VBR モードでは 1 つのエンコード パスが使用されるため、 MFPKEY_PASSESUSED を 1 に設定します。
  • MFPKEY_DESIRED_VBRQUALITY プロパティを設定して、必要な品質レベル (0 から 100) を設定します。 品質ベースの VBR は、定義済みのバッファー パラメーターにコンテンツをエンコードしません。 結果として得られるビット レートの要件に関係なく、ストリーム全体に対して維持されるこの品質レベル。
  • ビデオ ストリームの場合は、エンコーダーの出力メディアの種類の MF_MT_AVG_BITRATE 属性で、平均ビット レートを 0 以外の値に設定します。 エンコード セッションが完了すると、正確なビット レートが更新されます。

次のコード例は、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;
}

ASF エンコードの種類