Passaggio 3: Aprire un file multimediale

Questo argomento è il passaggio 3 dell'esercitazione Come riprodurre file multimediali con Media Foundation. Il codice completo è illustrato nell'argomento Esempio di riproduzione di sessioni multimediali.

Il CPlayer::OpenURL metodo apre un file multimediale da un 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;
}

Questo metodo esegue i passaggi seguenti:

  1. Chiama CPlayer::CreateSession per creare una nuova istanza della sessione multimediale. Vedere Passaggio 4: Creare la sessione multimediale.
  2. Crea un'origine multimediale dall'URL. Il codice completo per questo passaggio è illustrato nell'argomento Uso del resolver di origine.
  3. Chiama IMFMediaSource::CreatePresentationDescriptor per ottenere il descrittore di presentazione dell'origine multimediale. Il descrittore di presentazione descrive ogni flusso nel file di origine.
  4. Crea la topologia di riproduzione. Il codice per questo passaggio è illustrato nell'argomento Creazione di topologie di riproduzione.
  5. Chiama IMFMediaSession::SetTopology per impostare la topologia nella sessione multimediale.

Il metodo SetTopology viene completato in modo asincrono. Al termine, viene chiamato il metodo IMFAsyncCallback::Invoke dell'oggetto CPlayer; vedere Passaggio 5: Gestire gli eventi della sessione multimediale.

Passaggio 4: Creare la sessione multimediale

Riproduzione di audio/video

Come riprodurre file multimediali con Media Foundation