Share via


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 i dati in una pipeline di riproduzione. In uno scenario di codifica, l'applicazione può usare l'origine multimediale ASF come origine per convertire in un altro formato o per convertire un file a velocità di bit superiore in un file a velocità di 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 la sessione multimediale è in corso. 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 FMMediaSource , ovvero 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 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 del supporto ASF. Le informazioni di origine devono essere fornite specificando l'URL del file di origine o il flusso di byte che contiene i supporti. Se l'applicazione sceglie di creare l'origine multimediale ASF specificando l'URL, deve chiamare FMSourceResolver::CreateObjectFromURL per l'operazione sincrona o FMSourceResolver::Begin... EndCreateObjectFromURL per l'operazione asincrona. Il processo per la creazione dell'origine multimediale da un flusso di byte è simile. L'applicazione deve chiamare FMSourceResolver::CreateObjectFromByteStream per l'operazione sincrona o FMSourceResolver::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: "schema". L'estensione del nome file deve essere ".asf", ".wm", L".wma", o ".wmv". Per un file ASF nella 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 i gestori di flusso di byte nel Registro di sistema e carica il gestore di corrispondenza più vicino che può analizzare il contenuto multimediale e creare anche l'oggetto origine multimediale sottostante. Indipendentemente dal metodo usato per creare l'origine multimediale (URL e flusso byte), il resolver di origine crea un flusso di byte e legge il contenuto del supporto di origine nel flusso di byte. Per altre informazioni, vedere Gestori schemi e gestori Byte-Stream.

Per 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à sta cercando. 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 nella presentazione.

Un'applicazione può impostare la modalità di ricerca, per l'origine multimediale da usare, 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à sono impostati in un archivio proprietà e passati al parametro pProps . Se queste proprietà non vengono passate, le funzioni di 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 ASF Index del file ASF. Se il file non ha l'oggetto Index, la ricerca esatta è disabilitata e una delle altre modalità viene usata a seconda delle proprietà specificate dall'applicazione impostate sull'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 all'ora 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 rispetto alla 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 frequenza media di 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à, usare 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 arresta quando raggiunge il numero massimo di iterazioni o quando trova un pacchetto la cui distanza dal tempo di ricerca si trova all'interno della 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 FMMediaSource ed espone le interfacce seguenti. Un'applicazione può ottenere un riferimento a queste interfacce chiamando FMMediaSource::QueryInterface nell'origine multimediale ASF.

Interfaccia Descrizione
FMIMediaSource Obbligatorio per tutte le origini multimediali.
FMMediaEventGenerator Obbligatorio per tutte le origini multimediali. Consente alle applicazioni di ottenere eventi dall'origine multimediale tramite la sessione multimediale.
FMGetService Esegue 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.
FMMetadata Descrive i metadati per il file ASF.
FMMetadataProvider Recupera una raccolta di metadati, per un'intera presentazione o per un flusso nella presentazione.
FMRateSupport Esegue query sull'intervallo di frequenze di riproduzione supportate, inclusa la riproduzione inversa.
FMRateControl Ottiene o imposta la frequenza di riproduzione.
FMTrustedInput Ottiene l'ITA per ognuno dei flussi ASF contenuti nell'origine.
FMPMPClient Consente a un'origine multimediale di ricevere un puntatore all'interfaccia FMPMPHost , utilizzata per creare oggetti nel processo PMP.
FMTimecodeTranslate Converte tra i codici temporali Society of Motion Picture e Television Engineers (SMPTE) e 100-nanosecondi.

 

Servizi multimediali ASF

L'origine multimediale ASF fornisce vari servizi con ambito per il file ASF. Per ottenere un puntatore a un servizio specifico, 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 FMRateSupport o FMRateControl . Usando l'oggetto di supporto della frequenza implementato dall'origine multimediale, l'applicazione può verificare se una determinata frequenza è supportata dal file multimediale ASF sottostante ottiene anche la velocità più veloce 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 innanzitutto se la frequenza richiesta rientra nei limiti di velocità (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 consente di accedere alle informazioni sul file ASF in particolare sugli oggetti intestazione ASF e sui flussi contenuti all'interno del contenuto multimediale. Le informazioni di intestazione vengono esposte tramite attributi del descrittore di presentazione e le informazioni sul flusso vengono fornite tramite gli 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 delle 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 di codice temporali, ad esempio la conversione del codice ora SMPTE in unità di tempo da 100 nano e vice-

 

Traduzione timecode

L'origine multimediale ASF fornisce un servizio di traduzione del codice temporale che consente all'applicazione di convertire il codice temporale SMPTE nell'ora di presentazione più vicina (in unità di 100 nanosecondi). Viceversa, l'applicazione può anche ottenere il codice temporale 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 conversione 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à di 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 di codice time-to-time della presentazione, il file ASF deve contenere un oggetto Indice semplice; per la conversione dell'ora della presentazione da codice a presentazione, 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 il tempo richiesto 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 ora corretto. Dopo aver trovato l'esempio corretto, recupera l'ora di presentazione corrispondente o il codice 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 FMISample fornito dal nodo di origine dello script archivia i dati in IMFMediaBuffer associati 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\0Questo è un didascalia\0

Componenti ASF del livello pipeline

Supporto di ASF in Media Foundation