参考基于hi3516A的H265码流实时传输系统设计_hi3516a通过rtsp播放h.265视频流的源码-程序员宅基地

技术标签: 驱动管理  

基于海思3516的H265 ipc live555开发基本原理

  (2017-07-09 10:32:20)
   

参考基于hi3516A的H265码流实时传输系统设计

 http://blog.sina.com.cn/s/blog_be2d7bfe0102wvfs.html

1、 系统工作原理

系统以Hi3516A开发平台(由高分辨率1080 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视频标准编码器;此外,海思提供的MPP对应用软件屏蔽了芯片相关的复杂的底层处理,提供给应用程序方便的接口,这样不仅大大缩短了开发周期,还降低了开发难度。对于应用程序开发者,只需要使用MPP所提供的接口实现特定功能,满足应用。

MPP主要由视频输入(VI)、视频处理(VPSS)、视频编码(VENC)、视频解码(VDEC)、视频输出(VO)、视频侦测分析(VDA)、区域管理(REGION)等模块组成。本系统用到VI、VPSS、VENC和REGION模块完成视频采集、处理、信息叠加和压缩编码工作,最终得到目标码流。

首先,调用系统控制模块的媒体处理平台编程接口(MPI)完成硬件和MPP初始化,它实现的重要功能是分配视频缓存池;

其次,调用VI模块的MPI创建视频输入设备和视频物理通道并设置参数;

然后,调用VPSS模块的MPI创建组和通道,并设置组和通道参数,输出期望分辨率的视频数据;

最后,调用REGION模块的MPI,在原始图像上叠加用户信息,并调用VENC模块的MPI对YUV原始图像进行H265压缩编码,得到 H265格式码流。

完成以上工作后,创建一个线程不断从编码通道获取实时H265码流。整个过程都通过调用各模块的MPI实现,难度较低。

2.2 H265实时码流传输

本系统中,H265实时流媒体数据的传输在LIVE555 C++开源项目的基础上实现。Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP、RTSP、SIP等的支持。Live555实现了对多种音视频编码格式的音视频数据的流化、接收和处理等支持,包括MPEG、H.263+、DV、JPEG视频和多种音频编码。同时由于良好的设计,Live555非常容易扩展对其他格式的支持。目前,Live555已经被用于多款播放器的流媒体播放功能的实现,如VLC(VideoLan)、 MPlayer。

LIVE555默认只支持发送音视频文件,而不支持从媒体设备获取的实时码流。需要修改LIVE555源代码以实现H265码流实时发送功能。

一种方法是通过有名管道(FIFO)实现,这种方法不需要修改LIVE555源代码,只需在视频捕捉与编码源进程中创建一个FIFO,并不断把实时H265 码流写入FIFO中即可。LIVE555服务器端用发送音视频文件的方式获取FIFO中数据,完成实时直播。这种方法容易实现,使用较多,但是当视频码流率较大时监控端的延时较大,并存在卡顿、马赛克等现象,效果较差。

另一种方法是通过修改LIVE555源代码,从实现RTSP服务的相关基类派生出 H265码流直播的类,重写类的成员方法来实现。该方法通过共享内存进程通信方式实现与视频捕捉和编码进程的码流交互。这种方法的实现比较复杂,但在数据处理过程中比第一种方式少了多次数据写入和拷贝工作,从而监控端能够以较大码流率实时、流畅地播放高清视频图像。

LIVE555主要通过任务调度机制和 RTSP服务机制两个部分实现流媒体服务器功能。其中任务调度机制主要通过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。自定义的类可以继承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即可。

3 结果分析

H265码流实时传输的程序通过海思平台的交叉编译工具链编译,生成可执行文件,并在海思Hi3516A开发平台下运行,完成服务器搭建工作。

客 户端通过安装Windows系统下的VLC播放器实现。打开VLC播放器,在“打开网络串流”选项中输入 rtsp://192.168.1.116:8554/H265LiveVideo,点击播放,就可以看到来自高清摄像头的视频图像,并长期稳定工作。与常用的FIFO方式作效果对比,当码流率较大时,视频图像延迟更短,视频画面更加完整和流畅。

实际上Darwin确实在架构以及性能方面较live555略胜一筹,但是LIVE555 是更为廉价和快捷的开发方式。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/c_L_j_/article/details/79435804

智能推荐

http隧道 java_使用java语言实现http隧道技术-程序员宅基地

文章浏览阅读119次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼/***Getaparametervalue**@paramkeyString*@paramdefString*@returnString*/publicStringgetParameter(Stringkey,Stringdef){returnisStandalone?System.getProperty(ke..._java http隧道

Keepalived高可用+邮件告警_keepalived sendmail-程序员宅基地

文章浏览阅读913次。IP主机名备注192.168.117.14keepalived-master主节点192.168.117.15keepalived-slaver备节点192.168.117.100VIP1.主备节点均安装keepalived# yum install -y keepalived httpd2.主备节点均修改keepalived日志存放路径..._keepalived sendmail

SPFILE 错误导致数据库无法启动(ORA-01565)_ora01565 ora27046-程序员宅基地

文章浏览阅读469次。--==========================================--SPFILE错误导致数据库无法启动(ORA-01565)--========================================== SPFILE错误导致数据库无法启动 SQL> startup ORA-01078: failurein proce_ora01565 ora27046

功能测试基础知识(1)-程序员宅基地

文章浏览阅读6.1k次,点赞2次,收藏54次。功能测试基础知识总结_功能测试

postgresql 中文排序_pg中文排序-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏2次。pg 中文首字母排序_pg中文排序

[Mysql] CONVERT函数_mysql convert-程序员宅基地

文章浏览阅读3.1w次,点赞23次,收藏109次。本文主要讲解CONVERT函数_mysql convert

随便推点

HTML5与微信开发(2)-视频播放事件及API属性_微信开发者工具视频快进-程序员宅基地

文章浏览阅读8.6k次,点赞2次,收藏2次。HTML5 的视频播放事件想必大家已经期待很久了吧,在HTML4.1、4.0之前我们如果在网页上播放视频无外乎两种方法: 第一种:安装FLASH插件或者微软发布的插件 第二种:在本地安装播放器,在线播放组件之类的 因为并不是所有的浏览器都安装了FLASH插件,就算安装也不一定所有的都能安装成功。像苹果系统就是默认禁用FLASH的,安卓虽然一开始的时候支持FLASH,但是在安卓4.0以后也开始不_微信开发者工具视频快进

JedisConnectionException Connection Reset_jedisconnectionexception: java.net.socketexception-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏4次。在使用redis的过程常见错误总结1.JedisConnectionException Connection Reset参考这边文章:Connection reset原因分析和解决方案https://blog.csdn.net/cwclw/article/details/527971311.1问题描述Exception in thread "main" redis.clients...._jedisconnectionexception: java.net.socketexception: connection reset

Lua5.3版GC机制理解_lua5.3 gc-程序员宅基地

文章浏览阅读8.3k次,点赞8次,收藏42次。目录1.Lua垃圾回收算法原理简述2.Lua垃圾回收中的三种颜色3.Lua垃圾回收详细过程4.步骤源码详解4.1新建对象阶段4.2触发条件4.3 GC函数状态机4.4标记阶段4.5清除阶段5.总结参考资料lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁,目前大多数有关这个方面的文章都还是基于lua5.1版本,有一定的滞后性。因此本文通过参考当前..._lua5.3 gc

手机能打开的表白代码_能远程打开,各种手机电脑进行监控操作,最新黑科技...-程序员宅基地

文章浏览阅读511次。最近家中的潮人,老妈闲着没事干,开始学玩电脑,引起他的各种好奇心。如看看新闻,上上微信或做做其他的事情。但意料之中的是电脑上会莫名出现各种问题?不翼而飞的图标?照片又不见了?文件被删了,卡机或者黑屏,无声音了,等等问题。常常让她束手无策,求助于我,可惜在电话中说不清,往往只能苦等我回家后才能解决,那种开心乐趣一下子消失了。想想,这样也不是办法啊, 于是,我潜心寻找了两款优秀的远程控制软件。两款软件...

成功Ubuntu18.04 ROS melodic安装Cartograhper+Ceres1.13.0,以及错误总结_ros18.04 安装ca-程序员宅基地

文章浏览阅读1.8k次。二.初始化工作空间三.设置下载地址四.下载功能包此处可能会报错,请看:rosdep update遇到ERROR: error loading sources list: The read operation timed out问题_DD᭄ꦿng的博客-程序员宅基地接下来一次安装所有功能包,注意对应ROS版本 五.编译功能包isolated:单独编译各个功能包,每个功能包之间不产生依赖。编译过程时间比较长,可能需要几分钟时间。此处可能会报错:缺少absl依赖包_ros18.04 安装ca

Harbor2.2.1配置(trivy扫描器、镜像签名)_init error: db error: failed to download vulnerabi-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏7次。Haobor2.2.1配置(trivy扫描器、镜像签名)docker-compose下载https://github.com/docker/compose/releases安装cp docker-compose /usr/local/binchmod +x /usr/local/bin/docker-composeharbor下载https://github.com/goharbor/harbor/releases解压tar xf xxx.tgx配置harbor根下建立:mkd_init error: db error: failed to download vulnerability db: database download

推荐文章

热门文章

相关标签