(计算机应用技术专业论文)基于rtp的流媒体实时传输系统研究与实现.pdf_第1页
(计算机应用技术专业论文)基于rtp的流媒体实时传输系统研究与实现.pdf_第2页
(计算机应用技术专业论文)基于rtp的流媒体实时传输系统研究与实现.pdf_第3页
(计算机应用技术专业论文)基于rtp的流媒体实时传输系统研究与实现.pdf_第4页
(计算机应用技术专业论文)基于rtp的流媒体实时传输系统研究与实现.pdf_第5页
已阅读5页,还剩58页未读 继续免费阅读

(计算机应用技术专业论文)基于rtp的流媒体实时传输系统研究与实现.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南京航空航天大学硕士学位论文 i 摘 要 流媒体技术是近年来研究的一个热点。随着 internet 的普及与发展, 流媒体技术在网络中有着越来越广泛的应用,如视频会议、视频点播、电 话和远程教育等,己经从实验室逐步应用到商业领域。 流媒体在网络上的实时传输具有三个主要特点:一是需要非常高的带 宽;二是对实时性要求很高;三是数据往往都是突发的。而当前的网络状 况是网络带宽不够高,传输多媒体数据时还会有不可预知的延迟,而且目 前的网络质量还不可避免地出现丢包现象。如何解决媒体流在网络上传输 的特点与当前网络状况的矛盾,是一个极具挑战的课题。 通过对 rtp/rtcp 协议、视频编解码技术、directshow、时间戳、组 播等流媒体实时传输相关技术的研究,本文提出了一个基于 rtp 的流媒体 实时传输系统的设计方案。该系统具有音视频采集、编码、网络传输、解 码、和回放等功能,较好的解决了目前网络流媒体传输存在的网络带宽较 窄等问题。这些功能都采用软件实现,采用视频压缩标准 mpeg-4 对视频 进行编码解码。在硬件方面只作较少的投资,因此,成本低,易于升级。 根据该设计方案,本论文完成了该系统的开发工作,实现了音视频的采集、 压缩、实时传输、解压以及回放等功能。 关键字:关键字:流媒体, rtp/rtcp, directshow,组播,windows sockets 南京航空航天大学硕士学位论文 ii abstract streaming media technology is a hot issue in research these year.with the development and popularization of internet, streaming media technology is widely applied in network, such as video conference, vod, ip telephone and remote education. it has been applied from laboratory to commercial field. real-time transmission of streaming media have three main feature. the first is the need of wide bandwidth, the second is the high real time need and the third is the gusty data.however,the status of current network is narrow bandwidth,unpredictable delay while transmitting multimedia data,and appearing the phenomenon of losing package. how to resolve the confliction between the need of multimedia stream transmission and the status of current network is a defiant task. by the study of rtp/rtcp protocol,video encod/decode technic, directshow, timestamp and multicast, the paper brought forward the design project of streaming media real-time system based on rtp.the system has the function of video/audio capturing, encoding, network transmission,decoding,storage and playback.it resolved some problems such as streaming media transmission on narrow banwidth better.these functions were accomplished by software with using mpeg-4 standard to encode and decode video stream. because of the little investment on hardware,the system has the virtue of low cost and easier upgrade.accoding to design project,the paper finished the development work and the function of capture,encodeing,real-time transmission,decoding and playback. key words: streaming media, rtp/rtcp, directshow, multicast, windows sockets 南京航空航天大学硕士学位论文 承诺书 本人郑重声明:所呈交的学位论文,是本人在导师指导下,独立进 行研究工作所取得的成果。尽我所知,除文中已经注明引用的内容外, 本学位论文的研究成果不包含任何他人享有著作权的内容。对本论文所 涉及的研究工作做出贡献的其他个人和集体,均已在文中以明确方式标 明。 本人授权南京航空航天大学可以有权保留送交论文的复印件,允许 论文被查阅和借阅,可以将学位论文的全部或部分内容编入有关数据库 进行检索,可以采用影印、缩印或其他复制手段保存论文。 (保密的学位论文在解密后适用本承诺书) 作者签名: 日 期: 基于 rtp 的流媒体实时传输系统研究与实现 v 图表清单 图 2.1 流媒体实时传输系统物理模型.6 图 2.2 系统逻辑框架图.7 图 2.3 音视频采集网络发送模块框架图.8 图 2.4 媒体服务器模块框架图.9 图 2.5 客户端回放模块框架图.9 表 2.1 h.263 与 mpeg-4 的比较图.10 图 3.1 vop 编码器结构图.15 图 3.2 xvid 对关键帧编码的流程图.19 图 3.3 应用程序与 windows sockets 关系图.21 图 3.4 directshow 的系统结构图 .24 图 3.5 directshow filter 流程图.24 图 3.6 rtp 报文的封装 .33 图 3.7 rtp 报头格式 .33 图 4.1 网络发送 rtp 拆帧流程图 .42 图 4.2 网络接受 rtp 组帧流程图 .45 图 4.3 组播参数的设置属性页图.46 图 4.4 xvid 解码参数设置属性页.49 图 4.5 视频采集前端效果.51 图 4.6 视频采集服务器端效果.51 图 4.7 客户端回放效果.52 南京航空航天大学硕士学位论文 1 第一章 绪论 1.1 流媒体技术 流媒体技术是指采用流式传输方式在网络上播放多媒体的技术,而流 式传输方式是将经过特殊编码的多媒体文件分成一个个压缩包,由服务器 向用户计算机连续、实时传送。在采用流式传输方式的系统中,用户不必 像采用下载方式那样等到整个文件全部下载完毕,而是只需经过几秒或几 十秒的启动延时即可在用户的计算机上利用解压设备(软件或硬件)对压 缩的多媒体文件解压后进行播放和观看。与单纯的下载方式相比,这种多 媒体文件边下载边播放的流式传输方式不仅使启动延时大幅度地缩短,而 且对系统缓存容量的要求也大大降低。因而采用流媒体技术是解决当前网 络远程教学,视频会议等音视频的传输问题的有效途径。 流媒体概念包括以下两个层面 1: 其一,流媒体是计算机网络(尤其是 internet/intranet)上需要实时传 输的多媒体文件。在传输前需要压缩处理成多个数据包,并附加上与其传 输有关的信息,形成实时数据流。实时数据流最大的特点是允许播放器及 时反应而不用等待文件下载。 其二,流媒体对多媒体信息进行“流化”处理,是一种解决问题的方 式,可以使视频等对实时性要求严格的多媒体文件在 internet/intranet 上, 在既无下载等待要求又不占用客户端硬盘空间的情况下保证实时播放。 流媒体技术不是单一的技术,它是计算机技术、网络通信技术、多媒 体技术和数字压缩技术等多学科、多领域融合交叉结合的产物。它涉及流 媒体数据的采集、压缩、存储、传输以及网络通信等多项技术,因此加大 了研究的难度和复杂性。 1.1.1 流媒体技术发展 internet/intranet 上使用较多的流媒体技术主要有 realnetworks 公司的 real system,microsoft 公司的 windows media technology 和 apple 公司的 quicktime,它们是流媒体传输系统的主流技术,在这里介绍前两种 2。 1. real system 基于 rtp 的流媒体实时传输系统研究与实现 2 real system 由媒体内容制作工具 real producer、 服务器端 realserver、 客户端软件(client software)3 部分组成,其流媒体文件包括 realaudio, realvideo,real presentation 和 realflash4 类文件,分别用于传送不同的 文件。real system 采用 surestream 技术,自动地并持续地调整数据流的流 量以适应实际应用中的各种不同网络带宽需求,轻松实现视音频和三维动 画的回放。real 流式文件采用 real producer 软件进行制作,首先把源文件 或实时输入变为流式文件,再把流式文件传输到服务器上供用户点播。 由于 real system 的技术成熟、性能稳定,美国在线(aol) ,abc, at 2枚举采集设备 采集设备在 directshow 框架下也是以过滤器的形式存在的,wdm 驱 动 模 型 的 采 集 设 备 使 用wdm video capture filter ( 实 现 文 件 为 kswdmcap.ax) ,vfw 驱动模型的采集设备使用 vfw captuer filter(实现 文件为 qcap.dll) 。应用程序只要枚举特定的类型目录,就能知道系统中安 装有多少个, 以及何种类型的采集设备。 视频采集设备注册在 video capture 基于 rtp 的流媒体实时传输系统研究与实现 37 sources 目录下, 该类型目录的 clsid 为 clsid_videoinputdevicecategory, 下面是枚举采集设备部分的实现: /创建系统设备枚举器接口, clsid_systemdeviceenum 是要建立对象 的类型, iid_icreatedevenum 是接口的 guid icreatedevenum *pdevenum = null; cocreateinstance(clsid_systemdeviceenum, null, clsctx_inproc, iid_icreatedevenum, (void *) /创建一个视频采集的枚举器 ienummoniker *pclassenum = null; pdevenum-createclassenumerator(clsid_videoinputdevicecategory, ulong cfetched; imoniker *pmoniker = null; ibasefilter *psrc = null; while (pclassenum-next(1, /将采集过滤器加到过滤器图中。 pgraph-addfilter(psrc, lrgb video capture); /添加后要将枚举设备时创建的 imoniker 指针、设备列表释放掉 pmoniker-release();/释放 moniker pclassenum-release();/释放类枚举器 pdevenum-release();/释放设备枚举器 3视频采集与预览 directshow 采用 wdm 方式进行视频捕捉,因此在实现视频回放功能 时,它直接把捕捉到的视频流从采集设备送到显示设备,数据流在核心模 式下传输,减少了到用户模式的切换时间,使视频的实时性得到保证。 基于 rtp 的流媒体实时传输系统研究与实现 38 /用 renderstream 方法将视频源过滤器和预览连接起来 g_pcapture-renderstream( /设置将采集数据的输出文件 g_pcapture-setoutputfilename( /用 renderstream 将视频源过滤器和文件过滤器连接起来 g_pcapture-renderstream( 如果既指定了pin_category_capture又指定了 pin_category_preview, renderstream 方法会自动插入一个 smart tee 过滤器将数据分流。 各个过滤器连接完毕后,就可以进行视频的采集和预览了。 4控制采集过程 过滤器图的 imediacontrol 接口提供方法来运行、终止和暂停整个图, 但 是 如 果 图 中 有 多 个 数 据 流 , 想 独 立 地 控 制 它 们 则 要 使 用 icapturegraphbuilder2: controlstream 方法,要采集流运行一段时间停止, 而预览流仍在运行代码如下 imediacontrol *pcontrol; reference_time rtstart = 20000000, rtstop = 50000000; / 采集流在 2 秒时启动,在 5 秒时停止 pbuilder-controlstream( pgraph-queryinterface(iid_imediacontrol, (void *) pcontrol-run(); 4.1.2 音视频编码 1视频编码过滤器的开发 本系统采用的编码器是开放源代码的 xvid mpeg-4 编码器。该编码器 是一群原 opendivx 义务开发者在 opendivx 停止开发后自行开发的。 xvid 编码的 api 在上一章中已经介绍过了,现在集中介绍如何利用这些 api 进 行编码器的过滤器设计。本系统中自行设计的几个过滤器都是在微软提供 的 directshow 基类库上开发的,因此这里只介绍重载了的基类方法中重要 基于 rtp 的流媒体实时传输系统研究与实现 39 的部分。 xvid mpeg-4 encoder filter是 一 个 传 输 过 滤 器 , 基 类 选 择 ctransformfilter,要开发的过滤器类 cxvidencoderfilter 从该基类派生, 它的输出 pin 由 ctransformoutputpin 基类派生。 cxvidencoderfilter:completeconnect: 该函数重载了 ctransformfilter: completeconnect 函数,它除了调用 ctransformfilter:completeconnect 功 能外,还要调用 xvid_encore 函数创建编码实例。在调用前先填充一个 xvid_enc_param结 构 , 其 指 针 作 为 参 数paraml , opt参 数 为 xvid_enc_create。 cxvidencoderfilter:breakconnect: 这个函数重载了 ctransformfilter: breakconnect 函数,它调用 xvid_encore 来销毁编码实例。 cxvidencoderfilter:transform:这个函数重载了 ctransformfilter:transform 函数。它调用 xvid_encode 执行实际的编码操 作 。 在 调 用 前 先 填 充 一 个 xvid_enc_frame 结 构 , 其 指 针 作 为 参 数 param1,opt 参数为 xvid_enc_encode。 此外,该 filter 的输出 pin 实现了 iamvvideocompression 接口,这个 接口可以用于调节编码质量、关键帧等。 2视频编码过滤器的调用 该编码器的类别号字符串是 “44495658-0000-0010-8000-00aa00389b71” , 通过 define_guid 函数 可以将该字符串转变为编码器类别号(clsid):clsid_xvid define_guid(clsid_xvid, 0 x44495658, 0 x0000, 0 x0010, 0 x80, 0 x00, 0 x00, 0 xaa, 0 x00, 0 x38, 0 x9b, 0 x71); 通过 cocreateinstance 函数可以得到 xivd mpeg-4 编码过滤器的指 针: ibasefilter * pxvidfilter; hr = cocreateinstance (clsid_xvid, null, clsctx_inproc_server, iid_ibasefilter, (void*) 将 xivd mpeg-4 编码过滤器以”mpeg-4 xvid compressor”的名称添加 到过滤器图形管理器中: hr = g_pgraph-addfilter(pxvidfilter,l” mpeg-4 xvid compressor”); (3) 音频编码的实现 音频编码选用 directshow 系统的 mpeg layer-3 音频编码过滤器该编 基于 rtp 的流媒体实时传输系统研究与实现 40 码器的类别号字符串是“00000055-0000-0010-8000-00aa00389b71” ,转 换为编码器类别号 clisid_mp3 define_guid(clsid_mp3, 0 x00000055, 0 x0000, 0 x0010, 0 x80, 0 x00, 0 x00, 0 xaa, 0 x00, 0 x38, 0 x9b, 0 x71); 得到该过滤器指针,并添加到过滤器图形管理器中: ibasefilter * pmp3filter; hr = cocreateinstance (clsid_ mp3, null, clsctx_inproc_server, iid_ibasefilter, (void*) hr = g_pgraph-addfilter(pmp3filter,l” mpeg layer-3 compressor”); 4.1.3 流媒体网络发送 4.1.3.1 网络发送过滤器结构 网络传输过滤器实现构建的类为 cnetworksend,从 cbasefilter 派生, 该过滤器有一个 input pin,没有 output pin。 input pin 类为 cinputpin,从 cbaseinputpin 派生。cinputpin 类主要实 现以下函数: getmediatype 函数,得到该 pin 上推荐使用的媒体类型。 checkmediatype 函数,该 pin 连接过程中对连接用的媒体类型进行检 查,仅接收可接受的媒体类型。 receive 函数,上一级过滤器通过该函数将数据传如,然后委托给过滤 器上的 send 函数进行实际的处理。 过滤器类 cnetworksend 实现的框架函数主要有: createinstance 函数:创建一个 cnetworksend 类的实例。 getpincount 函数,返回 1,表示该过滤器仅有一个 pin。 getpin 函数,返回 input pin 的对象指针。 nondelegatingqueryinterface 函 数 , 暴 露 过 滤 器 上 新 实 现 的 接 口 , ispecifyproperty pages、inetsendconfig、ipersiststream 等。 stop 函数,当 filter 进入停止状态时,销毁 socket 资源。 send 函数:接受上级过滤器传来的数据,并调用 cnetsender 的 send 函数,完成网络发送,cnetsender 类的实现将在下面探讨。 基于 rtp 的流媒体实时传输系统研究与实现 41 cnetworksend 还实现一系列的接口,inetsendconfig 可以让用户设置 发送的 ip 地址、本地 socket 绑定的端口号等;ispecifypropertypages 接口 用于指定过滤器的属性页;ipersiststream 接口用于将过滤器内部参数保存 到 grf 文件。 4.1.3.2 rtp 网络传输实现 cnetsender 是主要负责 cnetworksend 网络发送的类,网络发送协议 采用 rtp 协议,本系统使用的是 jrtplib rtp 库。 发送流媒体数据的主要流程是:获得接收端的 ip 地址和端口号,创 建 rtp 会话 ,指定 rtp 数据接收端,设置 rtp 会话默认参数 ,发送流媒 体数据。 在 使 用 jrtplib 进 行 实 时 流 媒 体 数 据 传 输 之 前 , 首 先 生 成 rtpsession 类的一个实例来,调用 create() 方法来对其进行初始化操作。 rtpsession m_sess; dw = m_sess.create(ulnic); 设置恰当的时戳单元(调用 rtpsession 类的 settimestampunit 方法), 并且设置好数据发送的目标地址,rtp 协议允许同一会话存在多个目标地 址 , cnetsender 函 数 通 过 调 用 rtpsession 类 的 adddestination() 、 deletedestination() 和 cleardestinations() 方法来完成地址的添加、删除 和清除。 目标地址全部指定之后,调用 rtpsession 类的 sendpacket() 方法, 向所有的目标地址发送流媒体数据。sendpacket() 是 rtpsession 类提供 的一个重载函数对于同一个 rtp 会话来讲,负载类型、标识和时戳增量 通常来讲都是相同的,jrtplib 允许将它们设置为会话的默认参数,这是 通过调用 rtpsession 类的 setdefaultpayloadtype()、setdefaultmark() 和 setdefaulttimestampincrement() 方法来完成的。为 rtp 会话设置这 些默认参数的好处是可以简化数据的发送。 基于 rtp 的流媒体实时传输系统研究与实现 42 在网络带宽比较低的情况下(如十几 kbps) ,数据丢帧现象比较严重, 这对于图像质量有很大的影响。因此采用拆帧(拆成 1400 个字节)以后再 发送的方法,来降低丢帧率。接收端收到数据后,再把属于同一视频帧的 数据再组起来。网络发送程序流程图如图 4.1 所示 图 4.1 网络发送 rtp 拆帧流程图 发送端拆帧的算法如下: if (该数据帧小于 1400 个字节) 直接用 rtpsessio: :send()发送出去。 else 把该帧拆成 1400 个字节一个包再发送。对于同一帧数据,我们 采用相同的时间戳来标记。 4.1.3.3 网络发送过滤器调用 网络发送过滤器的构建完毕注册后,就可以调用网络发送过滤器了, 网络发送过滤器的类识别号字符串会在开发的过程中定义,根据定义的字 符串转变为过滤器类别号 clsid_netsend,通过 cocreateinstance 函数可 开始发送 该帧不大于1400bytes? 通过rtp发送数据 把该帧拆成不大于 1400bytes的包 否 网络 是 基于 rtp 的流媒体实时传输系统研究与实现 43 以得到网络发送过滤器的指针: ibasefilter * pnetsendfilter; hr = cocreateinstance (clsid_ netsend, null, clsctx_inproc_server, iid_ibasefilter, (void*) 将网络发送过滤器以”net send”的名称添加到过滤器图形管理器中: hr = g_pgraph-addfilter(pnetsendfilter,l” net send”); 4.2 媒体服务器的实现 4.2.1 服务器网络接收 4.2.1.1 网络接收过滤器框架 1. 网络接收过滤器的框架 网络接受过滤器实现类为 cnetworkreciverfilter,从 cbasefilter 类派 生 , 实 现 的 框 架 函 数 主 要 有 : createinstance函 数 , 创 建 一 个 cnetworkreceiverfilter 类的实例; getpin 函数, 返回 output pin 对象指针; nondelegatingqueryinterface 函数, 暴露 filter 上新实现的接口; stop 函数, 当过滤器进入停止状态时,销毁 socket 资源。cnetworkreceivefilter 只有 一个 output pin,定义为类 cnetoutputpin,从 cbaseoutputpin 类派生, cnetoutputpin 类主要实现的函数有:getmediatype 函数,得到该 pin 上 推荐使用的媒体类型;checkmediatype 函数,对连接过程中的媒体类型进 行检查,仅接收本系统中定义的媒体类型;decidebuffersize,决定该 pin 使用的 sample 管理的属性(sample 内存的大小,个数等) ;initallocator 函数,创建该 pin 使用的 sample 管理器对象,获取 sample 管理器对象的 指针。 4.2.1.2 推模式的实现 在 directshow 中,数据传输有拉(pull)和推(push)二种模式。在推模式 下,上游滤波器决定数据传输,它将数据主动发送到下游滤波器中;在拉 模式下,下游滤波器决定数据传输,它在需要数据时向上游滤波器索取, 而 上 游 滤 波 器 不 主 动 向 下 游 滤 波 器 发 送 数 据 , 推 模 式 使 用 的 是 基于 rtp 的流媒体实时传输系统研究与实现 44 imeminputpin 接口,拉模式使用 iasyncreader 接口,推模式比拉模式要更 常用。而我们所要开发的网络接收过滤器显然要采用推模式。 实现网络接收过滤器的“推”模式主要还定义了以下几个工具类: cbuffer:封装了一定大小的内存(8192 字节) ,用于一块数据的读写, 可以放到缓存池中循环使用。 cbuffpool:维护了包含一定数量的 cbuff 类型的缓存对象的双向列 表。这个列表中的每一个缓存对象都能被重用:外部调用者需要用缓存时, 从列表中取出一个空闲的缓存对象,然后使用;使用完毕后,将该缓存对 象回收到列表中,等待下一次使用。 ctsmediasample:自定义 sample 类,因为 directshow 中以 sample 的形式来传递数据,所以定义这个类来包装 cbuffer 类型的缓存对象。 ctsmediesamplepool: sample 池 类 , 维 护 了 一 个 包 含 一 定 数 量 的 ctsmediasample 类型的 sample 对象的双向链表,这个列表中每一个 sample 对象都可以被重用。 cnetrecvallo: 自定义的 sample 管理器类, directshow 的标准设计中, 使用 sample 管理器(allocator)来管理 pin 上使用的 sample。 cnetreceiver:实现了网络数据(异步方式)的接收,然后以 sample 的形式“推”给下一级过滤器的整个控制流程。外部调用者调用 activate 函数创建接收网络数据的 rtp 会话,启动控制线程,开始一个从网络数据 接收到 sample 到 sample 发送的反复过程。 4.2.1.3 rtp 会话接收数据 流媒体数据 rtp 接收的主要流程是:获得用户指定的端口号,创建 rtp 会话,设置接收模式,接受 rtp 数据,检索 rtp 数据源,获取 rtp 数据报,删除 rtp 数据报。 在本系统中,通过 cnetreceiver 的 activate 函数中创建 rtp 会话,来 接收来自定义端口的 rtp 数据, rtp 数据报有三种接收模式,其中每种 接收模式都具体规定了哪些到达的 rtp 数据报将会被接受,而哪些到达 的 rtp 数据报将会被拒绝。通过调用 rtpsession 类的 setreceivemode() 方法可以设置下列这些接收模式: receivemode_all 缺省的接收模式, 所有到达的 rtp 数据报都将 被接受; 基于 rtp 的流媒体实时传输系统研究与实现 45 receivemode_ignoresome 除了某些特定的发送者之外,所有到 达 的 rtp 数 据 报 都 将 被 接 受 , 而 被 拒 绝 的 发 送 者 列 表 可 以 通 过 调 用 addtoignorelist()、deletefromignorelist() 和 clearignorelist() 方法来进 行设置; receivemode_acceptsome 除了某些特定的发送者之外,所有到 达 的 rtp 数 据 报 都 将 被 拒 绝 , 而 被 接 受 的 发 送 者 列 表 可 以 通 过 调 用 addtoacceptlist ()、 deletefromacceptlist 和 clearacceptlist () 方法来 进行设置。 流媒体数据的接收主要在 cnetreceiver 的 pendreads 中函数实现, sess.create(localport)创建rtp会话,sess.setreceivemode (receivemode_acceptsome)设置接收模式, sess.addtoacceptlist(remoteip, allports,portbase) 添 加 接 收 地 址 列 表 , sess.polldata() 接 收 数 据 , sess.gotofirstsourcewithdata() 检 索 数 据 源 , packet = sess.getnextpacket()获取 rtp 数据报,delete packet 删除数据报。 由于在教师机发送流媒体数据的时候经过了拆帧, 在接收数据的时候, 要把属于同一视频帧的数据再组起来,网络接收的流程图如图 4.2 所示: 图 4.2 网络接受 rtp 组帧流程图 接收端的组帧算法如下: while(该 rtp 包的时间戳和上一个 rtp 包的时间戳相同) 说明该 rtp 包和上一个 rtp 包属于同一个视频帧的数据。 把接收到的数据保存在缓存中。 网络 通过rtp接收数据 接收到的rtp包时间戳和 上一个rtp包相同? 循环接收直到接收到不同时 间戳的rtp包 组帧并发送给下一级过滤器 基于 rtp 的流媒体实时传输系统研究与实现 46 然后把属于同一视频帧的数据组好,发送到下一级 filter。 网 络 接 收 过 滤 器 实 现 后 , 就 可 以 调 用 网 络 发 送 过 滤 器 , 同 样 通 过 cocreateinstance 函 数 可 以 得 到 网 络 发 送 过 滤 器 对 象 的 指 针 , 并 通 过 addfilter 添加到过滤器管理器中。 4.2.2 rtp 网络组播 媒体服务器上的多媒体数据网络发送和前端教师机的网络发送框架基 本相似。不同的是网络发送的方式不同,前端教师机同服务器的数据传输 是一对一的单播方式,而媒体服务器的网络发送是一对多的组播方式。这 就要求网络中的路由器,客户机以及它们之间的网络结构必须支持组播, 防火墙也要设置成允许组播通过。客户机收到服务器发送的数据,网络接 口卡滤出组播群的 mac 地址,网络驱动器对此地址做出反应后,把数据 传递到 tcp/ip 协议栈,进入应用层就可以接收多媒体数据了。 为了实现组播功能需要实现一个 imulticastconfig 接口用来进行组播 设置,属性页类 cnetsendprop 用调用该接口设置组播的 ip 地址、端口号、 网卡地址等一系列的参数。属性页类 cnetsendprop 从 cbasepropertypage 类派生,并重写 cbasepropertypage 类中的一些函数。组播参数的设置属 性页如图 4.3 所示: 图 4.3 组播参数的设置属性页图 crtpnetsender 类取得属性页的参数,通过 hresult cnetreceiver: 基于 rtp 的流媒体实时传输系统研究与实现 47 joinmulticast_ (in ulong ulip, in ushort usport, in ulong ulnic )函 数创建组播组,设置组播参数,要调用 jrtplib 的 adddestination 函数将 组播地址添加到 rtp 会话的发送列表中,关键实现代码如下: dw = m_sess.create(ulnic);/创建 rtp 会话 m_sess.setmulticastttl(ulttl);/设置 ttl m_sess.cleardestinations();/清空地址列表 dw = m_sess.adddestination(ulip,usport);/设置组播地址加入列表 /设置 rtp 会话默认参数 m_sess.setdefaultmark(false); m_sess.setdefaultpayloadtype(1); m_sess.setdefaulttimestampincrement(1); /设置发送的最大长度 m_sess.setmaxpacketsize(int)m_dwpttransmitlength); 然后通过调用 m_sess.sendpacket()函数发送数据,视频数据的打包算 法仍然使用 4.1.3.2 节所使用的网络发送 rtp 拆帧算法,这里不再重复。 crtpnetsender 的 leavemulticast 函数主要用于撤消组播组,销毁 rtp 会 话。 4.3 客户端回放的实现 4.3.1 客户端数据接收 客户端数据接收和服务器的网络数据接受相似,需要获取服务器指定 的端口号, 加入服务器所创建的组播组, 创建 rtp 会话并检索 rtp 数据源, 即可接收 rtp 组播数据,需要注意的是 iner_addr()与 ntohl()函数要用对, 否则参数传不进去,接受列表中无值,会接受不到数据包。 另外,在数据接收过滤器的输出引脚需要设置视频的类型以及大小的 参数,具体实现在 cnetoutpin: getmediatype 函数中,设置格式如下: videoinfo *pvi = (videoinfo *) pmt-allocformatbuffer (sizeof(videoinfo); dword fccxvid = divx; pvi-bmiheader.bicompression = fccxvid; pvi-bmiheader.bibitcount = 24; 基于 rtp 的流媒体实时传输系统研究与实现 48 pvi-bmiheader.bisize = sizeof(bitmapinfoheader); pvi-bmiheader.biwidth = 320; pvi-bmiheader.biheight = 240; pvi-bmiheader.bisizeimage = getbitmapsize( setrectempty( setrectempty( pmt-setformattype( pmt-setsamplesize(pvi-bmiheader.bisizeimage); 设置完毕即可接收组播数据经过解码过滤器进行流媒体的回放。 4.3.2 音视频解码 视频解码器是一个典型的 transform filter。它由 cxviddecoderfilter 类 实 现 , 从cvideotransformfilter基 类 派 生 而 来 , 该 基 类 是 在 ctransformfilter 的基础上增加了质量控制(quality control) 8,过滤器根 据来自提交过滤器的质量消息通过 receive 方法来决定是否丢弃该帧,一 旦丢帧,后面的参考帧会全部丢弃,直到下一个关键帧的出现。 cxviddecoderfilter:completeconnect:这个函数重载了 ctransformfilter: completeconnect函数,它除了调用 ctransformfilter:completeconnect 的功能外,还要调用 xvid_decore 函数 创建解码实例。在调用前先填充一个 xvid_dec_param 结构,其指针作 为参数 param 1,opt 参数为 xvid_dec_create。 cxviddecoderfilter: breakconnect: 这个函数重载了 ctransformfilter: breakconnect 函 数 , 它 调 用 xvid_ecore 来 销 毁 解 码 实 例 ( opt 参 数 为 xvid_dec _destroy) 。 cxviddecoderfilter:transform:这个函数重载了 ctransformfilter:transform 函数。它调用 xvid_decore_func 函数执行实际 的解码操作。在调用前先填充一个 xvid_ dec_ frame 结构,其指针作 为参数 paraml , opt 参数为 xvid_dec_encode。 解 码 过 滤 器 通 过 调 用 函 数 cocreateinstance (clsid_xvid, null, clsctx_inproc_server, iid_ibasefilter, (void

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论