我理解的对么?
directshow播放顺序
我在网上看了些帖子,但是和我理解的存在点疑问,来这里问问。
我的理解是这样:
1)
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
//hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
//IID_IMediaControl, (void **)&pMC);
//以上两句只是通过不同的方式来来获取FilterGraph 并且 可以通过IID_IGraphBuilder IID_IMediaControl 互相获取对方!也可以获取其他借口只是要遵循下面的规则:
hr = pMC->QueryInterface(IID_IGraphBuilder, (void **)&pGraph);
hr = pGraph->RenderFile(lpszMovie, NULL);//是不是这句要传给filer graph视频 然后只用这句调用完成之后才会 有真正的内容在filer graph(类似于实例化一个对象)
//然后才可以通过pGraph 获取其他借口 ,对视频的控制才有效果
//总结是就是pGraph->RenderFile 必须先于pGraph->QueryInterface(IID_IMediaSeeking, (void **)&pMediaSeekiking);
//pGraph->QueryInterface(IID_IMediaPosition, (void **)&pMediaPos);
//pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVideoWnd);
//pGraph->QueryInterface(IID_IBasicVideo, (void **)&pBasicVideo);
//调用才会有用,打破了这个顺序就会出错。
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
pGraph->QueryInterface(IID_IMediaEventEx, (void **)&pEvent);//pMC->QueryInterface(IID_IMediaEventEx, (void **)&pME); 这两句是一样的
pGraph->QueryInterface(IID_IMediaSeeking, (void **)&pMediaSeekiking);
pGraph->QueryInterface(IID_IMediaPosition, (void **)&pMediaPos);
pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVideoWnd);
pGraph->QueryInterface(IID_IBasicVideo, (void **)&pBasicVideo);
hr = pControl->Run();
hr = pEvent->WaitForCompletion(INFINITE, &evCode);//调用这这句会发生阻塞,等待视频播放完成
//如果我这时候调用pMediaPos->put_CurrentPosition();的会产生中断,处理这个设置当前视频的位置
忘指正!谢谢