访问国外网站dns,贵州做网站公司,电子商务网站建设 概念,大批量刷关键词排名软件转载于http://m.blog.csdn.net/faihung/article/details/73008742#xff0c;如有侵权请告知删除。 1 系统工作原理 系统以Hi3516A开发平台#xff08;由高分辨率1080 p的AR0330摄像头模块、带千兆以太网功能的Hi3516A控制器模块组成硬件平台#xff0c;并在硬件平台上烧写了…转载于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所提供的接口 实现特定功能满足应用。 2MPP主要由视频输入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。 2LIVE555默认只支持发送音视频文件而不支持从媒体设备获取的实时码流。需要修改LIVE555源代码以实现H265码流实时发送功能。 3一 种方法是通过有名管道FIFO实现这种方法不需要修改LIVE555源代码只需在视频捕捉与编码源进程中创建一个FIFO并不断把实时H265 码流写入FIFO中即可。LIVE555服务器端用发送音视频文件的方式获取FIFO中数据完成实时直播。这种方法容易实现使用较多但是当视 频码流率较大时监控端的延时较大并存在卡顿、马赛克等现象效果较差。 4另一种方法是通过修改LIVE555源代码从实现RTSP服务的相关基类派生出 H265码流直播的类重写类的成员方法来实现。该方法通过共享内存进程通信方式实现与视频捕捉和编码进程的码流交互。这种方法的实现比较复杂但在数据 处理过程中比第一种方式少了多次数据写入和拷贝工作从而监控端能够以较大码流率实时、流畅地播放高清视频图像。 5LIVE555主要通过任务调度机制和 RTSP服务机制两个部分实现流媒体服务器功能。其中任务调度机制主要通过TaskScheduler类库实现它完成网络套接字任务、延时任务和 触发事件三种任务的循环调度从而构成了系统运行框架。而RTSP服务机制通过工程的liveMedia目录下的类库实现通过把RTSP协议加入到运行 框架中实现了流媒体服务器。下面具体分析RTSP服务机制的实现过程。 1、首先建立RTSPServer监听客户端的连接请求响应客户 端请求建立连接后创建RTSPClientSessionRTSP协议就是在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实时流媒 体处理特有的方法。具体实现方法是添加H265LiveVideoServerMediaSubssionpublic H265VideoFileServerMediaSubsession类并重写createNewStreamSource成员方法。该成员方法的关 键段代码段如下 estBitrate1000
H265FramedLiveSource*liveSourceH265FramedLiveSourcecreateNewenvir
ifliveSourceNULL{return NULL}
return H265VideoStreamFramercreateNewenvirliveSource 该代码段的主要工作是把ByteStreamFileSource替换为用户自定义的H265FramedLiveSource用于获取高清摄像头上的实 时视频数据。H265FramedLiveSource的成员方法H265FramedLiveSourcedoGetNextFrame就实现了从 H265编码输出端获取H265格式视频数据并送到H265VideoRTPSink端的过程。 其中进程之间数据交换采用共享内存方式用有名信号量实现进程对共享内存的同步访问。该成员方法的关键代码段如下 static int niHaveReadSize0
ifFramed_dosenttrue{if0niHaveReadSizesem_waitsemrfFrameSizeFramed_datasize-niHaveReadSize-fMaxSizefMaxSizeFramed_datasize-niHaveReadSizememcpyfToshm_addniHaveReadSizefFrameSizeniHaveReadSizefFrameSizeifniHaveReadSizeFramed_datasize{sem_postsemwniHaveReadSize0}
} 这样当服务器端收到客户端PLAY命令时不断调用H265FramedLiveSourcedoGetNextFrame读取H265格式视频数据封包和发送出去实现H265码流实时传输功能。 在主函数中只需在创建ServerMediaSession时加入H265LiveVideoServerMediaSubssion并向RTSPServer中注册该ServerMediaSession即可。 3 结果分析 1H265码流实时传输的程序通过海思平台的交叉编译工具链编译生成可执行文件并在海思Hi3516A开发平台下运行完成服务器搭建工作。 2客 户端通过安装Windows系统下的VLC播放器实现。打开VLC播放器在“打开网络串流”选项中输入 rtsp//192.168.1.1168554/H265LiveVideo点击播放就可以看到来自高清摄像头的视频图像并长期稳定工作。与 常用的FIFO方式作效果对比当码流率较大时视频图像延迟更短视频画面更加完整和流畅。 3实际上Darwin确实在架构以及性能方面较live555略胜一筹但是LIVE555 是更为廉价和快捷的开发方式。