参考基于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

智能推荐

python中文显示不出来_解决Python词云库wordcloud不显示中文的问题-程序员宅基地

文章浏览阅读2.6k次。解决Python词云库wordcloud不显示中文的问题2018-11-25背景:wordcloud是基于Python开发的词云生成库,功能强大使用简单。github地址:https://github.com/amueller/word_cloudwordcloud默认是不支持显示中文的,中文会被显示成方框。安装:安装命令:pip install wordcloud解决:经过测试发现不支持显示中文..._词云python代码无法输出文字

台式计算机cpu允许温度,玩游戏cpu温度多少正常(台式电脑夏季CPU一般温度多少)...-程序员宅基地

文章浏览阅读1.1w次。随着炎热夏季的到来,当玩游戏正爽的时候,电脑突然死机了,自动关机了,是不是有想给主机一脚的冲动呢?这个很大的原因是因为CPU温度过高导致的。很多新手玩家可能都有一个疑虑,cpu温度多少以下正常?有些说是60,有些说是70,到底多高CPU温度不会死机呢?首先我们先看看如何查看CPU的温度。下载鲁大师并安装,运行鲁大师软件,即可进入软件界面,并点击温度管理,即可看到电脑各个硬件的温度。鲁大师一般情况下..._台式机玩游戏温度多少正常

小白自学Python日记 Day2-打印打印打印!_puthon打印任务收获-程序员宅基地

文章浏览阅读243次。Day2-打印打印打印!我终于更新了!(哭腔)一、 最简单的打印最最简单的打印语句: print(“打印内容”)注意:python是全英的,符号记得是半角下面是我写的例子:然后进入power shell ,注意:你需要使用cd来进入你保存的例子的文件夹,保存时名字应该取为xxx.py我终于知道为什么文件夹取名都建议取英文了,因为进入的时候是真的很麻烦!如果你没有进入正确的文件夹..._puthon打印任务收获

Docker安装:Errors during downloading metadata for repository ‘appstream‘:_"cenerrors during download metadata for repository-程序员宅基地

文章浏览阅读1k次。centos8问题参考CentOS 8 EOL如何切换源? - 云服务器 ECS - 阿里云_"cenerrors during download metadata for repository \"appstream"

尚硅谷_谷粒学苑-微服务+全栈在线教育实战项目之旅_基于微服务的在线教育平台尚硅谷-程序员宅基地

文章浏览阅读2.7k次,点赞3次,收藏11次。SpringBoot+Maven+MabatisPlusmaven在新建springboot项目引入RELEASE版本出错maven在新建springboot项目引入RELEASE版本出错maven详解maven就是通过pom.xml中的配置,就能够从仓库获取到想要的jar包。仓库分为:本地仓库、第三方仓库(私服)、中央仓库springframework.boot:spring-boot-starter-parent:2.2.1.RELEASE’ not found若出现jar包下载不了只有两_基于微服务的在线教育平台尚硅谷

随便推点

网络学习第六天(路由器、VLAN)_路由和vlan-程序员宅基地

文章浏览阅读316次。路由的概念路由器它称之为网关设备。路由器就是用于连接不同网络的设备路由器是位于OSI模型的第三层。路由器通过路由决定数据的转发。网关的背景:当时每家计算机厂商,用于交换数据的通信程序(协议)和数据描述格式各不相同。因此,就把用于相互转换这些协议和格式的计算机称为网关。路由器与三层交换器的对比路由协议对比路由器的作用:1.路由寻址2.实现不同网络之间相连的功能3.通过路由决定数据的转发,转发策略称为 路由选择。VLAN相关技术什么是VLAN?中文名称叫:虚拟局域网。虚_路由和vlan

设置div背景颜色透明度,内部元素不透明_div设置透明度,里面的内容不透明-程序员宅基地

文章浏览阅读2.8w次,点赞6次,收藏22次。设置div背景颜色透明度,内部元素不透明:.demo{  background-color:rgba(255,255,255,0.15) } 错误方式:.demo{ background-color:#5CACEE;opacity:0.75;} 这样会导致div里面的元素内容和背景颜色一起变透明只针对谷歌浏览器的测试_div设置透明度,里面的内容不透明

Discuz!代码大全-程序员宅基地

文章浏览阅读563次。1.[ u]文字:在文字的位置可以任意加入您需要的字符,显示为下划线效果。2.[ align=center]文字:在文字的位置可以任意加入您需要的字符,center位置center表示居中,left表示居左,right表示居右。5.[ color=red]文字:输入您的颜色代码,在标签的中间插入文字可以实现文字颜色改变。6.[ SIZE=数字]文字:输入您的字体大小,在标签的中间插入文..._discuzcode 大全

iOS NSTimer定时器-程序员宅基地

文章浏览阅读2.6k次。iOS中定时器有三种,分别是NSTimer、CADisplayLink、dispatch_source,下面就分别对这三种计时器进行说明。一、NSTimerNSTimer这种定时器用的比较多,但是特别需要注意释放问题,如果处理不好很容易引起循环引用问题,造成内存泄漏。1.1 NSTimer的创建NSTimer有两种创建方法。方法一:这种方法虽然创建了NSTimer,但是定时器却没有起作用。这种方式创建的NSTimer,需要加入到NSRunLoop中,有NSRunLoop的驱动才会让定时器跑起来。_ios nstimer

Linux常用命令_ls-lmore-程序员宅基地

文章浏览阅读4.8k次,点赞17次,收藏51次。Linux的命令有几百个,对程序员来说,常用的并不多,考虑各位是初学者,先学习本章节前15个命令就可以了,其它的命令以后用到的时候再学习。1、开机 物理机服务器,按下电源开关,就像windows开机一样。 在VMware中点击“开启此虚拟机”。2、登录 启动完成后,输入用户名和密码,一般情况下,不要用root用户..._ls-lmore

MySQL基础命令_mysql -u user-程序员宅基地

文章浏览阅读4.1k次。1.登录MYSQL系统命令打开DOS命令框shengfen,以管理员的身份运行命令1:mysql -u usernae -p password命令2:mysql -u username -p password -h 需要连接的mysql主机名(localhost本地主机名)或是mysql的ip地址(默认为:127.0.0.1)-P 端口号(默认:3306端口)使用其中任意一个就OK,输入命令后DOS命令框得到mysql>就说明已经进入了mysql系统2. 查看mysql当中的._mysql -u user

推荐文章

热门文章

相关标签