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.
Tópicos relacionados