次の方法で共有


制約のない可変ビット レート エンコード

制約のない可変ビットレート (VBR) エンコード モードでは、指定されたビット レートを維持しながら、コンテンツは可能な限り高い品質にエンコードされます。

制約のない VBR エンコードでは、2 つのエンコード パスが使用されます。 制約のない VBR エンコードを使用する場合は、定数ビット レート エンコードの場合と同様に、ストリームの ビット レートを指定します。 ただし、エンコーダーはこの値をストリームの平均ビット レートとしてのみ使用し、平均を維持しながら品質を可能な限り高くするためにエンコードします。 エンコーダーによって生成される個々のサンプルは、明示的なバッファー制限なしにサイズが異なります。 ただし、エンコード セッション中の平均ビット レートとストリームの継続時間は、ユーザーが指定した値を超えてはなりません。 エンコードされたストリーム内の任意の時点での実際のビット レートは、平均値と大きく異なる場合があります。 制約のない VBR エンコード用のバッファー ウィンドウは設定しません。 代わりに、エンコーダーは、エンコードされたサンプルの要件に基づいて、必要なバッファー ウィンドウのサイズを計算します。 つまり、平均ビット レートが設定した値以下である限り、ストリーム内の個々のサンプルのサイズに制限はありません。

制約のない VBR エンコードの利点は、圧縮ストリームの品質が可能な限り高く、予測可能な平均帯域幅内に留まることです。 これは、帯域幅を指定する必要があるが、指定された帯域幅の周りの変動が許容される場合に使用します。たとえば、ローカル ファイルの場合やダウンロードのみの場合などです。

このエンコード モードの欠点は、エンコーダーでバッファー ウィンドウをエンコード後に必要な値に設定でき、バッファー サイズを制御できなくなる点です。 ほとんどの場合、バッファーのサイズや帯域幅の使用量の一貫性を気にしない場合は、品質ベースの可変ビット レート エンコードを使用する必要があります

制約のない VBR 用のエンコーダーの構成

エンコーダーの構成は、プロパティ値によって設定されます。 これらのプロパティは wmcodecdsp.h で定義されています。 出力メディアの種類をネゴシエートする前に、エンコーダーで構成プロパティを設定する必要があります。 エンコーダーでプロパティを設定する方法については、「エンコーダーの 構成」を参照してください。 指定したプロパティ値に基づいて、サポートされている VBR 出力の種類を列挙し、平均ビット レートに基づいてエンコーダー Media Foundation Transform (MFT) で必要なものを選択できます。

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

  • MFPKEY_VBRENABLED プロパティを VARIANT_TRUE に設定して、VBR エンコード モードを指定します。
  • 制約のない VBR モードでは 2 つのエンコード パスが使用されるため、MFPKEY_PASSESUSEDを 2 に設定します。
  • 出力メディアの種類を列挙するときに、MF_MT_AUDIO_AVG_BYTES_PER_SECOND属性 (オーディオ ストリームの場合) または使用可能な出力メディアの種類の MF_MT_AVG_BITRATE 属性 (ビデオ ストリームの場合) をチェックします。 エンコードされたコンテンツでエンコーダーが維持する目的の平均ビット レートに最も近い平均ビット レートを持つ出力メディアの種類を選択します。 出力メディアの種類の選択の詳細については、「 エンコーダーでのメディアの種類のネゴシエーション」を参照してください。

バッファー ウィンドウの値をエンコーダーによって設定するには、エンコード セッションの後に wmcodecifaces.h および wmcodecdspuuid.lib で定義されている IWMCodecLeakyBucket::GetBufferSizeBits を呼び出します。 ストリームに対する制約のない VBR サポートを追加するには、ASF プロファイルの構成中に、ストリーム構成オブジェクトの MF_ASFSTREAMCONFIG_LEAKYBUCKET1 属性 (平均リーク バケット値) でこの値を設定する必要があります。

次に、制約のない VBR モードを設定するように、サンプル クラス CEncoder の SetEncodingType メソッドを変更します。 このクラスの詳細については、「 Encoder Example Code」を参照してください。 この例で使用されるヘルパー マクロの詳細については、「Using the Media Foundation Code Examples」を参照してください。

//////////////////////////////////////////////////////////////////////////
//  Name: SetEncodingType
//  Description: Sets the encoding type to unconstrained VBR
//
/////////////////////////////////////////////////////////////////////////

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_Unconstrained)
    {
        //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);
    }

done:
    PropVariantClear(&var);
    SAFE_RELEASE (pProp);
    return hr;
    
}

ASF エンコードの種類

漏れバケット バッファー モデル

Two-Pass Windows メディア エンコードのトポロジを作成する方法