DirectShow 制作在Unity3D中可以设置进度的视频播放插件
如果想在Unity3D中去播放视频文件,那么最方便的方法就是使用它自带的MovieTexture. 可以实现简单的视频播放功能. Play Pause Stop. 有也只有这三个功能, 如果你想要一个进度条,并且可以随意的拖拽视频的进度的话, 那就不能满足你的需求了. 所以想使用 DirectShow 这个视频开发包.来实现我们的想法.
这东西是基于COM组件的一套 C++ 开发库. 所以花了两天时间,各种Google. 把这个功能实现了, 在这里把流程记录一下,做为备忘.
DirectShow 是由各种的 过虑器(Filter) 及 接口(Interface) 组成的. 处理过程就是 根据你的需求,构建 Filter图表,然后 使用 IMediaControl->Run() 方法.运行这个图表,就可以了.我们这里的 图表是这样的 :
使用 FilterGraphManager 做为总的管理类. 所以一切的开始都要先 构建一个 IGraphBuilder : 创建 的方法与创建 IBaseFilter的方法相同 是这样的:
1 // Initialize COM Libs *初始化COM库 别忘了* 2 hr = CoInitialize(NULL); 3 // Filter Graph 4 hr = CoCreateInstance( 5 CLSID_FilterGraph, // CLSID 6 NULL, 7 CLSCTX_INPROC_SERVER, // SERVER 8 IID_IFilterGraph, // IID (Interface ID) 9 (void**)&pGraph); // var's Ptr
从过滤器(Filter)中,获得接口的方法是这样的:
1 // Sample Grabber Filter 这是构建 ISampleGrabber 过滤器 2 hr = CoCreateInstance( 3 CLSID_SampleGrabber, // 注意 CLSID的变化 4 NULL, 5 CLSCTX_INPROC_SERVER, 6 IID_IBaseFilter, // IID 为 IBaseFilter 7 (void**)&pGrabberF); 8 // *将视频捕捉Filter加入图表* 9 pGraph->AddFilter(pGrabberF,L"Sample Grabber"); 10 11 // *得到接口* 12 pGrabberF->QueryInterface(IID_ISampleGrabber,(void**)&pGrabber);
这是从FilterGraph 构建SourceFilter 也就是得到 源文件过滤器:
1 // 媒体文件 我们传入的是 char* 字符串,这里需要转化WCHAR 宽字节 2 TCHAR _fileName[MAX_PATH]; 3 memset(_fileName,0,sizeof(_fileName)); 4 MultiByteToWideChar(CP_ACP,0,fileName,strlen(fileName)+1,_fileName, sizeof(_fileName)/sizeof(_fileName[0])); 5 // 这是 构建 源文件过滤器 Filter 6 hr = pGraph->AddSourceFilter(_fileName,L"Source Filter",&pSrc);
记录的流程与代码先写这么多。。 自己写的一个 VideoCapture 类,已经同步到百度云了。 以后如果有疑问可以翻出来看看~~ 都是记忆碎片呀~~ ^_^