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组件失败
");
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组件失败
");
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
");
55     return 0;
56 }
原文地址:https://www.cnblogs.com/orange1438/p/4161732.html