Modifica

Condividi tramite


Domande frequenti su DirectShow

Questo articolo risponde a molte domande frequenti su Microsoft DirectShow.

Quali sistemi operativi supportaNo DirectShow?

DirectShow è disponibile in tutte le versioni supportate di Windows.

Quanta conoscenza COM è necessario programmare con DirectShow?

Per lo sviluppo di applicazioni, è necessario comprendere le nozioni di base sull'uso degli oggetti COM: come crearne un'istanza, accedere alle interfacce esposte e gestire i conteggi dei riferimenti su tali interfacce. Lo sviluppo di filtri richiede una maggiore conoscenza COM.

Quali formati supporta DirectShow?

Esiste un elenco di compatibilità hardware DirectShow (HCL)?

No. DirectShow usa funzionalità hardware Microsoft DirectDraw e Microsoft DirectSound se disponibili. Quando non è disponibile alcun hardware speciale, DirectShow usa GDI per disegnare video e le API multimediali waveOut * per riprodurre audio.

Quali lingue è possibile usare per scrivere un'applicazione DirectShow?

DirectShow è progettato principalmente per lo sviluppo C++. Un piccolo set secondario dell'API DirectShow viene esposto tramite Visual Basic 6.0; tuttavia, questa funzionalità è deprecata.

DirectShow sarà mai accessibile tramite codice gestito?

Microsoft non ha piani correnti per implementare un'API DirectShow gestita.

Quale compilatore è necessario per lo sviluppo di DirectShow?

Qualsiasi compilatore in grado di generare oggetti Component Object Model (COM) deve funzionare una volta configurato correttamente l'ambiente del compilatore.

In che modo DirectShow si riferisce a Microsoft DirectX?

Internamente, DirectShow usa DirectSound e DirectDraw quando l'hardware lo supporta. I filtri Di Renderingr video e Overlay Mixer usano superfici DirectDraw 3 e DirectDraw 5. Il renderer di mix video 7 (solo Windows XP) usa superfici DirectDraw 7. Il renderer di mix video 9 e il renderer video avanzato usano le API Microsoft Direct3D più recenti. Non è necessario usare le altre API DirectX per scrivere un'applicazione DirectShow, anche se è possibile combinarle.

In che modo DirectShow si riferisce a Microsoft ActiveMovie?

ActiveMovie era il nome originale per DirectShow. Il termine ActiveMovie non viene più usato.

Il codice sorgente dell'utilità GraphEdit è disponibile? GraphEdit può essere ridistribuito?

No, l'origine non è disponibile e Graphedt.exe non è ridistribuibile.

Sostituire i filtri DirectShow?

Microsoft DirectX Media Objects (DMOs) può essere usato in un'applicazione DirectShow. Per i codificatori, i decodificatori e gli effetti, è consigliabile scrivere un DMO anziché un filtro DirectShow. Nota: se si vuole usare l'accelerazione video DirectX nel decodificatore, è necessario implementarla come filtro. Per altri scopi, un filtro DirectShow potrebbe essere più appropriato. Per altre informazioni sugli oggetti DMO, vedere Oggetti multimediali DirectX.

Sto giocando un file di formato AVI con Lettore multimediale Windows. Posso sentire l'audio, ma non sembra che ci sia alcun video, ma vedo solo nero. Qual è il problema?

Probabilmente il file è stato codificato con un codec che non è presente nel sistema. Anche se il formato di file AVI è comune, i file AVI possono essere creati con molti formati di compressione diversi (codec). Se si tenta di riprodurre un file AVI che usa un codec non supportato, si potrebbe sentire il componente audio, ma il video verrà visualizzato come una schermata nera o il contenuto dello schermo rimarrà invariato.

Nota

Lettore multimediale Windows spesso tenta di scaricare e installare un codec se non è presente nel sistema.

 

Ricerca per categorie compilare l'applicazione? Quali librerie e file di intestazione sono necessari?

GraphEdit visualizza molti filtri non documentati. Quali sono questi filtri?

GraphEdit enumera tutti i filtri registrati nel sistema in una categoria di filtro. Questo può includere filtri installati da applicazioni di terze parti o installati da altre tecnologie Microsoft, ad esempio Windows Media o NetMeeting. Inoltre, alcuni filtri DirectShow fungono da wrapper per codec o dispositivi hardware, con ogni codec o dispositivo visualizzato come filtro distinto. Il codec video Microsoft H.263 viene usato da NetMeeting e non è più supportato in DirectShow. Per altre informazioni, vedere Enumerazione di dispositivi e filtri.

Si verificano problemi durante la creazione del grafico personalizzato a livello di codice.

Provare prima a creare il grafico del filtro con GraphEdit. Questo strumento consente di simulare rapidamente molte possibilità. GraphEdit è sempre un ottimo posto per testare il grafico prima di tentare di compilarlo con il codice sorgente.

Per altre informazioni sulla compilazione di grafici, vedere gli articoli seguenti:

Come è possibile rilevare se DirectShow è installato in un determinato computer?

Chiamare CoCreateInstance per creare un'istanza di Filter Graph Manager. Se questa chiamata ha esito positivo, DirectShow viene installato nel computer. Nel codice seguente viene illustrato come eseguire questa operazione:

IGraphBuilder *pGraph;

HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
    NULL, CLSCTX_INPROC_SERVER,
    IID_IGraphBuilder, (void **) &pGraph);

Ricerca per categorie modificare le impostazioni di un filtro senza visualizzare la pagina delle proprietà?

La maggior parte dei filtri espone una o più interfacce per l'impostazione delle proprietà nel filtro. Consultare la pagina di riferimento per il filtro in questione. Vedere Filtri DirectShow.

È possibile testare il filtro con GraphEdit?

Durante lo sviluppo di un filtro, GraphEdit consente di visualizzare le connessioni tra filtri. Può anche fornire un test rapido della funzionalità di un filtro. Tuttavia, non è inteso come una piattaforma di test affidabile.

A quale anello dei privilegi vengono eseguiti i filtri?

I filtri vengono eseguiti all'anello 3, anche se alcuni filtri controllano i dispositivi di streaming eseguiti all'anello 0. Per altre informazioni, vedere Come i dispositivi hardware partecipano al grafico dei filtri.

È necessario usare un debugger del kernel?

Dipende dal progetto specifico. L'installazione delle librerie di runtime di debug DirectX significa che si installano driver di debug e altri componenti della modalità kernel e che se l'applicazione causa un'asserzione di debug in uno di questi componenti, il computer verrà riavviato automaticamente a meno che non si abbia un debugger del kernel collegato al processo.

Quando si esegue l'applicazione nel debugger, si arresta in modo anomalo.

Alcuni decodificatori sono progettati per non funzionare mentre l'applicazione è collegata al debugger. Provare a eseguire l'applicazione all'esterno del debugger.

Come funziona la macro DEFINE\_GUID?

La macro DEFINE_GUID risolve il problema di dichiarare extern riferimenti ai valori GUID nel codice sorgente. Si supponga, ad esempio, che il progetto abbia tre file di origine, Src1.cpp, Src2.cpp e Src3.cpp e tutti e tre i file usino un determinato valore GUID definito. Il valore GUID deve essere definito esattamente una volta nel progetto e gli altri file di origine devono dichiarare extern i riferimenti. Con la macro DEFINE_GUID , è possibile usare lo stesso file di intestazione a scopo entrambi. Nel file di intestazione dichiarare il GUID come indicato di seguito:

DEFINE_GUID(CLSID_MyObject, 
0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);

Dove questo esempio ha zero, inserire i valori GUID effettivi. È possibile usare l'utilità Guidgen.exe per creare un nuovo GUID e incollarlo nel file di intestazione nel formato DEFINE_GUID . Includere questo file di intestazione in ogni file di origine che fa riferimento al GUID. In uno dei file di origine includere il file di intestazione Initguid.h prima del file di intestazione. Ad esempio:

// Src1.cpp
#include <initguid.h>
#include "MyGuids.h"

// Src2.cpp
#include "MyGuids.h"

// Src3.cpp
#include "MyGuids.h"

Ovunque il file di intestazione Initguid.h non sia incluso, la macro DEFINE_GUID crea un extern riferimento al valore GUID. Quando il file di intestazione Initguid.h è incluso, ridefine la macro DEFINE_GUID in modo che DEFINE_GUID crei una dichiarazione di definizione del GUID.

Se non si include Initguid.h in uno dei file di origine, verrà visualizzato un errore di collegamento "simbolo esterno non risolto". Se si include Initguid.h due volte per lo stesso GUID, verrà visualizzato un errore di compilazione "ridefinizione; inizializzazione multipla." Per risolvere questi errori, assicurarsi che Initguid.h sia incluso esattamente una volta. Inoltre, non includere Initguid.h all'interno di un file di intestazione precompilato, perché in effetti l'intestazione precompilata è inclusa in ogni file di origine.

Introduzione a DirectShow