方法当然是 通过 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);
}