DShow实现一个avi视频的播放(含有个人解释和注释)
此项目为win32下的控制台C++代码(别忘记配置DShow库)
1 // movie_test.cpp : 定义控制台应用程序的入口点。 2 // 3 #include "stdafx.h" 4 #include <DShow.h> 5 6 #pragma comment(lib,"strmiids.lib") // 也可以在属性里面添加 7 8 int _tmain(int argc, _TCHAR* argv[]) 9 { 10 IGraphBuilder *pGraph = NULL; // 图标管理器接口 11 IMediaControl *pControl = NULL; // 媒体控制器接口 12 IMediaEvent *pEvent = NULL; // 媒体事件接口 13 14 // 初始化com库 15 HRESULT hr = CoInitialize(NULL); 16 if(FAILED(hr)) 17 { 18 printf("初始化com组件失败\n"); 19 return -1; 20 } 21 22 // 创建滤波器链表管理器 23 hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pGraph); 24 if(FAILED(hr)) 25 { 26 printf("初始化com组件失败\n"); 27 return -1; 28 } 29 30 //查询媒体控制和媒体事件接口 31 hr = pGraph->QueryInterface(IID_IMediaControl,(void **)&pControl); 32 hr = pGraph->QueryInterface(IID_IMediaEvent,(void **)&pEvent); 33 34 //建立链表,这里用户可以更改待播放的文件的名称 35 hr = pGraph->RenderFile(L"E:\\DXSDK\\DXSDK 9.0B\\Samples\\Media\\ruby.avi",NULL); 36 if(SUCCEEDED(hr)) 37 { 38 //运行链表 39 hr = pControl->Run(); 40 if(SUCCEEDED(hr)) 41 { 42 //等待回放结束 43 long evCode; 44 pEvent->WaitForCompletion(INFINITE,&evCode); 45 // 切记:在实际应用中,不能使用INFINITE标识,因为他会不确定的阻塞程序 46 } 47 } 48 49 // 释放所有资源 50 pControl->Release(); 51 pEvent->Release(); 52 pGraph->Release(); 53 CoUninitialize(); 54 printf("this is example\n"); 55 return 0; 56 }