DirectShow ( Capture und Overlay )



  • Hi, ich hab mal ein bischen in den Samples gestöbert und das PlayCap als grundlage genommen.
    Ich möchte gerne Auf ein Videobild das ich über die TV-Karte bekomme, ein Bitmap als Overlay zeichnen.

    Bekomme aber immer nen Fehler.
    Hier noch ein bisschen Code, wenn man das noch so nennen kann.
    Sorry schon mal für die unübersichtlichkeit ich bin schon die ganze Zeit
    am probieren und hab dabei den ganzen Code Zerfetzt. 😞

    IFilterGraph2* pFG2;
    HRESULT CaptureVideo()
    {
        HRESULT hr;
    	IBaseFilter *pSrcFilter=NULL;
    	CComPtr <IPin> pOutputPin;
    	// Get DirectShow interfaces
        hr = GetInterfaces();
        if (FAILED(hr))
        {
            Msg(TEXT("Failed to get video interfaces!  h0r=0x%x"), hr);
            return hr;
        }
    
    	// Attach the filter graph to the capture graph
        hr = g_pCapture->SetFiltergraph(g_pGraph);
        if (FAILED(hr))
        {
            Msg(TEXT("Failed to set capture filter graph!  hr=0x%x"), hr);
            return hr;
        }
    
    	// Use the system device enumerator and class enumerator to find
        // a video capture/preview device, such as a desktop USB video camera.
        hr = FindCaptureDevice(&pSrcFilter);
        if (FAILED(hr))
        {
            // Don't display a message because FindCaptureDevice will handle it
            return hr;
        }
    
    	// Add Capture filter to our graph.
        hr = g_pGraph->AddFilter(pSrcFilter, L"Video Capture");
        if (FAILED(hr))
        {
            Msg(TEXT("Couldn't add the capture filter to the graph!  hr=0x%x\r\n\r\n") 
                TEXT("If you have a working video capture device, please make sure\r\n")
                TEXT("that it is connected and is not being used by another application.\r\n\r\n")
                TEXT("The sample will now close."), hr);
            pSrcFilter->Release();
            return hr;
        }	 
    //BuildVMR9();
    AddVMR9( g_pGraph, ghApp );
    
    	GetUnconnectedPin(pSrcFilter, PINDIR_OUTPUT, &pOutputPin);
    	hr = g_pGraph->QueryInterface(IID_IFilterGraph2, (void **)&pFG2);
    	hr = pFG2->RenderEx(pOutputPin, AM_RENDEREX_RENDERTOEXISTINGRENDERERS, NULL);[b]Hier kommt der Fehler (DIERR_INSUFFICIENTPRIVS & VFW_E_INVALIDMEDIATYPE)[/b]
    	// Render the preview pin on the video capture filter
        // Use this instead of g_pGraph->RenderFile
    //    hr = g_pCapture->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
    //                                   pSrcFilter, NULL, NULL );
    
    MessageBox(NULL, DXGetErrorString9( hr),
                    TEXT("Error"), MB_OK | MB_ICONERROR);
    
        if (FAILED(hr))
        {
            Msg(TEXT("Couldn't render the video capture stream.  hr=0x%x\r\n")
                TEXT("The capture device may already be in use by another application.\r\n\r\n")
                TEXT("The sample will now close."), hr);
            pSrcFilter->Release();
            return hr;
        }
    
    	// Now that the filter has been added to the graph and we have
        // rendered its stream, we can release this reference to the filter.
        pSrcFilter->Release();
    
    	// Set video window style and position
        hr = SetupVideoWindow();
        if (FAILED(hr))
        {
            Msg(TEXT("Couldn't initialize video window!  hr=0x%x"), hr);
            return hr;
        }
    LoadVMR9Image( ghApp, m_Wc );
    	// Start previewing video data
        hr = g_pMC->Run();
        if (FAILED(hr))
        {
            Msg(TEXT("Couldn't run the graph!  hr=0x%x"), hr);
            return hr;
        }
    
        // Remember current state
        g_psCurrent = Running;
    
    	//EnumFilters (g_pGraph);
    	//ConnectFilter();
    
        return S_OK;
    
    }
    
    HRESULT AddVMR9( IGraphBuilder* pGb, HWND m_hwndApp )
    {
    	HRESULT hr = S_OK;
    
    	IBaseFilter* pBF = NULL;
        hr = CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC,
                                        IID_IBaseFilter, (LPVOID *)&pBF);
    	pVMR9 = pBF;
        if(SUCCEEDED(hr))
        {
    		hr = pGb->AddFilter(pBF, L"Video Mixing Renderer 9");
    	/**/	if(!SUCCEEDED(hr)) MessageBox(NULL, DXGetErrorString9( hr), TEXT("Error"), MB_OK | MB_ICONERROR);
            if(SUCCEEDED(hr))
            {
                // Test VMRConfig, VMRMonitorConfig
                IVMRFilterConfig9* pConfig;
                hr = pBF->QueryInterface(IID_IVMRFilterConfig9, (LPVOID *)&pConfig);
    	/**/	if(!SUCCEEDED(hr)) MessageBox(NULL, DXGetErrorString9( hr), TEXT("Error"), MB_OK | MB_ICONERROR);
                if(SUCCEEDED(hr))
                {
                    hr = pConfig->SetNumberOfStreams(2);
    	/**/	if(!SUCCEEDED(hr)) MessageBox(NULL, DXGetErrorString9( hr), TEXT("Error"), MB_OK | MB_ICONERROR);
                    hr = pConfig->SetRenderingMode(VMR9Mode_Windowless);
    	/**/	if(!SUCCEEDED(hr)) MessageBox(NULL, DXGetErrorString9( hr), TEXT("Error"), MB_OK | MB_ICONERROR);
                    hr = pConfig->SetRenderingPrefs(RenderPrefs_AllowOverlays);
    	/**/	if(!SUCCEEDED(hr)) MessageBox(NULL, DXGetErrorString9( hr), TEXT("Error"), MB_OK | MB_ICONERROR);
                    pConfig->Release();
                }
    
                IVMRMonitorConfig9* pMonitorConfig;
                hr = pBF->QueryInterface(IID_IVMRMonitorConfig9, (LPVOID *)&pMonitorConfig);
    	/**/	if(!SUCCEEDED(hr)) MessageBox(NULL, DXGetErrorString9( hr), TEXT("Error"), MB_OK | MB_ICONERROR);
                if(SUCCEEDED(hr))
                {
                    UINT iCurrentMonitor;
                    hr = pMonitorConfig->GetMonitor(&iCurrentMonitor);
    	/**/	if(!SUCCEEDED(hr)) MessageBox(NULL, DXGetErrorString9( hr), TEXT("Error"), MB_OK | MB_ICONERROR);
                    pMonitorConfig->Release();
                }
    
                hr = pBF->QueryInterface(IID_IVMRWindowlessControl9, (LPVOID *)&m_Wc);
    	/**/	if(!SUCCEEDED(hr)) MessageBox(NULL, DXGetErrorString9( hr), TEXT("Error"), MB_OK | MB_ICONERROR);
            }
        }
    
        if(pBF)
        {
            pBF->Release();
        }
    
        if(SUCCEEDED(hr))
        {
            hr = m_Wc->SetVideoClippingWindow(m_hwndApp);
    	/**/	if(!SUCCEEDED(hr)) MessageBox(NULL, DXGetErrorString9( hr), TEXT("Error"), MB_OK | MB_ICONERROR);
            hr = m_Wc->SetAspectRatioMode(VMR_ARMODE_LETTER_BOX);
    	/**/	if(!SUCCEEDED(hr)) MessageBox(NULL, DXGetErrorString9( hr), TEXT("Error"), MB_OK | MB_ICONERROR);
        }
        else
        {
            if(m_Wc)
            {
                m_Wc->Release();
                m_Wc = NULL;
            }
        }
    
    	return hr;
    }
    

    😕


Anmelden zum Antworten