Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stato sostituito da MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice utilizzi MediaPlayer, IMFMediaEngine e acquisizione audio/video in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Come per qualsiasi applicazione DirectShow, un'applicazione di riproduzione DVD inizia creando un grafico di filtro. DirectShow fornisce i componenti seguenti per la riproduzione dvd:
- DVD Graph Builder. Oggetto helper che costruisce il grafico del filtro. Espone l'interfaccia IDvdGraphBuilder.
- filtro strumento di navigazione DVD. Filtro DirectShow che gestisce la riproduzione dvd, la navigazione e altri comandi.
La riproduzione dvd richiede anche un decodificatore MPEG-2. I decodificatori MPEG-2 hardware e software sono disponibili da terze parti. Creare prima di tutto un'istanza dell'oggetto DVD Graph Builder.
IDvdGraphBuilder *pBuild = NULL;
hr = CoCreateInstance(CLSID_DvdGraphBuilder, NULL,
CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, (void **)&pBuild);
A questo punto, è possibile selezionare e configurare il renderer video prima di compilare il resto del grafico. Questo passaggio, facoltativo, è descritto in modo più dettagliato nella sezione successiva. Se si omette questo passaggio, DVD Graph Builder seleziona un renderer predefinito. Successivamente, compilare il grafo chiamando il metodo IDvdGraphBuilder::RenderDvdVideoVolume.
AM_DVD_RENDERSTATUS buildStatus;
hr = pBuild->RenderDvdVideoVolume(L"Z:\\video_ts", 0, &buildStatus);
Il primo parametro è il nome di una directory che contiene i file DVD. In un disco DVD questi file risiedono in una directory denominata VIDEO_TS. Se il primo parametro è NULL, DVD Graph Builder usa la prima unità che contiene un volume DVD.
Il secondo parametro contiene vari flag facoltativi per scegliere il tipo di decodificatore (hardware o software) e altre opzioni.
Il terzo parametro è una struttura AM_DVD_RENDERSTATUS che riceve informazioni sullo stato. Se il metodo RenderDvdVideoVolume restituisce S_FALSE, significa che la chiamata ha avuto esito parzialmente positivo (o parzialmente fallito, se sei un pessimista). Ad esempio, il metodo potrebbe non riuscire a eseguire il rendering del flusso della sottopagina, anche se il rendering degli altri flussi è stato eseguito correttamente. Se il metodo RenderVideoVolume restituisce un codice di errore o il valore S_FALSE, è possibile esaminare la struttura AM_DVD_RENDERSTATUS per informazioni dettagliate sull'errore.
Successivamente, ottenere un puntatore per il gestore del grafico dei filtri chiamando IDvdGraphBuilder::GetFiltergraph. Questo metodo restituisce un puntatore all'interfaccia di IGraphBuilder di Filter Graph Manager.
IGraphBuilder *pGraph = NULL;
hr = pBuild->GetFiltergraph(&m_pGraph);
Utilizzare il metodo IDvdGraphBuilder::GetDvdInterface per recuperare le interfacce correlate al DVD, tra cui:
- IDvdControl2. Controlla la riproduzione e i comandi DVD
- IDvdInfo2. Restituisce informazioni sullo stato corrente dello strumento di navigazione DVD.
- IAMLine21Decoder. Controlla la visualizzazione della didascalia chiusa. La visualizzazione della didascalia chiusa è abilitata per impostazione predefinita. Per disabilitarla, chiamare IAMLine21Decoder::SetServiceState con il flag AM_L21_CCSTATE_Off.
- IBasicAudio. Controlla il volume audio e il bilanciamento.
Ad esempio, il codice seguente restituisce l'interfaccia IDvdControl2.
IDvdControl2 *pDvdControl = NULL;
hr = pBuild->GetDvdInterface(IID_IDvdControl2, (void**)&pDvdControl);
Il modo consigliato per creare il grafico del filtro di riproduzione DVD è farlo automaticamente da un oggetto DVD Graph Builder. Questo approccio è illustrato di seguito e nell'applicazione di esempio DVD. Se è necessario creare manualmente il grafico del filtro DVD, è possibile farlo seguendo le regole di base della compilazione del grafo descritte altrove nella documentazione di DirectShow. In genere, non è consigliabile aggiungere, rimuovere, connettere o disconnettere manualmente singoli filtri nel grafico creato da DVD Graph Builder, perché in questo modo potrebbe confondere il codice di pulizia.
Configurazione del renderer video
DirectShow offre diversi filtri del renderer video. Prima di compilare il grafico, è possibile scegliere il renderer video preferito. Selezionare il renderer chiamando IDvdGraphBuilder::GetDvdInterface e richiedendo un'interfaccia specifica per quel renderer:
- Filtro Overlay Mixer: IDDrawExclModeVideo.
- Video Mixing Renderer 7 (VMR-7): IVMRFilterConfig.
- Video Mixing Renderer 9 (VMR-9): IVMRFilterConfig9.
- Enhanced Video Renderer (EVR): IEVRFilterConfig.
Se si richiede una qualsiasi di queste interfacce prima di compilare il grafico del filtro, il generatore di grafici DVD crea il renderer video corrispondente. Successivamente, quando si compila il grafico, DVD Graph Builder tenterà di usare tale renderer. Tuttavia, se non riesce a compilare il grafico usando il renderer selezionato, può passare a un altro renderer. Ad esempio, il decodificatore MPEG-2 potrebbe non essere compatibile con il filtro VMR, nel qual caso il generatore di grafici DVD utilizzerebbe per impostazione predefinita l'Overlay Mixer.
Queste interfacce offrono anche la possibilità di configurare il renderer prima che sia connesso al decodificatore. Ad esempio, è possibile impostare VMR per usare la modalità senza finestra anziché la modalità predefinita finestra. Per altre informazioni sui renderer video, vedere l'argomento Informazioni sul rendering video in DirectShow.
In Windows XP e versioni successive, DVD Graph Builder usa sempre la Video Mixing Renderer 7 (VMR-7), a meno che:
- Il chiamante interroga le interfacce trovate solo nel Overlay Mixer, come IMixerPinConfig2. In questo modo viene inviato un suggerimento a DVD Graph Builder che l'applicazione vuole usare il mixer di sovrimpressione e non il VMR. Windows Media Player include anche un'opzione nella finestra di dialogo per forzare l'uso del Overlay Mixer.
- Il decodificatore installato non è compatibile con VMR. Durante la costruzione del grafo, la nuova interfaccia IAMDecoderCaps viene utilizzata per verificare il supporto VMR del decodificatore. Se non è presente, il generatore di grafici DVD userà il mixer di sovrimpressione.
- Durante l'uso di un decodificatore hardware, il decodificatore non può connettersi al Video Port Manager (VPM). Se un decodificatore hardware non può usare VPM, non può usare VMR e quindi DVD Graph Builder prova a creare un grafico usando overlay mixer.
- La scheda di visualizzazione è nota per avere risorse e/o funzionalità insufficienti per supportare la macchina virtuale virtuale, ma non segnala correttamente il problema nel driver. Alcuni casi noti sono esclusi in modo specifico da DVD Graph Builder.
- La connessione tra il decodificatore e il VMR fallisce per qualsiasi motivo, di solito a causa di una mancanza di VRAM per creare le superfici necessarie. In questi casi, DVD Graph Builder disattiva l'uso di VMR e tenta di usare overlay mixer per creare un grafico.
Modalità a finestra
In modalità finestra (Mixer overlay o VMR), il renderer crea la propria finestra video. Per rendere questa finestra figlia della finestra dell'applicazione, chiamare IVideoWindow::put_Owner con un handle all'applicazione. Chiama anche IVideoWindow::put_WindowStyle per impostare gli stili WS_CHILD e WS_CLIPSIBLINGS nella finestra video del renderer. Per ottenere i messaggi del mouse dalla finestra video del renderer, chiamare IVideoWindow::put_MessageDrain con un handle alla finestra dell'applicazione. Questo metodo configura un "svuotamento dei messaggi", ovvero la finestra video inoltra i messaggi del mouse ricevuti alla finestra di svuotamento dei messaggi.
pVideoWindow->put_Owner((OAHWND)hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVideoWindow->put_MessageDrain((OAHWND)hwnd) ;
Il deflusso dei messaggi rende un po' complicata la selezione dei pulsanti del menu DVD. Supponendo che la finestra video non riempia l'intera area client dell'applicazione, alcuni eventi del mouse si troveranno all'esterno della finestra video. Quando si ottiene un evento del mouse da all'interno della finestra video, dovresti elaborarlo per la navigazione del menu DVD. Gli eventi del mouse provenienti da non devono essere elaborati all'esterno della finestra video. Con il deflusso dei messaggi, non c'è modo di distinguere tra i due. Inoltre, le coordinate per gli eventi del mouse dalla finestra video sono relative all'area client della finestra video; ma gli eventi del mouse dall'esterno della finestra video sono relativi all'area client dell'applicazione.
Modalità senza finestra
La modalità senza finestra evita completamente i problemi relativi ai messaggi del mouse. Non è necessario uno svuotamento dei messaggi, perché VMR (o EVR) non crea la propria finestra in modalità senza finestra. Viene invece disegnato direttamente nella finestra dell'applicazione. Se il rettangolo di destinazione è più piccolo dell'area client dell'applicazione, lo strumento di navigazione DVD tiene conto di questa situazione quando calcola le posizioni del pulsante DVD. Pertanto, quando si riceve un messaggio del mouse, è possibile passare le coordinate direttamente allo strumento di navigazione DVD, come descritto nella sezione Navigazione menu.
Argomenti correlati