网站域名授权怎么做,建设摩托车报价及图片,专业做网站的页面设计,中国交通频道在线直播2022一、 前言 流媒体的定义很广泛#xff0c;大多数时候指的是把连续的影像和声音信息经过压缩处理后放上网站服务器#xff0c;让用户一边下载一边观看、收听#xff0c;而不需要等整个压缩文件下载到自己机器就可以观看的视频/音频传输、压缩技术。流媒体也指代由这种技术…一、 前言 流媒体的定义很广泛大多数时候指的是把连续的影像和声音信息经过压缩处理后放上网站服务器让用户一边下载一边观看、收听而不需要等整个压缩文件下载到自己机器就可以观看的视频/音频传输、压缩技术。流媒体也指代由这种技术支持的某种特定文件格式压缩流式文件它通过网络传输并通过个人电脑软件进行解码。 MCI是微软为Windows最初提出的多媒体编程接口随着多媒体技术的迅速发展各种压缩算法在该领域的的应用MCI技术越来越显的力不从心最明显的是它不支持可变比特率的压缩算法对于处理DVD等近年出现的多种新的媒体格式已显得无能为力而使用微软提供的vfw之类的多媒体库又太麻烦。怎么办呢 作为MCI的接班人微软又适时推出了建立在DirectX包含DirectDraw、DirectSound、Direct3D之上的DirectShow技术它是在DirectX之上的媒体层支持来自本地或网络的各种视频、音频压缩格式的媒体文件的解码和回放可以从设备上捕捉多媒体流也可以处理各种压缩算法处理的流媒体。这些格式包括MPEG的音频和视频标准、音频和视频交互标准AVI、WAVE、MIDI和高级流格式ASF。DirectShow对媒体数据处理采用流媒体Multimedia Stream的方式在应用中使用该方式可以大大的减少编程的复杂程度同时又可以自动协商从数据源到应用的转换流接口提供了统一的、可以预测的数据存取的控制方法这样应用程序在播放媒体数据时不需要考虑它最初的来源和格式。 二、理解DirectX DirectX是一个用于多媒体应用程序和硬件增强的编程环境它是微软为了将其Windows建设成适应各种多媒体的最好平台而开发设计的。DirectX目前已经成为微软自身SDK的一部分而Windows 98/Windows 2000内则集成了DirectX表明它已成为操作系统的一部分。 DirectX技术是一种API应用程序接口每个DirectX部件都是用户可调用的API的总和通过它应用程序可以直接访问计算机的硬件。这样应用程序就可以利用硬件加速器Hardware Accelerator。如果硬件加速器不能使用DirectX还可以仿真加速器以提供强大的多媒体环境。 为了理解DirectX我们可以把系统分为四层 ●硬件/网络层放置有多媒体设备包括图形加速器、声卡、输入设备以及网络通信设备等 ●DirectX基础层为图像、声音和设备提供多媒体基本服务 ●DirectX媒体层为动画制作、音频和视频等提供API功能 ●组件层包括ActiveX控制和应用它利用DirectX的API功能的优势为用户提供多媒体服务。 DirectShow就是建立在DirectX媒体层之上的技术其前身是ActiveMovie2.0。它以一组API函数或ActiveX控件出现用途是让开发者能够在网络上传递高质量的音频和视频信号。值得一提的是DirectShow为我们提供了一个开放式的开发环境我们可以根据自己的需要定制组件。 三、DirectShow技术结构 DirectShow定义了如何利用标准组件来处理流媒体数据这些组件称为过滤器。过滤器带有输入、输出针角(pin)或二者兼而有之。在DirectShow技术中处于最核心位置的就是作为过滤器的可插入标准组件它是执行特定任务的COM对象。过滤器又可被细分为源过滤器Source filter、变换过滤器Transform filter、表现过滤器(Renderer filter)等。过滤器通过向文件读写、修改数据和显示数据到输出设备上来操作流媒体。为了完成整个任务必须要将所有的过滤器Filter连接起来这三种过滤器组成了过滤器图表结构如图3.1所示
图3.1 过滤器图表结构(Filter Graph) 从图3.1中可以看出过滤器图表是各种过滤器的集合它是通过过滤器的输入输出针脚pin顺序连接而成的这些过滤器的针脚通过协商来决定它们将支持何种形式多媒体。由于DirectShow支持可重构的过滤器图表结构所以使用相同的软件组件可以播放多种类型的媒体。开发人员可以通过定义自己的过滤器来扩展DirectShow对媒体的支持功能。 在过滤器图表结构中源过滤器用来从数据源获取数据并将数据传送到过滤器图表中这里的数据源可以是摄像机、因特网、磁盘文件等转换过滤器用来获取、处理和传送媒体数据它包括分离视频和音频的分解变换过滤器Splitter transform filter、解压视频数据的视频转换过滤器Video transform filter、解压音频数据的音频转换过滤器Audio transform filter表现过滤器用来在硬件上表现媒体数据如显卡和声卡或者是任何可以接受媒体数据的地方如磁盘文件。它包括用来显示图像的视频表现过滤器Video renderer filter、将音频数据送到声卡上去的音频表现过滤器(Audio renderer filter)。 在过滤器图表中为了完成特定的任务必须将所有需要的过滤器连接起来因此前级过滤器的输出必定成为下级过滤器的输入。一个过滤器至少有一个输入针Input pin并将特定的输出送到输出针Output pin图3.2显示了一个过滤器连接图
3.2 过滤器连接图 你的应用程序不需要对过滤器图表中的各个过滤器进行单独的处理因为在更高的层次上DirectShow提供的一个称为过滤图表管理器的部件FGM管理着这些过滤器的连接和流媒体数据在过滤器之间的流动FGM提供了一套COM接口应用程序可以通过它来访问过滤器图表、控制流媒体或者接收过滤器事件。如果需要它可以自动的插入一个合适的解码器并将转换过滤器的输出针脚连接到表现过滤器。应用程序可以通过与过滤图表管理器的通信来控制过滤器图表的活动。程序开发人员只需要调用API函数来实现对流媒体的控制如run方法启动流媒体在过滤器图表Filter graph中的流动pause方法暂停流媒体的播放stop方法停止播放流媒体等。 另外利用Filter Graph Manager能够将事件信息传送到应用层这一特点可以使应用程序可以响应事件处理例如播放或搜索流媒体中的特定时间段的数据、流结束信息等。 图3.3是一个MPEG解码播放的实例可以看出Source filter将获取的多媒体数据通过Outpin送到MPEG分解转换过滤器MPEG分解转换过滤器有一个输入针脚两个输出针角分别将视频和音频解释码器进行解码最后两路数据分别通过视频表示过滤器、音频表示过滤器送到显卡和声卡进行回放。 图3.3 MPEG解码实例 四、DirectShow程序开发 DirectShow建立在COM组件技术基础上所以开发DirectShow程序必须要掌握COM组件技术。DirectShow与COM紧密相连它所有的部件和功能都由COM接口来构造和实现其开发方式相当灵活没有固定的模式通常随不同的需要使用不同的COM接口。但是其中几个重要的接口确实经常需要用到的IGraphBuilder接口这是最为重用的COM接口用来创建Filter Graph ManagerIMediaControl接口用来控制流媒体在滤波器图表Filter Graph中的流动例如流媒体的启动和停止IMediaEvent接口该接口在Filter Graph发生一些事件时用来创建事件的标志信息并传送给应用程序。 一个典型的DirectShow应用程序的开发通常遵循的步骤为 1通过API函数CoCreateInstance创建一个Filter Graph Manager 实例 2通过调用QueryInterface ( )函数来获取Filter Graph 和IMediaEvent组件的指针 3对Filter Graph进行控制和对事件作出响应。 下面举一个简单的例子来说明如何利用DirectShow技术对多媒体流进行解码回放的。首先生成一个名为MediaPlay的单文档应用程序定义一个名字为MediaPlay的函数该函数的具体实现代码为 void PlayMovie(LPTSTR lpszMovie){ IMediaControl *pMC NULL; IGraphBuilder *pGB NULL; IMediaEventEx *pME NULL; long evCode; // something to hold a returned event code hr CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IMediaControl, (void **)pMC); hr pMC-QueryInterface(IID_IGraphBuilder, (void **)pGB); hr pMC-QueryInterface(IID_IMediaEventEx, (void **)pME); hr pGB-RenderFile(lpszMovie, NULL); hr pMC-Run(); hr pME-WaitForCompletion(INFINITE, evCode); if(pMC)pMC-Release(); if(pGB)pGB-Release(); if(pME)pME-Release();} 上述代码中CoCreateInstance函数创建了一个过滤器图表Filter Graph对象并返回一个媒体控制ImediaControl接口这个接口通过过滤器来实现播放、暂停、停止等媒体放映功能但是这时候图表对象并不包含具体的过滤器因为此时DirectX并不清楚需要播放何种类型的媒体接下来创建一个图表构建接口该接口可以实现创建过滤器图表、向图表对象添加、删除各种过滤器、列举当前过滤器图表中所有的过滤器、连接图表对象中的各个过滤器等功能本例中使用了IGraphBuilder 接口的RenderFile函数告诉DirectX需要播放的媒体文件名此时IgraphBuilder对象接口根据多媒体文件的类型自动向过滤器图表添加播放该类型媒体所需的的各种过滤器并实现其连接。 最后函数调用ImediaControl接口对象的Run()函数就可以开始播放媒体文件了。为了实现从头至尾的顺序播放完多媒体文件需要调用IMediaEventEx 对象接口的WaitForCompletion阻塞函数的运行直到媒体文件结束后才可以释放对象、结束函数的运行。