基于Hi3516A的H265 IPC LIVE555 开发

转载于http://m.blog.csdn.net/faihung/article/details/73008742,如有侵权请告知删除。

1 系统工作原理

系统以Hi3516A开发平台(由高分辨率1080 p的AR0330摄像头模块、带千兆以太网功能的Hi3516A控制器模块组成硬件平台,并在硬件平台上烧写了U-Boot、Linux内核和加载了相关 驱动)作为基础,在该平台上开发应用程序。

(1)首先,进程A获取来自AR0330摄像头模块的YUV原始视频图像,并使用H265压缩编码算法进行压缩编码获得H265格式码流,该过程通过使用海思提供的媒体处理平台(MPP)实现。

(2)其次,进程B负责响应网络客户端的请求,将进程A的输出码流通过千兆以太网接 口实时地发送出去,该过程通过对LIVE555开源代码(该代码原本只支持文件发送功能,而不支持内存实时数据发送功能)二次开发实现

(3)此外,进程A与进 程B之间的数据交换使用共享内存进程通信方式,节约了CPU资源和时间成本。

2 功能实现

2.1 视频捕捉与编码

(1)选择在 Hi3516A开发平台上开发体现了在视频捕捉和编码过程中的很多优势。

Hi3516A是专用于HD IP摄像机的多媒体芯片,具有高性能Cortex-A7处理器和内部集成的硬件H265视频标准编码器;此外,海思提供的MPP对应用软件屏蔽了芯 片相关的复杂的底层处理,提供给应用程序方便的接口,这样不仅大大缩短了开发周期,还降低了开发难度。对于应用程序开发者,只需要使用MPP所提供的接口 实现特定功能,满足应用。

(2)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格式码流。

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

2.2 H265实时码流传输

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

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

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

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

(5)LIVE555主要通过任务调度机制和 RTSP服务机制两个部分实现流媒体服务器功能。其中任务调度机制主要通过TaskScheduler类库实现,它完成网络套接字任务、延时任务和 触发事件三种任务的循环调度,从而构成了系统运行框架。而RTSP服务机制通过工程的liveMedia目录下的类库实现,通过把RTSP协议加入到运行 框架中,实现了流媒体服务器。下面具体分析RTSP服务机制的实现过程。

1、首先,建立RTSPServer,监听客户端的连接请求,响应客户 端请求建立连接后,创建RTSPClientSession,RTSP协议就是在RTSPClientSession中实现的。

2、然后是RTSP协议的实现过程,客户端向服务器端发送RTSP描述命令(DESCRIBE),服务器查找到对应的ServerMediaSession(对应某个媒体设备或某种格 式文件),并生成会话描述协议(SDP)信息进行回应。

3、接着,客户端发送RTSP建立命令(SETUP),服务器端建立RTP/RTCP套接字,并建立特 定的Source和Sink,为数据的获取、封包和发送做准备。

完成以上步骤后,客户端发送播放命令(PLAY),服务器端响应请求,循环调用 Source对象的成员方法获取数据并通过Sink对象的成员方法进行封包和发送,实现流媒体服务器的功能;在播放过程中,客户端可以发送终止命令 (TERADOWN)结束流媒体会话。

(6)从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 结果分析

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教材配套PPT初稿

1-10章初稿,基本完整。有些粗糙,后面可能会稍作调整。 附更新情况如下: 1.增加了第10章内容; 2.第5章增加了一些内容; 3.第3章内容部分更新; 4.增加了第8-9章内容。 订正&#xff1a…

linux ssh抓包,如何在SSH连接Linux系统的环境下使用wireshark抓包?

TSINGSEE青犀视频云边端架构EasyNVR、EasyDSS、EasyGBS等都是有两种操作系统的版本,一种是linux,一种是windows。而大多数开发者用户都会使用linux版本进行安装。对于安装部署出现的问题,TSINGSEE青犀视频团队研发的经常为客户远程调试&#…

Gearman 启动日志文件提示协议出错的BUG

如果直接以gearmand -d 启动 /usr/local/var/log/gearmand.log 里提示 Address family not supported by protocol ERROR 2014-11-20 20:05:49.000000 [ main ] socket()(Address family not supported by protocol) -> libgearman-server/gearmand.cc:468 ERROR 2014-11-20…

linux环境变量设置方法(PATH等环境变量)

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 linux系统的环境变量有很多,这里简单介绍几个常见环境变量的设置方法。 环境变量PATH 这个环境变量,表示“可执行程序的查找路径”。 1、查看PATH的值,输入“echo $PATH”…

ASP.NET后台调用前台JS函数的三种常见方法

为什么80%的码农都做不了架构师?>>> 第一种:使用普通的添加控件中的Attributes属性进行调用 例如,像一般的普通的按钮:Button1.Attributes.Add("onclick","MyFun();"); 此方法只能在Onload中或者…

Android基础知识大纲

原文链接:http://android.eoe.cn/topic/overview * Android是什么?*版本:Android 4.0 r1原始页面:http://developer.android.com/guide/basics/what-is-android.htmlAndroid是一个移动设备的程序集合,包括的操作系统、…

linux unix shell programming,UnixampLinux Shell Programming I.ppt

《Unix&ampLinux Shell Programming I.ppt》由会员分享,可在线阅读,更多相关《Unix&ampLinux Shell Programming I.ppt(17页珍藏版)》请在人人文库网上搜索。1、Unix/Linux Shell Programming I,Dec 14th 2011 Shen Wei,Agenda,Unix/Linux Intro…

被遮挡的绝对定位 z-index

<div class”A” style”position:relative;”>A (relative) <div class”logo” style”position:absolute;z-index:99999;“></div> </div> <div class”B” style”position:relative;”>B (relative)</div> 最近做minisite项目时&…

嵌入式数据库sqlite在ARM上的的移植和使用

参考SQLite的编译、安装和使用_whz_zb的博客-CSDN博客&#xff0c;如有侵权&#xff0c;请告知删除。 参考&#xff1a;头文件路径问题 Linux下的头文件搜索路径 - 心哲 - 博客园 参考&#xff1a;进一步学习资源 SQlite - 标签 - likebeta - 博客园 一、源码获取 SQLite Do…

贪心法

贪心法的证明 —归纳证明&#xff1a; —贪心法使用的条件是&#xff1a;最优子结构和贪心选择正确性 —贪心算法是一步一步实现的&#xff0c; —在归纳证明的时候&#xff0c;贪心的第一步贪心选择策略的正确性就是归纳基础&#xff0c;因为以后都是一个子问题的选取&#xf…

第一季5:Hi3518EV200的环境搭建

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、内容总结 本文讲述如何安装交叉编译工具链&#xff0c;与编译源码得到uboot、kernel、rootfs镜像文件。 &#xff08;1&#xff09;安装交叉编译工具链&#xff0c;主要是通过执行osdrv/opensou…

Linux下WPS自主设置快捷键,电脑wps的word怎么自主设定快捷键

打开Word2003&#xff0c;点击“工具”选项卡&#xff0c;在下拉菜单中选择“自定义”栏。在弹出的“自定义”页面框中选择“键盘”。在弹出的“自定义键盘”页面框中选择你要设置快捷的命令&#xff0c;比如办公族在这里选择了“字体”里的“幼圆体”这个命令当前并没有快捷键…

登录和操作员管理

在MainWindow的Loaded中弹出登录对话框&#xff0c;如果没有登录则Application.Current.Shutdown()退出。 密码的MD5加盐处理&#xff0c;把盐值放在app.config的AppSetting中。 登录正确性判断&#xff0c;错误次数超过三次锁定 登录成功把当前用户Id放到Application.Current.…

Android动画的实现 上

在Android系统中也能经常见到动画&#xff0c;那么如何实现动画效果呢&#xff1f;本文就来为大家介绍动画的实现方式。 Android中动画的实现分两种方式&#xff0c;一种方式是补间动画Tween Animation&#xff0c;就是说你定义一个开始和结束&#xff0c;中间的部分由程序运算…

第一季2:HI3518EV200的初体验(检测板子是否正常工作)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、检测步骤 1、设置PC主机有线网卡的ip地址设为192.168.1.10&#xff0c;关闭防火墙。 2、虚拟机桥接到有线网卡&#xff0c;并设置虚拟机的静态ip地址为192.168.1.141。 3、在uboot控制台设置ub…

linux安装 redis,在linux中安装redis

本文中使用的系统是Ubantu 18.04因为我是第一次使用Linux系统&#xff0c;并不知道使用哪一款比较好&#xff0c;主要是因为Ubantu的界面很好看(笑)在使用linux安装redis之前遇到过几个小问题。在本文中写下来。我在使用window远程ssh连接linux时&#xff0c;出现access denied…

cocos2d-x的Android工程开启c++0x特性

首先一定要确定你所安装NDK支持c0x&#xff08;我安装的android-ndk-r8&#xff09; 文本打开 项目目录/proj.android/jni/Application.mk 在APP_CPPFLAGS那一行最后追加上 -stdc0x&#xff0c;改完之后可能这样 APP_CPPFLAGS : -FRTTI -DCOCOS2D_DEBUG1 -stdc0x ok&#xff0c…

了解 Windows Azure 存储的可伸缩性、可用性、持久性和计费

借助 Windows Azure存储&#xff0c;应用程序开发者及其应用程序和用户可以在云中使用可用性更高、持久性更长、可伸缩性更强的海量存储。开发者可以构建能随时随地高效访问数据的服务&#xff0c;在所需的时间段内存储任意数量的数据&#xff0c;并按基于实际使用情况进行付费…

linux 安装git失败,Linux运维知识之linux下安装git常见故障整理

本文主要向大家介绍了Linux运维知识之linux下安装git常见故障整理&#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习Linux运维知识有所帮助。FAQ1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).[roottestss git]# git clone git192.1…

JS函数addEventListener的浏览器差异性封装

IE8及更早的版本不支持 addEventListener()函数,因此需要一个标准的函数将这些差异性做封装: 1 function addListener(target, type, handler) { 2 if (target.addEventListener) { 3 target.addEventListener(type, handler, false); 4 } else if (target.att…