50行代码实现的一个最简单的基于 DirectShow 的视频播放器

本文介绍一个最简单的基于 DirectShow 的视频播放器。该播放器对于初学者来说是十分有用的,它包含了使用 DirectShow 播放视频所有必备的函数。

直接贴上代码,具体代码的含义都写在注释中了:

[cpp]  view plain copy
  1. /* 雷霄骅 
  2.  * 中国传媒大学/数字电视技术 
  3.  * [email protected] 
  4.  * 
  5.  */  
  6. // aviplayer.cpp : 定义控制台应用程序的入口点。  
  7.   
  8. #include "stdafx.h"  
  9. #include <dshow.h>  
  10.   
  11. // 用到的DirectShow SDK链接库  
  12. #pragma comment(lib,"strmiids.lib")  
  13.   
  14. int _tmain(int argc, _TCHAR* argv[])  
  15. {  
  16.     IGraphBuilder *pGraph = NULL;  
  17.     IMediaControl *pControl = NULL;  
  18.     IMediaEvent   *pEvent = NULL;   
  19.     // 初始化COM库.  
  20.     HRESULT hr = CoInitialize(NULL);  
  21.     if (FAILED(hr))  
  22.     {  
  23.         printf("错误 - 无法初始化 COM 组件");  
  24.         return -1;  
  25.     }  
  26. // 创建滤波器图表管理器  
  27.    hr=CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void **)&pGraph);  
  28.     if (FAILED(hr))  
  29.     {  
  30.         printf("错误 - 无法创建 Filter Graph Manager.");  
  31.         return -1;  
  32.     }  
  33.    // 查询媒体控制和媒体事件接口  
  34.    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);  
  35.     hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);  
  36. // 建立图表,在这里你可以更改待播放的文件名称  
  37.     hr = pGraph->RenderFile(L"E:\\movie\\外婆.VOB", NULL);  
  38.     if (SUCCEEDED(hr))  
  39.     {  
  40.         // 运行图表.  
  41.         hr = pControl->Run();  
  42.         if (SUCCEEDED(hr))  
  43.         {  
  44.             //等待回放结束事件.  
  45.             long evCode;  
  46.             pEvent->WaitForCompletion(INFINITE, &evCode);  
  47.            // 切记: 在实际应用当中,不能使用INFINITE标识, 因为它会不确定的阻塞程序  
  48.         }  
  49.     }  
  50. // 释放所有资源和关闭COM库  
  51.     pControl->Release();  
  52.     pEvent->Release();  
  53.     pGraph->Release();  
  54.     CoUninitialize();  
  55.     return 0;  
  56. }  

你可能感兴趣的:(50行代码实现的一个最简单的基于 DirectShow 的视频播放器)