基于RTMP协议的桥梁视频监控关键技术研究
2020-12-07崔营营刘洋刘志强
崔营营 刘洋 刘志强
摘 要:文中针对视频监控信号对网络带宽要求高,难以通过公网远程传输等问题,提出了基于RTMP协议的实时视频远程传输解决方案,通过开发视频转换软件将桥梁现场视频信号转换为RTMP码流,并将其推流至云平台端搭建的Nginx流媒体服务器上。客户端通过开发Web端和安卓移动视频播放软件,实现了桥梁视频监控信息的跨平台展示应用,提升了桥梁安全的实时监管能力。
关键词:RTMP协议;流媒体;Nginx服务器;Web;编码技术;视频监控
中图分类号:TP206文献标识码:A文章编号:2095-1302(2020)11-00-03
0 引 言
近年来,随着我国交通基础设施建设的跨越式发展,各类跨江跨海大桥建立的健康监测系统逐渐成为保障桥梁安全的重要手段。视频监控凭借技术成熟,监测方式直观可靠等优点已成为桥梁健康监测系统的标配。但视频信号相较数字类监测信号对网络带宽要求较高,常出现卡顿、掉帧等问题。同时考虑桥梁现场恶劣的工况及数据安全要求,导致目前只能采用高速光纤专网实现视频信号的局域网传输,大大限制了网络传输距离和应用范围。
本文提出了一种基于RTMP(Real Time Messaging Protocol,RTMP)协议的视频监控数据远程传输方案,在不改变桥梁监测系统网络架构的基础上,实现了视频监控信号的远程传输和多平台展示应用[1-2]。
1 编码协议简介
1.1 RTMP协议
RTMP协议是一种进行实时数据通信的网络协议,主要用来在支持Flash/AIR平台和支持RTMP协议的流媒体服务器之间进行音视频数据通信[3-4]。
RTMP协议是建立在TCP协议之上的应用层协议,其数据包由一个固定长度的包头和最大长度为128 B的包体组成。RTMP協议数据包格式如图1所示。
协议包头中MessageType为消息类型,PayloadLength为报文长度,TimeStamp为消息时间戳,StreamID为视频流ID。协议包体主要由基本消息头(ChunkBasicHeader)、负载消息头(ChunkMessageHeader)、扩展时间戳(ExtendedTimeStamp)和消息块数据(ChunkData)组成。
为保证在低网络带宽下视频流的传输,在RTMP协议下视频消息块被拆分为若干个小的数据块,各数据块通过ChunkMessageHeader消息头可重新组装成完整的消息块。数据采集端将视频流分割成较小的数据块后以TCP协议发送至服务器端,客户端获取服务器端数据块后重新将其组装成完整的视频消息块,实现视频流的流畅播放,从而解决了低带宽情况下的视频延迟和卡顿问题。
1.2 H.264编码技术
H.264是当前一种主流的视频压缩编码标准。与H.261,H.263等视频编码标准相比,H.264协议采用DCT变换编码加DPCM差分编码,并融合了运动估计、多帧预测、基于内容的变长编码等先进技术,使其编码压缩效率大幅提升,进而有效提升视频质量及其网络适应能力。
H.264协议为解决不同应用中网络传输的差异问题,在架构层面定义了两个层级。
(1)视频编码层(VCL):通过视频信息的编码,实现视频内容的高效展示;
(2)网络提取层(NAL):判断当前网络环境,并采用相应的提取算法打包和传输视频数据。
H.264编码架构如图2所示。
2 总体技术路线
本文结合以往项目经验,提出基于RTMP协议的视频监控信号的远程传输方案,总体技术路线如下:
(1)桥梁现场视频摄像机将采集的原始视频流数据通过光纤内网传输到监控中心的视频处理服务器;
(2)自主开发RTMP码流转换软件并将其部署在视频处理服务器上,将桥梁现场传输的原始视频信号转换为RTMP码流,并通过加密公网将RTMP信号推流至具有公网IP的云服务器端;
(3)在云服务器端部署并配置Nginx流媒体服务Server端,实现RTMP视频数据的中继转换功能;
(4)在客户端开发基于Web端和安卓移动端的视频播放软件,从Nginx服务器获取并展示视频信号,实现桥梁视频监控信息的实时展示[5-6]。
RTMP视频监控网络架构如图3所示。
3 关键技术研究
3.1 RTMP码流转换开发
目前主流的RTMP码流转换方法是采用FFmpeg将RTSP视频信号转换为RTMP流媒体信号,但FFmpeg存在丢包率高、多路信号传输支持性差等缺点。
经过多方比选验证,本文最终采用EasyRTMP直播组件进行二次开发,该组件集成了RTMP基本协议与异步推送、环形缓冲区、网络拥塞自动丢帧、事件回调、缓冲器、关键帧检索等功能,可兼容市面上大部分RTMP流媒体服务器。
EasyRTSP直播组件具有Windows,ARM,Linux等不同跨平台版本[7-8]。实际开发中采用C++语言引用EasyRTSPClient.dll类库编写视频流接收及RTMP转换功能,其代码逻辑流程如图4所示。
本模块通过RTSPSourceCallback回调函数不断监听视频数据,当监听到数据类型为EASY_SDK_VIDEO_FRAME_FLAG时,启动RTMP码流转换代码块,其处理核心逻辑代码如下:
if(_mediatype== EASY_SDK_VIDEO_FRAME_FLAG)
{
pChannel->fPusherInfo.rtmpHandle= EasyRTMP_Create();
//创建RTMP句柄对象
EasyRTMP_SetCallback(pChannel->fPusherInfo.rtmpHandle,__EasyRTMP_Callback, pChannel);//设置RTMP回调函数
EasyRTMP_Connect(pChannel->fPusherInfo.rtmpHandle, pChannel->fCfgInfo.destRtmpAddr);//连接目标主机
mediaInfo.u32VideoFps=pChannel->fMediainfo.u32VideoFps;
mediaInfo.u32VideoCodec = frameinfo->codec;
mediaInfo.u32VideoFps = frameinfo->fps;
EasyRTMP_InitMetadata(pChannel->fPusherInfo.rtmpHandle, &mediaInfo, 1024);//初始化RTMP元数据
EASY_AV_Frame avFrame;
memset(&avFrame, 0, sizeof(EASY_AV_Frame));
//视频帧大小
avFrame.u32AVFrameFlag = EASY_SDK_VIDEO_FRAME_FLAG;
avFrame.u32AVFrameLen = frameinfo->length;//视频长度赋值
avFrame.pBuffer = (unsigned char*)pbuf;//视频帧内容
avFrame.u32VFrameType = EASY_SDK_VIDEO_FRAME_I;
EasyRTMP_SendPacket(pChannel->fPusherInfo.rtmpHandle, &avFrame);//RTMP视频流发送目标主机
}
按照以上代码逻辑编写软件程序并封装成后台Windows服务,实现了多路视频信号由RTSP协议到RTMP协议解析转码,并通过公网将转换后的视频信号推流至云端的Nginx流媒体服务器。
3.2 Nginx流媒体服务器搭建
Nginx是一种高性能的Http和反向代理服务器,通过Nginx可搭建支持RTMP协议的流媒体服务平台,其设计难点在于如何在网络带宽有限的情况下尽量减少数据延迟和数据丢帧。
Nginx通过RTMP模块提供服务,本方案采用阿里云ECS云服务器作为运行环境,操作系统为Windows Server 2012,其配置Nginx流媒体服务关键步骤如下:
(1)通过命令编译并安装Nginx依赖包gcc;
(2)下载并通过命令安装第三方扩展模块nginx-rtmp-module,使Nginx能够支持RTMP和HLS协议;
(3)下载并安装nginx_mod_h264_streaming模块,使Nginx支持FLV和MP4流播放功能;
(4)修改nginx.conf配置文件,将nginx-rtmp-module添加到配置文件中。
核心配置信息如下:
# vim nginx.conf
rtmp {
server {
listen 1935;//监听的端口号
application myapp {//自定义的名字
live on;
}
application hls {
live on;
hls on;
hls_path /tmp/hls;
hls_fragment 1s;
hls_playlist_length 3s;
}
}
}
# /etc/init.d/nginx reload
3.3 客戶端视频播放开发
Nginx流媒体服务搭建完成后,客户端可通过拉流获取并播放视频。本文设计Web端和安卓移动端两种客户端播放展示方式,如不支持HTML5则自动切换至Flash播放器。
目前主流的网络视频播放器架构包含UI界面、多媒体引擎和解码器三个部分。UI界面主要实现播放界面的风格、UI组件及业务逻辑模块控制。多媒体引擎包含媒体源管理引擎和网络管理引擎,主要实现网络传输及多媒体传输控制。解码器部分包含解码器和渲染器两部分,为播放器的内核。网络视频播放器架构如图5所示。
为实现Web端视频播放器的去插件化,需要借助HTML5技术,通过采用Media Source Extension API接口实现基于Web的无插件式流媒体播放功能。
实际开发中,Web平台前端视频播放界面选择开源类库video.js,它能够自动检测浏览器对HTML5的支持情况,若浏览器不支持HTML5则自动使用Flash播放视频,满足系统对于多种浏览器的兼容性需求。Web端视频播放界面如图6所示。
安卓移动端采用开源视频播放器ijkplayer,该播放器包含先进的音视频编解码库libavcodec,能够实现完整的视频录制、转换以及流媒体播放等功能。安卓移动端视频监控APP界面如图7所示。
4 结 语
本文针对桥梁健康监测系统采集的视频监控信号对网络带宽要求高,难以通过公网远距离传输的问题,提出了基于RTMP协议的视频远程传输方案。
桥梁现场通过开发并部署基于RTMP协议的码流转换软件,将原始视频信号转换为RTMP码流并推送至云服务器端。
云服务器端通过搭建Nginx流媒体服务接收转换桥梁现场推送的RTMP码流,并为客户端提供拉流服务,同时还具有缓存中继和公网转发功能。
实际应用中采用Web网页端和安卓端两种方式获取并展示视频监控信息,实现了桥梁视频监控信号的跨平台展示应用,大大提升了桥梁安全的实时监管能力。
参考文献
[1]王艳.Android系统中RTMP流媒体直播的设计与实现[J]. 电视技术,2017,41(1):64-67.
[2]张印.基于RTMP协议的流媒体系统的设计实现[D]. 成都:电子科技大学,2016.
[3]吴杨.基于RTMP协议的实时视频监控系统的设计与实现[D].杭州:浙江工业大学,2017.
[4]吴杨.基于SIP、RTP/RTCP和RTSP协议的视频监控系统[J].计算机与现代化,2013,29(11):139-142.
[5]隗超,张伟,石澜.基于Nginx负载均衡及多线程智慧农业系统的设计[J].物联网技术,2017,7(4):110-111.
[6]叶锋,傅燕云,陈林芳,等. 基于多协议融合的实时移动视频监控系统[J].计算机系统应用,2015,25(4):80-85.
[7]孙晓波,王荣浩,季新年,等.基于Web视频监控系统的设计方案[J].电脑编程技巧与维护,2011,18(2):61-62.
[8]方旭昌.基于H.264的无线视频采集系统[D].杭州:杭州电子科技大学,2013.
[9]马丹丹.基于RTMP协议的视频流媒体服务器部分关键技术研究与实现[D].南京:南京航空航天大学,2012.
[10]许磊.基于RTMP协议的智能监控系统的设计与实现[D].广州:广东工业大学,2017.