Работа с примерами мультимедиа

В этом разделе описывается, как использовать интерфейс МВФ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.

Примеры мультимедиа

Буферы мультимедиа