流媒体直播服务器的设计和实现*
2012-05-12刘三满
刘三满
(山西警官高等专科学校,山西太原030021)
把流媒体技术应用于教育上,构建网络环境下的网络学校、网上课堂、在线答疑等新的教学模式,正成为21世纪教育改革发展的新趋势[1]。在流媒体技术应用中,流媒体直播服务器系统功能的设计与实现,是关键。
1 流媒体直播服务器研究现状
当今世界,知识经济已见端倪,通过计算机、网络进行互动式教学成为时尚。在欧洲和美国,流媒体技术已成为教育变革的推动力。如:英国南部地区Sussex Virtual学院联合16家再教育机构和学院,组成集团。集团内部服务器相连,通过校际网络共享教学资源。集团外部与企业个人电脑终端和ISDN电话线相连,通过在线视听会议网络为当地的中小型企业提供IT以及商业方面的培训。
现在各高校建设网络教学流媒体平台存在的主要问题是:需要将流媒体技术与本校特有的教育资源相结合,设计出一套兼顾教育、教学、信息发布的多媒体直播服务系统。技术要点包括:基于MPEG4IP项目进行二次开发,实现符合MPEG4标准的音视频数据。实现不同带宽用户对视频质量的需求。基于SDL技术实现在Linux平台显示播放。基于RTP/RTSP协议实现音视频数据的传输。
2 流媒体直播服务器的功能设计
直播服务器旨在提供一种立体的、视音频等多种媒体相整合的、可交互的、具有多种体验的基于超媒体、超链接的教学形式。这种教学形式有利于教师之间业务的相互学习,可有效提高学生多种技能的培训效果,增进与其他学校之间的文化、活动交流。直播服务器应该主要提供以下的功能:系统的应用环境是校园网,采用C/S模式通过LAN接入。管理员应该能够根据学校的安排对教师的授课和学校的各项活动进行视频的采集和编码。教师在教学时,能够方便地引用直播服务器上的视频资源进行演示;存储采集到的教师授课或学校活动的视频文件,作为校园网资源;响应来自各教研室教师的直播请求,使各个教研室都能在网上收看教师授课和学校活动的直播情况[2]。师生在下课后可以对校园网资源进行点播。
流媒体直播服务器系统的信息处理流程为:开启管理员界面,根据对音视频参数的设置开始配置音、视频参数,然后等待管理员命令,接收到管理员的命令后便开始采集、编码教师授课或学校活动的视频数据。若收到教研室的直播请求,则开启直播服务,为教研室发送音、视频数据。若学校要求对数据进行备份,则管理员可以设置存储文件,服务器开始生成.mp4格式的文件。当视频直播需要结束时,由管理员中止服务,退出主界面。
针对流媒体直播服务器的功能需求,对系统进行如下设计:音、视频部分,网络传输部分,管理员GUI部分,基础组件部分。
音、视频部分设计主要的功能为:采集音、视频数据,并对音、视频数据进行编码。
网络传输部分的设计基于RTSP实时流协议。作为一个应用层协议,RTSP可提供一个可供扩展的框架,控制具有实时特性的数据发送,提供播放、暂停、快进等操作,负责定义具体的控制消息、操作方法、状态码等,描述与RTP间的交互操作,实现实时流媒体数据的受控和点播。
管理员GUI部分设计主要包括:管理员GUI和流控制两个部分,实现生成系统运行的管理员界面和子对话框界面,监听客户端的连接请求。
基础组件部分的设计主要完成对音、视频参数的设置,保存.mp4文件,创建线程和出错信息处理等。
3 流媒体直播服务器功能的实现
流媒体直播服务器系统具有四大功能:音视频采集、编码功能,网络传输功能(包括直播服务),管理控制服务器功能。
流媒体直播服务器开启管理员界面后,根据GUI的设置开始配置音、视频参数,系统开启。然后等待客户端连接。若收到客户端的请求直播服务,则启动直播服务,首先经过音视频采集、编码数据,为每一个连接建立相应的流控线程,然后通过RTP/RTSP协议进行网络传输,为客户端发送数据。若管理员设置服务器为多播方式,则系统提供的服务切换为多播状态[3]。若管理员设置存储文件,存放未编码的音视频文件或者已经编码的音视频文件,则服务器开始生成扩展名是mp4格式的文件。当点击“退出”按钮时,则中止服务,退出主界面。
3.1 音频采集编码的实现
初始化函数描述:
3.2 视频采集编码的实现
初始化函数描述:
音视频帧接口函数描述:
void AddReference(void)m_refcnt自加1
void RemoveReference(void)m_refcnt自减1
void operator delete(void* p)对 CMediaFrame中的 m_refcnt变量减1,
如果m_refcnt变为了0,则释放CMediaFrame中的m_pData和m_pMutex,同时释放p指针。
3.3 网络传输模块的实现
网络传输模块主要函数描述:
static u_int32_t GetRandomMcastAddress(void)得到随机的多播地址
static u_int16_t GetRandomPortBlock(void)产生大于2000的四个随机端口号
u_int32_t AudioTimestampToRtp(Timestamp t)把音频时间戳转换成RTP时间戳
u_int32_t VideoTimestampToRtp(Timestamp t)把视频时间戳转换成RTP时间戳
u_int64_t TimestampToNtp(Timestamp t)把时间戳转化为NTP格式
void CRtpTransmitter::DoStartTransmit()初始化音频及视频RTP会话,开始RTP传输
更为轰动的是,原腾讯公司总裁助理刘春宁在负责腾讯视频版权采购时期,涉嫌商业贿赂被抓,当时,他已经跳槽到阿里巴巴负责文娱业务。
void CRtpTransmitter::DoSendFrame(CMediaFrame*pFrame)判断媒体帧的类型,用RTP发送数据,同时设定是否需要音视频同步,发送的数据必须是已经编码过的数据。
3.4 对数据流控制模块的实现
本模块由CMediaFlow类实现,作为CAVLiveMediaFlow的父类,它提供了流媒体启动,流媒体结束,设置流媒体的参数,以及获得流媒体当前状态的函数接口。
主要函数描述:
如果不是询问媒体流是否开始,则返回false;如果是,则valueName=FLOW_STATUS_STARTED,则返回 true,同时返回开始状态
void CAVLiveMediaFlow::Start(void)开始流媒体
设置音视频设备的输入,产生新的音视频源,设置config,启动ThreadMain()等待消息,开始流媒体。
void CAVLiveMediaFlow::AddSink(CMediaSink*pSink)往媒体源中的接收器队列中添加接收器pSink
void CAVLiveMediaFlow::RemoveSink(CMediaSink*pSink)从媒体源的接收器队列中删除接收器pSink
void CAVLiveMediaFlow::StartVideoPreview(void)往视频源的接收器队列中添加回显接收器,并且启动视频回显
void CAVLiveMediaFlow::SetAudioOutput(bool mute)屏蔽音频
void CAVLiveMediaFlow::SetPictureControls(void)调节图像的饱和度,色度和对比度
bool CAVLiveMediaFlow::GetStatus(u_int32_t value Name,void*pValue)
用pValue存储已经编码的视频帧的个数;否则,用pValue存储流媒体已经开始的信息[4]。
4 实验效果分析
分析了流媒体直播服务器的功能需求,根据现有的直播服务系统的原理和处理流程,利用MPEG4IP编码库实现MPEG4的软编码,设计了流媒体直播服务器的功能。通过主要函数的描述为中心,以主要函数的流程为线索,通过编写管理员界面及子对话框来实现管理及设置服务器功能,实现符合MPEG4标准的音视频数据,最终形成一个基于linux平台的网络直播平台——Linux流媒体直播服务器。Linux流媒体直播服务器系统的设计与实现,突破了传统的教学模式,在实现过程中,较之其他直播服务器,在技术上的创新有以下几点:
·基于MPEG4IP项目进行二次开发,实现了符合MPEG4标准的音视频数据,满足了不同带宽用户对视频质量的需求。
·基于SDL技术实现在Linux平台显示播放。
·基于RTP/RTSP协议实现音视频数据的传输。
实验显示,采用SDL技术实现了在Linux平台显示播放,基于RTP/RTSP协议实现了音视频数据的传输,效果良好,而且系统稳定性和负载均衡性都有很好表现。
[1]吴坚.IPTV内容使用精细化[J].流媒体世界,2009(3):23-25.
[2]张静.基于.NET下Web服务的信息查询系统的研究与设计[D].合肥工业大学,2011(9):32-35.
[3]骆炎民.基于XML的WebGIS及其数据共享的研究[D]华侨大学,2010(11):40-44.
[4]骆炎民.基于XML的WebGIS及其数据共享的研究[D]华侨大学,2007.