机载光电吊舱视频流实时解码显示技术

2021-04-07 00:28马希超魏志强
电视技术 2021年2期
关键词:卡顿视频流吊舱

马希超,魏志强,葛 珊

(中国电子科技集团公司第三研究所,北京 100015)

0 引 言

随着无人机在侦察监视、安防保卫、森林消防及航拍摄影等众多领域的推广应用,作为其核心载荷的光电吊舱得到了人们越来越多的关注[1-2]。在执行飞行任务时,光电吊舱作为无人机的“眼睛”,通过有线或无线传输链路将采集的可见光视频和红外视频实时传输至地面,由地面操控台上运行的显控软件接收并显示。目前,主流的光电吊舱采集的可见光视频分辨率基本都可达到1 920×1 080 像素,帧率为25 f/s 或30 f/s。通过计算可知,如果直接传输原始视频数据,数据量会达到Gb/s 的量级,对于远距离无线传输来说极难实现。因此,通常对视频进行编码,如采用H.264 或H.265 格式,将数据量压缩至Mb/s 的量级,再经无线链路传输后由地面显控软件解码后显示[3-4]。

视频编解码的引入对显控软件提出了更高的要求[5],主要体现在实时性和平稳性两个方面。一方面,显控软件从接收视频流到解码再到显示需经过多个环节,若简单地顺序执行,必然会导致较大的滞后,对操控设备和观察视频造成明显的影响。为保证较好的实时性,需要设计合理的多线程架构,尽量减小视频显示的延迟滞后。另一方面,在H.264或H.265 格式的视频码流中,视频帧分为关键帧(I帧)、前向参考帧(P帧)和双向参考帧(B帧)3类[6]。其中,I 帧每隔一定时间出现一次,包含一帧图像的完整信息,因此数据量较大;其余的P 帧和B 帧只包含帧差信息,数据量小。因此,传输、接收及解码I 帧时所需的时间较长,导致视频在显示时出现周期性卡顿现象。此时,需要采取适当的方法来保证视频显示的平稳性。

本文描述一种针对机载光电吊舱的视频流实时解码显示技术。通过设计合理的多线程架构,采用动态图像缓存技术,实现了视频解码显示的低延迟和无卡顿,提高了显控软件的实时性和平稳性。

1 流程和线程设计

整个流程分为3 个线程,即接收线程、解码线程及显示线程。3 个线程并行运行,通过视频流缓存和图像缓存两个存储区进行数据交换。处理流程和线程结构如图1 所示。

图1 流程图

在接收线程中,程序以循环的方式不断接收视频流数据并存入视频流缓存;解码线程同样以循环的方式不断检查视频流缓存中的数据量,当数据量超过一定的阈值,提取数据进行解码,并将解码后的图像存入图像缓存;显示线程以定时器方式周期性地从图像缓存中提取图像进行显示。3 个线程在各自独立运行的同时紧密配合,以保证数据的快速传递,最大限度降低延迟,同时数据流向清晰,避免产生线程冲突。

2 接收与解码

接收线程用于完成光电吊舱下传视频流的接收。光电吊舱通常采用UDP 通信协议,通过网络下传视频流,可能带有加密帧头。接收线程通过循环的方式不断读取网络数据,根据通信协议从加密数据包中提取有效的视频流数据,并立即将数据存入视频流缓存。视频流缓存为全局存储区,需具备大量数据快速写入写出的能力。同时,它对内存空间的控制十分重要,一旦发生接收线程和解码线程配合失常的情况,如接收线程正常运行而解码线程由于初始化问题未能运行时,视频流缓存将出现只存入不取出的情况,最终导致内存溢出,程序崩溃。为避免这种情况的发生,采用环形存储器作为视频流缓存。环形存储器采用先进先出原则,当存储空间用尽后会从尾部回到头部,用新的数据覆盖最早的数据。这样既可以免去不断申请新内存空间的开销,又可避免出现内存溢出的情况。在程序运行过程中,接收线程控制存储器的写入指针不断存入视频流数据,到达末端后便回到起点继续写入;解码线程控制存储器的读取指针以追赶的方式不断取出数据,使存储器内的数据量始终保持在一定长度之内,实现动态平衡。

解码线程同样采用循环方式不断获取视频流缓存中的数据量。当数据量大于设定的阈值N(如1 024 Bytes)时,则提取N个字节的数据移交至解码器处理。解码器调用FFmpeg 程序库对H.264 或H.265 码流解码,并转换为RGB 格式图像存入图像缓存。

3 动态图像缓存与显示

在H.264 或H.265 码流中,大部分帧都是只包含帧差信息的参考帧(P 帧和B 帧),数据量较小。每隔固定时间(如1 s)会有一个关键帧I 帧,包含完整的图像信息,数据量大,使得传输和解码都较为耗时。因此,解码得到各帧图像的时间间隔是不均匀的。若不加处理地将每一帧解码图像立即显示,则会每隔一段时间出现一次卡顿现象,影响视频显示的连贯性和平稳性。

为解决这一问题,本文引入了图像缓存。图像缓存的总体思路是将解码图像依次存入缓存,由显示线程定时提取图像进行显示,使显示的周期与解码的周期隔离开来并保持均匀。图像缓存采用队列形式,以先入先出原则进行存取。采用图像缓存需要解决的一个重要问题是保证输入输出的平衡。虽然根据相机的帧率可以计算各帧的平均间隔,但并不十分精确。此外,为定时器设定的响应周期也无法做到与真实的帧间隔完全一致,会导致输入输出的不平衡。若输出快于输入,则会耗尽缓存内的图像,存入一帧则立即显示一帧,导致缓存失去作用,视频依然发生卡顿;若输出慢于输入,则缓存数量不断增加,若不加限制会导致内存溢出,程序崩溃,若设置限幅则会丢失图像。

本文采用动态图像缓存的方法实现输入输出的平衡,流程如图2 所示。每隔一段时间判断一次缓存内的图像数量,若数量较多,则减小定时器的间隔,加快显示;若数量较少,则增大定时器的间隔,减慢显示;若数量适中,则保持初始间隔。以30 f/s的可见光视频为例,设初始显示间隔T=33 ms。每解码30 帧判断一次缓存数量N,若N>5,则令T=30 ms,加速显示,消耗缓存数量,减小视频滞后;若N<3,则令T=34 ms,稍稍减慢显示,积累缓存数量,避免出现卡顿;若3 ≤N≤5,则令T=33 ms,保持稳定显示。

经过对提取频率的动态调整,可以使图像缓存长期维持在数量较少的状态,保持输入与输出的平衡和稳定。

4 测试验证

测试所用的光电吊舱显控软件采用C++语言和Qt 框架编写,实现了本文所述的多线程架构和动态图像缓存技术。在解码线程和显示线程中分别记录每帧图像解码和显示的时间戳,计算解码时间间隔和经动态调整后的显示时间间隔,最后绘制如图3 所示的曲线图。

从图3 可知,解码间隔极不稳定,约30 帧(大概1 s)会出现一次120 ms 以上的长间隔,即处理I帧所需的时间。而经动态调整后,显示间隔平稳程度显著提高,绝大多数数据稳定在33 ms 左右,其中一小段在30 ms 左右,这是缓存数量较多、加快显示的结果。这一结果表明,采用动态图像缓存技术可以有效提高视频显示的平稳性,避免出现卡顿现象。

图2 动态图像缓存流程

图3 帧间隔统计

此外,合理的多线程架构设计也使显控软件具有较好的实时性。本文用简易方法测试了从相机成像到视频编码、传输再到接收、解码及显示全过程的总延迟时间约为0.4 s,如图4 所示。在这一较低的延迟下,控制光电吊舱和观察视频时基本不会产生明显的滞后现象。

图4 延迟时间测试

5 结 语

本文介绍了一种针对机载光电吊舱的视频流实时解码技术,通过设计合理的多线程架构和数据交换方式,采用动态图像缓存技术,实现了低延迟和无卡顿的视频解码显示效果,对于充分发挥光电吊舱的性能和提高地面显控软件的运行效率与使用体验具有重要意义。

猜你喜欢
卡顿视频流吊舱
边缘实时视频流分析系统配置动态调整算法研究
战机吊舱火力赋能“神器”
基于视频流传输中的拥塞控制研究
最忠实的守墓犬
最忠实的守墓犬
最忠实的守墓犬
铁路货场智能大门集装箱全景图像采集方法研究
NEO—2X光电吊舱
美国视频流市场首现饱和征兆
吊舱式电力推进船舶螺旋桨匹配设计仿真研究