In diesem Artikel werden viele häufig gestellte Fragen zu Microsoft DirectShow beantwortet.
Welche Betriebssysteme werden von DirectShow unterstützt?
DirectShow ist in allen unterstützten Versionen von Windows verfügbar.
Wie viel COM-Wissen benötige ich, um mit DirectShow zu programmieren?
Für die Anwendungsentwicklung müssen Sie sich mit den Grundlagen der Arbeit mit COM-Objekten vertraut machen: Wie Sie diese instanziieren, auf die von ihnen verfügbar gemachten Schnittstellen zugreifen und die Verweisanzahl für diese Schnittstellen verwalten. Die Filterentwicklung erfordert mehr COM-Kenntnisse.
Welche Formate werden von DirectShow unterstützt?
Weitere Informationen finden Sie unter Unterstützte Formate in DirectShow.
Gibt es eine DirectShow-Hardwarekompatibilitätsliste (HCL)?
Nein. DirectShow verwendet Hardwarefunktionen von Microsoft DirectDraw und Microsoft DirectSound, sofern diese verfügbar sind. Wenn keine spezielle Hardware verfügbar ist, verwendet DirectShow GDI zum Zeichnen von Videos und die waveOut * Multimedia-APIs zum Wiedergeben von Audio.
Welche Sprachen kann ich verwenden, um eine DirectShow-Anwendung zu schreiben?
DirectShow ist in erster Linie für die C++-Entwicklung konzipiert. Eine kleine Untermenge der DirectShow-API wird über Visual Basic 6.0 verfügbar gemacht. Dieses Feature ist jedoch veraltet.
Kann über verwalteten Code auf DirectShow zugegriffen werden?
Microsoft hat keine aktuellen Pläne zur Implementierung einer verwalteten DirectShow-API.
Welchen Compiler benötige ich für die DirectShow-Entwicklung?
Jeder Compiler, der COM-Objekte (Component Object Model) generieren kann, sollte funktionieren, sobald die Umgebung des Compilers ordnungsgemäß konfiguriert wurde.
In welchem Verhältnis steht DirectShow zu Microsoft DirectX?
Intern verwendet DirectShow DirectSound und DirectDraw, wenn es von der Hardware unterstützt wird. Die Filter Video Renderer und Overlay Mixer verwenden DirectDraw 3- und DirectDraw 5-Oberflächen. Der Video Mixing Renderer 7 (nur Windows XP) verwendet DirectDraw 7-Oberflächen. Der Videomischrenderer 9 und der erweiterte Videorenderer verwenden die neuesten Microsoft Direct3D-APIs. Sie müssen die anderen DirectX-APIs nicht verwenden, um eine DirectShow-Anwendung zu schreiben, obwohl es möglich ist, sie zu kombinieren.
In welchem Verhältnis steht DirectShow zu Microsoft ActiveMovie?
ActiveMovie war der ursprüngliche Name für DirectShow. Der Begriff ActiveMovie wird nicht mehr verwendet.
Ist der Quellcode für das GraphEdit-Hilfsprogramm verfügbar? Kann GraphEdit weiterverbreitet werden?
Nein, die Quelle ist nicht verfügbar, und Graphedt.exe ist nicht verteilbar.
Ersetzen DMOs DirectShow-Filter?
Microsoft DirectX Media Objects (DMOs) können in einer DirectShow-Anwendung verwendet werden. Für Encoder, Decoder und Effekte wird empfohlen, anstelle eines DirectShow-Filters einen DMO zu schreiben. (Hinweis: Wenn Sie Die DirectX-Videobeschleunigung in Ihrem Decoder verwenden möchten, müssen Sie sie als Filter implementieren.) Für andere Zwecke kann ein DirectShow-Filter besser geeignet sein. Weitere Informationen zu DMOs finden Sie unter DirectX-Medienobjekte.
Ich spiele eine AVI-Formatdatei mit Windows Medienwiedergabe ab. Ich kann das Audio hören, aber es scheint kein Video zu geben - stattdessen sehe ich nur schwarz. Wo liegt der Fehler?
Wahrscheinlich wurde die Datei mit einem Codec codiert, der nicht auf Ihrem System vorhanden ist. Obwohl das AVI-Dateiformat üblich ist, können AVI-Dateien mit vielen verschiedenen Komprimierungsformaten (Codecs) erstellt werden. Wenn Sie versuchen, eine AVI-Datei wiederzugeben, die einen nicht unterstützten Codec verwendet, hören Sie möglicherweise die Audiokomponente, aber das Video wird als schwarzer Bildschirm angezeigt, oder der Bildschirminhalt bleibt unverändert.
Hinweis
Windows Medienwiedergabe versucht häufig, einen Codec herunterzuladen und zu installieren, wenn er nicht auf Ihrem System vorhanden ist.
Gewusst wie meine Anwendung erstellen? Welche Bibliotheken und Headerdateien benötige ich?
Weitere Informationen finden Sie unter Einrichten der Buildumgebung.
GraphEdit zeigt viele Filter an, die nicht dokumentiert sind. Was sind diese Filter?
GraphEdit listet alle Filter auf, die auf Ihrem System in einer Filterkategorie registriert sind. Dies kann Filter sein, die von Drittanbieteranwendungen oder von anderen Microsoft-Technologien wie Windows Media oder NetMeeting installiert werden. Außerdem fungieren einige DirectShow-Filter als Wrapper für Codecs oder Hardwaregeräte, wobei jeder Codec oder jedes Gerät als eigenständiger Filter angezeigt wird. Der Microsoft H.263-Videocodec wird von NetMeeting verwendet und in DirectShow nicht mehr unterstützt. Weitere Informationen finden Sie unter Auflisten von Geräten und Filtern.
Ich habe Probleme beim programmgesteuerten Erstellen eines benutzerdefinierten Graphen.
Versuchen Sie zunächst, das Filterdiagramm mit GraphEdit zu erstellen. Mit diesem Tool können Sie viele Möglichkeiten schnell simulieren. GraphEdit ist immer ein großartiger Ort, um das Diagramm zu testen, bevor Sie versuchen, es mit Quellcode zu erstellen.
Weitere Informationen zum Erstellen von Diagrammen finden Sie in den folgenden Artikeln:
Wie kann ich erkennen, ob DirectShow auf einem bestimmten Computer installiert ist?
Rufen Sie CoCreateInstance auf, um eine instance des Filter Graph-Managers zu erstellen. Wenn dieser Aufruf erfolgreich ist, wird DirectShow auf dem Computer installiert. Dies wird im folgenden Code veranschaulicht:
IGraphBuilder *pGraph;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **) &pGraph);
Gewusst wie die Einstellungen eines Filters ändern, ohne die Eigenschaftenseite anzuzeigen?
Die meisten Filter machen eine oder mehrere Schnittstellen zum Festlegen von Eigenschaften für den Filter verfügbar. Lesen Sie die Referenzseite für den betreffenden Filter. (Siehe DirectShow-Filter.)
Kann ich meinen Filter mit GraphEdit testen?
Während Sie einen Filter entwickeln, kann GraphEdit Ihnen helfen, die Verbindungen zwischen Filtern zu visualisieren. Es kann auch einen schnellen Test der Funktionalität eines Filters bieten. Es ist jedoch nicht als robuste Testplattform gedacht.
An welchem Berechtigungsring werden Filter ausgeführt?
Filter werden bei Ring 3 ausgeführt, obwohl einige Filter Streaminggeräte steuern, die bei Ring 0 ausgeführt werden. Weitere Informationen finden Sie unter Teilnehmen von Hardwaregeräten am Filterdiagramm.
Muss ich einen Kerneldebugger verwenden?
Das hängt von Ihrem spezifischen Projekt ab. Die Installation der DirectX-Debuglaufzeitbibliotheken bedeutet, dass Sie Debugtreiber und andere Kernelmoduskomponenten installieren, und wenn Ihre Anwendung eine Debug-Assertion in einer dieser Komponenten verursacht, wird Ihr Computer automatisch neu gestartet, es sei denn, Sie haben einen Kerneldebugger an Ihren Prozess angefügt.
Wenn ich meine Anwendung im Debugger aus führe, stürzt sie ab.
Einige Decoder funktionieren nicht, während die Anwendung an den Debugger angefügt ist. Versuchen Sie, die Anwendung außerhalb des Debuggers auszuführen.
Wie funktioniert das Makro DEFINE\_GUID?
Das DEFINE_GUID Makros löst das Problem des Deklarierens extern
von Verweisen auf GUID-Werte im Quellcode. Angenommen, Ihr Projekt verfügt über drei Quelldateien: Src1.cpp, Src2.cpp und Src3.cpp, und alle drei Dateien verwenden einen bestimmten GUID-Wert, den Sie definiert haben. Der GUID-Wert muss genau einmal in Ihrem Projekt definiert werden, und die anderen Quelldateien müssen Verweise darauf deklarieren extern
. Mit dem DEFINE_GUID Makros können Sie dieselbe Headerdatei für beide Zwecke verwenden. Deklarieren Sie die GUID in Ihrer Headerdatei wie folgt:
DEFINE_GUID(CLSID_MyObject,
0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
(Wenn dieses Beispiel Nullen aufweist, geben Sie die tatsächlichen GUID-Werte an.) Sie können das Hilfsprogramm Guidgen.exe verwenden, um eine neue GUID zu erstellen und sie im DEFINE_GUID-Format in die Headerdatei einzufügen. Schließen Sie diese Headerdatei in jede Quelldatei ein, die auf die GUID verweist. Fügen Sie in genau einer der Quelldateien die Headerdatei Initguid.h vor Ihre Headerdatei ein. Beispiel:
// Src1.cpp
#include <initguid.h>
#include "MyGuids.h"
// Src2.cpp
#include "MyGuids.h"
// Src3.cpp
#include "MyGuids.h"
Unabhängig davon, wo die Headerdatei Initguid.h nicht enthalten ist, erstellt das DEFINE_GUID Makro einen extern
Verweis auf den GUID-Wert. Wenn die Headerdatei Initguid.h enthalten ist, wird das DEFINE_GUID Makro neu definiert, sodass DEFINE_GUID eine definierende Deklaration der GUID erstellt.
Wenn Sie Initguid.h nicht in eine der Quelldateien einschließen, wird der Linkfehler "externes Symbol nicht aufgelöst" angezeigt. Wenn Sie Initguid.h zweimal für dieselbe GUID einschließen, erhalten Sie den Kompilierfehler "Redefinition; Mehrfachinitialisierung." Um diese Fehler zu beheben, stellen Sie sicher, dass Initguid.h genau einmal enthalten ist. Schließen Sie Auch Initguid.h nicht in eine vorkompilierte Headerdatei ein, da der vorkompilierte Header in jeder Quelldatei enthalten ist.