Come creare una playlist
In questo argomento viene descritto 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.
La sorgente del sequencer garantisce una riproduzione senza interruzioni inizializzando e caricando la topologia successiva prima che la sessione multimediale inizi a riprodurre quella 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 sequenza. Inoltre, la sessione multimediale gestisce il tempo di presentazione per i segmenti.
Per altre informazioni su come l'origine sequencer gestisce le topologie, vedere Informazioni sull'origine sequencer.
Questa procedura dettagliata contiene i passaggi seguenti:
- Prerequisiti
- inizializzazione di Media Foundation
- Creazione di oggetti Media Foundation
- Creazione della sorgente multimediale
- creazione di topologie parziali
- Aggiungere le topologie alla sorgente del sequencer
- Impostazione della prima topologia nella sessione multimediale
- Messa in coda della topologia successiva nella sessione multimediale
- Rilascio della sorgente del sequenziatore
Gli esempi di codice illustrati in questo argomento sono estratti dall'argomento codice di esempio di codice sorgente sequencer, 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 mostrato qui si espande sul codice in quell'argomento.
Inizializzazione di Media Foundation
Prima di poter usare qualsiasi interfaccia o metodo di Media Foundation, inizializzare Media Foundation chiamando la funzioneMFStartup. 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 del sequenziatore. Questo oggetto espone l'interfacciaIMFSequencerSource, che fornisce metodi per aggiungere, aggiornare ed eliminare topologie in una sequenza.
- Chiamare la funzione MFCreateMediaSession per creare la sessione multimediale.
- Chiamare IMFMediaEventQueue::BeginGetEvent per richiedere il primo evento dalla sessione multimediale.
- Chiamare la funzione MFCreateSequencerSource per creare l'origine 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 della sorgente multimediale
Creare quindi un'origine multimediale per il primo segmento di playlist. Usare il Source Resolver per creare un'origine multimediale da un URL. A tale scopo, chiamare la funzioneMFCreateSourceResolver 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 utilizza l'oggetto caricatore della topologia per risolvere la topologia. Dopo la risoluzione di una topologia, vengono aggiunti i decodificatori necessari e altri nodi di trasformazione. La sorgente del sequencer può contenere anche topologie complete.
Per creare l'oggetto topologia, usare la funzioneMFCreateTopology e quindi usare l'interfacciaIMFTopologyNodeper 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 del media e l'ora di fermo del media rispetto all'inizio dell'origine originale come tipi UINT64.
Aggiunta di topologie all'origine del Sequencer
Aggiungi quindi le topologie parziali create all'origine del sequencer. A ogni elemento sequenza, denominato segmento , viene assegnato un identificatore MFSequencerElementId. Per ulteriori informazioni su come l'origine del sequencer gestisce le topologie, consultare Informazioni sull'origine del sequencer.
Dopo l'aggiunta di tutte le topologie alla sorgente del sequencer, l'applicazione deve contrassegnare l'ultimo segmento nella sequenza per terminare la riproduzione nel flusso. Senza questo flag, la sorgente del sequenziatore si aspetta l'aggiunta di più topologie.
Chiamare il metodo IMFSequencerSource::AppendTopology per aggiungere una specifica topologia alla fonte del 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 nella sorgente sequencer, passare SequencerTopologyFlags_Last nel parametro dwFlags. Questo valore viene definito nell'enumerazione MFSequencerTopologyFlags.
Chiamare IMFSequencerSource::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 il IMFSequencerSource::UpdateTopology e passando la nuova topologia in pTopology. Se nella nuova topologia sono presenti nuove origini native, le origini vengono aggiunte alla cache di origine. L'elenco dei preroll viene anch'esso aggiornato.
Impostazione della prima topologia nella sessione multimediale
Successivamente, metti in coda la prima topologia della sorgente di 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.
Recupera la sorgente multimediale nativa per la prima topologia della sorgente di sequenza.
Creare un descrittore di presentazione per l'origine multimediale chiamando il metodo IMFMediaSource::CreatePresentationDescriptor.
Recuperare la topologia associata per la presentazione chiamando il metodoIMFMediaSourceTopologyProvider::GetMediaSourceTopology.
Impostare la prima topologia nella sessione multimediale chiamando IMFMediaSession::SetTopology.
Chiamare setTopology con il parametro dwSetTopologyFlags impostato su NULL. Indica alla sessione multimediale di avviare la topologia specificata una volta completata la topologia corrente. Poiché in questo caso, la topologia specificata è la prima topologia e non è presente alcuna 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
L'applicazione deve quindi gestire l'evento MENewPresentation.
L'origine Sequencer genera MENewPresentation quando la sessione multimediale inizia a riprodurre un segmento seguito da un altro. Questo evento informa l'applicazione sulla topologia successiva nella sequenza sorgente fornendo il descrittore di presentazione per il segmento successivo nella lista di preroll. L'applicazione deve recuperare la topologia associata, usando il provider di topologia e accodarla nella sessione multimediale. La sorgente sequencer quindi prepara in anticipo questa topologia, garantendo una transizione senza problemi tra le presentazioni.
Quando l'applicazione cerca tra segmenti, l'applicazione riceve diversi eventi MENewPresentation mentre l'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 su come saltare i segmenti, vedere Usare la sorgente del sequenziatore.
Per informazioni su come ottenere notifiche sulla sorgente sequencer, vedere Eventi della sorgente sequencer.
Nel gestore eventi MENewPresentation recuperare il descrittore di presentazione per il segmento successivo dai dati dell'evento.
Ottenere la topologia associata per la presentazione chiamando il metodoIMFMediaSourceTopologyProvider::GetMediaSourceTopology.
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 del codice sorgente del Sequencer
Infine, arrestare il sequenziatore. A tale scopo, chiamare il metodo IMFMediaSource::Shutdown sulla sorgente sequencer. Questa chiamata arresta tutte le origini multimediali native sottostanti nella sorgente del sequenziatore.
Dopo aver rilasciato l'origine del sequencer, l'applicazione deve chiudere e arrestare la sessione multimediale chiamando IMFMediaSession::Close e IMFMediaSession::Shutdown, in questo 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 illustra come creare una playlist di base utilizzando la sorgente del sequenziatore. 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:
- Come controllare gli stati di presentazione: il sequencer di origine si basa sulla Media Session per fornire il controllo del trasporto, ad esempio, Play, Pause e Stop.
- Come eseguire lo scrubbing descrive i passaggi necessari per cercare una posizione specifica in un flusso.
Argomenti correlati