其实用DirectShow(下面简称DS)播放视频动画和播放音乐相似的。
我就综述为以下4个主要主要步骤:
1.初始化com
2.载入媒体文件
3.视频的播放
4.清除程序
如果了解这些操作可以不看下面的代码:可以直接看看对IVideoWindow窗体的操作。
1.初始化com
先加载头文件和链接,和播放音乐的一样。
#include <dshow.h>
#pragma comment(lib,"strmiids.lib")//这个是用来识别
//4个多媒体接口(滤波器,控制器,事件监听器,视频窗口)
IGraphBuilder* pGraphBuilder=NULL; // 图像过滤器
IMediaControl* pMediaControl=NULL; // 控制器
IMediaEventEx* pMediaEventEx=NULL; //触发的事件
IVideoWindow* pVW = NULL;//视频窗口
/*******************************com初始化************************************/
CoInitialize(NULL);
// DirectShow初始化
if(FAILED(CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(LPVOID*)&pGraphBuilder)))
{
MessageBox(0,TEXT("创建滤波器失败!"),0,0);
return E_FAIL;
}
pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID*)&pMediaControl);
pGraphBuilder->QueryInterface(IID_IVideoWindow,(LPVOID*)&pVW);
pGraphBuilder->QueryInterface(IID_IMediaEventEx,(LPVOID*)&pMediaEventEx);
/*******************************com初始化************************************/
2.载入文件
CStringW strFile = " ";//你的视频地址
//如果需要CStringA和CStringW的转换,点击这里看代码http://blog.csdn.net/bojie5744/article/details/26160679
pGraphBuilder->RenderFile(strFile,NULL);//读取流文件
3.播放动画
pMediaControl->Run();//播放
4.最后清理程序
if( pGraphBuilder ) { pGraphBuilder -> Release(); pGraphBuilder = NULL; }
if( pMediaControl ) { pMediaControl -> Release(); pMediaControl = NULL; }
if( pMediaEventEx ) { pMediaEventEx -> Release(); pMediaEventEx = NULL; }
if( pVW )
{
pVW -> put_Visible(OAFALSE);
pVW -> Release();
pVW = NULL;
}
CoUninitialize();
//这里要记得释放之后给那4个指针赋值NULL,不然你的if条件没作用。
然后上面的操作基本代码就是这样子了,那就谈谈,究竟怎么关闭那个IVideoWindow窗体?
其实释放步骤的代码就是关闭IVideoWindow窗体的实现代码。
然后,很多时候,我们需要把这个IVideoWindow窗体变成为无边框的窗口嵌入在父窗口中。
实现代码如下:
HWND h = ::FindWindowA(NULL,"DX媒体播放器");//寻找父窗口句柄
//DX媒体播放器 为你的父窗口的标题名字
pVW ->put_Owner((OAHWND)h); //把窗口嵌入在父窗口中
pVW ->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS |WS_CLIPCHILDREN);//设置渲染器的窗口属性
pVW ->SetWindowPosition(0,0,800,600);//窗口的大小
然后就实现了我们需求。