关键词:流媒体RTPRTSP服务器视频点播
流媒体的市场空间迅速扩大,国内很多公司迅速介入流媒体产品的开发。国内的流媒体产品多借助于国外某些开源的RTP(实时传输协议real-timetransportprotocol)开发库进行开发,在国外开源的RTP开发库中,LiveMedia不但提供了基于RTP协议的开发库,而且对于开发库在视频点播,直播等方面的应用也给出相应的参考实例,这对于从事流媒体的开发人员来都具有较高的参考价值。整个库文件都是由标准的C++语言写成,能够跨平台编译,适合于构建低成本的流媒体应用系统,也适合于嵌入式系统。
1LiveMedia的整体架构
LiveMedia可分为三部分:RTP库、LiveMedia库和流媒体应用实例,RTP库的主要功能是采用RTP协议完成数据的发送,LiveMedia库主要功能是实现对各种媒体类型和编码格式的支持,应用实例主要用于说明如何应用RTP库开发流媒体应用程序。下面分别对三部分作详细描述。
11RTP库
RTP库又可分为三部分:UsageEnvironment库、Groupsock库和BasicUsageEnvironment库。为了区分这三部分,在源程序目录中有三个子目录来分别放置这三个库,这三个子目录的名字分别是三个库的名字,即UsageEnvironment、Groupsock和BasicUsageEnvironment。
UsageEnvironment库中包括了三个主要的类:UsageEnvironment类、TaskScheduler类和HarshTable类,这些类都是抽象的基类,它们的实现都在其子类中完成。其中HarshTable类定义了通用Hash表的接口,主要为其它类服务。Hash表对象中存放的是诸如Socket句柄一类的对象,一旦程序需要,能够实现快速查找。UsageEnvironment类和TaskScheduler类主要用来处理延时事件,异步读取事件和输出错误或警告信息。延时事件处理是指对多媒体文件的传输处理,由于多媒体文件一般都较大,要完全发送到客户端需要经过较长一段时间,客户端的播放程序要播放完这个文件一般也要经过一段时间。这样,为了实现边传输边播放,在服务器端将文件读出后,根据多媒体文件的播放速度,每隔一段时间,发送一次数据,这些发送任务都发生在文件播出指令以后,以自动方式进行,不断循环,直到文件发送完毕或遇到停止指令。异步读取事件处理是指程序通过Socket以异步方式接收指令,并进行相应的处理。输出错误或警告信息是指在整个程序运行过程中,如果出错误或警告信息,该部分负责输出。
Groupsock库中的类封装了网络接口和套接字,在这里完成指令和数据的收发任务。在有些情况下其中的Groupsock类还可以完成多播数据的发送和接收任务。
BasicUsageEnvironment类定义了UsageEnvironment类的一个具体实现,用作配置基本环境。
12LiveMedia库
这个库在代码目录中也有对应的子目录,目录名是LiveMedia。这部分是LiveMedia的核心,可以实现RTP和RTSP会话的建立、各种RTPpayload的打包和解析以及RTSP的控制等。其中定义了一个基类Medium,其它各种与流媒体类型和编码有关的类都从这个类继承。以下是基类Medium与其部分子类的关系图。在这里,MediaSink用于从其它模块接收数据并进行处理。MediaSource用于自身产生数据或接收其它模块的数据,并可以将其输出。Mpeg1or2Demux用于将Mpeg1或Mpeg2格式的程序流文件的声音、图像分离。RTSPServer用于建立基于RTSP协议的RTSP服务器。RTSPClient用于建立基于RTSP协议的客房端。还有其它很多子类可以在源程序和帮助文件中找到。
13应用实例
应用实例在源程序目录中对应于TestProgs子目录,这个子目录中的程序用来说明如何使用以上提到的两个库去开发应用程序。其中主要有以下几个程序:
131使用RTSP协议的客户端
程序名叫openRTSP,是一个命令行程序,用这个程序可打开、接收和记录某一媒体流,这个媒体流一般通过以RTSP开头的URL指定。例如:RTSP://19216801/test,test是媒体流的名字。参照该程序,可以建立基于RTSP协议的客户端。
132使用RTSP协议的服务器端
程序名叫testOnDemandRTSPServer,这个程序能够在程序启动时建立RTSP服务器,并根据指定的文件建立相应的子会话,在接收到点播命令后能够建立相应的单播流。该程序支持的视频媒体类型主要有MPEG1,MPEG2和MPEG4格式的基本流文件、MPEG1、MPEG2格式的程序流和传输流文件。在这个程序的基础上,可以建立视频点播服务器,并可对服务器支持的格式进行扩展。
133MPEG声音+视频程序
程序名叫testMPEG1or2AudioVideoStreamer,这个程序在启动后能不断地读取指定的MPEG1或MPEG2程序流文件,并把他们分解为独立的声音基本流和视频基本流,然后进行流化,发送数据包到多播组2392554242,端口是6666/6667(声音)和8888/8889(视频)。在这程序的基础上,可以建立视频直播服务器。
2应用分析
21RTP库的应用
RTP库的作用是方便使用者使用RTP协议发送和接收数据,无须考虑SSRC(同步源标识)冲突等一些底层的问题。它是LiveMedia的基础。在实际应用中,也可以只使用RTP库来发送多媒体数据,而不必考虑其它库。
22多格式支持库的应用
LiveMedia库的功能强大,不但支持多种格式,而且支持多种功能,包括建立点播服务器、直播服务器和客户端等。该库也有较大的扩展性,要扩展服务器支持的格式可以通过继承FramedSource,要扩展客户端支持的格式可以通过继承MultiFramedRTPSink,通过以上继承方式来实现自己的媒体类。
3用LiveMedia开发视频点播服务器
在实例程序testOnDemandRTSPServer的基础上,可建立起基于RTSP协议的视频点播服务器,对建立的视频点播服务器的测试,可采用通用RealPlayer或开源的VLC客户端进行。
31基本视频点播服务器分析
一个完整的视频点播服务器应包括点播服务系统和管理系统两大部分。点播服务系统的功能包括建立与客户端的RTSP会话、向客户端发送需要的媒体信息等,管理系统则担负用户认证,计费等的任务。这其中的核心部分是媒体服务系统,服务器的性能很大程度上决定于它。LiveMedia代码中的实例程序testOnDemandRTSPServer,能够说明视频点播服务器的建立过程,改进后就能作为我们需要的服务器。下面分析这一服务程序的建立流程:
(1)建立使用环境
通过代码TaskSchedulerscheduler=BasicTaskScheduler::createNew();
env=BasicUsageEnvironment::createNew(scheduler);来生成BasicUsageEnvironment类的一个对象,建立基本使用环境。
(2)权限控制
利用代码UserAuthenticationDatabaseauthDB=NULL;authDB=newUserAuthenticationDatabase;
authDB->addUserRecord("username1","password1");实现权限控制,可以阻止没有权限的用户进行点播。没有权限控制需要的可以省略此部分。
(3)建立RTSP服务器
利用代码RTSPServerrtspServer=RTSPServer::createNew(env,8554,authDB);建立RTSP服务器,该服务器完成与客户端的交互,实现客户端的VCR *** 作,即在客户端完成对当前节目的播放、暂停、倒退、快进等 *** 作。8554是RTSP服务器的端口,也可以改为其它未被占用的端口,服务器的IP地址不用特别设定,它是运行点播服务程序的计算机的IP地址。该服务器只创建一次,一个服务器响应所有的点播用户。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)