Cet article répond à de nombreuses questions fréquemment posées sur Microsoft DirectShow.
Quels systèmes d’exploitation DirectShow prend-il en charge ?
DirectShow est disponible dans toutes les versions prises en charge de Windows.
Combien de connaissances com dois-je programmer avec DirectShow ?
Pour le développement d’applications, vous devez comprendre les principes de base de l’utilisation des objets COM : comment les instancier, accéder aux interfaces qu’ils exposent et gérer le nombre de références sur ces interfaces. Le développement de filtres nécessite davantage de connaissances COM.
Quels formats DirectShow prend-il en charge ?
Consultez Formats pris en charge dans DirectShow.
Existe-t-il une liste de compatibilité matérielle (HCL) DirectShow ?
Non. DirectShow utilise les fonctionnalités matérielles Microsoft DirectDraw et Microsoft DirectSound si elles sont disponibles. Lorsqu’aucun matériel spécial n’est disponible, DirectShow utilise GDI pour dessiner des vidéos et les API multimédia waveOut * pour lire l’audio.
Quels langages puis-je utiliser pour écrire une application DirectShow ?
DirectShow est conçu principalement pour le développement C++. Un petit sous-ensemble de l’API DirectShow est exposé via Visual Basic 6.0 ; toutefois, cette fonctionnalité est déconseillée.
DirectShow sera-t-il jamais accessible via du code managé ?
Microsoft n’a pas prévu d’implémenter une API DirectShow managée.
De quel compilateur ai-je besoin pour le développement DirectShow ?
Tout compilateur capable de générer des objets COM (Component Object Model) doit fonctionner une fois que l’environnement du compilateur a été configuré correctement.
Comment DirectShow est-il lié à Microsoft DirectX ?
En interne, DirectShow utilise DirectSound et DirectDraw lorsque le matériel les prend en charge. Les filtres Video Renderer et Overlay Mixer utilisent les surfaces DirectDraw 3 et DirectDraw 5. Le convertisseur de mixage vidéo 7 (Windows XP uniquement) utilise des surfaces DirectDraw 7. Le convertisseur de mixage vidéo 9 et le convertisseur vidéo amélioré utilisent les dernières API Microsoft Direct3D. Vous n’avez pas besoin d’utiliser les autres API DirectX pour écrire une application DirectShow, bien qu’il soit possible de les combiner.
Quel est le lien entre DirectShow et Microsoft ActiveMovie ?
ActiveMovie était le nom d’origine de DirectShow. Le terme ActiveMovie n’est plus utilisé.
Le code source de l’utilitaire GraphEdit est-il disponible ? GraphEdit peut-il être redistribué ?
Non, la source n’est pas disponible et Graphedt.exe n’est pas redistribuable.
Les DMO remplacent-ils les filtres DirectShow ?
Microsoft DirectX Media Objects (DMO) peut être utilisé dans une application DirectShow. Pour les encodeurs, les décodeurs et les effets, nous vous encourageons à écrire un DMO au lieu d’un filtre DirectShow. (Remarque : si vous souhaitez utiliser DirectX Video Acceleration dans votre décodeur, vous devez l’implémenter en tant que filtre.) À d’autres fins, un filtre DirectShow peut être plus approprié. Pour plus d’informations sur les objets DMO, consultez Objets multimédias DirectX.
Je lit un fichier au format AVI avec Lecteur multimédia Windows. Je peux entendre l’audio, mais il ne semble pas y avoir de vidéo à la place, je vois juste noir. Quel est le problème ?
Le fichier a probablement été encodé avec un codec qui n’est pas présent sur votre système. Bien que le format de fichier AVI soit courant, les fichiers AVI peuvent être créés avec de nombreux formats de compression différents (codecs). Si vous essayez de lire un fichier AVI qui utilise un codec non pris en charge, vous pouvez entendre le composant audio, mais la vidéo s’affiche sous la forme d’un écran noir ou le contenu de l’écran reste inchangé.
Notes
Lecteur multimédia Windows tente souvent de télécharger et d’installer un codec s’il n’est pas présent sur votre système.
Comment faire créer mon application ? De quelles bibliothèques et fichiers d’en-tête ai-je besoin ?
Consultez Configuration de l’environnement de build.
GraphEdit affiche un grand nombre de filtres qui ne sont pas documentés. Quels sont ces filtres ?
GraphEdit énumère tous les filtres inscrits sur votre système dans une catégorie de filtre. Cela peut inclure des filtres installés par des applications tierces ou installés par d’autres technologies Microsoft, telles que Windows Media ou NetMeeting. En outre, certains filtres DirectShow agissent comme des wrappers pour les codecs ou les périphériques matériels, chaque codec ou appareil apparaissant comme un filtre distinct. Le codec vidéo Microsoft H.263 est utilisé par NetMeeting et n’est plus pris en charge dans DirectShow. Pour plus d’informations, consultez Énumération d’appareils et de filtres.
J’ai du mal à créer mon graphe personnalisé par programmation.
Essayez d’abord de générer le graphe de filtre avec GraphEdit. Cet outil vous permet de simuler de nombreuses possibilités rapidement. GraphEdit est toujours l’endroit idéal pour tester le graphique avant d’essayer de le générer avec du code source.
Pour plus d’informations sur la création de graphiques, consultez les articles suivants :
Comment puis-je détecter si DirectShow est installé sur un ordinateur donné ?
Appelez CoCreateInstance pour créer un instance du Gestionnaire de graphes de filtre. Si cet appel réussit, DirectShow est installé sur l’ordinateur. Le code suivant illustre comment procéder :
IGraphBuilder *pGraph;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **) &pGraph);
Comment faire modifier les paramètres d’un filtre sans afficher la page de propriétés ?
La plupart des filtres exposent une ou plusieurs interfaces pour définir des propriétés sur le filtre. Consultez la page de référence pour le filtre en question. (Voir Filtres directshow.)
Puis-je tester mon filtre avec GraphEdit ?
Lorsque vous développez un filtre, GraphEdit peut vous aider à visualiser les connexions entre les filtres. Il peut également fournir un test rapide des fonctionnalités d’un filtre. Toutefois, il ne s’agit pas d’une plateforme de test robuste.
À quel anneau de privilèges les filtres s’exécutent-ils ?
Les filtres s’exécutent à l’anneau 3, bien que certains filtres contrôlent les appareils de diffusion en continu qui s’exécutent à l’anneau 0. Pour plus d’informations, consultez Comment les appareils matériels participent au graphe de filtre.
Dois-je utiliser un débogueur de noyau ?
Cela dépend de votre projet spécifique. L’installation des bibliothèques runtime de débogage DirectX signifie que vous installez des pilotes de débogage et d’autres composants en mode noyau, et que si votre application provoque une déclaration de débogage dans l’un de ces composants, votre ordinateur redémarre automatiquement, sauf si vous avez un débogueur de noyau attaché à votre processus.
Lorsque j’exécute mon application dans le débogueur, elle se bloque.
Certains décodeurs sont conçus pour ne pas fonctionner tant que l’application est attachée au débogueur. Essayez d’exécuter l’application en dehors du débogueur.
Comment fonctionne la macro DEFINE\_GUID ?
La macro DEFINE_GUID résout le problème de déclaration extern
de références à des valeurs GUID dans votre code source. Par exemple, supposons que votre projet comporte trois fichiers sources, Src1.cpp, Src2.cpp et Src3.cpp, et que les trois fichiers utilisent une certaine valeur GUID que vous avez définie. La valeur GUID doit être définie exactement une fois dans votre projet, et les autres fichiers sources doivent y déclarer extern
des références. Avec la macro DEFINE_GUID , vous pouvez utiliser le même fichier d’en-tête à ces deux fins. Dans votre fichier d’en-tête, déclarez le GUID comme suit :
DEFINE_GUID(CLSID_MyObject,
0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
(Si cet exemple a zéro, placez les valeurs GUID réelles.) Vous pouvez utiliser l’utilitaire Guidgen.exe pour créer un GUID et le coller dans le fichier d’en-tête au format DEFINE_GUID . Incluez ce fichier d’en-tête dans chaque fichier source qui fait référence au GUID. Dans l’un des fichiers sources, incluez le fichier d’en-tête Initguid.h avant votre fichier d’en-tête. Exemple :
// Src1.cpp
#include <initguid.h>
#include "MyGuids.h"
// Src2.cpp
#include "MyGuids.h"
// Src3.cpp
#include "MyGuids.h"
Partout où le fichier d’en-tête Initguid.h n’est pas inclus, la macro DEFINE_GUID crée une extern
référence à la valeur GUID. Lorsque le fichier d’en-tête Initguid.h est inclus, il redéfinit la macro DEFINE_GUID afin que DEFINE_GUID crée une déclaration de définition du GUID.
Si vous n’incluez pas Initguid.h dans l’un des fichiers sources, vous obtiendrez une erreur de lien « symbole externe non résolu ». Si vous incluez Initguid.h deux fois pour le même GUID, vous obtiendrez une erreur de compilation « redéfinition ; initialisation multiple. » Pour résoudre ces erreurs, assurez-vous que Initguid.h est inclus exactement une fois. En outre, n’incluez pas Initguid.h dans un fichier d’en-tête précompilé, car en effet, l’en-tête précompilé est inclus dans chaque fichier source.