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();


Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

在VC中调用DirectShow全屏播放视频

作者:jiaohe2000 转自:http://blog.csdn.net/jiaohe2000/article/details/1702107 有些正在尝试自己编制游戏的朋友可能会碰到这...
  • whw8007
  • whw8007
  • 2014年01月12日 18:59
  • 520

VC++中MCI播放音频文件

MCI播放mp3音频文件例程 源文件中需要包含头文件 Mmsystem.h,在Project->Settings->Link->Object/libray module中加入库 Winmm.lib。...

directshow学习笔记三-----视频预览(还未播放到指定窗口或控件,个人学习所用,仅供参考)

一、首先获取视频采集设备列表 //获取视频采集设备列表 void CTestPreviewDlg::GetDeviceList() { // Create the System Device Enum...

一个简单的视频播放小程序

  • 2015年09月23日 21:15
  • 4.71MB
  • 下载

OpenCV学习笔记【3】:视频播放控制

这个程序主要实现的功能是对视频播放窗口加入一个滚动条的功能,并没有实现...

opencv学习笔记(三)视频播放控制

这个程序我们通过通过加入滚动条来控制视频的播放。 代码如下: #include using namespace std;   using namespace cv;      int...

OpenCV学习笔记(3)——进度条视频播放控制

这里用一个进度条控制视频的播放快慢,以帧为单位: #include "opencv/cv.h" #include "opencv/highgui.h" int g_slider_positio...

Java与Flex学习笔记(17)---Flex+Red5实现在线视频播放

每当在招聘网站上查看Flex岗位时,总看到一部分企业对Flex开发“攻城狮”要求对Red5 有一定了解。本人对Red5 服务器有了一定的认识后,我就迫不及待的想要实现这个Flex+Red5 播放视频的...

opencv学习笔记(四)-视频播放控制

网上有很多关于用Cmake将opencv代码生成一个VS工程的方法查看opencv的源代码,但是我感觉这样打开源代码会让电脑很卡(不知道是不是我电脑的配置太低还是什么个情况),所以我就用Source_...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Directshow学习笔记五-----一个简单的视频播放程序(个人学习总结,仅供参考)
举报原因:
原因补充:

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