作者:suntaoznz

转自:http://blog.csdn.net/suntaoznz/article/details/600493

目录(?)[+]

DirectShow应用程序快速入门

摘要:该文介绍如何编写DirectShow应用程序,属于入门级文章。如果你感兴趣,可以来看看这些东西。欢迎到我的博客blog.csdn.net/suntaoznz看其他文章!

 

一环境设置

二 DirectShow编程简介

三播放文件例程

一 环境设置

该节介绍如何建立DirectShow应用程序。你可以建立一个控制台程序,或者Visual Studio环境下的其它Visual C++的项目。

头文件

所有DirectShow 程序都使用下表中的头文件。

头文件

需     要

dshow.h

所有DirectShow 程序。

有些DirectShow接口会要求其他头文件,你可以去查看这些接口的参考手册。

库文件

DirectShow程序要使用的库文件如下:

库文件

说            明

Strmiids.lib

提供类标识(CLSIDs)和接口表示(IIDs)。所有的DirectShow程序都要求使用该库文件。

Quartz.lib

提供AMGetErrorText函数,如果你不调用这个函数,就可以不加载该库文件。

可以把DirectX SDK 的Include 和Lib目录放在Visual Studio的搜索路径的第一位。以确保你可以使用最新的版本!

二 DirectShow编程简介

该节对DirectShow编程的基本术语和概念进行介绍,通过对该节的阅读,你可以写你的一个DirectShow应用程序。

过滤器(Filters)和过滤器图表(Filter Graphs)

过滤器(Filters)就是一个软件组件,它执行一些针对多媒体流的操作。比如:

·         读入文件

·         从视频捕获设备得到视频

·         对多种流格式解码,如MPEG-1

·         传送数据到显卡和声卡

过滤器可以接收输入并提供输出,比如,一个MPEG-1视频解码过滤器,它接收MPEG编码的数据流,通过处理后输出非压缩的视频图像帧。

在DirectShow, 应用程序执行的一些工作是在一串过滤器链接中完成,可能某个过滤器的输出到了下一步就是另一个过滤器的输入。这一组连接,我们就称为过滤器图表

例如下图显示了一个播放AVI文件的过滤器图表。

 

File Source 过滤器从硬盘上读取AVI文件。AVI Splitter 过滤器把文件解析为两个数据流(压缩的视频流和音频流)。AVI Decompressor过滤器对视频流解码,Video Rendere把视频数据显示出来(通过DirectDraw 或 GDI)。Default DirectSound Device过滤器使用DirectSound播发音频数据

应用程序不需要对数据流动进行管理,这些过滤器被级别更高的组件控制,过滤器图表管理器(Filter Graph Manager)管理这些过滤器。这样,你就可以使用更高级别的API来控制(比如”Run” , ”Stop”),如果你要控制流的操作,你也可以通过直接使用过滤器的COM接口实现。过滤器图表管理器通过事件来通知应用程序。

过滤器图表管理器的另一个用途是:它通过把过滤器连接在一起,向应用程序提供了建立过滤器图表的方法。

编写DirectShow 程序

在大部分的情况下,DirectShow应用程序必须执行下面3个步骤:

  1. 应用程序建立一个Filter Graph Manager的实例。
  2. 应用程序使用Filter Graph Manager 去建立一个filter graph. Filter graph中的过滤器依赖与应用程序的需求。
  3. 应用程序使用Filter Graph Manager 去控制filter graph 并通过过滤器去对数据解析分流。在整个处理过程中,应用程序都将响应Filter Graph Manager的事件。

当处理完成后,应用程序将释放掉Filter Graph Manager和所有的过滤器。

DirectShow 是基于COM的。Filter Graph Manager 和过滤器都是COM对象。你应该对COM编程有全面的了解。

三 播放文件例程

这里提供一个控制台应用程序去播放一个音、视频文件。这个程序只有几行长。

在前面介绍了一个基于DirectShow的应用程序,必须要进行如下几个基本步骤:

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

 

全部源码如下:

#include <dshow.h>

void main(void)

{

IGraphBuilder *pGraph = NULL;

IMediaControl *pControl = NULL;

IMediaEvent   *pEvent = NULL;

// 初始化COM 库

HRESULT hr = CoInitialize(NULL);

if (FAILED(hr))

{

printf("ERROR - Could not initialize COM library");

return;

}

// 建立过滤器图表管理器

hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,

IID_IGraphBuilder, (void **)&pGraph);

if (FAILED(hr))

{

printf("ERROR - Could not create the Filter Graph Manager.");

return;

}

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

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

// 建立过滤器图表

hr = pGraph->RenderFile(L"C://Example.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应用程序快速入门相关推荐

  1. 视频教程-微信小程序快速入门视频课程-微信开发

    微信小程序快速入门视频课程 北京八维研修学院技术工程师,5年大型项目实战开发经验,3年授课经验. 孟宪杰 ¥168.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 AP ...

  2. 微信小程序快速入门+四个实战小程序(一)——入门准备

    一)系列达成目标介绍 二)小程序创建的准备 1)注册开发者账号 2)下载编译器 ------------------------------------------------------ 一)系列达 ...

  3. 微信小程序快速入门【一】

    微信小程序快速入门[一] 文章目录 微信小程序快速入门[一]

  4. 使用ST TOOLS的STVP烧写程序快速入门

    使用ST TOOLS的STVP烧写程序快速入门 首先要对软硬件进行初始配置,并正确设备连接. 打开STVP,点击菜单栏中的"Configure -> Configure ST Visu ...

  5. qt开发界面程序快速入门总结

    前言 要使用qt设计一款上位机,从保存的数据文件中显示时域.频域图. QT基本概念及其下载 我参考了C语言中文网.里边有比较全面的QT基本概念以及下载教程.对于版本的选择,用于公司开发的话,比较稳定的 ...

  6. 微信小程序快速入门 --项目介绍

    小程序项目的基本构成 ① pages 用来存放所有小程序的页面 ② utils 用来存放工具性质的模块(例如:格式化时间的自定义模块) ③ app.js 小程序项目的入口文件 ④ app.json 小 ...

  7. 小程序快速入门到项目开发 7 (网络通讯和数据解析)

    你好,[程序职场]专注于:Spring Boot ,微服务 和 前端APP开发,闲暇之余一起聊聊职场规划,个人成长,还能带你一起探索 副业赚钱渠道,在提升技术的同时我们一起交流 敏捷流程 提高工作效率 ...

  8. c8051f310烧录_C8051F烧写程序快速入门(Silicon IDE)

    注:下载程序必须首先安装Silicon IDE以及Keil软件 ·Keil的安装 请到 Keil 官方网站: https://www.keil.com/c51/demo/eval/c51.htm下载安 ...

  9. 小程序快速入门到项目开发 2(小程序appID获取和目录结构)

    你好,[程序职场]专注于:Spring Boot ,微服务 和 前端APP开发,闲暇之余一起聊聊职场规划,个人成长,还能带你一起探索 副业赚钱渠道,在提升技术的同时我们一起交流 敏捷流程 提高工作效率 ...

最新文章

  1. Design Pattern IDisposable Pattern C
  2. Smartform 动态打印选择屏幕上传的图片
  3. optimize table优化mysql例子
  4. 在Nginx/Tengine服务器上安装SSL证书
  5. 个人作业-Week1
  6. 2018第一场多校 -补题
  7. pandas的dataframe
  8. 时间操作(JavaScript版)—页面显示格式:年月日星期几
  9. 用ruby编写标准计算器_WatirMaker再次用Ruby编写
  10. 产生式系统的基本概念
  11. python超市管理系统实训报告_需求分析实验报告(小型超市管理系统)
  12. windows动态ip和静态ip的bat文件
  13. Linux光标移动异常
  14. 期货发展的几个重要时间点和事件
  15. PHP 开发者应了解的 24 个库
  16. 人脸识别扫描(活体检测功能,眨眼、摇头、点头),身份证认证
  17. 区块链/BlockChain+ProofOfWork
  18. 是时候选择NewSQL数据库了
  19. 8个身家百万的儿童创业者
  20. 实施工程师面常见问题

热门文章

  1. JDK1.8 邮戳锁(StampedLock)知识点整理以及示例
  2. UML建模工具StarUML中文版
  3. 如何给自己的nginx服务设置管理密码
  4. 使用计算机教室的注意事项,学生计算机房(电脑室)使用须知
  5. MySQL解释--百度百科
  6. html继承 模板,模板继承
  7. Cluste 模式下 Log4js 日志丢失
  8. 读不读博士?不适合读博士的人选择读博士了怎么办?
  9. domtoimage截屏报错Uncaught(in promise)
  10. win10无法关机的解决方法