Implementazione del controllo frequenza
Questo argomento descrive in che modo gli oggetti pipeline personalizzati possono supportare le frequenze di riproduzione variabili, inclusa la riproduzione inversa. Per informazioni sull'uso del controllo del tasso da un'applicazione, vedere Controllo del tasso.
Questo argomento include le sezioni seguenti:
- Origini multimediali
- Trasformazioni di Media Foundation
- Destinazioni multimediali
- Argomenti correlati
Se si scrive un oggetto pipeline di Microsoft Media Foundation (un'origine multimediale, una trasformazione o un sink multimediale), potrebbe essere necessario supportare le frequenze di riproduzione variabili. A tale scopo, implementare le interfacce seguenti:
- Implementare l'interfaccia IMFGetService .
- Supportare il servizio MF_RATE_CONTROL_SERVICE . (Vedere Interfacce servizio.
- Implementare l'interfaccia IMFRateSupport , che ottiene le frequenze di riproduzione supportate dall'oggetto .
- Implementare l'interfaccia IMFRateControl , che ottiene o imposta la frequenza di riproduzione.
Origini multimediali
Se un'origine multimediale supporta il controllo della frequenza, deve implementare sia IMFRateSupport che IMFRateControl. In caso contrario, la sessione multimediale segnala che la frequenza di riproduzione minima e massima è 1,0, indipendentemente dagli altri componenti presenti nella pipeline.
La frequenza di riproduzione non influisce sui tempi di presentazione dei campioni, quindi l'origine multimediale non deve modificare i timestamp. Al contrario, l'orologio della presentazione funziona a una velocità superiore o inferiore. Per la riproduzione inversa, l'origine fornisce campioni in ordine inverso, con timestamp decrescente.
Il parametro fThin del metodo IMFRateControl::SetRate indica se l'origine multimediale deve sfoltire il contenuto. Lo snellimento si applica principalmente ai flussi video. In modalità thinned, l'origine elimina i fotogrammi differenziali e fornisce solo i fotogrammi chiave. A velocità di riproduzione molto elevate, l'origine potrebbe ignorare alcuni fotogrammi chiave (ad esempio, recapitare ogni altro fotogramma chiave).
L'origine non deve rilasciare campioni audio in modalità ridotta. A velocità di riproduzione molto elevate, tuttavia, l'origine potrebbe non essere in grado di leggere i dati abbastanza velocemente da soddisfare le richieste di campioni della pipeline. In tal caso, l'origine potrebbe dover eliminare alcuni dati audio. In tal caso, dovrebbe tentare di distribuire campioni audio vicini nel tempo agli esempi video (presupponendo che l'origine abbia entrambi i tipi di flusso).
Quando un flusso passa dalla modalità assottigliata a quella non assottigliata, invia un evento MEStreamThinMode.
Quando la origine multimediale completa una chiamata a SetRate, genera l'evento MESourceRateChanged.
Durante la riproduzione inversa:
- La sorgente multimediale fornisce campioni in ordine inverso, senza regolare le marche temporali.
- I timestamp all'interno di un flusso devono diminuire in modo monotono.
- L'inizio del contenuto viene considerato la fine del flusso. Dopo che ogni flusso multimediale ha recapitato il primo esempio nel flusso , ovvero il tempo di presentazione = 0, invia l'evento MEEndOfStream .
Trasformazioni di Media Foundation
In generale, una trasformazione Media Foundation (MFT) non richiede il supporto esplicito per il controllo della velocità, a meno che la MFT non implementi la riproduzione inversa senza assottigliamento.
Se un MFT non implementa l'interfaccia IMFRateSupport , la sessione multimediale presuppone quanto segue:
- MFT supporta le frequenze di riproduzione arbitrarie per la riproduzione in avanti, sia assottigliate che non assottigliate.
- MFT supporta la riproduzione inversa ridotta, ma non supporta la riproduzione inversa non ridotta.
Se una di queste condizioni non è vera, il MFT deve implementare IMFRateSupport e IMFRateControl.
Riproduzione inversa
La sessione multimediale può essere riprodotta inversa anche se una o più trasformazioni nella pipeline non supportano in modo esplicito la riproduzione inversa.
Se un MFT non espone l'interfaccia IMFRateSupport, La Sessione Multimediale usa thinning per la riproduzione inversa, come indicato di seguito:
La sessione multimediale invia fotogrammi chiave al MFT nel modo consueto, chiamando IMFTransform::P rocessInput.
La sessione multimediale elimina i fotogrammi differenziali e li sostituisce con eventi di tipo MEStreamTick.
Tra ciascun campione, la sessione multimediale svuota il MFT, per evitare errori causati dalla diminuzione dei timestamp.
Un campione viene considerato un fotogramma chiave se ha l'attributo MFSampleExtension_CleanPoint impostato su TRUE e un fotogramma delta se questo attributo è FALSE o non è impostato.
Se MFT implementa IMFRateSupport, la sessione multimediale usa questa interfaccia per determinare se MFT supporta la riproduzione inversa non sottile. Se l'MFT supporta la riproduzione inversa senza riduzione, la sessione multimediale fornisce tutti i campioni, in ordine inverso, senza eliminare campioni o svuotare l'MFT.
Se un MFT supporta la riproduzione inversa a piena qualità, deve implementare l'interfaccia IMFRateControl. La sessione multimediale userà questa interfaccia per notificare a MFT quando si verifica la riproduzione inversa. A questo punto, l'MFT deve essere preparato per la diminuzione dei timestamp e per l'arrivo dei frame in ordine inverso. Un decodificatore dovrà in genere memorizzare nel buffer i campioni fino a quando non ha ricevuto un intero gruppo di immagini (GOP), quindi decodificare l'intero GOP e restituire i fotogrammi decodificati nell'ordine corretto (inverso).
Dispositivi multimediali di destinazione
Se un sink multimediale è privo di vincoli di frequenza, la sessione multimediale presuppone che il sink multimediale possa gestire qualsiasi frequenza di riproduzione. Il sink multimediale non deve implementare IMFRateSupport. Un sink multimediale senza frequenza restituisce il flag MEDIASINK_RATELESS dal metodo IMFMediaSink::GetCharacteristics.
In caso contrario, un sink multimediale deve implementare IMFRateSupport se può gestire le frequenze di riproduzione diverse da 1,0.
I sink multimediali non devono implementare IMFRateControl. Quando la frequenza di riproduzione cambia, l'orologio della presentazione chiama il metodo IMFClockStateSink::OnClockSetRate del sink multimediale.
Argomenti correlati