メディア サンプルの操作

このトピックでは、IMFSample インターフェイスを使用してメディア サンプル オブジェクトを操作する方法について説明します。 メディア サンプルの概要については、「メディア サンプル」を参照してください。

新しいメディア サンプルを作成するには、MFCreateSample 関数を呼び出します。 最初は、サンプルのバッファー リストは空です。 リストの末尾にバッファーを追加するには、IMFSample::AddBuffer を呼び出します。

次のコードは、サンプルを作成してバッファーを追加する方法を示しています。

HRESULT CreateMediaSample(DWORD cbData, IMFSample **ppSample)
{
    HRESULT hr = S_OK;

    IMFSample *pSample = NULL;
    IMFMediaBuffer *pBuffer = NULL;

    hr = MFCreateSample(&pSample);

    if (SUCCEEDED(hr))
    {
        hr = MFCreateMemoryBuffer(cbData, &pBuffer);
    }

    if (SUCCEEDED(hr))
    {
        hr = pSample->AddBuffer(pBuffer);
    }

    if (SUCCEEDED(hr))
    {
        *ppSample = pSample;
        (*ppSample)->AddRef();
    }

    SafeRelease(&pSample);
    SafeRelease(&pBuffer);
    return hr;
}

サンプルからバッファーを取得するには、IMFSample::ConvertToContiguousBuffer を呼び出すことをお勧めします。 このメソッドは、単一の連続バッファーを返します。

リスト内のバッファーを反復処理するには、まず IMFSample::GetBufferCount を呼び出します。 このメソッドは、バッファーの数を返します。 次に、IMFSample::GetBufferByIndex を呼び出し、取得するバッファーのインデックスを指定します。 バッファーには 0 からインデックスが作成されます。

次のコードは、サンプル内のバッファーを反復処理する方法を示しています。

IMFMediaBuffer *pBuffer = NULL;
DWORD cBuffers = 0;

hr = pSample->GetBufferCount(&cBuffers);

if (SUCCEEDED(hr))
{
    for (DWORD i = 0; i < cBuffers; i++)
    {
        hr = pSample->GetBufferByIndex(i, &pBuffer);

        // Use buffer (not shown).

        SafeRelease(&pBuffer);

        if (FAILED(hr))
        {
            break;
        }
    }
}

サンプルには、タイム スタンプと期間があります。 タイム スタンプは、プレゼンテーション クロックを基準にして、サンプル内のデータをレンダリングするタイミングを示します。 期間は、データをレンダリングするための時間の長さです。 通常、データ セットを生成するコンポーネントは、最初のタイム スタンプと期間を設定します。 これらの値は、メディア セッションによって変更される可能性があります。 タイム スタンプを設定するには、IMFSample::SetSampleTime を呼び出します。 期間を設定するには、IMFSample::SetSampleDuration を呼び出します。

サンプルには、サンプルに関する追加情報を含む属性を含めることもできます。 サンプル属性のリストについては、「サンプル属性」を参照してください。 属性を設定および取得するには、IMFSample が継承する IMFAttributes インターフェイスを使用します。

メディア サンプル

メディア バッファー