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.
Wie viel COM-Wissen muss ich mit DirectShow programmieren?
Für die Anwendungsentwicklung müssen Sie die Grundlagen der Arbeit mit COM-Objekten verstehen: wie Sie diese instanziieren, auf die verfügbaren Schnittstellen zugreifen und die Verweisanzahl auf diesen 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, um Audio wieder zu geben.
Mit welchen Sprachen kann ich eine DirectShow-Anwendung schreiben?
DirectShow ist in erster Linie für die C++-Entwicklung konzipiert. Eine kleine Untergruppe der DirectShow-API wird über Visual Basic 6.0 verfügbar gemacht. dieses Feature ist jedoch veraltet.
Ist DirectShow jemals über verwalteten Code zugänglich?
Microsoft hat derzeit keine Pläne, eine verwaltete DirectShow-API zu implementieren.
Welchen Compiler ben ben ben wir für die DirectShow-Entwicklung?
Jeder Compiler, der in der Lage ist, Component Object Model (COM)-Objekte zu generieren, sollte funktionieren, sobald die Umgebung des Compilers ordnungsgemäß konfiguriert wurde.
In welchem Zusammenhang steht DirectShow mit Microsoft DirectX?
Intern verwendet DirectShow DirectSound und DirectDraw, wenn die Hardware dies unterstützt. 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 Video Mixing Renderer 9 und der erweiterte Videorenderer verwenden die neuesten Microsoft Direct3D-APIs. Sie müssen nicht die anderen DirectX-APIs verwenden, um eine DirectShow-Anwendung zu schreiben, obwohl es möglich ist, sie zu kombinieren.
In welchem Zusammenhang steht DirectShow mit Microsoft ActiveMovie?
ActiveMovie war der ursprüngliche Name für DirectShow. Der Begriff ActiveMovie wird nicht mehr verwendet.
Ist der Quellcode für das Hilfsprogramm GraphEdit verfügbar? Kann GraphEdit neu verteilt werden?
Nein, die Quelle ist nicht verfügbar, und Graphedt.exe nicht verteilbar.
Ersetzen DMOs DirectShow-Filter?
Microsoft DirectX Media Objects (DMOs) kann in einer DirectShow-Anwendung verwendet werden. Bei Encodern, Decodern und Effekten wird empfohlen, anstelle eines DirectShow-Filters 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 ist ein DirectShow-Filter möglicherweise besser geeignet. Weitere Informationen zu DMOs finden Sie unter DirectX Media Objects.
Ich spiele eine AVI-Formatdatei mit Windows Media Player. Ich kann die Audiodaten 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 auf Ihrem System nicht 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 wiederwiedergaben, 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 Media Player versucht häufig, einen Codec herunterzuladen und zu installieren, wenn er auf Ihrem System nicht vorhanden ist.
Gewusst wie meine Anwendung zu erstellen? Welche Bibliotheken und Headerdateien ben ben?
GraphEdit zeigt viele Filter an, die nicht dokumentiert sind. Was sind diese Filter?
GraphEdit listet alle Filter auf, die in Ihrem System in einer Filterkategorie registriert sind. Dies kann Filter umfassen, die von Anwendungen von Drittanbietern oder von anderen Microsoft-Technologien wie Windows Media oder NetMeeting installiert wurden. Darüber hinaus fungieren einige DirectShow-Filter als Wrapper für Codecs oder Hardwaregeräte, bei der jeder Codec oder jedes Gerät als eindeutiger Filter angezeigt wird. Der Microsoft H.263-Videocodec wird von NetMeeting verwendet und in DirectShow nicht mehr unterstützt. Weitere Informationen finden Sie unter Aufzählen von Geräten und Filtern.
Ich habe Probleme beim programmgesteuerten Erstellen meines 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 hervorragender 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 Instanz des Filter-Graph 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. Sehen Sie sich die Referenzseite für den in Frage gestellten Filter an. (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. Sie kann auch einen schnellen Test der Funktionalität eines Filters bereitstellen. Sie ist jedoch nicht als stabile Testplattform gedacht.
Auf welchem Berechtigungsring werden Filter ausgeführt?
Filter werden an Ring 3 ausgeführt, obwohl einige Filter Streaminggeräte steuern, die an Ring 0 ausgeführt werden. Weitere Informationen finden Sie unter How Hardware Devices Participate in the Filter Graph.
Muss ich einen Kerneldebugger verwenden?
Dies hängt von Ihrem spezifischen Projekt ab. Die Installation der DirectX-Debuglaufzeitbibliotheken bedeutet, dass Sie Debugtreiber und andere Kernelmoduskomponenten installieren. Wenn Ihre Anwendung eine Debug-Assert-Anweisung in einer dieser Komponenten verursacht, wird Ihr Computer automatisch neu gestartet, es sei denn, Ihr Prozess ist mit einem Kerneldebugger verbunden.
Wenn ich meine Anwendung im Debugger ausstelle, stürzt sie ab.
Einige Decoder sind so konzipiert, dass sie nicht funktionieren, während die Anwendung an den Debugger angefügt ist. Versuchen Sie, die Anwendung außerhalb des Debuggers auszuführen.
Wie funktioniert das DEFINE \_ GUID-Makro?
Das DEFINE _ GUID-Makro löst das Problem, Verweise extern auf GUID-Werte im Quellcode zu deklarieren. 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 extern Verweise darauf deklarieren. Mit dem DEFINE _ GUID-Makro können Sie dieselbe Headerdatei für beide Zwecke verwenden. Deklarieren Sie die GUID in der Headerdatei wie folgt:
DEFINE_GUID(CLSID_MyObject,
0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
(Wenn dieses Beispiel Nullen enthält, legen Sie die tatsächlichen GUID-Werte ab.) Sie können das Hilfsprogramm Guidgen.exe verwenden, um eine neue GUID zu erstellen und im DEFINE _ GUID-Format in die Headerdatei einfüge. Schließen Sie diese Headerdatei in jede Quelldatei ein, die auf die GUID verweist. Schließen Sie in genau eine der Quelldateien die Headerdatei Initguid.h vor Ihrer Headerdatei ein. Beispiel:
// Src1.cpp
#include <initguid.h>
#include "MyGuids.h"
// Src2.cpp
#include "MyGuids.h"
// Src3.cpp
#include "MyGuids.h"
Wenn die Headerdatei Initguid.h nicht enthalten ist, erstellt das DEFINE _ GUID-Makro einen Verweis extern 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 einarbeiten, erhalten Sie den Linkfehler "nicht aufgelöstes externes Symbol". Wenn Sie Initguid.h zweimal für dieselbe GUID enthalten, erhalten Sie den Kompilierungsfehler "Neudefinition; mehrere Initialisierungen." Stellen Sie sicher, dass Initguid.h genau einmal enthalten ist, um diese Fehler zu beheben. Schließen Sie außerdem Initguid.h nicht in eine vorkompilierte Headerdatei ein, da der vorkompilierte Header tatsächlich in jeder Quelldatei enthalten ist.