这段时间一直在学习陆其明老师的《DirectShow开发指南》一书,书中对DirectShow的很多细节讲解清晰,但是却容易让人缺少对全局的把握。在学习过程中,整理了关于DirectShow程序运行过程的内容,希望会对上手学习DirectShow的人有所帮助。

DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。对于DirectShow的使用除妖是为了对多媒体流的捕捉和回放提供支持,以及对获取的数据进行后期的处理和存储。

在介绍DirectShow程序运行过程之前,需要先说明几个概念。

Filter:有些资料中翻译为过滤器,用于参与数据处理的功能模块。根据功能的不同,可以分为Source Filters、Transform Filters和Rendering Filters,分别用于对数据的获取,处理和分发。

Pin:Filter对外提供的接口,分为输入Pin和输出Pin,作为Filter之间的连接通道用于数据传输。

Filter Graph:用于管理Filter的模型,展示整个数据流的处理过程。在Filter Graph中,每个Filter按一定的顺序进行连接,数据在Filter之间进行传递。微软提供的GraphEdit工具是用于对Filter的测试,在这个工具中可以很直观的看到Filter Graph的运行和处理。

Filter Graph Manager:用于管理Filter Graph,控制数据处理过程。

DirectShow程序的运行过程就是以上提到的对象之间协作的过程。由于DirectShow应用程序实际上是一种COM组件的客户程序,所以涉及到COM组件的创建,对象接口的调用等问题。

(1)DirectShow应用程序运行的第一步就是初始化COM库。

    HRESULT hr = Colnitialize(NULL);  // 调用 Colnitialize来初始化COM库

(2)创建Filter Graph Manager实例

    HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph); 

(3)创建Filter Graph Manager之后,根据实际应用,创建完整的Filter链路。此处的Filter可以是调用已有的Filter,或者是调用由用户自行实现的Filter。在Filter之间连接链路的过程就是将对应的Pin进行连接的过程,即为媒体类型的协商过程。无论是输入Pin还是输出Pin,支持的媒体类型都是有限的,需要选择两端都支持的媒体类型,才能实现Pin之间的连接。需要提出的是,连接的过程总是从输出Pin指向输入Pin。

①首先,枚举欲连接的输入Pin上所有的媒体类型,用这些媒体类型与输出Pin进行连接,如果输出Pin也支持某种媒体类型,那么该连接即成功,若在输入Pin上支持的媒体类型都不能被支持,就会转而从输出Pin方进行枚举,如果输出方Pin支持的媒体类型同时也被输入方Pin支持,那么也使该连接成功。如果两次枚举过程都不能成功建立连接,则这两个Pin之间不能进行连接。

    HRESULT CBasePin::AttempConnection(IPin*,const CMediaType*) 

②在建立连接之后,还不能立刻进行数据传输,还需要针对Pin上的内存分配器进行协商。连接双方的Pin之间进行传输的数据单元叫做Sample,Sample是由分配器(Allocator)来管理的。连接两个Filter的Pin必须使用同一个分配器,而具体需要由哪个Pin来创建是需要协商的。

   HRESULT CBaseOutputPin::DecideAllocator(IMemlnputPin*,IMemAllocator)    

(4)在成功构建了一个Filter Graph之后,就可以进行播放了。此时,使用Filter Graph Manager控制Filter graph及在其中的数据流。在这个过程中,应用程序会收到Filter Graph Manager发送的事件,并对这些事件进行响应。

以上就是一个DirectShow应用程序运行的基本过程,在此过程中还牵涉到很多细节,例如在推模式和拉模式两种不同的数据传送模式下,Pin之间数据如何传送的问题等,在本文中没有进行详细说明。

转载于:https://www.cnblogs.com/orange1438/p/4544945.html

DirectShow程序运行过程简析相关推荐

  1. RAP开发入门-运行过程简析(三)

    今天通过标准的RAP程序来简单分析下RAP的启动过程 1.新建一个标准的rap plugin-in 项目: 得到的项目结构大概如下: run confi..->..add bundle(配置好b ...

  2. 智能机器人编程游戏robocode的运行代码简析

    智能机器人编程游戏robocode的运行代码简析 金庆 2007.6.1 阅读robocode1.3的源代码,查看运行的原理. (转载请注明来源于 金庆的专栏) 主线程Battle.run() --- ...

  3. Nutch学习笔记二——抓取过程简析

    在上篇学习笔记中http://www.cnblogs.com/huligong1234/p/3464371.html 主要记录Nutch安装及简单运行的过程. 笔记中 通过配置抓取地址http://b ...

  4. 内存管理——程序运行过程中内存的作用以及如何与cpu、os交互

    今年以来,内存条价格暴涨,已经跃升为新的新一代理财产品,所以今天就和大家讨论一下内存条的话题,主要内容就是在程序运行过程中,内存的作用以及如何与CPU,OS交互. 我们先来讨论:计算机的运行究竟是在做 ...

  5. java 程序运行过程 简介

    这里的Java程序运行过程,是指我们编译好代码之后,在命令行开始执行java xxx命令,到java程序开始执行起来的这一过程,我们称其为运行时. 第一步,操作系统解析我们输入的java xxx命令, ...

  6. 程序运行过程中遇到“ORA-03114: not connected to ORACLE”的问题解决

    程序运行过程中遇到"ORA-03114: not connected to ORACLE"的问题解决 参考文章: (1)程序运行过程中遇到"ORA-03114: not ...

  7. 操作系统之内存管理:1、内存管理基础知识(指令工作原理、地址转化、程序运行过程)

    1.内存管理基础知识(指令工作原理.地址转化.程序运行过程) 思维导图 什么是内存? 指令的工作原理 装入模块的三种实现 绝对装入 可重定位装入 动态重定位 程序的运行过程 链接的三种方式 思维导图 ...

  8. 深入理解计算机系统---程序运行过程

    一个简单的C程序从编写到执行输出hello world!其中间经历的是诸多处理过程,而不仅仅是显示黑屏上的几个字符.这个过程透露着计算机系统的运行本质. 个人对该过程进行了一些分析和总结,如果有不对的 ...

  9. VUE程序运行过程-runtime-complier和runtime-only的区别

    1.VUE程序运行过程 当把template传递给vue实例的时候,vue实例会把该模板内容保存到vm.options, 然后对该template解析成ast(抽象语法树) 将ast编译为render ...

最新文章

  1. 计算机改名后无法上网,CDEF磁盘分区无法修改名字修复方法
  2. 微软加入了面向Java的Cloud Foundry
  3. Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法
  4. android输入法源码分析,基于Android的输入法的设计与实现.doc
  5. NIFI从mysql导入Hbase
  6. eclipse提示方法已过时_提高效率,eclipse上你可能不知道的技巧
  7. Linux下查看/管理当前登录用户及用户操作历史记录
  8. Android usb 权限广播,android10.0 USB弹窗权限流程解析
  9. python selenium 常用方法
  10. servlet到底是什么?
  11. Android得到位图方式
  12. 2017年笔记本计算机行业,2017笔记本电脑最新排行榜
  13. 计算机应用基础网课试题及答案2020,2019-2020年度公共课计算机应用基础考试试题附答案(5页)-原创力文档...
  14. php提交按钮快捷键,直接打印快捷键
  15. Oauth2 存储 token 到Redis 报错:READONLY You can‘t write against a read only slave
  16. 理解CMMI 3级过程域非常好的例子
  17. Portainer容器可视化工具
  18. 【Android】BoardcastReceiver简介
  19. STAR软件安装以及使用
  20. 前端技术的发展与演变

热门文章

  1. (二)Graphivz 简单结构图及子图
  2. Makefile万能写法(gcc程序以及arm-linux-gcc程序)-转
  3. SQLite指南(0) 表和索引的文件存储结构
  4. Linux查看和剔除当前登录用户-转
  5. 一步一步手绘Spring IOC运行时序图三(基于Annotation的IOC容器初始化)
  6. python web实战视频教程_Python Web开发实战【中级班】
  7. java 将 ResultSet 转化为 json格式
  8. Hadoop2.x介绍与源代码编译
  9. 配置suse syslog服务器
  10. Python 函数知识