使用媒體範例

本主題描述如何使用 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介面。

媒體範例

媒體緩衝區