这段时间一直在学习陆其明老师的《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之间数据如何传送的问题等,在本文中没有进行详细说明。

DirectShow程序运行过程简析的更多相关文章

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

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

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

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

  3. 孙鑫MFC学习笔记3:MFC程序运行过程

    1.MFC中WinMain函数的位置在APPMODUL.cpp APPMODUL.cpp中是_tWinMain,其实_tWinMain是一个宏#define _tWinMain WinMain 2.全 ...

  4. java 程序运行过程 简介

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

  5. Java内存管理-程序运行过程(一)

    勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 相信在做Java开发的伙伴一定知道 JVM(Java Virtual Machine( ...

  6. (转)在.NET程序运行过程中,什么是堆,什么是栈?什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗?

    转自:http://www.cnblogs.com/xiaoyao2011/archive/2011/09/09/2172427.html 在.NET程序运行过程中,什么是堆,什么是栈? 堆也就是托管 ...

  7. Android 启动过程简析

    首先我们先来看android构架图: android系统是构建在linux系统上面的. 所以android设备启动经历3个过程. Boot Loader,Linux Kernel & Andr ...

  8. Java 程序运行过程中的内存分析

    作为 java 程序员,都应该知道 Java 程序运行在 JVM(Java Virtual Machine,Java 虚拟机)上,可以把 JVM 理解成 Java 程序和操作系统之间的桥梁,JVM 实 ...

  9. opencv检错:程序运行过程正常,当跳出函数时出现断言错误(Debug Assertion Failed)

    转载http://blog.csdn.net/u012327581/article/details/51351780 1.问题描述 在VS2015下配置好Opencv后,程序在函数运行过程中正常,调试 ...

随机推荐

  1. 精选29款非常实用的jQuery应用插件

    今天我们来分享一些实用的jQuery应用插件,没有特别花哨,但都比较实用,jQuery菜单.jQuery图片都有涉及到,一起来看看. 1.jQuery+CSS3仿IOS无线局域网Wifi DEMO演示 ...

  2. ALTER SEQUENCE 修改序列解决唯一约束冲突 unique constraint violated

    背景 自增序列会遇到也会遇到唯一约束冲突吗?是的,最常见的情况就是数据迁移之后,导致数据最大值超过序列值. 软件开发中不遇到些出乎意料的问题,总感觉不太够劲. 修改序列(ALTER SEQUENCE) ...

  3. EventBus使用介绍

    EventBus是Android下高效的发布/订阅事件总线机制.作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程 ...

  4. ios面试技术要点

    iOS面试 技术总结点(可参考):多线程 运行时 runloop app框架 几种动画编程 jsonmodel原理 sdwebimage原理 masonry怎么应用及原理 应用框架有哪些 说一下Fac ...

  5. 数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。

    #include <iostream> using namespace std; int maxCover(int* a, int n, int l) { ; ; ; while(end ...

  6. 读书笔记_Effective_C++_条款四十一:了解隐式接口和编译期多态

    从本条款开始,就进入了全书的第七部分:模板与泛型编程.模板与泛型在C++中是非常重要的部分,还记得本书第一章时,把C++视为一个联邦,它由四个州政府组成,其中一个政府就是模板与泛型了. 本条款是一个介 ...

  7. access里like的通配符不能用%,要用*

    转自http://www.knowsky.com/339881.html access里like的通配符用法是这样:     “?”表示任何单一字符: “*”表示零个或多个字符: “#”表示任何一个数 ...

  8. zepto - toggle

    <input type="text" value="123456789" /> <div id="too_long"> ...

  9. 写的一个Sass 和Compass的例子

    /*1.打开项目根目录下的 config.rb 文件 2.搜索 line_comments 关键词,默认应该是 # line_comments = false 3.去掉前面的 #,保存 config. ...

  10. 下载安装与配置 Java JDK 7

    1. 去 Oracle 的官网下载 JDK,我下载的是:jdk-7u25-windows-x64.exe   大小为:90.6M 2. 双击它安装. 3. 安装完后,JDK 配置如下: 01 02 - ...