メディア サンプルの操作
このトピックでは、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 インターフェイスを使用します。
関連トピック