Condividi tramite


Come creare una playlist

Questo argomento descrive come usare l'origine sequenza per riprodurre una sequenza di file.

Panoramica

Per riprodurre file multimediali in una sequenza, l'applicazione deve aggiungere topologie in una sequenza per creare una playlist e accodare queste topologie nella sessione multimediale per la riproduzione.

L'origine sequencer garantisce la riproduzione senza problemi inizializzando e caricando la topologia successiva prima che la sessione multimediale inizi a riprodurre la topologia corrente. Ciò consente all'applicazione di avviare rapidamente la topologia successiva ogni volta che è necessario.

La sessione multimediale è responsabile dell'alimentazione dei dati nei sink e della riproduzione delle topologie nell'origine della sequenza. Inoltre, la sessione multimediale gestisce il tempo di presentazione per i segmenti.

Per altre informazioni sul modo in cui l'origine sequencer gestisce le topologie, vedere Informazioni sull'origine sequencer.

Questa procedura dettagliata contiene i passaggi seguenti:

  1. Prerequisiti
  2. Inizializzazione di Media Foundation
  3. Creazione di oggetti Media Foundation
  4. Creazione dell'origine multimediale
  5. Creazione di topologie parziali
  6. Aggiunta di topologie all'origine sequencer
  7. Impostazione della prima topologia nella sessione multimediale
  8. Accodamento della topologia successiva nella sessione multimediale
  9. Rilascio dell'origine sequencer

Gli esempi di codice illustrati in questo argomento sono estratti dal codice sorgente sequencer dell'argomento, che contiene il codice di esempio completo.

Prerequisiti

Prima di iniziare questa procedura dettagliata, acquisire familiarità con i concetti di Media Foundation seguenti:

Leggi anche Come riprodurre file multimediali con Media Foundation, perché il codice di esempio si espande qui sul codice in questo argomento.

Inizializzazione di Media Foundation

Prima di poter usare qualsiasi interfaccia o metodi di Media Foundation, inizializzare Media Foundation chiamando la funzione MFStartup . Per altre informazioni, vedere Inizializzazione di Media Foundation.

    hr = MFStartup(MF_VERSION);

Creazione di oggetti Media Foundation

Creare quindi gli oggetti Media Foundation seguenti:

  • Sessione multimediale. Questo oggetto espone l'interfaccia IMFMediaSession , che fornisce metodi per riprodurre, sospendere e arrestare la topologia corrente.
  • Origine sequencer. Questo oggetto espone l'interfaccia IMFSequencerSource , che fornisce metodi per aggiungere, aggiornare ed eliminare topologie in una sequenza.
  1. Chiamare la funzione MFCreateMediaSession per creare la sessione multimediale.
  2. Chiamare FMIMediaEventQueue::BeginGetEvent per richiedere il primo evento dalla sessione multimediale.
  3. Chiamare la funzione MFCreateSequencerSource per creare l'origine del sequencer.

Il codice seguente crea la sessione multimediale e richiede il primo evento:

//  Create a new instance of the media session.
HRESULT CPlayer::CreateSession()
{
    // Close the old session, if any.
    HRESULT hr = CloseSession();
    if (FAILED(hr))
    {
        goto done;
    }

    assert(m_state == Closed);

    // Create the media session.
    hr = MFCreateMediaSession(NULL, &m_pSession);
    if (FAILED(hr))
    {
        goto done;
    }

    // Start pulling events from the media session
    hr = m_pSession->BeginGetEvent((IMFAsyncCallback*)this, NULL);
    if (FAILED(hr))
    {
        goto done;
    }

    m_state = Ready;

done:
    return hr;
}

Creazione dell'origine multimediale

Creare quindi un'origine multimediale per il primo segmento di playlist. Usare il resolver di origine per creare un'origine multimediale da un URL. A tale scopo, chiamare la funzione MFCreateSourceResolver per creare un resolver di origine e quindi chiamare il metodo IMFSourceResolver::CreateObjectFromURL per creare l'origine multimediale.

Per informazioni sulle origini multimediali, vedere Origini multimediali.

Creazione di topologie parziali

Ogni segmento nell'origine sequencer ha una propria topologia parziale. Creare quindi topologie parziali per le origini multimediali. Per una topologia parziale, i nodi di origine della topologia sono connessi direttamente ai nodi di output, senza specificare alcuna trasformazione intermedia. La sessione multimediale usa l'oggetto loader della topologia per risolvere la topologia. Dopo aver risolto una topologia, vengono aggiunti i decodificatori necessari e altri nodi di trasformazione. L'origine del sequencer può contenere anche topologie complete.

Per creare l'oggetto topologia, usare la funzione MFCreateTopology e quindi usare l'interfaccia IMFTopologyNode per creare nodi di flusso.

Per istruzioni complete sull'uso di questi elementi di programmazione per creare topologie, vedere Creazione di topologie di riproduzione.

Un'applicazione può riprodurre una parte selezionata dell'origine nativa configurando il nodo di origine. A tale scopo, impostare l'attributo MF_TOPONODE_MEDIASTART e l'attributo MF_TOPONODE_MEDIASTOP nei nodi della topologia MF_TOPOLOGY_SOURCESTREAM_NODE . Specificare l'ora di inizio multimediale e l'ora di arresto multimediale rispetto all'inizio dell'origine nativa come tipi UINT64 .

Aggiunta di topologie all'origine sequencer

Aggiungere quindi all'origine del sequencer le topologie parziali create. Ogni elemento sequenza, denominato segmento, viene assegnato un identificatore MFSequencerElementId . Per altre informazioni sul modo in cui l'origine sequencer gestisce le topologie, vedere Informazioni sull'origine sequencer.

Dopo aver aggiunto tutte le topologie all'origine del sequencer, l'applicazione deve contrassegnare l'ultimo segmento nella sequenza per terminare la riproduzione nella pipeline. Senza questo flag, l'origine sequencer prevede l'aggiunta di più topologie.

  1. Chiamare il metodo IMFSequencerSource::AppendTopology per aggiungere una topologia specifica all'origine sequencer.

        hr = m_pSequencerSource->AppendTopology(
            pTopology, 
            SequencerTopologyFlags_Last, 
            &SegmentId
            );
    

    AppendTopology aggiunge la topologia specificata alla sequenza. Questo metodo restituisce l'identificatore del segmento nel parametro pdwId .

    Se la topologia è l'ultima nell'origine sequencer, passare SequencerTopologyFlags_Last nel parametro dwFlags . Questo valore è definito nell'enumerazione MFSequencerTopologyFlags .

  2. Chiamare FMISequencerSource::UpdateTopologyFlags per aggiornare i flag per la topologia associata all'identificatore di segmento nell'elenco di input. In questo caso, la chiamata indica che il segmento specificato è l'ultimo segmento nel sequencer. Questa chiamata è facoltativa se l'ultima topologia è specificata nella chiamata AppendTopology .

        BOOL bFirstSegment = (NumSegments() == 0);
    
        if (!bFirstSegment)
        {
            // Remove the "last segment" flag from the last segment.
            hr = m_pSequencerSource->UpdateTopologyFlags(LastSegment(), 0);
            if (FAILED(hr))
            {
                goto done;
            }
        }
    

L'applicazione può sostituire la topologia di un segmento con un'altra topologia chiamando FMSequencerSource::UpdateTo topologia e passando la nuova topologia in pTo topologia. Se sono presenti nuove origini native nella nuova topologia, le origini vengono aggiunte alla cache di origine. Viene aggiornato anche l'elenco di preroll.

Impostazione della prima topologia nella sessione multimediale

Accodare quindi la prima topologia nell'origine della sequenza nella sessione multimediale. Per ottenere la prima topologia dall'origine sequencer, l'applicazione deve chiamare il metodo IMFMediaSourceTopologyProvider::GetMediaSourceTopology . Questo metodo restituisce la topologia parziale, risolta dalla sessione multimediale.

Per informazioni sulle topologie parziali, vedere Informazioni sulle topologie.

  1. Recuperare l'origine multimediale nativa per la prima topologia dell'origine sequenza.

  2. Creare un descrittore di presentazione per l'origine multimediale chiamando il metodo IMFMediaSource::CreatePresentationDescriptor .

  3. Recuperare la topologia associata per la presentazione chiamando il metodo IMFMediaSourceTopologyProvider::GetMediaSourceTopology.

  4. Impostare la prima topologia nella sessione multimediale chiamando FMIMediaSession::SetTo topologia.

    Chiamare SetTopology con il parametro dwSetTopologyFlags impostato su NULL. Indica alla sessione multimediale di avviare la topologia specificata al termine della topologia corrente. Poiché in questo caso, la topologia specificata è la prima topologia e non esiste una presentazione corrente, la sessione multimediale avvia immediatamente la nuova presentazione.

    Il valore NULL indica anche che La sessione multimediale deve risolvere la topologia perché la topologia restituita dal provider di topologia è sempre una topologia parziale.

// Queues the next topology on the session.

HRESULT CPlaylist::QueueNextSegment(IMFPresentationDescriptor *pPD)
{
    IMFMediaSourceTopologyProvider *pTopoProvider = NULL;
    IMFTopology *pTopology = NULL;

    //Get the topology for the presentation descriptor
    HRESULT hr = m_pSequencerSource->QueryInterface(IID_PPV_ARGS(&pTopoProvider));
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pTopoProvider->GetMediaSourceTopology(pPD, &pTopology);
    if (FAILED(hr))
    {
        goto done;
    }

    //Set the topology on the media session
    m_pSession->SetTopology(NULL, pTopology);

done:
    SafeRelease(&pTopoProvider);
    SafeRelease(&pTopology);
    return hr;
}

Accodamento della topologia successiva nella sessione multimediale

Successivamente, l'applicazione deve gestire l'evento MENewPresentation .

L'origine sequencer genera MENewPresentation quando la sessione multimediale inizia a riprodurre un segmento con un altro segmento che lo segue. Questo evento informa l'applicazione sulla topologia successiva nell'origine della sequenza fornendo il descrittore di presentazione per il segmento successivo nell'elenco di preroll. L'applicazione deve recuperare la topologia associata usando il provider di topologie e accodarla nella sessione multimediale. L'origine sequencer prerolla quindi questa topologia, che garantisce una transizione semplice tra presentazioni.

Quando l'applicazione cerca tra segmenti, l'applicazione riceve diversi eventi MENewPresentation come origine sequencer aggiorna l'elenco di preroll e configura la topologia corretta. L'applicazione deve gestire ogni evento e accodare la topologia restituita nei dati dell'evento, nella sessione multimediale. Per informazioni sull'ignorare i segmenti, vedere Uso dell'origine sequencer.

Per informazioni sull'acquisizione delle notifiche di origine del sequencer, vedere Eventi di origine sequencer.

  1. Nel gestore eventi MENewPresentation recuperare il descrittore di presentazione per il segmento successivo dai dati dell'evento.

  2. Ottenere la topologia associata per la presentazione chiamando il metodo IMFMediaSourceTopologyProvider::GetMediaSourceTopology .

  3. Impostare la topologia nella sessione multimediale chiamando il metodo IMFMediaSession::SetTopology .

    La sessione multimediale avvia la nuova presentazione al termine della presentazione corrente.

HRESULT CPlaylist::OnNewPresentation(IMFMediaEvent *pEvent)
{
    IMFPresentationDescriptor *pPD = NULL;

    HRESULT hr = GetEventObject(pEvent, &pPD);

    if (SUCCEEDED(hr))
    {
        // Queue the next segment on the media session
        hr = QueueNextSegment(pPD);
    }

    SafeRelease(&pPD);
    return hr;
}

Rilascio dell'origine Sequencer

Infine, arrestare l'origine sequencer. A tale scopo, chiamare il metodo IMFMediaSource::Shutdown sull'origine sequencer. Questa chiamata arresta tutte le origini multimediali native sottostanti nell'origine sequencer.

Dopo il rilascio dell'origine sequencer, l'applicazione deve chiudere e arrestare la sessione multimediale chiamando IMFMediaSession::Close e IMFMediaSession::Shutdown, in tale ordine.

Per evitare perdite di memoria, l'applicazione deve rilasciare puntatori alle interfacce di Media Foundation quando non sono più necessarie.

Passaggi successivi

Questa procedura dettagliata ha illustrato come creare una playlist di base usando l'origine sequencer. Dopo aver creato la playlist, potresti voler aggiungere funzionalità avanzate, ad esempio ignorare il segmento, modificare lo stato di riproduzione e cercare all'interno di un segmento. L'elenco seguente fornisce collegamenti agli argomenti correlati:

Origine Sequencer