基于directshow的流媒体解码和回放

上传人:j****9 文档编号:45024791 上传时间:2018-06-14 格式:DOC 页数:4 大小:54.50KB
返回 下载 相关 举报
基于directshow的流媒体解码和回放_第1页
第1页 / 共4页
基于directshow的流媒体解码和回放_第2页
第2页 / 共4页
基于directshow的流媒体解码和回放_第3页
第3页 / 共4页
基于directshow的流媒体解码和回放_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《基于directshow的流媒体解码和回放》由会员分享,可在线阅读,更多相关《基于directshow的流媒体解码和回放(4页珍藏版)》请在金锄头文库上搜索。

1、基于基于 DirectShow 的流媒体解码和回放的流媒体解码和回放一、一、 前言前言流媒体的定义很广泛,大多数时候指的是把连续的影像和声音信息经过压缩处理后放上网站服 务器,让用户一边下载一边观看、收听,而不需要等整个压缩文件下载到自己机器就可以观看的视 频/音频传输、压缩技术。流媒体也指代由这种技术支持的某种特定文件格式:压缩流式文件,它通 过网络传输,并通过个人电脑软件进行解码。MCI 是微软为 Windows 最初提出的多媒体编程接口,随着多媒体技术的迅速发展,各种压缩 算法在该领域的的应用,MCI 技术越来越显的力不从心,最明显的是它不支持可变比特率的压缩算 法,对于处理 DVD 等

2、近年出现的多种新的媒体格式已显得无能为力,而使用微软提供的 vfw 之类 的多媒体库又太麻烦。怎么办呢? 作为 MCI 的“接班人“,微软又适时推出了建立在 DirectX(包含 DirectDraw、DirectSound、Direct3D)之上的 DirectShow 技术,它是在 DirectX 之上的媒体层, 支持来自本地或网络的各种视频、音频压缩格式的媒体文件的解码和回放,可以从设备上捕捉多媒 体流,也可以处理各种压缩算法处理的流媒体。这些格式包括:MPEG 的音频和视频标准、音频和 视频交互标准(AVI)、WAVE、MIDI 和高级流格式 ASF。DirectShow 对媒体数据处

3、理采用流媒 体(Multimedia Stream)的方式,在应用中使用该方式可以大大的减少编程的复杂程度,同时又可 以自动协商从数据源到应用的转换,流接口提供了统一的、可以预测的数据存取的控制方法,这样 应用程序在播放媒体数据时不需要考虑它最初的来源和格式。二、理解二、理解 DirectXDirectX 是一个用于多媒体应用程序和硬件增强的编程环境,它是微软为了将其 Windows 建设 成适应各种多媒体的最好平台而开发设计的。DirectX 目前已经成为微软自身 SDK 的一部分,而 Windows 98/Windows 2000 内则集成了 DirectX,表明它已成为操作系统的一部分。

4、DirectX 技术是一种 API(应用程序接口),每个 DirectX 部件都是用户可调用的 API 的总和, 通过它应用程序可以直接访问计算机的硬件。这样,应用程序就可以利用硬件加速器(Hardware Accelerator)。如果硬件加速器不能使用,DirectX 还可以仿真加速器以提供强大的多媒体环境。为了理解 DirectX,我们可以把系统分为四层:硬件/网络层:放置有多媒体设备,包括图形加速器、声卡、输入设备以及网络通信设备等;DirectX 基础层:为图像、声音和设备提供多媒体基本服务;DirectX 媒体层:为动画制作、音频和视频等提供 API 功能;组件层:包括 Activ

5、eX 控制和应用,它利用 DirectX 的 API 功能的优势为用户提供多媒体服 务。DirectShow 就是建立在 DirectX 媒体层之上的技术,其前身是 ActiveMovie2.0。它以一组 API 函数或 ActiveX 控件出现,用途是让开发者能够在网络上传递高质量的音频和视频信号。值得一提 的是,DirectShow 为我们提供了一个开放式的开发环境,我们可以根据自己的需要定制组件。三、三、DirectShow 技术结构技术结构DirectShow 定义了如何利用标准组件来处理流媒体数据,这些组件称为过滤器。过滤器带有输 入、输出针角(pin),或二者兼而有之。在 Dire

6、ctShow 技术中处于最核心位置的就是作为“过滤器“的 可插入标准组件,它是执行特定任务的 COM 对象。过滤器又可被细分为源过滤器(Source filter)、 变换过滤器(Transform filter)、表现过滤器(Renderer filter)等。过滤器通过向文件读写、修改数 据和显示数据到输出设备上来操作流媒体。为了完成整个任务,必须要将所有的过滤器 Filter 连接 起来,这三种过滤器组成了过滤器图表结构,如图 3.1 所示:图 3.1 过滤器图表结构(Filter Graph) 从图 3.1 中可以看出,过滤器图表是各种过滤器的集合,它是通过过滤器的输入输出针脚“pin

7、“ 顺序连接而成的,这些过滤器的针脚通过协商来决定它们将支持何种形式多媒体。由于 DirectShow 支持可重构的过滤器图表结构,所以使用相同的软件组件可以播放多种类型的媒体。开发人员可以 通过定义自己的过滤器来扩展 DirectShow 对媒体的支持功能。在过滤器图表结构中,源过滤器用来从数据源获取数据,并将数据传送到过滤器图表中,这里 的数据源可以是摄像机、因特网、磁盘文件等;转换过滤器用来获取、处理和传送媒体数据,它包 括分离视频和音频的分解变换过滤器(Splitter transform filter)、解压视频数据的视频转换过滤器 (Video transform filter)、

8、解压音频数据的音频转换过滤器(Audio transform filter);表现过滤 器用来在硬件上表现媒体数据,如显卡和声卡,或者是任何可以接受媒体数据的地方,如磁盘文件。 它包括用来显示图像的视频表现过滤器(Video renderer filter)、将音频数据送到声卡上去的音频 表现过滤器(Audio renderer filter)。在过滤器图表中,为了完成特定的任务,必须将所有需要的过滤器连接起来,因此前级过滤器 的输出必定成为下级过滤器的输入。一个过滤器至少有一个输入针(Input pin),并将特定的输出 送到输出针(Output pin);图 3.2 显示了一个过滤器连接图

9、:3.2 过滤器连接图 你的应用程序不需要对过滤器图表中的各个过滤器进行单独的处理,因为在更高的层次上, DirectShow 提供的一个称为过滤图表管理器的部件(FGM)管理着这些过滤器的连接和流媒体数 据在过滤器之间的流动,FGM 提供了一套 COM 接口,应用程序可以通过它来访问过滤器图表、控 制流媒体或者接收过滤器事件。如果需要,它可以自动的插入一个合适的解码器,并将转换过滤器 的输出针脚连接到表现过滤器。应用程序可以通过与过滤图表管理器的通信来控制过滤器图表的活 动。程序开发人员只需要调用 API 函数来实现对流媒体的控制,如 run 方法启动流媒体在过滤器图 表(Filter gr

10、aph)中的流动;pause 方法暂停流媒体的播放;stop 方法停止播放流媒体等。另外,利用 Filter Graph Manager 能够将事件信息传送到应用层这一特点,可以使应用程序可 以响应事件处理,例如播放或搜索流媒体中的特定时间段的数据、流结束信息等。图 3.3 是一个 MPEG 解码播放的实例,可以看出 Source filter 将获取的多媒体数据通过 Outpin 送到 MPEG 分解转换过滤器,MPEG 分解转换过滤器有一个输入针脚,两个输出针角分别 将视频和音频解释码器进行解码,最后两路数据分别通过视频表示过滤器、音频表示过滤器送到显 卡和声卡进行回放。图 3.3 MPE

11、G 解码实例 四、四、DirectShow 程序开发程序开发DirectShow 建立在 COM 组件技术基础上,所以开发 DirectShow 程序必须要掌握 COM 组件 技术。DirectShow 与 COM 紧密相连,它所有的部件和功能都由 COM 接口来构造和实现,其开发 方式相当灵活,没有固定的模式,通常随不同的需要使用不同的 COM 接口。但是其中几个重要的 接口确实经常需要用到的:IGraphBuilder 接口,这是最为重用的 COM 接口,用来创建 Filter Graph Manager;IMediaControl 接口,用来控制流媒体在滤波器图表(Filter Grap

12、h)中的流动, 例如流媒体的启动和停止;IMediaEvent 接口,该接口在 Filter Graph 发生一些事件时用来创建事 件的标志信息并传送给应用程序。一个典型的 DirectShow 应用程序的开发通常遵循的步骤为:1)通过 API 函数 CoCreateInstance()创建一个 Filter Graph Manager 实例;2)通过调用 QueryInterface ( )函数来获取 Filter Graph 和 IMediaEvent 组件的指针;3)对 Filter Graph 进行控制和对事件作出响应。下面举一个简单的例子来说明如何利用 DirectShow 技术对多

13、媒体流进行解码回放的。首先生 成一个名为 MediaPlay 的单文档应用程序,定义一个名字为 MediaPlay 的函数,该函数的具体实现 代码为:void PlayMovie(LPTSTR lpszMovie) IMediaControl *pMC = NULL; IGraphBuilder *pGB = NULL;IMediaEventEx *pME = NULL;long evCode; / something to hold a returned event codehr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPRO

14、C,IID_IMediaControl, (void *)hr = pMC-QueryInterface(IID_IGraphBuilder, (void *)hr = pMC-QueryInterface(IID_IMediaEventEx, (void *)hr = pGB-RenderFile(lpszMovie, NULL);hr = pMC-Run();hr = pME-WaitForCompletion(INFINITE, if(pMC)pMC-Release();if(pGB)pGB-Release();if(pME)pME-Release(); 上述代码中,CoCreateIn

15、stance()函数创建了一个过滤器图表(Filter Graph)对象,并返回 一个媒体控制(ImediaControl)接口,这个接口通过过滤器来实现播放、暂停、停止等媒体放映功 能,但是这时候图表对象并不包含具体的过滤器,因为此时 DirectX 并不清楚需要播放何种类型的 媒体;接下来创建一个图表构建接口,该接口可以实现创建过滤器图表、向图表对象添加、删除各 种过滤器、列举当前过滤器图表中所有的过滤器、连接图表对象中的各个过滤器等功能;本例中使 用了 IGraphBuilder 接口的 RenderFile()函数,告诉 DirectX 需要播放的媒体文件名,此时 IgraphBuilder 对象接口根据多媒体文件的类型,自动向过滤器图表添加播放该类型媒体所需的的各 种过滤器,并实现其连接。最后,函数调用 ImediaControl 接口对象的 Run()函数,就可以开始播放媒体文件了。为了实 现从头至尾的顺序播放完多媒体文件,需要调用 IMediaEventEx 对象接口的 WaitForCompletion()阻塞函数的运行,直到媒体文件结束后才可以释放对象、结束函数的运行。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号