Partilhar via


Etapa 3: Abrir um arquivo de mídia

Este tópico é a etapa 3 do tutorial Como reproduzir arquivos de mídia com o Media Foundation. O código completo é mostrado no tópico Exemplo de Reprodução de Sessão de Mídia.

O CPlayer::OpenURL método abre um arquivo de mídia de uma 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;
}

Esse método executa as seguintes etapas:

  1. Chama CPlayer::CreateSession para criar uma nova instância da Sessão de Mídia. Consulte Etapa 4: Criar a Sessão de Mídia.
  2. Cria uma fonte de mídia da URL. O código completo desta etapa é mostrado no tópico Usando o Resolvedor de Origem.
  3. Chama IMFMediaSource::CreatePresentationDescriptor para obter o descritor de apresentação da fonte de mídia. O descritor de apresentação descreve cada fluxo no arquivo de origem.
  4. Cria a topologia de reprodução. O código para esta etapa é mostrado no tópico Criando Topologias de Reprodução.
  5. Chama IMFMediaSession::SetTopology para definir a topologia na Sessão de Mídia.

O método SetTopology é concluído de forma assíncrona. Quando ele é concluído, o método IMFAsyncCallback::Invoke do objeto CPlayer é chamado; consulte Etapa 5: Manipular eventos de sessão de mídia.

Próximo: Etapa 4: Criar a sessão de mídia

Reprodução de áudio/vídeo

Como reproduzir arquivos de mídia com o Media Foundation