多路视频数据实时采集系统设计与实现

来源:互联网 发布:开淘宝店流程图2017 编辑:程序博客网 时间:2024/05/22 02:20

多路视频数据实时采集系统设计与实现

常永亮   王霖萱  常馨蓉


摘要 面对越来越多的实时视频采集、播放的应用,如何能更加方便的操控视频采集,保证流畅的播放效果,成为近几年实时媒体流的一个重要研究方向。本文介绍了视频数据的采集、记录、编解码、多路视频数据间的切换,基于多网络协议组合下的多媒体流传输,动态切换四路视频数据实时传输与播放,从而使远端操控、优质播放有了很大的提高。

关键词 视频编解码、媒体流、RTP/RTCP协议、组播协议、TCP协议


0. 引 言

随着信息技术的不断发展,人们将计算机技术引入视频采集、视频处理领域,用计算机处理视频信息和网络传输数字视频数据在很多领域已有广泛的应用,飞机试飞中现如今也大量的应用。

针对目前分散在多处试飞现场视频传入监控大厅后监测设备多而分散的问题,提出了将多处试飞现场视频引入监控大厅后用一台高性能服务器管控,客户端通过网络请求服务器端检测关心的现场场景,达到集中管理优化监控的目的。

视频图像采集的方法较多,基本可分为2大类:数字信号采集和模拟信号采集。前者采用图像采集芯片组完成图像的采集、帧存储器地址生成以及图像数据的刷新;除了要对采集模式进行设定外,主处理器不参与采集过程,我们只要在相应的帧存储器地址取出采集到的视频数据即可得到相应的视频数据,这种方法,无论在功能、性能、可靠性、速度等各方面都得到了显著的提高,但成本高。后者采用通用视频采集卡实现图像的采集,并用软件进行实时编码,其特点是数据采集CPU占用率较高,对处理器的速度要求高,成本低、易于实现,能够满足某些图像采集系统的需要。此系统使用第二类视频采集方法。

如何将各处试飞现场视频信号通过VGA持续接收?传统方式是将模拟的VGA信号引到指定显示器显示,这样即浪费资源且多占空间。多路视频实时采集使用的是VisionRGB- PRO板卡(英国Datapath公司),此卡可同时实时采集两路视频数据,基本达到了本系统的要求,再用一台VGA矩阵切换器将前端数据源的四路视频数据进行人为切换采集,用H.264格式编解码,保存为H.264格式,通过RTP/RTCP与组播协议将编码后视频流传输给请求客户端,而且可在客户端通过TCP协议选择关心的VGA采集通道。

在一台显示器上同时最多显示两路 VGA数据,不用再增加设备,并通过一台服务器软件实时处理后,按客户端请求实时传送到相应客户端监控某现场状态。达到用任意一台客户端按需监控的目的。

1.  系统整体设计


图1   系统结构框图

系统主要实现对前端四路视频数据的人为切换式实时采集,在服务器端最多可同时采集和储存两路视频数据(用一个视频采集卡),也可以一次只采集一路视频数据,再经网络实时传输到客户端播放,服务器端同时实时播放所采集的视频数据。

系统主要由VGA矩阵切换器、服务器端软件、客户端软件三大部分组成,VGA矩阵切换器对四路视频输入信号进行切换输出,服务器端主要负责视频数据采集、VGA矩阵信号切换、视频数据编码、视频信号网络传输,客户端主要负责视数据的解码与播放、简单的VGA矩阵输入输出信号切换。

在进行视频切换方面可在服务器端或客户端自行切换,在服务器端可通过串行口操作VGA矩阵切换进行相应的视频输入输出口的切换,在客户端可通过网络(TCP)->服务器程序相应模块->串行口->VGA矩阵切换进行相应的视频输入输出口的切换。如图1所示。

2.  系统软件的设计

2.1           服务器端软件设计

图2 服务器端程序流程图

图2所示为服务器端实时采集、记录、发送视频数据的程序流程图。运行服务器端程序先加载配置信息,加载成功后初始化RGB板卡、串口、网络,初始化成功后进入实时检测VGA通道信号状态,无信号可手动选择其他通道检测,如果有视频信号将进入实时显示与编码保存状态。如有客户端通过网络请求视频数据,则将编码后的视频数据用RTP协议打包后通过组播协议发送给请求的客户端,同时周期性发送RTCP控制包,,通过对发送、丢失的数据包的数量等统计,动态地改变传输速率与同步视频播放。视频数据量较大,这就要求视频数据处理系统具有实时处理的特点。在服务器端的实现是整个系统的关键,在此也承担了整个软件系统的大部分工作,主要有以下几大块:一是采集;二是记录;三是向客户端发送;四是串口的通信;五图像的形成;六是服务器端的实时播放;七是对图像亮度、颜色、位置等的调整;采集通道、采样率、采集时间的选择。

软件要实现对视频数据的实时采集、控制视频输入输出通道、把视频数据实时编码保存并发送到多个请求客户端。在软件实现方面应用了相应的SDK(Software developmentkit)和API(应用编程接口)。

视频采集先通过Initialise函数初始化VisionRGB板卡与播放界面,在SetupCapture函数中初始化视频的显示的模式,在采集方面最主要是实时性,在此以事件驱动的方法从端口获取数据,回调函数InitiateFrameCapture通过板卡通道命令事件实时采集原始视频数据,采集到视频数据流在相应软件界面播放的同时再利用ffmpeg开源库将InitiateFrameCapture获取视频原始数据编码为H264格式,编码后的数据在服务器本地保存的同时通过网络传输给请求客户端。如图3所示。

图3 服务器端数据处理流程图

在服务器端各方面协调工作是关键,程序启动首先默认上次设定的视频采集卡通道,如有视频数据就播放、记录,如果没有视频数据就等待,如果要调整视频采集卡通道可用串口给VGA矩阵切换器发送相应的命令让VGA矩阵切换器进行相应的输入输出通道切换。也可通过TCP协议经客户端经网络到服务器串口到VGA矩阵切换器进行VGA矩阵切换器相应的输入输出通道切换。每次切换后将自动保存原视频文件,如切换后有视频数据将自动重新生成一个新的视频文件。

在服务器界面播放的视频是没经编码处理的,但网络传输和保存的视频数据是经H.264编码处理后的,这样有力的减轻了网络间传输和服务器的存储I/O负担。

为了在局域网上有效的、高质量的实时传输媒体流,需要多种技术的支持,包括网络传输层协议的选择、编(解)码技术,网络传输层质量控制技术等等。

实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频数据。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务;这两种协议都提供了传输层协议的功能。但是 RTP 可以与其它适合的底层网络或传输协议一起使用。如果底层网络提供组播方式,那么 RTP 可以使用该组播表传输数据到多个目的地。在此,通过JRTPLIB库提供的RTPUDPv4TransmissionParams、RTPSessionParams 等类实现了在组播协议上利用RTP/RTCP协议对视频流进行封装、视频流的同步和控制流封装。服务器端将视频数据封装成RTP协议格式通过组播传输到请求客户端,客户端再将RTP协议包中视频数据分离出,给H.264解码库进行解码播放。服务器端网络接口函数核心代码如下:

服务器端网络发送核心代码如下:

......

RTPUDPv4TransmissionParams netInterface; 

RTPSessionParamsnetSet; 

netSet.SetOwnTimestampUnit(1.0/8000); 

netSet.SetAcceptOwnPackets(true);  

netInterface.SetPortbase(组播端口);  

netInterface.SetLocalIPList(本地IP); 

netInterface.SetMulticastInterfaceIP(组播IP); 

netInterface.SetMulticastTTL(255); 

sess.Create(netSet,&netInterface); 

RTPIPv4Addressaddr(destip,destport); 

sess.AddDestination(addr); 

if(!sess.SupportsMulticasting()) 

 { 

::MessageBox (NULL," 加入组播错误!","错误",MB_ICONERROR);

   } 

    ...... 

如果局域网通信速率很高且状态稳定,则进行实时视频传输就可以达到非常好的效果。但是在网络出现异常时会导致数据传输率不稳定或明显下降,造成发送端数据积压或丢失,此时就要采取一定的策略来控制发送端(服务器端)与接收端(客户端),以达到实时性、稳定性的要求,通过RTCP控制分组信息,服务器端与客户端实时交互描述信息,根据传输数据状态调整传输数据及网络应用状态,达到最佳实时传输视频流的网络状态。在服务器端的采集、播放、保存不受此策略的影响,也就是在服务器端保存的视频数据不会有丢帧的现象。

在服务器端视频采集采用从VisionRGB视频采集卡捕获视频数据,经相应软件模块处理成位图型式的视频帧,然后用H.264编码进行压缩,通过相应网络协议实现压缩后的视频数据在局域网中的实时传输,在客户端接收数据交给H.264解码器解压,最后实现视频播放。如图4所示:

图4  网络间传输示意图

2.2           客户端软件设计

在上面讲服务器端的实现时已经大概描述了客户端的实现,把服务器端实现,客户端实现难点就小很多。如图5所示:

图5 客户端程序流程图

     客户端程序执行流程,运行客户端程序先初始化网络,如果成功则将请求命令发送给服务器端,将接受的网络包按RTP协议分解组合送给H.264解码库解码播放,同时向服务器端周期性发送RTCP控制包。

在客户端也可以自行选择要采集的通道,但对服务器端的采样率等都不能通过客户端进行设置。

客户端端网络接收核心代码如下:

......

RTPUDPv4TransmissionParamsnetInterface; 

RTPSessionParams netSet;

netSet.SetOwnTimestampUnit(1.0/8000); 

netSet.SetAcceptOwnPackets(true); 

netInterface.SetPortbase(组播端口);  

netInterface.SetBindIP(本地IP);   

netInterface.SetMulticastInterfaceIP(组播IP); 

RTPIPv4Addressaddr(destip,portbase); 

sess.Create(netSet,&netInterface); 

sess.SupportsMulticasting();   

status=sess.JoinMulticastGroup(addr);  

……

在客户端实时H.264解码播放速度是完全可以达到实时播放的要求。H.264解码和播放在不同的两个线程中实现,这样做主要是为了播放流畅。可以在两个不同客户端全屏播放两个不同的视频通道采集的数据。

2.3           运行结果分析

在相对稳定的千兆以太网环境下,保证数据源质量的前提下,对采集、接收到的VGA数据包进行统计结果如表1:

表1 时间段内采集与接收帧数比较

运行时间(分钟)

采集帧数

播放帧数

5

125

125

10

250

250

30

750

749

60

1500

1497

120

3000

2983

3.结论

系统作为试飞场景视频监控系统的一部分,负责多个试飞现场VGA数据的实时采集、记录和视频编解码算法的实现、通过多网络协议的优化组合,解决了视频流稳定传输、流畅播放的功能,系统软件还支持事后视频回放,在试运行期间已达到本系统的要求。

系统的软件开发难点和重点在服务器端各功能的实现与多网络输协议的协调运用,通过多网络协议的协调运用,达到很好的实时监控效果。

系统对VGA视频输入扩充后可以实现多于四路输入,增加VisionRGB- PRO板卡可增加视频输出路数,如此升级后,可大大增加系统的实时监控能力。

 

参考文献

[1] Jeffrey Richter(美). Windows核心编程[M].北京: 机械工业出版社出版,2008.          

[2] 张静 , 梁澍.Windows多媒体编程基础[M]  北京. 清华大学出版社,2005

[3] 罗莉琴、詹祖桥.Windows网络编程[M] .北京. 人民邮电出版社,2011  

[4] 雷延钊 .H.264图像压缩与图像增强算法的研究与实现[L] .成都. 电子科技大学,2011   [5] 毕厚杰.新一代视频压缩码标准-H.264_AVC[M] .北京. 人民邮电出版社,2011

[6] 陈靖 .深入理解视频编解码技术--基于H.264标准及参考模型[M] .北京. 北京航空航天大学出版社,2012

[7] 李少博,王晓东,周宇,陈美子,章联军 .基于RTP/RTCP主动丢包的立体视频传输研究[J] .北京. 计算机工程,2015 41(4):241-245

[8]  刘志军.基于H264的实时流媒体可靠性传输[J] .武汉. 中南民族大学,2015

原创粉丝点击