使用媒體範例
本主題描述如何使用 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 ,並指定要擷取之緩衝區的索引。 緩衝區會從零編製索引。
下列程式代碼示範如何逐一查看範例中的緩衝區。
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介面。
相關主題