您的位置:首页 > 其它

[DirectShow] 播放一个源视频 [大三TJB_708]

2013-05-15 12:52 197 查看
用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中运行这段程序就可以打开一个源视频并且播放视频了,具体允许的视频格式恐怕还得自己设置。这段程序支持***I格式的视频。SysFreeString(path)表示释放掉保存源视频信息的那块内存,免得内存泄露。



3 运行结果

运行此段程序,载入视频就可以播放视频了,不过有一个现象是这样子的,不管是用qq截图还是用截屏方式截图都是黑窗口,截图不到视频窗口的视频图像。我用用手机拍照了一张。播放视频为电影《Life of Pi》,电影讲述的是一个少年和一只老虎在大海中的故事,还不错,除了英语口音难被听懂之外。^-^




DirectShow播放一个源视频图

此次笔记记录完毕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐