directshow获取视频播放消息

 方法当然是 通过 IMediaEvent 了, 捕获 directshow 帮助文档上写的太麻烦了,一般人看半天还不明白,所有这里介绍一种简单的方法:

 

1: 播放视频:

 IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent   *pEvent = NULL;

void Play()

{

     HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
     printf("ERROR - Could not initialize COM library");
     return;
    }    
 
    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
    
    if (FAILED(hr))
    {
     printf("ERROR - Could not create the Filter Graph Manager.");
     return;
    }
   
    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
    hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);    
  
    hr = pGraph->RenderFile(L"视频名字", NULL);
 
    if (SUCCEEDED(hr))
    {
     hr = pControl->Run();
    }
}

2: 播放消息: 这里为了简便,直接做一个线程;

UINT GetPlayMessage( PVOID p )

{  

   long evCode;
   pEvent->WaitForCompletion(INFINITE, &evCode);

   if (EC_COMPLETE == evCode)
   {
        MessageBox("视频播放完成") ;
   }
   if (EC_USERABORT == evCode )
   {
       MessageBox("视频播放中断");
   }

  。。。

   return 0 ;

}

这样,通过线程,就直接可以获取视频播放的消息了;

 

还有一个小方法:

通过 IMediaSeeking *  pMediaSeeking; 获取播放时间总长,用IMediaSeeking 也可以判断视频播放的进度;

 

int GetAllTime()

{

 LONGLONG l = 0;
 pMediaSeeking->GetStopPosition(&l);

 

return l/10000000;

 //CString str;str.Format("%d",l/10000000);
// MessageBox(str);

 

}

 

你可能感兴趣的:(server,filter,null,Graph,文档,library)