Directshow VMR-9



  • Hallo @ all

    ich versuche grade mit DirectShow und der VMR-9 ein avi im windowless mode azuspielen. Ich kanns zwar schon abspielen aber es sieht leider nicht ganz so toll aus, den wenn es angezeigt wird habe ich artefakteim Bild. Mit MPEG klappt es wird alles korrekt angezeigt nur beim avi macht er in der mitte so komische artefakte. Hier mal mein Code:

    VMR9NormalizedRect *r;
    IVMRWindowlessControl9 *pWC;
    IVMRMixerControl9 *pMix;
    IGraphBuilder *pGB;
    IBaseFilter *pVmr;
    IVMRFilterConfig9 *pConfig;
    IMediaControl *pMC;
    IMediaSeeking *pMS;
    
    	CoInitialize(NULL);
    
        // initialize video coordinates with normal values
        r = new VMR9NormalizedRect;
        r->left = 0;
        r->top = 0;
        r->right = 1;
        r->bottom = 1;
    
        pWC = NULL;
        pMix = NULL;
        pGB = NULL;
        pVmr = NULL;
        pConfig = NULL;
        pMC = NULL;
        pMS = NULL;
    
    	ICaptureGraphBuilder2 *pCaptureGraphBuilder2;
        // create an instance of the Filter Graph Manager
        CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, 
            IID_IGraphBuilder, (void **)&pGB);
        // create an instance of the VMR9 filter
        CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER,
            IID_IBaseFilter, (void**)&pVmr);
        // add the VMR9 filter to the Graph Manager
        pGB->AddFilter(pVmr, L"Video");    
        // get a pointer to the IVMRFilterConfig9 interface
        pVmr->QueryInterface(IID_IVMRFilterConfig9, (void**)&pConfig);
        // make sure VMR9 is in windowless mode
        pConfig->SetRenderingMode(VMR9Mode_Windowless);
        // get a pointer to the IVMRWindowlessControl9 interface 
        pVmr->QueryInterface(IID_IVMRWindowlessControl9, (void**)&pWC);
        // explicitly convert System::Drawing::Rectangle type to RECT type
    
    	pWC->SetVideoClippingWindow(m_hWnd);
        // set destination rectangle for the video
        long lWidth, lHeight;
    	pWC->GetNativeVideoSize(&lWidth, &lHeight, NULL, NULL); 
    	pWC->SetVideoPosition(CRect(0,0,lWidth,lHeight), CRect(10,10,200,200));
    
        // specify the container window that the video should be clipped to    
    
        // IVMRMixerControl manipulates video streams
        pVmr->QueryInterface(IID_IVMRMixerControl9, (void**)&pMix);
        // IMediaSeeking seeks to a position in the video stream
        pGB->QueryInterface(IID_IMediaSeeking, (void **)&pMS);
        // IMediaControl controls flow of data through the graph
        pGB->QueryInterface(IID_IMediaControl, (void **)&pMC);
    
    	IBaseFilter *pSource;
    	pGB->AddSourceFilter(L"c:\\test.avi", L"Source", &pSource);
    	// Create GraphBuilder, CaptureGraphBuilder2
    	CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, 
    	IID_ICaptureGraphBuilder2, 
    	(LPVOID *)&pCaptureGraphBuilder2);
    
    	// Set FilterGraph for CaptureGraphBuilder2
    	pCaptureGraphBuilder2->SetFiltergraph(pGB);
    
    	// Build Graph
    	pCaptureGraphBuilder2->RenderStream(0, 0, pSource, 0, pVmr);
    	// Start playing
    //
    //	pGB->RenderFile(L"C:\\Movie\\DRS\\DRS.MPG",0);
    	pMC->Run();
    

    jemand von euch ne idee was los ist????


Anmelden zum Antworten