Uso dei codec multimediali della finestra in DirectShow

Gli oggetti codificatore e decodificatore audio e video di Windows Media sono stati originariamente progettati e ottimizzati per lavorare con il formato del contenitore di file ASF e Windows Media Format SDK. Gli oggetti codec funzionano bene in DirectShow per determinati scenari, ovvero la codifica CBR e la qualità basata su VBR di flussi video. Tuttavia, se si sta valutando l'uso degli oggetti codec direttamente in DirectShow usando contenitori di file diversi da ASF, esistono alcuni comportamenti e problemi da tenere in considerazione in anticipo.

Nota

Se si useranno codec autonomi con DirectShow, probabilmente si vuole usarli solo come DMOs. In altre parole, si usa l'interfaccia IMediaObject anziché FMTransform.

 

Audio WM nei file AVI

È possibile usare DirectShow per codificare i flussi WMA in qualsiasi formato di contenitore di file per il quale è disponibile un filtro multiplexer. Tuttavia, le interfacce codec Audio e Video di Windows Media non supportano WMA nei file AVI perché è impossibile, usando i filtri di riproduzione DirectShow AVI predefiniti, per mantenere la sincronizzazione audio-video in un file AVI con un flusso WMA. Per altre informazioni, vedere Archiviazione di supporti compressi nei file AVI.

Il codificatore audio DMO restituisce esempi di durata variabile, anche quando in modalità "frequenza di bit costante". Funziona quindi meglio con i formati dei contenitori di file che usano i timestamp. I file AVI non forniscono un timestamp per ogni esempio audio o gruppo di esempi. In DirectShow il filtro AVI Splitter produce timestamp per ogni gruppo di campioni (ogni frame audio) in base al valore nAvgBytesPerSec nella struttura WAVEFORMATEX nell'intestazione di flusso AVI.

Il presupposto sottostante questo calcolo è che tutti gli esempi audio nel flusso sono di durata uguale; tuttavia, gli esempi restituiti dal DMO non sono di durata uguale e quindi i timestamp applicati da AVI Splitter non sono accurati. Pertanto, non è possibile, senza modificare AVI Splitter o il decodificatore audio DMO, per usare qualsiasi applicazione basata su DirectShow per riprodurre i file AVI con flussi audio e video in sincronizzazione. Il codec Di Windows Media Audio 9 Voice funziona in alcuni casi, ma anche questo perderà la sincronizzazione dopo qualsiasi operazione di ricerca, quindi non può essere considerata una soluzione valida.

Se si ha un codificatore MP3, è possibile creare file AVI con WMV e MP3 per il flusso audio. Tali file verranno riprodotti correttamente in Lettore multimediale Windows e in altre applicazioni basate su DirectShow, perché AVI Splitter contiene codice di gestione speciale per i flussi MP3. Un'altra opzione consiste nell'usare l'audio PCM non compresso, anche se ovviamente le dimensioni dei file risultanti saranno molto più grandi di quelle con un flusso audio compresso. Poiché l'applicazione di esempio DirectShow crea file AVI, non illustra come usare il codificatore audio DMO.

Codifica one-pass

Il codificatore video DMO funziona facilmente in DirectShow per due modalità di codifica: CBR e VBR basato sulla qualità. Purché si segui l'ordine corretto delle operazioni durante la compilazione del grafico del filtro, come illustrato nell'applicazione di esempio, è relativamente semplice posizionare il contenuto WMV in un file AVI usando AVI Multiplexer e il writer di file.

Codifica a due passaggi

Le modalità di codifica a due passaggi richiedono un approccio più complesso alla compilazione e allo streaming dei grafici per impedire al DMO di scaricare il contenuto dal primo passaggio prima di iniziare il secondo passaggio. Nella codifica a due passaggi, è necessario eseguire il grafico una volta in modo che DMO possa eseguire l'analisi preliminare dei dati del file e quindi riavvolgere il grafico ed eseguirlo nuovamente in modo che il DMO possa eseguire la codifica effettiva.

Quando il grafico entra in uno stato di esecuzione per il secondo passaggio, il DMO Wrapper imposta il flag DISCONTINUITY nel primo esempio, perché il timestamp non è sequenziale con l'ultimo timestamp del primo passaggio. Quando il DMO, che non è stato progettato per funzionare in DirectShow in questo modo, riceve il flag DI DISCONTINUITY, esegue uno scaricamento e perde i dati archiviati dal primo passaggio. Per risolvere questo problema, la soluzione migliore è probabilmente scrivere un filtro wrapper DMO personalizzato che non imposta il flag DI INTERRUZIONE quando il grafico viene cercato dopo il primo passaggio. L'esempio Video per Windows (VfW) in questo SDK illustra come eseguire la codifica a due passaggi.

Contenuto interlacciato

Il codificatore WMV DMO è in grado di codificare contenuti interlacciati mantenendo l'interlacciamento, che è utile per il contenuto acquisito da una TV e potrebbe anche essere riprodotto in una TV. Tuttavia, non è possibile mantenere l'interlacciamento usando il wrapper DMO predefinito, perché tale filtro non supporta INSSBuffer nei relativi esempi di input.

DMO usa tale interfaccia per ottenere le impostazioni interlacciate per ogni esempio ricevuto. Se l'interfaccia non viene trovata, come accade con DMO Wrapper, il DMO considera semplicemente gli esempi di input come non interlacciati. Per eseguire la codifica interlacciata in DirectShow, esistono diverse alternative. L'approccio più semplice è probabilmente quello di usare Windows Media Format 9 Series SDK direttamente o usando il filtro DirectShow di WM ASF Writer, per creare un file ASF interlacciato. È quindi possibile transcodificare tale file in un altro formato. Se si esegue la transcodifica in AVI, si avrà un file interlacciato, ma i filtri di riproduzione DIRECTShow AVI standard non lo riconosceranno come tali perché non supportano VIDEOINFOHEADER2. Un altro approccio consiste nel scrivere un filtro wrapper DMO personalizzato che supporta l'interfaccia INSSBuffer .

Uso di CODEC DMO