Problem mit DirectX und DirectVideo



  • Hallo an euch alle.

    Hier ist ein kleines Programm, welches einfach nur mit einer Kamera verbinden soll über direct X. Leider startet das Programm gleich mit 30 fps, was meine Kamera leider nicht schafft. Meine frage ist nun, ob irgendwer von euch mit sagen kann, wie man die Framrate einstellen kann. Habe den befehl leider nicht gefunden.

    Ich danke jeedem, der sich diesen Code ansieht,
    aber vor allen denen, die mir helfen können.

    #include "stdafx.h"
    
    #include <atlbase.h>
    #include <atlstr.h>
    
    #include <dshow.h>
    
    HRESULT FindCaptureDevice(CComPtr<IBaseFilter> &pSrc)
    {
    	USES_CONVERSION;
        HRESULT hr;
        CComPtr<IMoniker> pMoniker = NULL;
        ULONG cFetched;
    
    	pSrc = NULL;
    
        CComPtr<ICreateDevEnum> pDevEnum = NULL;
    
        hr = pDevEnum.CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC);
        if(FAILED(hr))
            return hr;
    
        CComPtr<IEnumMoniker> pClassEnum = NULL;
    
        hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
        if(FAILED(hr))
            return hr;
    
        if(pClassEnum == NULL)
            return E_FAIL;
    
        while(S_OK == (pClassEnum->Next(1, &pMoniker, &cFetched)))
        {
    		CComPtr<IPropertyBag> pBag;
    
    		hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
    		if(SUCCEEDED(hr))
    		{
    			VARIANT var;
    			var.vt = VT_BSTR;
    			hr = pBag->Read(L"FriendlyName", &var, NULL);
    			if(SUCCEEDED(hr))
    			{
    				CString temp(var.bstrVal);
    				VariantClear(&var);
    
    				if(temp.Left(3) == "AVT")
    				{
    					hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);
    					if(FAILED(hr))
    						return hr;
    					return S_OK;
    				}				
    			}
    		}
    		pMoniker = NULL;
        }
    	return E_FAIL;
    }
    
    void SetStandardFormat(CComPtr<IAMStreamConfig> &pStreamConfig)
    {
    	int count, size;
    	AM_MEDIA_TYPE *pType;
    
    	pStreamConfig->GetNumberOfCapabilities(&count, &size);
    
    	BYTE *buffer = new BYTE[size];
    
    	pStreamConfig->GetStreamCaps(0, &pType, buffer);
    	pStreamConfig->SetFormat(pType);
    	CoTaskMemFree((LPVOID)pType);
    
    	delete [] buffer;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HRESULT hr = ::CoInitialize(NULL);
    
        if(SUCCEEDED(hr))
    	{
    		CComPtr<IGraphBuilder> pGraph;
    		CComPtr<ICaptureGraphBuilder2> pCapture;
    		CComPtr<IMediaControl> pMC;
    		CComPtr<IVideoWindow> pVideoWindow;
    		CComPtr<IBaseFilter> pSrc;
    		CComPtr<IAMStreamConfig> pStreamConfig;
    
    		hr = pGraph.CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC);
    		if(SUCCEEDED(hr))
    		{
    			hr = pCapture.CoCreateInstance(CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC);
    			if(SUCCEEDED(hr))
    			{
    				hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pMC);
    				if(SUCCEEDED(hr))
    				{
    					hr = pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *)&pVideoWindow);
    					if(SUCCEEDED(hr))
    					{
    						hr = FindCaptureDevice(pSrc);
    						if(SUCCEEDED(hr))
    						{
    							hr = pCapture->SetFiltergraph(pGraph);
    							if(SUCCEEDED(hr))
    							{
    								hr = pGraph->AddFilter(pSrc, L"Video Capture Source");
    
    								if(SUCCEEDED(hr))
    								{
    									hr = pCapture->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
    											pSrc, IID_IAMStreamConfig, (void **)&pStreamConfig);
    
    									SetStandardFormat(pStreamConfig);
    
    									if(SUCCEEDED(hr))
    									{
    										hr = pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
    															pSrc, NULL, NULL);
    										if(SUCCEEDED(hr))
    										{
    											pMC->Run();
    											while(1);
    											Sleep(10000);
    											pMC->Stop();
    										}
    									}
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    
    	::CoUninitialize();
    	return 0;
    }
    


  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo Freshman22,

    hast Du evtl eine komplette Kopie des Projekts für mich. Ich versuche schon seit einiger Zeit mit DirectShow meine WebCam oder Capture Card mit 16 Ports anzusprechen. Mit GraphEdit habe ich das schon hinbekommen aber ich krieg das in C++ nicht hin.

    Gibt es Funktionen um Capture Geräte zu finden? Ein weiteres Problem was später wohl auf mich zukommen wird ist das ich einzelne Ports der Capture Card anzusprechen. Z.B. wenn ich das Videosignal des 3. Eingangs holen möchte.

    Würd mich freuen wenn Du antwortest 🙂

    Kannst mir auch eine E-Mail senden -> Olcay@WinFuture.de , mich via MSN Messenger -> Olcay247@Hotmail-PPE.com oder ICQ -> 148678267 kontaktieren.

    Vielen Dank,
    Olcay 🙂



  • Naja für 500€ würde ich mir das mal anschauen.

    Bye, TGGC (Ein Jahr Helden)



  • Mit Projekt meinte ich ein in Visual Studio erstelltes Projekt/Solution mit einem simplen Beispiel. Z.B. das was oben steht. Sorry wenn ich mich etwas falsch ausgedrückt habe.



  • @Freshman22

    Kannst du das nicht selber bestimmen wie oft du die Informationen verarbeitest/abholst?


Anmelden zum Antworten