用GetFileName函数获取源视频之后对视频做什么处理呢。本着最简单和最直接的原则,那就把打开的视频原样播放一下吧。怎么样才能播放一个源视频呢,将其步骤记录到此篇笔记中。
1 用GetMoivePath函数返回源视频路径
GetMoivePath函数的编写在(GetMoivePath函数源码)中,源于微软的vmr9allocator示例。此处修改一下GetMoivePath函数代码用于返回源视频的路径,当用GetFileName函数执行成功之后,就将视频路径、文件名存入内存中并返回此段内存的地址。修改代码如下:
if (GetOpenFileName (&ofn)){
return SysAllocString( szBuffer );
}
当然,修改这个地方还需要修改一下函数的返回值类型,不再是VOID类型的了,返回值应改为BSTR类型。
2 播放一个源视频步骤和代码
2.1 播放一个源视频步骤
(0) 打开源视频文件,即可通过GetMoivePath函数获取源视频。
(1)创建FilterGraph Manager对象g_graph <数据类型:IGraphBuilder>。
(2)用FilterGraph Manager对象g_graph获取指向IMediaContorl接口的指针g_mediaControl <数据类型:IMediaControl>。
(3)用g_graph->RenderFilec创建一个播放视频的filter Graph。
(4)用g_mediaControl->Run接口内函数播放视频。
2.2 播放一个源视频源代码
void PlayStrVedio()
{
BSTR path = GetMoviePath();
if( ! path )
{
return E_FAIL;
}
HRESULT hr;
//创建Filter Graph Manager 对象
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&g_graph);
if (SUCCEEDED(hr))
{
hr = g_graph->QueryInterface(IID_IMediaControl, reinterpret_cast<void**>(&g_mediaControl));
}
if (SUCCEEDED(hr))
{
//创建一个播放视频的filter Graph
hr = g_graph->RenderFile( path, NULL );
}
if (SUCCEEDED(hr))
{
//播放视频
hr = g_mediaControl->Run();
}
//释放BSTR类型数据变量,即视频变量的内存段
SysFreeString(path);
}
想办法在vs2010中MFC或者Win32中运行这段程序就可以打开一个源视频并且播放视频了,具体允许的视频格式恐怕还得自己设置。这段程序支持AVI格式的视频。SysFreeString(path)表示释放掉保存源视频信息的那块内存,免得内存泄露。
3 运行结果
运行此段程序,载入视频就可以播放视频了,不过有一个现象是这样子的,不管是用qq截图还是用截屏方式截图都是黑窗口,截图不到视频窗口的视频图像。我用用手机拍照了一张。播放视频为电影《Life of Pi》,电影讲述的是一个少年和一只老虎在大海中的故事,还不错,除了英语口音难被听懂之外。^-^
DirectShow播放一个源视频图
此次笔记记录完毕。