百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

基于Hi3516A的H265码流实时传输系统设计

liebian365 2025-01-17 12:11 14 浏览 0 评论

摘 要: 介绍了在海思Hi3616A开发平台下实现的一种H265码流实时传输系统。利用海思提供的媒体处理平台(MPP)采集高清摄像头感应到的视频图像并进行H265压缩编码,然后对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.

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: