Поделиться через


Шаг 3. Открытие файла мультимедиа

В этом разделе описывается шаг 3 руководства воспроизведение файлов мультимедиа с помощьюMedia Foundation. Полный код показан в разделе пример воспроизведения сеансов мультимедиа.

Метод CPlayer::OpenURL открывает файл мультимедиа из URL-адреса.

//  Open a URL for playback.
HRESULT CPlayer::OpenURL(const WCHAR *sURL)
{
    // 1. Create a new media session.
    // 2. Create the media source.
    // 3. Create the topology.
    // 4. Queue the topology [asynchronous]
    // 5. Start playback [asynchronous - does not happen in this method.]

    IMFTopology *pTopology = NULL;
    IMFPresentationDescriptor* pSourcePD = NULL;

    // Create the media session.
    HRESULT hr = CreateSession();
    if (FAILED(hr))
    {
        goto done;
    }

    // Create the media source.
    hr = CreateMediaSource(sURL, &m_pSource);
    if (FAILED(hr))
    {
        goto done;
    }

    // Create the presentation descriptor for the media source.
    hr = m_pSource->CreatePresentationDescriptor(&pSourcePD);
    if (FAILED(hr))
    {
        goto done;
    }

    // Create a partial topology.
    hr = CreatePlaybackTopology(m_pSource, pSourcePD, m_hwndVideo, &pTopology);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set the topology on the media session.
    hr = m_pSession->SetTopology(0, pTopology);
    if (FAILED(hr))
    {
        goto done;
    }

    m_state = OpenPending;

    // If SetTopology succeeds, the media session will queue an 
    // MESessionTopologySet event.

done:
    if (FAILED(hr))
    {
        m_state = Closed;
    }

    SafeRelease(&pSourcePD);
    SafeRelease(&pTopology);
    return hr;
}

Этот метод выполняет следующие действия.

  1. Вызывает CPlayer::CreateSession для создания нового экземпляра сеанса мультимедиа. См. шаг 4: Создание сеанса мультимедиа.
  2. Создает источник мультимедиа из URL-адреса. Полный код для этого шага показан в теме Использование сопоставителя источника.
  3. Вызывает IMFMediaSource::CreatePresentationDescriptor, чтобы получить дескриптор презентации источника мультимедиа. Дескриптор презентации описывает каждый поток в исходном файле.
  4. Создает топологию воспроизведения. Код этого шага показан в разделе создании топологий воспроизведения.
  5. Вызывает IMFMediaSession::SetTopology, чтобы задать топологию на Media Session.

Метод SetTopology выполняется асинхронно. По завершении вызывается метод IMFAsyncCallback объекта CPlayer::Invoke; см. шаг 5: Обработка событий сеанса мультимедиа.

Далее: шаг 4. Создание сеанса мультимедиа

воспроизведение звука и видео

Воспроизведение файлов мультимедиа с помощью Media Foundation