Origine multimediale ASF

Media Foundation fornisce l'origine multimediale ASF che un'applicazione può usare per rappresentare un file ASF nel livello della pipeline dell'architettura.

Per riprodurre un file ASF, un'applicazione può usare l'origine multimediale ASF per inserire dati in una pipeline di riproduzione. In uno scenario di codifica, l'applicazione può usare l'origine multimediale ASF come origine per eseguire la conversione in un altro formato o per convertire un file a velocità in bit più elevata in un file a velocità in bit inferiore senza modificare i formati. L'origine multimediale ASF deve essere usata nel livello della pipeline, ovvero un'applicazione deve usare la sessione multimediale per controllare l'operazione. Questo livello di accesso consente alle applicazioni di ottenere eventi mentre è in corso la sessione multimediale. Per ottenere l'accesso di livello inferiore al contenuto asf, un'applicazione deve usare i componenti ASF WMContainer Layer.

L'origine multimediale ASF implementa l'interfaccia IMFMediaSource , che è l'interfaccia generica per le origini multimediali in Media Foundation. Come qualsiasi altra origine multimediale, l'origine multimediale ASF fornisce un descrittore di presentazione che descrive principalmente l'oggetto intestazione ASF. Inoltre, l'origine multimediale ASF fornisce descrittori di flusso che rappresentano ogni flusso nel contenuto multimediale. Per altre informazioni, vedere Struttura di file ASF.

Creazione dell'origine multimediale ASF

Per creare l'origine multimediale ASF, l'applicazione deve usare il resolver di origine. Per creare l'origine multimediale ASF, l'applicazione deve fornire l'origine per cui il resolver di origine crea l'origine multimediale ASF. Le informazioni di origine devono essere fornite specificando l'URL del file di origine o il flusso di byte che contiene il supporto. Se l'applicazione sceglie di creare l'origine multimediale ASF specificando l'URL, deve chiamare IMFSourceResolver::CreateObjectFromURL per l'operazione sincrona o IMFSourceResolver::Begin... EndCreateObjectFromURL per l'operazione asincrona. Il processo di creazione dell'origine multimediale da un flusso di byte è simile. L'applicazione deve chiamare IMFSourceResolver::CreateObjectFromByteStream per l'operazione sincrona o IMFSourceResolver::Begin... EndCreateObjectFromBytestream per l'operazione asincrona. Queste chiamate devono specificare MF_RESOLUTION_MEDIASOURCE nel parametro dwFlags . Per altre informazioni sull'uso di questo flag, vedere Uso del resolver di origine.

Se l'applicazione specifica un URL, per un file locale, la stringa URL può contenere il percorso del file multimediale o può essere preceduta dal prefisso "file: "scheme. L'estensione del nome file deve essere ".asf", ".wm", L".wma" o ".wmv". Per un file ASF in rete, il resolver di origine crea l'origine di rete, che usa l'origine multimediale ASF.

Durante il processo di creazione dell'oggetto, il resolver di origine cerca l'elenco dei gestori dello schema e dei gestori di flusso dei byte nel Registro di sistema e carica il gestore corrispondente più vicino in grado di analizzare il contenuto multimediale e creare anche l'oggetto origine multimediale sottostante. Indipendentemente dal metodo usato per creare l'origine multimediale (URL e flusso di byte), il resolver di origine crea un flusso di byte e legge il contenuto dei supporti di origine nel flusso di byte. Per altre informazioni, vedere Gestori di schemi e gestori di flusso byte.

Per un esempio di codice su come creare un'origine multimediale, vedere Uso del resolver di origine.

Impostazioni di configurazione per l'origine multimediale ASF

Le query del resolver di origine per le funzionalità del flusso di byte sottostante e determinano che le operazioni sono consentite nell'origine multimediale appena creata. Una di queste funzionalità è alla ricerca. Se è consentita un'operazione di ricerca, l'applicazione può specificare la modalità di ricerca usata dall'origine multimediale durante la ricerca di un determinato punto della presentazione.

Un'applicazione può impostare la modalità di ricerca, affinché l'origine multimediale possa essere usata durante la creazione di oggetti. Dopo aver creato l'origine multimediale ASF con la modalità di ricerca specificata, non può essere modificata nell'origine multimediale o modificata dinamicamente durante una presentazione. Le preferenze di ricerca vengono specificate come proprietà nella chiamata dell'applicazione ai metodi del resolver di origine pertinenti usati per creare l'origine multimediale. Questi set di proprietà vengono impostati in un archivio proprietà e passati al parametro pProps . Se queste proprietà non vengono passate, le funzioni dell'origine multimediale con le impostazioni predefinite. Per altre informazioni sull'impostazione di queste proprietà, vedere Configurazione di un'origine multimediale.

Se la ricerca è consentita, l'origine multimediale ASF supporta le modalità di ricerca seguenti:

  • Ricerca esatta: in questa modalità, l'origine multimediale ASF si basa sull'oggetto indice ASF del file ASF. Se il file non dispone dell'oggetto Index, la ricerca esatta è disabilitata e viene utilizzata una delle altre modalità a seconda delle proprietà specificate dall'applicazione impostate nell'origine multimediale.
  • Ricerca approssimativa: questa modalità viene richiesta dall'applicazione passando MFPKEY_ASFMediaSource_ApproxSeek nell'archivio delle proprietà ai metodi del resolver di origine pertinenti. Tuttavia, la ricerca approssimativa viene usata solo se il flusso di byte non supporta la ricerca basata sul tempo. In questa modalità, l'origine multimediale determina un'ora di inizio relativamente più vicina al tempo di ricerca. Se il file ASF contiene un oggetto indice ASF, viene usato per calcolare l'ora di inizio. La ricerca approssimativa è meno accurata ma più veloce della ricerca esatta perché il tempo impiegato per il rendering del primo campione all'ora di inizio predeterminata è più veloce.
  • Ricerca iterativa: per impostare questa modalità, l'applicazione deve impostare la proprietà MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex . La ricerca iterativa è un algoritmo per trovare una posizione in un file ASF che non contiene alcun oggetto indice ASF. In questa modalità, l'origine multimediale determina una stima approssimativa del punto di ricerca leggendo l'offset del flusso di byte. Usa una serie di approssimazioni, in base alla velocità media dei bit, per avvicinarsi progressivamente al tempo di ricerca di destinazione. L'algoritmo è simile a una ricerca binaria. La ricerca iterativa può richiedere più tempo rispetto alla ricerca usando l'oggetto Index, quindi è disabilitata per impostazione predefinita. Se si imposta questa proprietà, utilizzare le proprietà seguenti per impostare i parametri di ricerca: MFPKEY_ASFMediaSource_IterativeSeek_Max_Count MFPKEY_ASFMediaSource_IterativeSeek_Tolerance_In_MilliSecond. Queste proprietà impostano rispettivamente il numero massimo di iterazioni e la tolleranza. L'algoritmo si interrompe quando raggiunge il numero massimo di iterazioni o quando trova un pacchetto la cui distanza dal tempo di ricerca rientra nella tolleranza specificata.

In breve, l'applicazione ha la possibilità di scegliere una ricerca approssimativa o iterativa quando il file ASF non contiene un oggetto indice ASF.

Modello a oggetti di origine multimediale ASF

L'origine multimediale ASF implementa l'interfaccia IMFMediaSource ed espone le interfacce seguenti. Un'applicazione può ottenere un riferimento a queste interfacce chiamando IMFMediaSource::QueryInterface nell'origine multimediale ASF.

Interfaccia Descrizione
IMFMediaSource Obbligatorio per tutte le origini multimediali.
IMFMediaEventGenerator Obbligatorio per tutte le origini multimediali. Consente alle applicazioni di ottenere eventi dall'origine multimediale tramite la sessione multimediale.
IMFGetService Esegue una query sull'origine multimediale per l'interfaccia del servizio specificata.
IPropertyStore Imposta e ottiene le proprietà nell'origine multimediale. Ogni proprietà contiene un nome descrittivo e un valore.
IMFMetadata Descrive i metadati per il file ASF.
IMFMetadataProvider Recupera una raccolta di metadati, per un'intera presentazione o per un flusso nella presentazione.
IMFRateSupport Esegue una query sull'intervallo di frequenze di riproduzione supportate, inclusa la riproduzione inversa.
IMFRateControl Ottiene o imposta la frequenza di riproduzione.
IMFTrustedInput Ottiene l'ITA per ognuno dei flussi ASF contenuti nell'origine.
IMFPMPClient Consente a un'origine multimediale di ricevere un puntatore all'interfaccia IMFPMPHost , usata per creare oggetti nel processo PMP.
IMFTimecodeTranslate Converte tra i codici temporali SMPTE (Society of Motion Picture e Television Engineers) e le unità temporali a 100 nanosecondi.

 

Servizi di origine multimediale ASF

L'origine multimediale ASF fornisce vari servizi con ambito per il file ASF. Per ottenere un puntatore a un determinato servizio, l'applicazione deve usare uno degli identificatori di servizio seguenti nella chiamata a MFGetService. Per informazioni, vedere Interfacce di servizio.

Identificatore del servizio Descrizione
MF_RATE_CONTROL_SERVICE Usando questo identificatore, un'applicazione può ottenere un puntatore alle interfacce IMFRateSupport o IMFRateControl. Usando l'oggetto di supporto della frequenza implementato dall'origine multimediale, l'applicazione può verificare se una frequenza specifica è supportata dal file multimediale ASF sottostante ottiene anche la velocità più rapida e più lenta. Usando l'oggetto controllo frequenza, l'applicazione può ottenere e impostare la frequenza di riproduzione. Se l'applicazione specifica una frequenza specifica per la riproduzione, l'origine multimediale ASF controlla prima di tutto se la frequenza richiesta rientra nei limiti di frequenza (determinati da velocità veloci e più lente) e quindi imposta la frequenza. Ciò non verifica la presenza di condizioni variabili perché la velocità in bit può cambiare in qualsiasi momento a seconda della larghezza di banda di rete. Per altre informazioni, controllo frequenza.
MF_METADATA_PROVIDER_SERVICE Usando questo identificatore, l'applicazione può ottenere un puntatore all'interfaccia IMFMetadataProvider dell'origine multimediale ASF. Questa interfaccia fornisce l'accesso alle informazioni sul file ASF in particolare sugli oggetti intestazione ASF e sui flussi contenuti all'interno del contenuto multimediale. Le informazioni sull'intestazione vengono esposte tramite attributi del descrittore di presentazione e le informazioni sul flusso vengono fornite tramite attributi del descrittore di flusso. Per altre informazioni su questi attributi, vedere Attributi di Media Foundation per oggetti intestazione ASF. Oltre alle informazioni esposte tramite attributi, esistono anche metadati descrittivi, che vengono impostati come proprietà.
MF_PROPERTY_HANDLER_SERVICE Usando questo identificatore, l'applicazione può ottenere un puntatore all'interfaccia IPropertyStore dell'origine multimediale ASF. L'archivio delle proprietà contiene tutti i metadati correlati al file ASF. Questo identificatore è nuovo in Windows 7 e sostituisce MF_METADATA_PROVIDER_SERVICE per ottenere le proprietà dei metadati.
MFNETSOURCE_STATISTICS_SERVICE Per altre informazioni, vedere Recupero di statistiche di rete nella registrazione client.
MF_TIMECODE_SERVICE Usando questo identificatore, l'applicazione può ottenere un puntatore all'interfaccia IMFTimecodeTranslate dell'origine multimediale. Questa implementazione può essere usata per eseguire traduzioni del codice temporale, ad esempio la conversione del codice temporale SMPTE in unità di tempo da 100 nano secondi e vice-unità.

 

Traduzione timecode

L'origine multimediale ASF fornisce un servizio di conversione del codice temporale che consente all'applicazione di convertire il codice temporale SMPTE nel tempo di presentazione più vicino (in unità di 100 nanosecondi). Al contrario, l'applicazione può anche ottenere il codice ora per un'ora di presentazione richiesta. Il servizio è disponibile tramite l'interfaccia IMFTimecodeTranslate , implementata dall'origine multimediale ASF. Le chiamate al metodo su questo puntatore di interfaccia sono asincrone che possono essere eseguite dal thread dell'applicazione principale senza bloccare l'interfaccia utente dell'applicazione.

I passaggi seguenti riepilogano la procedura per la traduzione del codice temporale:

  1. Ottenere il puntatore all'interfaccia IMFTimecodeTranslate dell'origine multimediale ASF chiamando MFGetService e specificando l'identificatore MF_TIMECODE_SERVICE.
  2. Chiamare IMFTimecodeTranslate::BeginConvertTimecodeToHNS o IMFTimecodeTranslate::BeginConvertHNSToTimecode e specificare l'ora da tradurre. Per BeginConvertTimecodeToHNS il codice ora deve essere specificato come variabile PROPVARIANT con tipo di dati VT_I8. Il metodo BeginConvertHNSToTimecode richiede il tempo in unità da 100 nanosecondi come tipo MFTIME.
  3. Completare l'operazione asincrona chiamando IMFTimecodeTranslate::EndConvertTimecodeToHNS o IMFTimecodeTranslate::EndConvertTimecodeToHNS in modo appropriato.

Durante la creazione dell'origine multimediale, il resolver di origine crea un flusso di byte per il file da cui l'origine multimediale legge il contenuto asf. Affinché le conversioni temporali abbiano esito positivo, il flusso di byte associato al file ASF deve avere funzionalità di ricerca; in caso contrario, l'applicazione ottiene l'errore MF_E_BYTESTREAM_NOT_SEEKABLE dalla chiamata Begin... . Un altro requisito per le conversioni temporali è che il file ASF, rappresentato dall'origine multimediale ASF, deve avere oggetti indice ASF. I tempi di presentazione e i codici di ora vengono estratti dagli oggetti indice ASF che mantengono tutti gli indici e i punti di ricerca corrispondenti per il file ASF. Per la conversione del codice time-to-time della presentazione, il file ASF deve contenere un oggetto Indice semplice; per la conversione dell'ora di presentazione del codice, il file ASF deve avere un oggetto Index. Le operazioni di conversione si basano sull'indicizzatore sottostante (componente WMContainer) per analizzare e leggere l'oggetto Index associato al file ASF. Se il file non contiene un oggetto Index, l'applicazione riceve in modo asincrono il codice di errore MF_E_NO_INDEX.

Per convertire l'ora richiesta dall'applicazione, l'origine multimediale enumera i flussi all'interno del file e trova il flusso che contiene l'oggetto indice ASF appropriato. Se viene trovato un flusso di questo tipo, l'origine multimediale analizza i pacchetti ASF del flusso fino a quando non viene raggiunto il codice di ora corretto. Dopo aver trovato l'esempio corretto, recupera l'ora di presentazione corrispondente o il codice dell'ora dall'esempio e lo restituisce al chiamante.

Supporto dei comandi script

Quando si compila una topologia ASF che contiene un flusso di script, alla topologia viene aggiunto un nodo Flusso di script. Questo nodo invierà IMFSamples al momento appropriato. Il IMFSample fornito dal nodo di origine dello script archivia i dati nel IMFMediaBuffer associato all'esempio. È possibile chiamare CopyToBuffer sull'esempio per ottenere un IMFMediaBuffer e quindi chiamare Lock sul buffer per ottenere i dati.

I payload del flusso di script vengono compressi nel buffer come stringa di tipo, seguiti da NULL, seguiti dalla stringa di comando, seguita da NULL. Le stringhe sono Unicode nel formato ASF.

Ad esempio, un payload potrebbe essere simile al seguente (dove \0 indica un carattere NULL):

URL\0http://contoso.com\0

Text\0Questa è una didascalia\0

Componenti ASF del livello pipeline

Supporto asf in Media Foundation