Trabajo con ejemplos multimedia
En este tema se describe cómo usar la interfaz IMFSample para manipular objetos de ejemplo multimedia. Para obtener información general sobre los ejemplos multimedia, consulte Ejemplos multimedia.
Para crear un nuevo ejemplo multimedia, llame a la función MFCreateSample. Inicialmente, la lista de búferes del ejemplo está vacía. Para agregar un búfer al final de la lista, llame a IMFSample::AddBuffer.
En el código siguiente se muestra cómo crear un ejemplo y agregarle un búfer.
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;
}
La manera recomendada de obtener los búferes del ejemplo es llamar a IMFSample::ConvertToContiguousBuffer. Este método devuelve un único búfer continuo.
Para iterar en los búferes de la lista, empiece llamando a IMFSample::GetBufferCount. Este método devuelve el número de búferes. A continuación, llame a IMFSample::GetBufferByIndex y especifique el índice del búfer que se va a recuperar. Los búferes se indexan desde cero.
En el código siguiente se muestra cómo iterar en los búferes de un ejemplo.
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;
}
}
}
Los ejemplos tienen una marca de tiempo y una duración. La marca de tiempo indica cuándo se deben representar los datos del ejemplo, en relación con el reloj de presentación. La duración es el período de tiempo durante el que se deben representar los datos. Normalmente, el componente que genera los datos establece la marca de tiempo inicial y la duración. Estos valores pueden modificarse mediante la sesión multimedia. Para establecer la marca de tiempo, llame a IMFSample::SetSampleTime. Para establecer la duración, llame a IMFSample::SetSampleDuration.
Los ejemplos también pueden tener atributos, que contienen información adicional sobre el ejemplo. Para obtener una lista de atributos de ejemplo, vea Atributos de ejemplo. Para establecer y recuperar atributos, use la Interfaz IMFAttributes, que IMFSample hereda.
Temas relacionados