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

用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播放一个源视频图

 

此次笔记记录完毕。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值