摘 要: 介绍了在海思Hi3616A开发平台下实现的一种H265码流实时传输系统。利用海思提供的媒体处理平台(MPP)采集高清摄像头感应到的视频图像并进行H265压缩编码,然后对LIVE555开源代码进行二次开发,实现播放H265实时码流的功能,将压缩编码后的数据发送出去。设计结果表明,系统传输高清视频图像延迟短,播放流畅,满足智能监控领域应用的要求。
关键词: MPP;LIVE555;H265;实时码流
0 引言
随着社会的发展以及人们生活质量的提高,安全问题越来越受到重视。在这样的形式之下,网络视频监控技术占领着越来越大的市场,广泛应用在交通、商场等领域。然而,技术应用对视频的质量、传输的实时性和数据的压缩效率等提出了要求[1],对项目开发构成了巨大挑战。本文设计并实现了一套实时流媒体传输系统,以Hi3516A开发平台作为基础,以高压缩效率的H265编码算法作为编码技术,通过对LIVE555开源代码二次开发实现H265码流实时传输从而构成了整个系统。该系统在视频质量、压缩效率、实时性上都满足了当前市场应用的要求,对实际项目开发具有一定的借鉴意义。
1 系统工作原理
如图1所示,系统以Hi3516A开发平台(由高分辨率1 080 p的AR0330摄像头模块和带千兆以太网功能的Hi3516A控制器模块组成硬件平台,并在硬件平台上烧写了U-Boot、Linux内核和加载了相关驱动)作为基础,在该平台上开发应用程序。首先,进程A获取来自AR0330摄像头模块的YUV原始视频图像,并使用H265压缩编码算法进行压缩编码获得H265格式码流,该过程通过使用海思提供的媒体处理平台(MPP)实现;其次,进程B负责响应网络客户端的请求,将进程A的输出码流通过千兆以太网接口实时地发送出去,该过程通过对LIVE555开源代码(该代码原本只支持文件发送功能,而不支持内存实时数据发送功能)二次开发实现;此外,进程A与进程B之间的数据交换使用共享内存进程通信方式,节约了CPU资源和时间成本。
2 功能实现
2.1 视频捕捉与编码
选择在Hi3516A开发平台上开发体现了在视频捕捉和编码过程中的很多优势。Hi3516A是专用于HD IP摄像机的多媒体芯片,具有高性能Cortex-A7处理器和内部集成的硬件H265视频标准编码器[2];此外,海思提供的MPP对应用软件屏蔽了芯片相关的复杂的底层处理,提供给应用程序方便的接口,这样不仅大大缩短了开发周期,还降低了开发难度。对于应用程序开发者,只需要使用MPP所提供的接口实现特定功能,满足应用。
MPP主要由视频输入(VI)、视频处理(VPSS)、视频编码(VENC)、视频解码(VDEC)、视频输出(VO)、视频侦测分析(VDA)、区域管理(REGION)等模块组成。本系统用到VI、VPSS、VENC和REGION模块完成视频采集、处理、信息叠加和压缩编码工作,最终得到目标码流。
如图2所示,首先,调用系统控制模块的媒体处理平台编程接口(MPI)完成硬件和MPP初始化,它实现的重要功能是分配视频缓存池;其次,调用VI模块的MPI创建视频输入设备和视频物理通道并设置参数;然后,调用VPSS模块的MPI创建组和通道,并设置组和通道参数,输出期望分辨率的视频数据;最后,调用REGION模块的MPI,在原始图像上叠加用户信息,并调用VENC模块的MPI对YUV原始图像进行H265压缩编码,得到H265格式码流[3]。完成以上工作后,创建一个线程不断从编码通道获取实时H265码流。整个过程都通过调用各模块的MPI实现,难度较低。
2.2 H265实时码流传输
本系统中,H265实时流媒体数据的传输在LIVE555 C++开源项目的基础上实现。LIVE555是跨平台的流媒体解决方案,使用RTSP、RTCP/RTP等标准流媒体传输协议,支持H265、H264、MPEG等视频格式和多种音频格式的流化、发送、接收等处理。此外,由于良好的代码框架设计,很容易扩展出对其他媒体格式的支持,所以大量应用在流媒体传输方案中,比如网络视频监控应用、流媒体播放器等。
LIVE555默认只支持发送音视频文件,而不支持从媒体设备获取的实时码流。在本系统中,需要修改LIVE555源代码以实现H265码流实时发送功能。
一种方法是通过有名管道(FIFO)实现,这种方法不需要修改LIVE555源代码,只需在视频捕捉与编码源进程中创建一个FIFO,并不断把实时H265码流写入FIFO中即可。LIVE555服务器端用发送音视频文件的方式获取FIFO中数据,完成实时直播[4]。这种方法容易实现,使用较多,但是当视频码流率较大时监控端的延时较大,并存在卡顿、马赛克等现象,效果较差。另一种方法是通过修改LIVE555源代码,从实现RTSP服务的相关基类派生出H265码流直播的类,重写类的成员方法来实现。该方法通过共享内存进程通信方式实现与视频捕捉和编码进程的码流交互。这种方法的实现比较复杂,但在数据处理过程中比第一种方式少了多次数据写入和拷贝工作,如图3所示(其中实线部分为第一种方法数据流向,虚线部分为第二种方法数据流向),从而监控端能够以较大码流率实时、流畅地播放高清视频图像。本文主要针对第二种方法的设计实现,而不讨论第一种方法。
LIVE555主要通过任务调度机制和RTSP服务机制两个部分实现流媒体服务器功能[5]。其中任务调度机制主要通过TaskScheduler类库实现,它完成网络套接字任务、延时任务和触发事件三种任务的循环调度,从而构成了系统运行框架。而RTSP服务机制通过工程的liveMedia目录下的类库实现,通过把RTSP协议加入到运行框架中,实现了流媒体服务器。下面具体分析RTSP服务机制的实现过程。
首先,建立RTSPServer,监听客户端的连接请求,响应客户端请求建立连接后,创建RTSPClientSession,RTSP协议就是在RTSPClientSession中实现的。然后是RTSP协议的实现过程,客户端向服务器端发送RTSP描述命令(DESCRIBE),服务器查找到对应的ServerMediaSession(对应某个媒体设备或某种格式文件),并生成会话描述协议(SDP)信息进行回应;接着,客户端发送RTSP建立命令(SETUP),服务器端建立RTP/RTCP套接字,并建立特定的Source和Sink,为数据的获取、封包和发送做准备;完成以上步骤后,客户端发送播放命令(PLAY),服务器端响应请求,循环调用Source对象的成员方法获取数据并通过Sink对象的成员方法进行封包和发送,实现流媒体服务器的功能;在播放过程中,客户端可以发送终止命令(TERADOWN)结束流媒体会话。
从RTSP协议实现过程可知,为了支持H265实时流媒体数据传输,需要实现用户自定义类ServerMediaSubssion、Source和Sink[6]。自定义的类可以继承H265VideoFileServer MediaSubsession、H265VideoRTPSink和H265VideoStreamFramer中能共用的方法,重写H265实时流媒体处理特有的方法。具体实现方法是添加H265LiveVideoServerMediaSubssion:public H265VideoFileServerMediaSubsession类,并重写createNewStreamSource成员方法。该成员方法的关键段代码段如下:
estBitrate=1000;
H265FramedLiveSource*liveSource=\
H265FramedLiveSource::createNew(envir());
if(liveSource==NULL){return NULL;}
return H265VideoStreamFramer::\
createNew(envir(),liveSource);
该代码段的主要工作是把ByteStreamFileSource替换为用户自定义的H265FramedLiveSource,用于获取高清摄像头上的实时视频数据。H265FramedLiveSource的成员方法H265FramedLiveSource::doGetNextFrame()就实现了从H265编码输出端获取H265格式视频数据并送到H265VideoRTPSink端的过程。其中,进程之间数据交换采用共享内存方式,用有名信号量实现进程对共享内存的同步访问。该成员方法的关键代码段如下:
static int niHaveReadSize=0;
if(Framed_dosent==true){
if(0==niHaveReadSize)sem_wait(semr);
fFrameSize=\
(Framed_datasize-niHaveReadSize>fMaxSize)\
fMaxSize:\
Framed_datasize-niHaveReadSize;
memcpy(fTo,shm_add+niHaveReadSize,\
fFrameSize);
niHaveReadSize+=fFrameSize;
if(niHaveReadSize==Framed_datasize){
sem_post(semw);
niHaveReadSize=0;
}
}
这样,当服务器端收到客户端PLAY命令时,不断调用H265FramedLiveSource::doGetNextFrame()读取H265格式视频数据,封包和发送出去,实现H265码流实时传输功能。
在主函数中,只需在创建ServerMediaSession时加入H265LiveVideoServerMediaSubssion,并向RTSPServer中注册该ServerMediaSession即可[7]。
3 结果分析
H265码流实时传输的程序通过海思平台的交叉编译工具链编译,生成可执行文件,并在海思Hi3516A开发平台下运行,完成服务器搭建工作。服务器正常运行后的终端输出如图4所示。
客户端通过安装Windows系统下的VLC播放器实现。打开VLC播放器,在“打开网络串流”选项中输入rtsp://192.168.1.116:8554/H265LiveVideo,点击播放,就可以看到来自高清摄像头的视频图像,并长期稳定工作。与常用的FIFO方式作效果对比,当码流率较大时,视频图像延迟更短,视频画面更加完整和流畅。
4 结论
在海思Hi3516A开发平台上,通过调用MPP进行编程和修改LIVE555流媒体服务器源代码,实现了H265实时码流获取和网络直播功能,且具有良好的效果,可以应用在项目开发中。由于系统还处在测试阶段,不够完善,实际项目开发中,要根据实际情况进一步优化,以达到更好的性能。
参考文献
[1] 瞿洪桂.网络视频监控的市场现状及发展方向[J].中国安防,2015(5):32-35.
[2] 季健佼.解析海思H.265超高清IP视频监控解决方案[J].中国公共安全(综合版),2014(22):198-200,202.
[3] 王峰.基于Hi3516的音视频采集及网络传输技术研究[D].西安:西安电子科技大学,2013.
[4] 曾金,毛燕琴,沈苏彬,等.嵌入式流媒体服务器的设计和实现[J].计算机技术与发展,2011,21(7):81-84,89.
[5] 许华滨,谢维波,黄奕,等.基于Live555的流媒体服务器设计与实现[J].微型机与应用,2014,33(18):48-50.
[6] 吕少君,周渊平.基于Live555的实时流媒体传输系统[J].计算机系统应用,2015,24(1):56-59.
[7] 彭宏,吴海巍,叶敏展,等.基于流媒体的移动视频直播系统的设计与实现[J].电子技术应用,2014,40(9):111-113,117.