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:
- 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.
- Cria uma fonte de mídia da URL. O código completo desta etapa é mostrado no tópico Usando o Resolvedor de Origem.
- 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.
- Cria a topologia de reprodução. O código para esta etapa é mostrado no tópico Criando Topologias de Reprodução.
- 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
Tópicos relacionados