智慧的鱼学习笔记
Directshow 开发笔记(翻译)
个人感觉开发自己的 还是要对 的基类要熟悉一些。所以才想起了要翻译
这些东西,希望在 月底前完成这些东西。我不想它的句子有多么流畅,语法的错误有多少,
我只希望能看明白就可以了
智慧的鱼()
作者简介:李强,: 欢迎转载本文档,
由于某些原因, 中的有些章节我没有翻译,如果哪位兄弟补充以后,可以将补充后的
文档发给我,我也学习学习,互相学习的过程就是提高的过程。
刚到北京来发展,希望北京的程序员朋友多多帮助
!"#$
%
智慧的鱼学习笔记
1 About Directshow 基础
1.1 设置 dshow 的开发环境
如果你用 &' 开发环境,一定要在 里设置下面的东西
包含头文件所有的 应用必须包含
包含动态库 (导出所有接口的 ')和接口 )) 定义。必须包含
*+(
%
智慧的鱼学习笔记
1.2 先演示一下 dshow 使用的一个例子
这里暂略。
1.3 Direcshow 概述
DirectShow 是微软公司提供的一套在 Windows 平台上进行流媒体处理的开发包,与
DirectX 开发包一起发布。
那么, 能够做些什么呢?且看, 为多媒体流的捕捉和回放提供了强有
力的支持。运用 ,我们可以很方便地从支持 , 驱动模型的采集卡上捕获数据,
并 且 进 行 相 应 的 后 期 处 理 乃 至 存 储 到 文 件 中 。 它 广 泛 地 支 持 各 种 媒 体 格 式 , 包 括
!-、.、!/、/、.$、,/ 等等,使得多媒体数据的回放变得轻而易举。另外,
还集成了 0 其它部分(比如 、*)的技术,直接支持
& 的 播放 ,视频的非线 性编辑, 以及与数 字摄像机 的数据交换。 更值得一提的 是 ,
提供的是一种开放式的开发环境,我们可以根据自己的需要定制自己的组件。
DirectShow 的系统组成
应用程序与 DirectShow 组件以及 DirectShow 所支持的软硬件之间的关系如图 1 所示。
%
智慧的鱼学习笔记
图 1 DirectShow 系统框图
1.4 Filter Graph 及其组成
这篇文档中我想给讲述 的主要组成部分,一个概括性的入门文章,对于应用开发
或者 的开发者都有所帮助。
1 DirectShow 的 Filter
是基于模块化,每个功能模块都采取 '1 组件方式,称为 。 提
供了一系列的标准的模块可用于应用开发,开发者也可以开发自己的功能 来扩展
的应用。下面我们用一个例子来说明如何采取 来播放一个 !&) 的视频文件。
从一个文件读取数据,形成字节流。(这个工作由源 完成)
检查 !&) 数据流的头格式,然后通过 !&) 分割 将视频流和音频流分开。
解码视频流,根据压缩格式的不同,选取不同的 -。
重画视频图像,通过 2。
将音频流送到声卡进行播放,一般采用缺省的*/。流程见下图。
从上面的图表看,每一个 - 都一个其他的一个或者两个 - 相连接,连接点也是 对
%
智慧的鱼学习笔记
象,我们称为 3。 通过 . 将数据从一个 - 传递到另一个 - 中,从而可以使数据
的 - 的链表中流动。图中的箭头表示 - 链表中的数据流的方向。在 中,一
个 -链表我们称为 -4.。
具有三个状态,运行,停止,暂停。当一个 - 运行时,它就处理媒体数据流,当
停止时,- 就不在处理数据,暂停状态常用来给运行状态之前 *。
4.
一章详细描述了这些概念,可以参考。
除非特别的例外,所有 . 中的 - 的状态的改变都是统一的,也就说,-.
中的所有的 -的状态改变是一致协调的。也就是说,我们也可以用 -. 也可以有运
行,停止,暂停三种状态。
一般分为下面几种类型。
(1)源过滤器(source filter):源过滤器引入数据到过滤器图表中,数据来源可以是
文件、网络、照相机等。不同的源过滤器处理不同类型的数据源。
(2)变换过滤器(transform filter):变换过滤器的工作是获取输入流,处理数据,并
生成输出流。变换过滤器对数据的处理包括编解码、格式转换、压缩解压缩等。
(3)提交过滤器(renderer filter):提交过滤器在过滤器图表里处于最后一级,它们
接收数据并把数据提交给外设。
(4)分割过滤器(splitter filter):分割过滤器把输入流 分割成多个输出。例如,AVI
分割过滤器把一个 AVI 格式的字节流分割成视频流和音频流。
(5)混合过滤器(mux filter):混合过滤器把多个输入 组合成一个单独的数据流。例
如,AVI 混合过滤器把视频流和音频流合成一个 AVI 格式的字节流。
过滤器的这些分类并不是绝对的,例如一个 ASF 读过滤器(ASF Reader filter)既是
一个源过滤器又是一个分割过滤器。
2 关于 Filter Graph Manager
4.
也是一个 对象,用来控制 . 中的所有的 -,主要有以下
的功能:
%用来协调 - 之间的状态改变,从而使 .中的所有的 - 的状态的改变应该一致。
建立一个参考时钟。
$将 -的消息返回给应用程序
提供方法用来建立-.。
这里只是简单的描述一下,详细地可以参考文档。
状态改变,4. 中的 - 的状态改变应该一致,因此,应用程序并将状态改变的命令直接
发给 -,而是将相应的状态改变的命令发送给 .,由 将命令分
发给 . 中每一个 -。5 也是同样的方式工作,首先由应用程序将 5 命令发送
到 -.管理器,然后由其分发给每个 -。
参考时钟,. 中的 - 都采用的同一个时钟,称为参考时钟(-5),参考时
钟可以确保所有的数据流同步,视频桢或者音频桢应该被提交的时间称为 presentation
time. 是相对于参考时钟来确定的。. 应该选择一个参考时
钟,可以选择声卡上的时钟,也可以选择系统时钟
Graph 事件,4.管理器采用事件机制将 . 中发生的事件通知给应用程序,这个机制
类似于 的消息循环机制。
Graph 构建的方法,. 管理器给应用程序提供了将 - 添加进 . 的方法,连接 -
的方法,断开 - 连接的方法。
但是,.管理器没有提供如何将数据从一个 - 发送到另一个 - 的方法,这个工作
是由 - 在内部通过 . 来独立完成的,
%