Trabalhando com amostras de mídia

Este tópico descreve como usar a interface IMFSample para manipular objetos de amostra de mídia. Para obter uma visão geral das amostras de mídia, consulte Amostras de mídia.

Para criar uma nova amostra de mídia, chame a função MFCreateSample. Inicialmente, a lista de buffer da amostra está vazia. Para adicionar um buffer ao final da lista, chame IMFSample::AddBuffer.

O código a seguir mostra como criar uma amostra e adicionar um buffer a ela.

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;
}

A maneira recomendada de obter os buffers da amostra é chamar IMFSample::ConvertToContiguousBuffer. Esse método retorna um único buffer contínuo.

Para iterar pelos buffers da lista, inicie chamando IMFSample::GetBufferCount. Esse método retorna o número de buffers. Em seguida, chame IMFSample::GetBufferByIndex e especifique o índice do buffer a ser recuperado. Os buffers são indexados a partir do zero.

O código a seguir mostra como iterar pelos buffers em um exemplo.

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;
        }
    }
}

As amostras têm um carimbo de data/hora e uma duração. O carimbo de data/hora indica quando os dados da amostra devem ser renderizados, em relação ao relógio de apresentação. A duração é o período para o qual os dados devem ser renderizados. Normalmente, o componente que gera os conjuntos de dados define o carimbo de data/hora inicial e a duração. Esses valores podem ser modificados pela sessão de mídia. Para definir o carimbo de data/hora, chame IMFSample::SetSampleTime. Para definir a duração, chame IMFSample::SetSampleDuration.

As amostras também podem ter atributas, que contêm informações adicionais sobre a amostra. Para obter uma lista de atributos de amostra, consulte Atributos de Amostra. Para definir e recuperar atributos, use a interface IMFAttributes, que IMFSample herda.

Amostras de Mídia

Buffers de Mídia