3.2. 源码
1. /********************************************************************
2. created: 2008/05/15
3. created: 15:5:2008 13:39
4. file base: FirstDX
5. file ext: cpp
6. author: ZJY
7.
8. purpose: 这个小程序主要是为了演示DirectShow的最基本的一个步骤
9. *********************************************************************/
10. #include "stdafx.h"
11. #include <dshow.h>
12. #include <iostream>
13.
14. int main(int argc,char *argv[])
15. {
16. char strAviName[256];
17. if (argc == 1)
18. {
19. std::cout << "没有输出影片,请添加要播放的影片..." <<std::endl;
20. return 1;
21. }
22. else if (argc == 2)
23. {
24. strcpy(strAviName,argv[1]);
25. }
26. else
27. {
28. std::cout <<"参数传递错误..." <<std::endl;
29. return 1;
30. }
31.
32. IGraphBuilder *pGraph = NULL;
33. IMediaControl *pControl = NULL;
34. IMediaEvent *pEvent = NULL;
35.
36. //初始化COM库.
37. HRESULT hr = CoInitialize(NULL);
38. if (FAILED(hr))
39. {
40. printf("ERROR - 不能初始化COM库");
41. return 1;
42. }
43.
44. //创建过滤器图像管理器,查询接口
45. hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
46. IID_IGraphBuilder, (void **)&pGraph);
47. if (FAILED(hr))
48. {
49. printf("ERROR - 不能够创建 Filter Graph Manager.");
50. return 0;
51. }
52.
53. hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
54. hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
55.
56. //由于DirectShow主要是Unicode格式,我们使用Windows自带函数
57. //转换文件名char数组为Unicode格式
58. int len = strlen(strAviName)+1;
59. wchar_t *wText = new wchar_t[len];
60. if ( wText == NULL)
61. {
62. std::cout <<"ERROR - 文件打开错误..."<<std::endl;
63. return 1;
64. }
65. memset(wText,0,len);
66. ::MultiByteToWideChar( CP_ACP, NULL,strAviName, -1, wText,len );
67.
68. // 创建graph,此处为要打开的影片
69. hr = pGraph->RenderFile((LPCWSTR)wText, NULL);
70.
71. if (SUCCEEDED(hr))
72. {
73. //运行graph.
74. hr = pControl->Run();
75. if (SUCCEEDED(hr))
76. {
77. // 等待影片播放完成
78. long evCode;
79. pEvent->WaitForCompletion(INFINITE, &evCode);
80. //注意:不要在真实的程序中使用INFINITE,因为这样会永久阻塞应用程序
81. }
82. }
83. else
84. std::cout << "ERROR - 影片不存在或格式不支持..." <<std::endl;
85. pControl->Release();
86. pEvent->Release();
87. pGraph->Release();
88. //卸载COM组件
89. CoUninitialize();
90. return 0;
91. }