Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [VC6] DirectShow

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 1999
    Messaggi
    88

    [VC6] DirectShow

    Buongiorno,
    premetto che conosco pochissimo le DirectX.

    Devo modificare un programma console che usava VFW per acquisire un'immagine da una webcam, elaborarla e fare diversi lavori.
    Ora devo passare alle DirectX perché devo lavorare in automatico con 2 webcam.

    Sono riuscito, modificando un esempio trovato su internet, a fare quello che mi serve a parte che mi si apre il preview e devo chiuderlo a mano per andare avanti con il programma.

    Eppure ho levato l'interfaccia IVideoWindow che pensavo fosse quella della finestra preview.

    Dove sbaglio?

    Mille grazie

    Paolo

    codice:
    HRESULT hr;  	// variabili per la gestione dell'anteprima 	
    IGraphBuilder *pGraph; 	
    ICaptureGraphBuilder2 *pBuild; 	
    //IVideoWindow  * g_pVW = NULL; 	
    IMoniker * pMon = NULL; 	
    IBaseFilter *myFilt; 	
    IAMStreamConfig *pConfig = NULL; 
    IMediaControl * g_pMC = NULL; 	
    AM_MEDIA_TYPE *pmt;      // variabili per la gestione del grabber video     
    IBaseFilter *pSG_Filter; // filtro x il grab del singolo frame     
    ISampleGrabber *myGrab;  // il vero grabber.      
    SampleGrabberCallback g_StillCapCB; // la classe che si occuperà del callback del grabber  	
    ...
    // Recupera il riferimento alla periferica selezionata     pMon=  getDevices(num_camera);  	// Crea il filtro da aggiungere al grafo dei filtri di Dshow   	hr = pMon->BindToObject(0,0,IID_IBaseFilter,(void **)&myFilt);  	if (hr!=S_OK) 	{ 		return FALSE; 	}  	
    // Crea il filtro da aggiugnere al grafo ( il grabber del singolo frame ) 	
    hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pSG_Filter);  	
    if (hr!=S_OK) 	
    { 		return FALSE; 	}  	
    // Crea il builder per il grafo dei filtri 	
    hr =  CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild );  	
    if (hr!=S_OK) 	
    { 		return FALSE; 	}  	
    // Crea il manager dei filtri 	
    hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);  	
    if (hr!=S_OK) 	
    { 		return FALSE; 	}  	
    // Setta il manager dei filtri del builder.  	  
    pBuild->SetFiltergraph(pGraph);   	  // aggiunge i filtri che ci servono al grafico dei filtri.  	  
    pGraph->AddFilter(myFilt,L"Devices"); 	  
    pGraph->AddFilter(pSG_Filter,L"Grabber"); 
    pBuild->FindInterface(&PIN_CATEGORY_CAPTURE, NULL, myFilt,IID_IAMStreamConfig, (void**)&pConfig);  	  
    hr = pConfig->GetFormat(&pmt);  	  
    VIDEOINFOHEADER *pVih = reinterpret_cast<VIDEOINFOHEADER*>(pmt->pbFormat);
     pVih->bmiHeader.biWidth = sizeW; 	  
    pVih->bmiHeader.biHeight = sizeH;  	  
    hr = pConfig->SetFormat(pmt);  	  
    // Utilizza il PIN di preview per generare un'anteprima dell'immagine che sarà  	  // catturata. Dall'anteprima lo passa al grabber. 	 
     hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,myFilt,pSG_Filter,NULL);
      // Recuperiamo l'interfaccia per la gestione del grabber. 	  
    hr = pSG_Filter->QueryInterface(IID_ISampleGrabber,(void **)&myGrab);  	 
     // impostiamo il grabber in modo da fargli salvare la bitmap in un percorso 	 
     myGrab->SetOneShot(true); 	  
    myGrab->SetBufferSamples(true);   
    myGrab->SetCallback(&g_StillCapCB,1); // 1 xè deve usare il bufferCb 	  myGrab->GetConnectedMediaType(&g_StillMediaType);         	  
    // Recupera la finestra di preview e il media control  	  //pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVW); 
    pGraph->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMC); 	  
    // Setta la finestra di preview come visibile 	  
    //hr = g_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN| WS_VISIBLE| WS_OVERLAPPEDWINDOW); 	 
     //hr = g_pVW->put_Visible(OATRUE);  	  
    catturata_img = FALSE;  	  
    // Avvia il redering del flusso nella finestra di preview 	 
    g_pMC->Run();  	 
    *MSG msg;  	  
    // Main message loop       
    while(GetMessage(&msg,NULL,0,0) && (catturata_img == FALSE)) 	  
    { 			
    TranslateMessage(&msg); 			
    DispatchMessage(&msg); 	  
    }  	  
    g_pMC->Stop(); 	  
    g_pMC->Release(); 	 
    //g_pVW->Release(); 	  
    pGraph->Release(); 	  
    myGrab->Release(); 	  
    pSG_Filter->Release(); 	 
     pBuild->Release(); 	  
    pConfig->Release();
    VB - Java - C/C++ - VC - CORBA -JDBC

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Nel sdk delle DX ce tutto anche una GUI per crearte i filtri.
    Lo puoi scaricare da internet.
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 1999
    Messaggi
    88
    Grazie per la risposta.

    Potresti essere un pò più preciso.
    Il codice che ho postato funziona bene. Il mio problema è che dopo l'acquisiszione rimane aperta la finestra preview (anche se nascosta) e non prosegue il codice perché il programma rimane inchiodato nella Get Message.

    Ho rimosso l'interfaccia IVideoWindow pensando che non creasse la finestra invece continua a farla

    Consigli?
    VB - Java - C/C++ - VC - CORBA -JDBC

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Evidentemente il tuo grafo ha dei filtri che renderizzano a video il filmato. Per il resto tocca anche a me rileggere la documentazione ed oggi sono particolarmente stanco .
    Consigli? Usa il programma di cui scrivo ti permette di collegare i vari filtri (i loro pin) e vedere il risultato finale. Cs avrai il tuo grafo, ed escludendo errori nel codice, avrai lo stesso risultato.
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 1999
    Messaggi
    88
    Ho risolto

    Grazie comunque per l'interessamento.
    Bastava sostituire la parte GetMessage con l'interfaccia IMediaEvent e aspettare che avesse finito.

    É la è prima volta che lavoro con i DirectX e non è stato facile .

    Buona giornata
    Paolo
    VB - Java - C/C++ - VC - CORBA -JDBC

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.