为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于DirectShow的p2p流媒体播放器的实现

2017-09-21 8页 doc 23KB 6阅读

用户头像

is_471618

暂无简介

举报
基于DirectShow的p2p流媒体播放器的实现基于DirectShow的p2p流媒体播放器的实现 基于DirectShow的p2p流媒体播放器的实 现 2007年第3期 第9卷(总第43期) 淮南师范学院 JOURNALOFHUAINANTEACHERSCOUGE No.3,2007 GeneralNo.43,Vo1.9 基于DirectShow的p2p的实现 刘若愚 (中国科学技术大学软件学院,安徽合肥230052) 【摘要】文章介绍了一种基于DirectShow技术的p2p流媒体播放器,主要着重于 几项关键技术: 缓冲层的设计,源过滤器的设计和过...
基于DirectShow的p2p流媒体播放器的实现
基于DirectShow的p2p流媒体播放器的实现 基于DirectShow的p2p流媒体播放器的实 现 2007年第3期 第9卷(总第43期) 淮南师范学院 JOURNALOFHUAINANTEACHERSCOUGE No.3,2007 GeneralNo.43,Vo1.9 基于DirectShow的p2p的实现 刘若愚 (中国科学技术大学软件学院,安徽合肥230052) 【摘要】文章介绍了一种基于DirectShow技术的p2p流媒体播放器,主要着重于 几项关键技术: 缓冲层的设计,源过滤器的设计和过滤器图的构建. [关键词]DirectShow;流媒体播放器;p2p [中图分类号],IP317【文献标识码]A[文章编号]1009—9530(2007)03一O118—03 1引言 随着高带宽网络的发展.多媒体应用服务越来 越深入人们的生活但是用户需要连接到服务器 上.要以大网站为中心,才能享受到服务.P2p技术 (也称为对等网络技术)是一种网络结构的思想, 使得用户可以通过互联网直接交互.直接连接到 其他用户的计算机,交换文件,真正地消除中间 商P2P技术改变了互联网现在的以大网站为中 心的状态,重返"非中心化",并把权力交还给用 户.P2P流媒体的应用是在P2P文件交换的基础 上产生的.用户在互联网上观看视频流媒体时,可 以与同时在观看该视频的用户之间进行资源利 用.用户可以从这些用户中同时下载该视频.这比 过去只能从服务器端下载.明显在效率与速度上 要快许多.不用一个完整文件全部下载完成,就可 一 边下载一边播放本文介绍了一种基于 DirectShow技术的p2p流媒体播放器.讨论的重点 是播放器缓冲层的设计以及DirectShow在编写一 个p2p流媒体网络播放器中的应用 2DirectShow DirectShow是微软公司提供的一套在 Windows平台上进行多媒体处理的开发包.为多媒 体流的捕捉和回放提供了强有力的支持运用 DirectShow.我们可以很方便地播放从本地文件和 网络播放多媒体流.从支持WDM驱动模型的采集 卡上捕获数据.并且能广泛地支持各种媒体. Directshow是通过自定义或内置的称为过滤 器的COM组件来控制和处理多媒体数据的体系 结构.该结构定义了如何控制和处理过滤器内部 和相互间的多媒体数据流.Directshow的基本结构 是过滤器(fliter)和针(pin).过滤器是一个执行特 定任务的COM对象.针是过滤器之间单方向数据 流的连接点.通过针将过滤器连接起来,完成一个 给定的任务.这样的集合成为过滤器图表(filter graph).Directshow通过filtergraph管理整个数据 流. 图1DirectShow系统结构图 因此Directshow的核心部分是过滤器图表 一 个典型的过滤器图表由源过滤器,转换过滤器 和表现过滤器组成源过滤器从一些数据源取数 据并将其导入过滤器图;转换过滤器用来获取,处 理和传送媒体数据.它包括分离视频和音频的切 分过滤器,解压视频数据的视频解码过滤器,解压 音频数据的音频解码过滤器:表现过滤器用来在 硬件上表现媒体数据.如显卡和声卡或是磁盘文 件等.它包括用来显示图像的视频表现过滤器和 将音频数据送到卡上去的音频表现过滤器. DirectshoW提供过滤器图表管理器(FilterGraph Manager)管理Filter的连接以及完成对Filter中数 据流的控制.它还可以传递事件通知给应用程序, 以便用户程序响应事件 3基于DirectShow的p2p流媒体播放器 【收稿日~12007—03—18 【作者简介】刘若~(1983--),男,安徽池州人,中国科学技术大学软件学院硕士研究 生,研究方向为软件I==l===程. 第3期刘若愚:基于DirectShow的p2p流媒体播放器的实现119 p2p流媒体播放器结构图如图2所示. 图2流媒体播放器结构图 因为需要缓冲数据.并且需要共享数据.所以 本播放器采用两层模块即流媒体缓冲层和流媒体 播放层实现由于主要播放rill和tinvb格式的文 件.因此SplitterFilter使用RealSplitterFilter. 3.1流媒体缓冲层的设计 流媒体缓冲层保证客户端之间的数据共享. 流畅地播放媒体.基本设计理念是所有的操作都 在内存中完成.在物理内存充裕的前提下.对硬盘 没有任何影响.采用循环队列实现.缓冲层具有多 种功能. 3.1.1最大读取替换原则 作为共享流媒体的源客户端.其硬盘拥有完 整的文件,总是出现在数据包请求的供给队列中. 而且共享的流媒体客户可以是任意多个.每个客 户需要的数据也不尽相同.因此.其硬盘读取是无 法避免的.因为读取的次数越多.在一定时间内. 文件块在客户端分布得越广泛.需要源客户提供 的可能性越小所以为了最大限度地减少硬盘读 取次数,客户端每次替换的缓冲数据,必定是已经 被读取次数最多的.称为最大读取替换原则. 3.1.2预请求 提前向P2P共享客户端请求用户将来最可能 需要的数据.获取当前正在播放的流数据包之后 的所有数据包.所能获得的最多数据包数量取决 于缓冲队列的大小.缓冲数据包的请求异步进行. 发现有空闲空间或据MRR原则每隔一定时间系 统会检查每个数据块的读取次数.获取可被替换 的数据块数目.向P2P客户层请求新数据块 3.1.3强迫缓冲 由于启动RealMedia播放需要文件头信息和 索引块因此对文件头信息和索引块的缓冲做强 行处理.即在客户端的缓冲区中单独开辟空间作 为其缓冲.这两块缓冲不在丢弃替换的范围.只要 客户端还处在共享状态中.就保证拥有头信息和 索引块.使得新加入共享的客户端能在最短的时 问内获得必要的数据,启动播放器 3.1.4向流媒体播放层传递数据 根据流媒体播放层传来的数据的位置和数据 长度.若是本地文件,则从文件系统读取,若是共 享文件.则判断是读取媒体文件的第一块,索引块 还是其他任意块 3.1.5同p2p协议客户层交换数据 从p2p协议客户层获取数据:若是媒体文件 的第一块,索引块则读入指定的缓冲区.若是媒体 文件的其他块则读入共享缓冲区;向p2p协议客 户层传送数据:若是媒体文件的第一块,索引块则 整块传送.若是媒体文件的其他块.则按所需的数 据长度传送 3.1.6缓冲层的接口函数 所有接口函数全部封装在名为bufferstream 的类中供流媒体播放层和p2p协议客户层调用. buffertoplayer(bytemem,UInt32pos,UInt32 length,int*read);从buffer中给播放层提供数据. 对第O和第1块数据进行强迫缓冲.判断用户是 否拖动进度条并进行处理 Buffertop2p(bytemem,intlength,intid);从 buffer发给p2p协议客户层数据. p2ptobuffer(bytechunk,intlength,intid,int blockid);从p2p协议客户层送给buffer数据. 3.2流媒体播放层的设计 图3p2p流媒体播放层过滤器图 3.2.1源过滤器的设计 由于是从流媒体缓冲层请求数据.因此必须 要设计自己的源过滤器.这是设计流媒体播放器 的核心部分. I流媒障缓冲层l I cMelIIs口eml i 妇摅黠cM姗R髓defi 请求队列卜—__{处理线翟 fJr‰州. Isr~Outp,_ltPinI il RimlMe.diaS甜 图4源过滤器模块图 在源过滤器的模块结构中.过滤器CMem— Stream由基类CAsyncStream继承而来.处理从缓 冲层读取的数据.主要重载了以下函数:HRESULT SetPointer(LONGLONGllPos)//~置播放指针位置. 1lPos为从缓冲层获取数据的总长度:HRESULT Read(PBYTEpbBuffer.DWORDdwBytesToRead, BOOLbAlign.LPDWORDpdwBytesRead)//将数据 放入视频缓冲区:L0NGL0NGSizefLONGLONG pSizeAvailable)//得到可得视频数据的长度. 过滤器CMemReader由基类CAsvncReader继 120淮南师范学院第9卷 承而来.实现了CbaseFilter定义的OutputPin及相 应操作.特别是在OutputPin中封装了一个IAsyn. cReader接口.支持异步操作. 输出CAsyncOutputPin是拉(pul1)模式的pin, 它允许源过滤器下游的切分过滤器建立一个线程 并从源过滤器中pull媒体数据.所使用的切分过 滤器是RealMediaSpilter,其输入是pullpin,它从 CAsyneOutputPin的IAsyncReader接口中索取数 据为了两者能连接,CasyncOutputPin的输出类型 为MEDIATYPEStream.子类型是MEDIASUB— TYPEREALMedia.所有的数据请求都由异步I/O 操作类CAsyncIo来处理,而CAsyncIo的核心是请 求队列处理线程.它不停地从请求队列中取数据 请求并处理.实现异步数据请求操作. 总体数据流向为:在建立源过滤器时,CMem— Reader会建立一个CAsynclo对象且CAsyncIo对 象在合适的时候启动一个请求队列处理线程,然 后开始以下的处理流程:RealMediaSpilterFilter 向CAsyncOutputPin提出数据请求;CAsyncOutput— Pin将该请求加以包装并加入到CAsyncIo的请求 队列中.由处理线程来处理;处理线程通过内存流 类CMemStreanl来访问缓冲区,读取数据并将得到 的数据通过CAsyncOutputPin发送给RealMedia SpilterFilter. 3.2.2过滤器图的构建 首先调用CoCreatelnstance方法创建过滤器 图例:CoCreateInstanee(CI.SID—FilterGraph,NULL, CLSCTX— INPROC— SERVER,IID— IGraphBuilder, (void**)&m_pGraph).其中m_pGraph为Ifilter- Graph型指针.指向已生成的过滤器图表.. 然后调用mpGraph的AddFilter方法将源过 滤器加入到过滤器图表当中:m_ pGraph一>AddFil— ter(m_pMemReader,NU,其中mpMemReader 为指向源过滤器的指针. 取得必要的媒体播放接口: 媒体播放控制接口:m_pGraph一>QueryInter— faee(IID—IMediaControl,(void女)&m_pContro1) 播放事件接口:m_pGraph一>Querylnterface(I— ID_IMediaEvent,(void**)&m_pEvent) 播放位置和播放速度控制接口:m_ pGraph一> Querylnterface(IID_IMediaSeekin~(void崦 &m_ pSeeking) 每次调用接口时.调用AddRef方法增加该接 口的引用次数.停止调用该接口时,调用Release 方法降低该接口的引用次数. 3.2.3启动播放,暂停或停止播放 调用IGraphBuilder的Render方法.将源过滤 器输出针的数据加入过滤器图表: m_pGraph一>Render(m_pMemReader->GetPin (0)) 然后调用m_ pControl一>Run()启动播放,其中 mpControl为IMediaControl型指针.调用 m_ pControl一>Pause();m_pControl->Stop()可以实 现暂停和停止播放. 实际应用该播放器的结果表明.它能很好地 完成同用户的共享,实现解码功能,并能对播放器 作比较理想的控制.达到了设计要求. 参考文献 [1]MicrosofiCorporation.DirectX9.0SDK 『2]陆其明.DirectShow开发指南【M】.北京:清华大学出版社
/
本文档为【基于DirectShow的p2p流媒体播放器的实现】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索