Précédent   Forum des professionnels en informatique > Applications > Développement 2D, 3D et Jeux > APIs multimédia > 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 (permalink)
Membre actif
 
Date d'inscription: avril 2004
Messages: 191
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 :
#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
Vieux 23/03/2007, 14h54   #2 (permalink)
Membre régulier
 
Avatar de titoine1978
 
Date d'inscription: décembre 2005
Localisation: Montréal
Messages: 132
Par défaut

Salut,

Il ne manquerait pas un CoInitialize quelque part ?
titoine1978 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/03/2007, 10h05   #3 (permalink)
Membre actif
 
Date d'inscription: avril 2004
Messages: 191
Par défaut

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
Vieux 29/03/2007, 00h11   #4 (permalink)
Membre régulier
 
Avatar de titoine1978
 
Date d'inscription: décembre 2005
Localisation: Montréal
Messages: 132
Par défaut

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
Vieux 29/03/2007, 10h14   #5 (permalink)
Modérateur
 
Avatar de Ti-R
 
Date d'inscription: avril 2003
Localisation: Paris/Vannes
Âge: 30
Messages: 1 597
Envoyer un message via ICQ à Ti-R
Par défaut

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
Vieux 29/03/2007, 11h35   #6 (permalink)
Membre actif
 
Date d'inscription: avril 2004
Messages: 191
Par défaut

d'accord je vais voir ça ... merci vos réponses ..
innosang est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 02/04/2007, 14h40   #7 (permalink)
Rédacteur
 
Date d'inscription: décembre 2003
Localisation: GRASSE
Âge: 35
Messages: 961
Par défaut

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
NEWS 2D - 3D - JEUXLES FAQsTUTORIELSOUTILSBIBLIOTHEQUESMEDIASLIVRESSOURCESTVBLOG

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > Applications > Développement 2D, 3D et Jeux > APIs multimédia > DirectX



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 16h20.


Vos questions techniques : forum d'entraide 2D - 3D - Jeux - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.