Работа с примерами мультимедиа
В этом разделе описывается, как использовать интерфейс МВФSample для управления образцами объектов мультимедиа. Общие сведения о примерах мультимедиа см. в разделе "Примеры мультимедиа".
Чтобы создать пример носителя, вызовите функцию MFCreateSample . Изначально список буферов образца пуст. Чтобы добавить буфер в конец списка, вызовите МВФSample::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. Этот метод возвращает один непрерывный буфер.
Чтобы выполнить итерацию по буферам в списке, начните с вызова МВФSample::GetBufferCount. Этот метод возвращает количество буферов. Затем вызовите МВФSample::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;
}
}
}
Примеры имеют метку времени и длительность. Метка времени указывает, когда данные в образце должны отображаться относительно часов презентации. Длительность — это продолжительность времени, для которого должны быть отрисованы данные. Обычно компонент, создающий данные, задает начальную метку времени и длительность. Эти значения могут быть изменены сеансом мультимедиа. Чтобы задать метку времени, вызовите МВФSample::SetSampleTime. Чтобы задать длительность, вызовИТЕ МВФSample::SetSampleDuration.
Примеры также могут содержать атрибуты, содержащие дополнительные сведения о образце. Список примеров атрибутов см. в разделе "Пример атрибутов". Чтобы задать и извлечь атрибуты, используйте интерфейс МВФAttributes, наследуемый МВФSample.
См. также