Uso dell'origine Sequencer
In questo argomento viene descritto come usare l'origine sequencer. Contiene le sezioni seguenti:
Per una panoramica generale dell'origine sequencer, vedere Informazioni sull'origine sequencer.
Panoramica
L'origine sequencer espone le interfacce seguenti.
Interfaccia | Descrizione |
---|---|
IMFMediaSource | Espone la funzionalità di origine multimediale generica. |
IMFSequencerSource | Consente all'applicazione di aggiungere o rimuovere topologie. |
IMFMediaSourceTopologyProvider | Recupera la topologia successiva alla coda nella sessione multimediale. |
IMFMediaSourcePresentationProvider | Utilizzato dalla sessione multimediale per terminare i segmenti. Le applicazioni non usano questa interfaccia. |
IMFGetService | Esegue una query sull'origine sequencer per le interfacce del servizio. |
Per riprodurre una sequenza di origini multimediali, seguire questa procedura:
- Per creare l'origine sequencer, chiamare la funzione MFCreateSequencerSource.
- Per ogni segmento, creare una topologia di riproduzione, come descritto in Creazione di topologie di riproduzione. Per aggiungere la topologia alla presentazione, chiamare IMFSequencerSource::AppendTopology.
- Prima di avviare la riproduzione, chiama IMFMediaSource::CreatePresentationDescriptor nell'origine sequencer. Questo metodo restituisce un puntatore a un descrittore di presentazione per il primo segmento. Per ottenere la topologia associata a questo segmento, chiamare QueryInterface nell'origine sequencer per l'interfaccia IMFMediaSourceTopologyProvider. Passare il descrittore di presentazione al metodo IMFMediaSourceTopologyProvider::GetMediaSourceTopology. Questo metodo restituisce un puntatore alla topologia.
- Passare la topologia per il primo segmento alla sessione multimediale chiamando il metodo IMFMediaSession::SetTopology della sessione multimediale.
- Avviare la riproduzione chiamando IMFMediaSession::Start.
- Quando l'origine sequencer è pronta per prerollare il segmento successivo, invia un evento MENewPresentation i cui dati dell'evento sono un puntatore all'interfaccia IMFPresentationDescriptor. Anche in questo caso, ottenere la topologia per il segmento chiamando GetMediaSourceTopology nell'origine sequencer e impostando la topologia nella sessione multimediale chiamando SetTopology. Non è necessario riavviare l'origine multimediale; verrà riprodotto automaticamente al segmento successivo.
- Prima dell'interruzione dell'applicazione, arrestare l'origine sequencer chiamando IMFMediaSource::Shutdown.
Il codice seguente illustra come ottenere la topologia e impostarla nella sessione multimediale:
// 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;
}
Per un esempio di codice completo, vedere Codice di esempio di origine sequencer.
Aggiunta di topologie
L'origine sequencer gestisce due elenchi di topologie: l'elenco di input e l'elenco di preroll.
L'elenco di input è una raccolta di topologie corrispondenti ai segmenti di playlist, nell'ordine in cui sono stati aggiunti dall'applicazione chiamando IMFSequencerSource::AppendTopology. Questo metodo assegna a ogni topologia un identificatore di segmento univoco del tipo MFSequencerElementId. L'identificatore del segmento viene impostato come attributo per tutti i nodi della topologia di origine. Un'applicazione può ottenere l'identificatore di segmento da un nodo di origine usando l'attributo MF_TOPONODE_edizione StandardQUENCE_ELEMENTID. L'elenco di input può avere topologie duplicate se l'applicazione denominata AppendTopology nella stessa topologia più di una volta, ma vengono identificate dai relativi identificatori di segmento univoci.
L'elenco di preroll è una raccolta di topologie di elenco di input inizializzate in preparazione alla riproduzione. Ciò consente alla sessione multimediale di passare facilmente alla topologia successiva al termine della topologia attiva. L'applicazione non può aggiungere o rimuovere direttamente topologie dall'elenco di preroll; viene generato dall'origine sequencer quando viene selezionata una topologia dall'elenco di input per la riproduzione. In questo modo l'origine sequencer aggiunge la topologia successiva dall'elenco di input all'elenco di preroll. Dopo questa operazione, l'origine sequencer genera in modo asincrono l'evento MENewPresentation e passa il descrittore di presentazione per la topologia di preroll come dati dell'evento. L'applicazione deve restare in ascolto di questo evento usando l'interfaccia IMFMediaEventGenerator di Media Session e accodare la topologia di preroll nella sessione multimediale chiamando IMFMediaSession::SetTopology. Questa operazione deve essere eseguita prima che la sessione multimediale completi la riproduzione della topologia attiva. SetTopology informa la sessione multimediale sulla topologia successiva che deve essere riprodotta dopo la riproduzione della topologia attiva. Per garantire una transizione senza problemi, l'applicazione deve chiamare SetTopology prima che la sessione multimediale completi la riproduzione della topologia precedente. In caso contrario, vi sarà un divario tra i segmenti.
L'evento MENewPresentation viene generato finché è presente una topologia dopo la topologia attiva. Di conseguenza, se l'elenco di input contiene una sola topologia o se la topologia attiva è l'ultima nell'elenco di input, questo evento non viene generato.
L'elenco di preroll viene sincronizzato con l'elenco di input e viene aggiornato ogni volta che una topologia viene aggiunta o eliminata dall'elenco di input.
Eliminazione di topologie
Per rimuovere una topologia dall'origine sequencer, un'applicazione deve chiamare il metodo IMFSequencerSource::D eleteTopology e specificare l'identificatore del segmento.
Prima di chiamare DeleteTopology, l'applicazione deve assicurarsi che La sessione multimediale non usi la topologia che l'applicazione vuole eliminare. A tale scopo, è necessario eseguire entrambe le operazioni seguenti prima che l'applicazione chiami DeleteTopology:
L'evento MESessionTopologyStatus con MF_TOPOSTATUS_ENDED viene ricevuto per la topologia per assicurarsi che la sessione multimediale abbia completato la riproduzione.
MESessionTopologyStatus con MF_TOPOSTATUS_STARTED_SOURCE viene ricevuto per la topologia successiva per assicurarsi che la sessione multimediale abbia iniziato a riprodurre la topologia successiva, viene ricevuto l'evento MESessionEnded per assicurarsi che la sessione multimediale venga eseguita con l'ultima topologia nell'origine sequencer.
Se il segmento eliminato è la topologia attiva, la riproduzione viene arrestata e l'origine sequencer genera l'evento M edizione Enterprise ndOfPresentationSegment. Se la topologia attiva è anche l'ultima topologia, viene generato l'evento M edizione Enterprise ndOfPresentation.
Ignorare un segmento
Un'applicazione può passare a un particolare segmento nella sequenza avviando la sessione multimediale con un offset di segmento, come indicato di seguito:
Chiamare la funzione MFCreateSequencerSegmentOffset per creare l'offset del segmento. Specificare l'identificatore del segmento nel parametro dwId . L'identificatore è stato restituito dall'oggetto Metodo IMFSequencerSource::AppendTopology quando è stata aggiunta per la prima volta la topologia all'origine sequencer. Il parametro hnsOffset specifica un offset di tempo rispetto all'inizio del segmento. La riproduzione inizierà in questo momento. Per il parametro pvarSegmentOffset, passare l'indirizzo di un PROPVARIANT vuoto. Quando la funzione restituisce il risultato, questo PROPVARIANT contiene l'offset del segmento.
Chiamare il metodo IMFMediaSession::Start nella sessione multimediale. Per il parametro pguidTimeFormat, usare il valore GUID MF_TIME_FORMAT_edizione StandardGMENT_OFFedizione Standard T. Questo valore indica la ricerca in base all'offset del segmento. Per il parametro pvarStartPosition , passare l'indirizzo del PROPVARIANT creato nel passaggio precedente.
Nell'esempio di codice seguente viene illustrato come passare all'inizio di un segmento specificato in una sequenza.
// Skips to the specified segment in the sequencer source
HRESULT CPlaylist::SkipTo(DWORD index)
{
if (index >= m_count)
{
return E_INVALIDARG;
}
MFSequencerElementId ID = m_segments[index].SegmentID;
PROPVARIANT var;
HRESULT hr = MFCreateSequencerSegmentOffset(ID, NULL, &var);
if (SUCCEEDED(hr))
{
hr = m_pSession->Start(&MF_TIME_FORMAT_SEGMENT_OFFSET, &var);
PropVariantClear(&var);
}
return hr;
}
Quando l'applicazione cerca tra segmenti, l'applicazione riceve diversi eventi quando l'origine sequencer termina il segmento corrente e si prepara a riprodurre il nuovo segmento. Poiché questi eventi vengono ricevuti in modo asincrono, è difficile stimare la sequenza esatta di eventi. Questi eventi sono i seguenti:
L'origine sequencer invia un evento MENewPresentation per il nuovo segmento a cui viene ignorata la sessione multimediale.
Quando l'origine sequencer termina il segmento attivo, invia l'evento M edizione Enterprise ndOfPresentationSegment.
L'origine sequencer annulla quindi la topologia di preroll. In questo modo si ottengono gli eventi seguenti per la topologia annullata:
- Evento MESessionTopologyStatus con il flag MF_TOPOSTATUS_READY.
- Evento MESessionTopologyStatus con il flag MF_TOPOSTATUS_STARTED_SOURCE.
- M edizione Enterprise ndOfPresentationSegment con l'attributo MF_EVENT_SOURCE_TOPOLOGY_CANCELED per indicare che la topologia è stata annullata dall'origine sequencer.
L'origine sequencer invia quindi eventi per il nuovo segmento, inclusi vari eventi MESessionTopologyStatus .
Se il nuovo segmento non è l'ultimo nell'elenco, l'origine sequencer aggiorna l'elenco di preroll e genera un altro MENewPresentation per la nuova topologia di preroll. Per informazioni sulle topologie nell'elenco di preroll, vedere Informazioni sull'origine sequencer.
Altri dettagli sugli eventi inviati dall'origine sequencer sono disponibili nell'argomento Eventi di origine sequencer.
Argomenti correlati