2024年6月3日发(作者:)

第34卷第3期 

2016年O5月 

佳木斯大学学报(自然科学版) 

Journal of Jiamusi University(Natural Science Edition) 

Vo1.34 No.3 

Mav 2016 

文章编号:1008—1402(2016)03—0430—03 

IPTV播放器数据源获取模块的设计与实现① 

袁明磊 ,陈业。 

(1.安徽国防科技职业学院。安徽。六安221600。2.六安大江信息技术有限公司安徽六安221600。 

3.冠捷显示科技有限公司厦门创新中心TV部。福建厦门361000) 

摘要: 对Itrl'V播放器数据源获取技术进行了研究,设计了一种易于扩展的数据源接口模 

块,为本地视频文件、RTSP数据源和HLS数据源的获取设计了解决方案。 

关键词: IP1V;流媒体;播放器;数据源 

中图分类号:TP37 文献标识码:A 

1 数据源获取模块设计 

由于IP网络自身具有开放性和互通性,IP1V 

可以很方便的为用户提供互动式服务,因I V采 

用高效率的流媒体播放技术,可以为用户提供更高 

清晰度的视频收视效果 J。 

为了解决IPTV多种数据源的读取问题,本文 

设计了一种易于扩展的IP1V数据源获取模块,该 

模块主要具备以下功能: 

(1)提供API供播放器服务端模块和音视频 

分离模块调用; 

2数据源获取模块的实现 

2.1数据源获取接口封装 

//数据源监听器 

class MediaSourceListner 

{ 

public: 

MediaSourceListner();//构造函数 

virtual~MediaSourceListner();//析构函数 

vitrual int notify(MediaSourceEvent&event):0; 

(2)获取普通Web服务器上的媒体流数据; 

(3)获取本地媒体文件的媒体流数据; 

(4)获取基于RTSP/RTP协议的服务器上的 

媒体流数据; 

(5)获取基于H1TI1P Live Streaming协议的服 

}; 

//各种协议所需具体实现的数据源获取虚基类 

class MediaSource 

{ 

public: 

务器上的媒体流数据; 

vitrual int open(string&url,int fd)=0;// 

(6)将媒体数据流数据的获取状态通知给播 

放器服务端模块。 

数据源获取模块的每一种协议都会有一个相 

应的数据源类(XxxSource)继承自MediaSource,且 

每一个数据源类都会包含一个封装该协议的读取 

器类(XxxReader)实例。 

MediaSourceListner为MediaSource的成员变 

打开指定的URL,并取得会话句柄 

vitrual int close(int fd)=0;//关闭会话句柄, 

释放资源 

virtual int read(int fd,char{buffer,int size, 

int readed)=0;//同步读取指定大小的数据 

vitrual int seek(int fd,long long int offset,int 

whence,long long int:Ic current)=0;//使读指针 

跳转到指定位置 

vitrual int getCurrent(int fd,long long int 

量,为MediaSource的使用者所注册,用于监听数据 

源获取时的状态。HttpSource和HttpLiveSource本 

质上都是从HTTP Server上获取数据,所以都依赖 

于类HttpReader。 

① 收稿日期:2016—03—22 

基金项目:安徽省自然科学研究重点项目(kJ2016A122)。 

current)=0;//获取当前的读指针所在位置 

vitrual int getAvailableSize(int fd,long long int 

作者简介:袁明磊(1985一),男,江苏沛县人,硕士,讲师,研究方向:计算机应用。 

第3期 袁明磊,等:IPTV播放器数据源获取模块的设计与实现431 

length)=0;//一次最多可以读取多大的数据量 

virtual int readAsync(int fd,char:Ic buffer,int 

size,MediaSourceListner ¥listener,void :l= ap— 

2.4 RTSP数据源获取 

pTag,int idReq)=0;//异步读取指定大小的 

数据 

virtual int abortRead(int fd,int idReq)=0;// 

在实现RTSP(Real Time Streaming Protoco1)数 

据源的获取时,首先需要定义一个继承自类Media. 

Source的RtspSource,结合Rtsp/Rtp协议客户端接 

口,分别予以实现虚基类中的各个接口即可。 

取消某次的异步读操作 

void regListner(MediaSourceListner:I=listner); 

//注册监听器 

void unregListner(MediaSourceListner¥list— 

ner);//取消已经注册的监听器 

private: 

MediaSourceListner m

_

prListner; 

}; 

图1流媒体的传输过程 

2.2数据源判别机制 

播放器服务端依据ud的路径规则选取不同 

的数据源,解释如下: 

(1)若url[0]==‘/’,则按照本地的方式 

通过FileSource获取媒体数据; 

(2)若url以“http://“或”https://“开头,首 

先会建立http request连接请求,根据http response 

回复的Content—Type,决定是否选择HttpLive— 

Source。若Content—Type为“application/x—mpe— 

gURL“,“application/vnd.apple.mpegud“,“audio/x 

mpegurl“三者之一,则选取HttpLiveSource获取 

媒体数据,否则选取HttpSource。 

(3)若以“rtsp://“开头,则选取RtspSource获 

取媒体数据。 

(4)若上述url判别规则都不满足,则返回通 

知事件“系统不予支持”。 

2.3 LOCAL数据源获取 

在实现Local数据源的获取时,首先需要定义 

个继承自类MediaSource的LocalSource,结合标 

准的文件I/O函数(open/close/lseek/read),分别 

予以实现虚基类中的各个接口即可。 

图2 RTP数据包接收处理过程 

2.4.1 RTP包的传输过程 

如图1所示,客户(以Web浏览器为例)向 

Web服务器发送HTI'P请求报文,Web服务器回复 

客户HTI'P应答报文。客户端从来自Web服务器 

的应答报文中获取到流媒体服务清单描述文件,然 

后启动与描述文件匹配的媒体播放器。播放器通 

过RTP/UDP向A/V服务器获取流媒体数据进行 

实时播放。在播放过程中,播放器与A/V服务器 

之间会不间断地通过RTSP/TCP(UDP)交换控制 

信息,智能地使播放器达到最佳播放效果 ]。 

2.4.2 RTP包的分析处理 

结合RTP包头定义的格式,对接收到的RTP 

包的处理流程如图2所示,解释如下: 

(1)从服务器端读取RTP数据包; 

432 佳木斯大学学报(自然科学版) 2016年 

(2)结合RTP包头定义规范,读取长度、时间 

戳、负载类型、是否有填充数据位等信息; 

(3)读取载荷类型,判断RTP包为音频包,还 

是视频包,并将数据存入到相应的缓冲区; 

(4)判断是否有填充数据,若存在,则将填充 

数据丢弃; 

(5)更新RTP包接收记录信息,主要是收到 

的字节数、数据帧数、序列号等。 

2.4.3 RTP包的缓冲空间管理 

为了便于流媒体数据的处理及控制,设置响应 

的缓冲区,缓冲区存在一个双向链表和一个数据缓 

冲区。链表中的每个节点对应一个RTP包,且每个 

节点严格按照时间戳进行排序。对于新接收到的且 

时间戳有效的RTP包,会将其数据存入缓冲区末 

尾,与之相应的新建的节点会依照时间戳排序插入 

双向链表的合适位置。因音频流和视频流是分开独 

立的,因而需要设计两个双向链表和两个缓冲区 。 

对于新到达的音视频数据,需要对其有效性进 

行判断:假设新到达的RTP包为音频流数据的话, 

首先提取新到达的音频数据的时间戳,与音频链表 

中第一个节点所对应的时间戳进行比较,若前者小 

于后者,视为无效。视频与此相似。 

播放器服务端模块若是需要播放时,会从双向 

链表的头节点开始,根据该节点所指示的缓冲区位 

置,依次读取所需的音频流或视频流数据,并将读 

取到的数据直接递送给解码器模块解码。 

2.5 HLS数据源获取 

割器负责将接收到的MPEG一2 TS流分割为一系 

列连续的、长度一样的小TS文件(后缀名为.ts,亦 

称作一系列的Ts切片),并依此发送和存储至内 

容分发系统中的Web服务器。对于视频点播 

(V0D),文件分割器(File Segmenter)首先将编码 

存储的媒体文件转换成MPEG一2 TS格式文件,然 

后将此Ts文件分割成一系列长度一样的小Ts文 

件。与流分割器一样,文件分割器亦会生成索引文 

件。因用于分割器转换分割的编码存储文件为静 

态文件,故视频点播方式下生成的静态文件亦是静 

态文件,其内容为该编码存储文件所对应的所有分 

段文件的URI列表。 

内容分发系统是一个普通的Web服务器或者 

Web缓存系统。几乎不需要对Web服务器作任何 

特别的配置,便可以将分割后的小1’S文件及其索 

引文件传送至客户端播放器。 

2.5.2 HLS客户端实现 

客户端会通过一个URL(HrITI'P Live Stream- 

ing)链接向Web服务器获取一个流媒体会话的索 

引文件,进而可以下载到索引列表中的每一个小 

Ts文件。当小rI's文件缓冲到一定的数量时,客户 

端播放器便可以将其拼接成一个连贯的Ts流,进 

而达到无缝播放。 

具体实现过程如下: 

(1)MediaPlayerServer调用HttpLiveSource的 

open()函数传人url连接; 

(2)HttpLiveSource通过HttpLiveReader获取 

到M3U文件(Ts索引文件); 

(3)HttpLiveSource通过M3UParser解析M3U 

文件,进而获取到索引文件中的各个Ts链接及其 

描述(例如时长); 

(4)HttpLiveSource通过HttpLiveReader获取 

各个TS链接的内容,并存储至HlsBuffer中。 

参考文献: 

[1]王相海.IP1V体系结构及其流媒体技术研究进展[J].通信 

学报,2012,33(4):1—7. 

与RTSP数据源获取的实现方式类似,HLS 

(H 1P Live Streaming)数据源获取也需要定义一 

个继承自类MediaSource的HttpLiveSource,结合 

Http Live Streaming协议的定义,分别予以实现虚 

基类中的各个接口即可。 

2.5.1 HLS服务器端部署 

个典型的H1TI甲Live Streaming流媒体系统 

由三部分组成:内容准备、内容分发和客户端软件。 

对于视频直播,编码器(Media Encoder)首先 

将摄像机实时采集来的音/视频数据压缩编码为符 

合特定标准的音/视频基本流,并以MPEG2一TS 

[2] 袁琦.应用在IfrrV中的CDN技术[J].电信网技术,2006, 

2:4—5. 

[3] 曾爱华.IPTV系统架构及主要技术[J].通信技术,2010,43 

(3):171—176. 

流的方式传给流分割器(Stream Segmenter)。流分 

The Design and Implementation ofⅡ’TV Hayer Data Source Acquisiiton Module 

YUANMing—feil, . CHEN Ye’ 

f1.AnhuiVocationalCollege ofDefenseTechnologyLuan221600,China;2.LuanBigRiverInformationTechnologyCo.Ltd.Luan 

221600.China:3.TPV Display Technology Co.Ltd.Xiamen Innovation Center TV section.Xiamen 361000,China) 

Abstract:This paper studied the data obtaining technology of IPTV player,designed an module which is 

easy to extend data source module,proposed an identification method of different data sources,designed solutions 

of how to obtain RTSP data sources and HLS data sources. 

Kev Words: IP1 ;streaming media;media player;data resource