Directshow学习笔记五-----一个简单的视频播放程序(个人学习总结,仅供参考)

原创 2015年01月10日 14:24:58


1.       建立一个Filter Graph Manager的实例.

2.       使用Filter Graph Manager 建立一个filter graph.

3.       运行这个graph。

调用CoInitialize 去初始化一个这个COM 库。

HRESULT hr = CoInitialize(NULL);

if (FAILED(hr))

{

    // 在这里加入错误处理

}

这里,我们跳过了对返回值的检查,当你调用了任何方法的时候都应该对返回值进行检查。下面调用CoCreateInstance创建Filter Graph Manager。

IGraphBuilder *pGraph;

HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL,

    CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);

类ID是CLSID_FilterGraph,由于Filter Graph Manager是动态链接库提供(dll),所以使用CLSCTX_INPROC_SERVER。

CoCreateInstance 将返回IgraphBuilder接口,在该例子中还需要两个接口:

l         IMediaControl 用于控制数据流。它提供停止和开始的操作方法。

l         IMediaEvent   可以获得Filter Graph Manager 事件。例如,可以获得播放完成事件。

这两个接口都由Filter Graph Manager提供,可以通过IgraphBuilder指针去获得它们:

IMediaControl *pControl;

IMediaEvent   *pEvent;

hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);

hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

现在,你可以建立过滤器图表(Fileter Graph)。对于文件播放,这里只需要调用一个方法就可以了:

hr = pGraph->RenderFile(L"C:\\Example.avi", NULL);

IGraphBuilder::RenderFile方法将建立一个过滤器图表,通过它来播放指定的文件。第一个参数指定要播放的文件名称,它是个宽字符字符串。第二个参数是系统保留,必须为NULL。如果指定文件不存在或文件格式未知,那么该方法调用将失败。

现在过滤器图表已经准备好了去播放文件,但是还必须调用IMediaControl::Run方法去播放。

hr = pControl->Run();

当过滤器图表开始运行,数据从通过过滤器播放出来。播放动作将在一个独立的线程中进行。调用IMediaEvent::WaitForCompletion 方法可以等待文件播放完成。

long evCode = 0;

pEvent->WaitForCompletion(INFINITE, &evCode);

这个方法将一直等待文件播放结束才返回。INFINITE就表示不能确定文件的播放时间长度。当应用程序完成播放后,应该释放掉接口指针和关闭COM库。

pControl->Release();

pEvent->Release();

pGraph->Release();

CoUninitialize();


全部代码如下

IGraphBuilder *pGraph = NULL;
    IMediaControl *pControl = NULL;
    IMediaEvent   *pEvent = NULL;
    // 初始化COM 库
    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
        printf("ERROR - Could not initialize COM library");
    }
//一、建立一个Filter Graph Manager的实例
    // 建立过滤器图表管理器
    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
    if (FAILED(hr))
    {
        printf("ERROR - Could not create the Filter Graph Manager.");
    }
    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
    hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
    // 建立过滤器图表
    hr = pGraph->RenderFile(L"C:\\TestExample.avi", NULL);
    if (SUCCEEDED(hr))
    {
        // 播放
        hr = pControl->Run();
        if (SUCCEEDED(hr))
        {
            // 等待播放结束
            long evCode;
            pEvent->WaitForCompletion(INFINITE, &evCode);
        }
    }
    pControl->Release();
    pEvent->Release();
    pGraph->Release();
    CoUninitialize();


DirectShow学习笔记

写这篇笔记,就当是对这个期间学习DirectShow的一个总结,假如它可以给你带来一些收获的话,那我会感到更高兴。还有我遇到的一些问题,希望和大家一起讨论。一、基本概念1.DirectShow概述Di...
  • suixinger1
  • suixinger1
  • 2015年04月18日 14:37
  • 501

一个清华学子写的关于directshow的学习心得【转】

学习DirectShow有一段时间了,把这段学习过程中翻译出来的SDK与大家分享,同时也希望专家们指出我理解上的错误,万分感谢。 1. DirectShow介绍     DirectShow是一个wi...
  • wishfly
  • wishfly
  • 2015年11月18日 10:30
  • 10228

DirectShow学习笔记总结

DirectShow是微软公司在ActiveMovie和Video for Windows的基础上推出的新一代基于COM(Component Object Model)的流媒体处理的开发包,9.0之前...
  • zhubosa
  • zhubosa
  • 2016年04月01日 10:29
  • 797

directshow学习笔记

  • 2008年05月28日 16:50
  • 1.42MB
  • 下载

最简单的基于DirectShow的示例:视频播放器自定义版

本文记录一个简单的基于DirectShow的自定义的视频播放器。这里所说的“自定义播放器”,实际上指的是自己在Filter Graph中手动逐个添加Filter,并且连接这些Filter的后运行的播放...
  • leixiaohua1020
  • leixiaohua1020
  • 2015年01月11日 18:05
  • 10143

JAVA 学习 自我总结

学习总结: 孔子曰学而时习之 不亦悦乎 。学习了新的东西,一定要及时练习和总结,并多次回想记忆,这样才能将知识记忆的牢固; 之前我学习东西只知道贪多,想一口吃一个胖子;但是每次都是事倍功半,这样又...
  • u010582345
  • u010582345
  • 2016年04月08日 23:58
  • 427

Directshow学习笔记

关于directshow的学习,我一直感觉有很多困惑的地方。微软的东西不是讲究简单吗,但我感觉directshow中的音视频采集远没有linux下的v4l2好用。 创建一个com实例,需要涉及到两个...
  • L_yangliu
  • L_yangliu
  • 2015年01月27日 14:21
  • 582

Directshow(SDK)学习笔记-智慧的鱼(LeeQiang)

  • 2009年10月02日 11:09
  • 857KB
  • 下载

ceph学习小结

最近部署ceph,硬是挤时间研究了下ceph的相关的东西,下面主要是通过看别人的文章以及自己工作用到的的知识总结而成。这可以算是ceph的笔记吧。...
  • duankaifei
  • duankaifei
  • 2014年10月28日 23:40
  • 1199

labview学习总结

关于自动索引:         labview中的while循环和for循环具有自动索引功能,只不过for循环的自动索引功能是自动开启的,而while循环的功能是默认不开启的。索引隧道是 Lab VI...
  • qq_39990094
  • qq_39990094
  • 2017年09月21日 08:56
  • 338
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Directshow学习笔记五-----一个简单的视频播放程序(个人学习总结,仅供参考)
举报原因:
原因补充:

(最多只允许输入30个字)