Précédent   Forum des professionnels en informatique > Applications > Développement 2D, 3D et Jeux > API graphiques > DirectX
DirectX Forum d'entraide sur le développement avec DirectX. Avant de poster -> FAQ DirectX
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 23/03/2007, 14h21   #1
Nouveau Membre du Club
 
Inscription : avril 2004
Messages : 189
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 189
Points : 28
Points : 28
Par défaut DirectShow et webcam

Bonjour,

j'essaie de récupérer le flux de ma webcam locale dans mon application. Pour celà, j'utilise donc DirectShow et grace au tutoriaux j'ai réussi à pondre un code qui compile. J'arrive à lancer mon application mais la video ne s'affiche pas ... si vous avez une idée ...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "camera.h"
 
//CONSTRUCTEUR DE LA FENETRE
Camera::Camera(QWidget *parent) : QWidget(parent)
{
	//PARAMETRES DE LA FENETRE CAMERA
	this->setWindowTitle("Webcam locale") ;
	this->setWindowIcon(QIcon());
	this->setFixedSize(QSize(170,150)) ;
	this->show() ;
 
	//BOUTON MUET
	muet = new QCheckBox("Microphone actif", this) ;
	muet->move(QPoint(30,128)) ;
 
	//CAMERA
	video = new QFrame(this) ;
	video->resize(160,120) ;
	video->move(QPoint(5,5)) ;
 
	Capture() ;
 
}
 
//DESTRUCTEUR
Camera::~Camera()
{
 
}
 
void Camera::Capture()
{
	HRESULT hr;
	IVideoWindow  * g_pVW = NULL;
	IMediaControl * g_pMC = NULL;
	IMediaEventEx * g_pME = NULL;
	IGraphBuilder * g_pGraph = NULL;
	ICaptureGraphBuilder2 * g_pCapture = NULL;
	IBaseFilter * pSrc = NULL;
    CComPtr <IMoniker> pMoniker =NULL;
    ULONG cFetched;
	CComPtr <ICreateDevEnum> pDevEnum =NULL;
	CComPtr <IEnumMoniker> pClassEnum = NULL;
	 IBaseFilter *pSrcFilter=NULL;
 
	hr = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
                           IID_IGraphBuilder, (void **) &g_pGraph);
 
 
    // Create the capture graph builder
    hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
                           IID_ICaptureGraphBuilder2, (void **) &g_pCapture);
 
    // Obtain interfaces for media control and Video Window
    hr = g_pGraph->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMC);
 
 
    hr = g_pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVW);
 
 
    hr = g_pGraph->QueryInterface(IID_IMediaEvent, (LPVOID *) &g_pME);
 
	hr = g_pCapture->SetFiltergraph(g_pGraph);
 
	//creation du device enumerator
	hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
                           IID_ICreateDevEnum, (void **) &pDevEnum);
 
	//creation du video device enumerator
	hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
 
	if (S_OK == (pClassEnum->Next (1, &pMoniker, &cFetched)))
    {
        // Bind Moniker to a filter object
        hr = pMoniker->BindToObject(0,0,IID_IBaseFilter, (void**)&pSrc);
 
    }
	hr = g_pCapture->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
                                   pSrcFilter, NULL, NULL);
 
	 hr = g_pMC->Run();
 
	 hr= g_pVW->put_Owner((OAHWND)video->winId());
 
	  hr = g_pVW->put_Visible(OATRUE);
 
}
innosang est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2007, 14h54   #2
Membre du Club
 
Avatar de titoine1978
 
Inscription : décembre 2005
Messages : 132
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : décembre 2005
Messages : 132
Points : 59
Points : 59
Salut,

Il ne manquerait pas un CoInitialize quelque part ?
titoine1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2007, 10h05   #3
Nouveau Membre du Club
 
Inscription : avril 2004
Messages : 189
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 189
Points : 28
Points : 28
j'ai rajouté hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);

mais j'ai des erreurs :

error C2065: 'COINIT_MULTITHREADED' : identificateur non déclaré
error C3861: 'CoInitializeEx' : identificateur introuvable

pour j'ai bien fait une include de objbase.h
innosang est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2007, 00h11   #4
Membre du Club
 
Avatar de titoine1978
 
Inscription : décembre 2005
Messages : 132
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : décembre 2005
Messages : 132
Points : 59
Points : 59
Tu as vraiment besoin du CoInitializeEx ? le CoInitialize ne te suffit pas ?

Sinon dans la doc ( http://msdn2.microsoft.com/en-us/library/ms695279.aspx ) c'est écrit :

You must include the #define _WIN32_DCOM preprocessor directive at the beginning of your code to be able to use CoInitializeEx.
titoine1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2007, 10h14   #5
Modérateur
 
Avatar de Ti-R
 
Inscription : avril 2003
Messages : 1 632
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : avril 2003
Messages : 1 632
Points : 1 860
Points : 1 860
Envoyer un message via ICQ à Ti-R
Dans les problèmes que j'ai rencontré, il y a aussi le nombre de périphériques retournés qu'il faut gérer, si tu as une webcam positionné en premier dans ta liste cela va fonctionner, sinon il ne va pas savoir forcément lire l'interface retourné.

Par exemple sur mon PC sur le premier périphérique, il me renvoie l'interface de ma carte TNT.

Donc il faut énumérer le tout et prendre la bonne entrée.

Télécharge mon exemple sur la capture de webcam qui utilise mon SDK ici, tu verras si tu as une ou plusieurs entrées sur ton PC, cela pourra te mettre sur une piste, je n'ai pas de code sur moi pour comparer mon code au tiens...
Ti-R est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2007, 11h35   #6
Nouveau Membre du Club
 
Inscription : avril 2004
Messages : 189
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 189
Points : 28
Points : 28
d'accord je vais voir ça ... merci vos réponses ..
innosang est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2007, 14h40   #7
Membre Expert
 
Homme david
Responsable développement
Inscription : décembre 2003
Messages : 1 120
Détails du profil
Informations personnelles :
Nom : Homme david
Âge : 37
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Responsable développement
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2003
Messages : 1 120
Points : 1 498
Points : 1 498
Citation:
Envoyé par titoine1978
Tu as vraiment besoin du CoInitializeEx ? le CoInitialize ne te suffit pas ?
Dans la doc:

http://msdn2.microsoft.com/en-us/library/ms678543.aspx


Citation:

New applications should call CoInitializeEx instead of CoInitialize.

CoInitialize calls CoInitializeEx and specifies the concurrency model as single-thread apartment.
Avec DirectShow, c'est plutôt du multithreadé.
moldavi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 13h17.


 
 
 
 
Partenaires

Hébergement Web