基于FFMPEG和SDL的遥测视频解析技术

2019-04-19 05:18刘升护
计算机技术与发展 2019年4期
关键词:解码器遥测缓冲区

郝 朝,刘升护

(中国飞行试验研究院,陕西 西安 710089)

0 引 言

飞行试验是验证航空产品设计指标要求和检验航空产品质量改进提高航空产品性能进行航空新理论和航空新技术研究的重要手段。在飞行试验中,机载视频影像能以最为直观与准确的方式描述飞机内部各独立子系统的健康状态,为地面飞行指挥人员和试飞工程师提供及时丰富的信息,对保障飞行安全、提高试飞效率有不可替代的作用[1]。

目前机载抽引的视频是以PCM流[1]的形式进行遥测下传。地面遥测天线接收到射频信号后通过PCM接收机进行解调,视频服务器接收视频数据并进行分路提取处理,然后以UDP组播[2-3]的形式发送给客户端进行监控显示。

基于以上分析,提出基于FFMPEG[4-6]和SDL[7-8]的遥测视频实时解析方案。客户端接收服务器发送的多路视频数据包,经过解包、拼帧,将一帧完整的视频数据送给FFMPEG进行解码,得到YUV[9-10]图像数据,然后采用SDL进行显示。

1 遥测视频PCM帧格式

PCM(pulse-code moduliation)称为脉冲编码调制。PCM数据传输以其抗干扰能力强、数据带宽大等特点,广泛应用于航空试验领域。PCM数据中一个完整的帧称为全帧,每一个全帧可以包含一个或者若干个子帧。数据中的每个子帧由同步字和数据字组成。目前飞行试验中,应用的机载视频采集器有MiniR700和通用采集器两种。

不同的采集器对应的PCM帧视频数据存放格式也不相同。对于MiniR700视频采集器,PCM帧视频格式如图1所示。

图1 MiniR700采集器视频PCM帧格式

假设该飞机一共有三路视频(V1、V2、V3)进行遥测下传,则每一路视频均是以TS流[11-12]的形式存储在PCM帧结构中,每一子帧中各路视频数据交替出现。为了保证PCM带宽,数据中会存在填充字(FADE)的现象。服务器进行处理时,首先通过ID字将每个子帧拼成一个完整的PCM全帧,然后分别提取每一路的视频数据,最后通过UDP组播的形式进行发送,发送数据包格式为【第几路】【该路视频数据】。

对于通用采集器,PCM帧视频格式如图2所示。服务器进行处理时,只需要将接收到的数据包以组播的形式进行转发即可。

图2 通用采集器视频PCM帧格式

通用采集器视频PCM帧只有一个子帧,帧长512个字。一个完整的视频画面数据需要拆分为上百个PCM帧,每个PCM帧内的图像数据定义如表1所示。

2 视频数据包解析

客户端通过UDP组播接收服务器发送的视频数据包。UDP组播初始化流程为:采用WSAStartup的初始化Winsock;创建套接字;采用bind绑定端口号;采用IP_ADD_MEMBERSHIP加入组播组;采用非阻塞的异步套接字WSAAsyncSelect()实现网络接收,对网络事件采用基于消息的异步存取策略,能够方便地处理网络通信。当接收到服务器视频数据包时,会触发FD_READ消息。接收到每路视频数据包后,存入相应的FIFO队列。

表1 影像数据帧头格式

对于MiniR700采集器的视频PCM帧,首先需要剔除填充字,然后对TS流进行解封装,拼成完整的一帧视频数据。TS流为188字节的固定包长度,好处是便于找到帧的起始位置,易于从包丢失中恢复,适合于有误码的环境。TS流格式如图3所示。包头为4个字节,负载为184个字节。

图3 TS流格式

同步字节固定为0x47,占1个字节,该字段是MPEG-2 TS传送包标识符。PID占13位,表示传送包的有效净荷中的数据类型。根据PID将TS上从不同ES(elementary stream,视频基本流)来的TS包区分开,以重建原来的ES。为了还原视频数据,还需要传输节目随带信息及解释有关TS特定结构的信息(元数据),即节目特定信息(program specific information,PSI),用于说明:1个视频是由多少个ES组成的;1个视频是由哪些个ES组成的;在哪些个PID情况下,1个相应的解码器能找到TS中的各个数据包。为了重建原来的ES,就要追踪从不同ES来的TS包及其PID。因此,一些映射结构(mapping mechanism),如节目源结合表(PAT,PID=0)和节目源映射表(PMT),会以打包的形式存在于TS上,即借助于PSI传输一串描述了各种ES的表格来实现。有了PAT及PMT这两种表,就可以根据PID将TS上从不同ES来的TS包区分开。首先从PID=0的PAT上找出带有PMT的那个节目源,然后从所选择的PMT中找到组成该节目源的各个ES的PID。将TS流还原成一帧完整视频数据后存入解码缓冲区。

对于通用采集器视频PCM帧,接收到每路视频数据包后,将多个视频数据包依据有效数据长度、影像帧长度拼成完成一帧视频后送给解码器解码。拼帧流程如图4所示。首先从接收缓冲区中取出一个视频数据包,如果当前数据帧ID不等于上一数据帧ID,说明为新的一帧视频,将Frame.length置0,将Frame.ID置为新的视频帧ID。否则说明为同一视频帧。将有效视频数据进行提取放入解码缓冲区,如果Frame.length等于该影像帧的总长度,则说明已拼成一帧完整视频,送给解码器进行解码。

图4 拼帧流程

为了保证在视频解码的同时不丢失数据包,采用多线程并发[13-14]与多缓冲区[15]机制,针对数据接收、数据包解析、视频解码与显示分别开辟单独的线程。设置两个缓冲区:数据接收缓冲区与解码缓冲区。数据接收线程接收到遥测视频数据包后将数据包存入接收缓冲区。数据包解析线程从缓冲区中提取数据包进行解包与组帧,将一帧完整视频数据存入解码缓冲区。视频解码线程从缓冲区中提取一帧视频进行解码并显示。各线程之间采用互斥量进行同步操作。

3 基于FFMPEG的视频解码技术

FFMPEG是一个开源且跨平台的音视频流方案,具备高可移植性和编解码质量,为音视频转换、解码以及流化提供了完整的解决方案。libavcodec包含全部FFMPEG音频/视频编解码库,相关数据结构包括AVFormatContext、AVCodecContext、AVCodec、AVPacket、AVFrame 与AVPicture等。

FFMPEG解码视频流的流程如下:

(1)对FFMPEG进行初始化。

av_register_all()

avformat_network_init();

(2)对pFormatCtx进行初始化设置,包括width、height。

(3)找到对应格式的视频解码器。

pCodec=avcodec_find_decoder(pCodecCtx->codec_id);

(4)打开对应格式的视频解码器。

avcodec_open2(pCodecCtx, pCodec,NULL);

(5)对一帧视频数据采用相应的解码器进行解码。

avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet);

在程序运行时读取配置文件,执行步骤1~4对FFMPEG进行设置,然后循环从解码缓冲区中提取一帧视频数据,调用步骤5进行解码得到YUV数据,向图像显示子线程发送消息。

4 基于SDL的图像显示技术

SDL(simple directmedia layer)是一套基于C语言的跨平台多媒体开发库,提供了多种控制音视频输入与输出的函数。SDL显示YUV数据流程如下:

(1)对SDL进行初始化。

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);

(2)利用控件创建SDL显示窗口。

screen=SDL_CreateWindowForm(m_hwnd);

(3)基于窗口创建渲染器。

sdlRenderer=SDL_CreateRenderer(screen,-1,0);

(4)创建纹理用于显示YUV数据。

sdlTexture=SDL_CreateTexture(sdlRenderer,SDL_PIXELFORMAT_IYUV,1,width,height);

(5)设置纹理的像素数据。

SDL_UpdateTexture(sdlTexture,NULL,pFrameYUV→data[0],pFrameYUV→linesize[0]);

(6)将纹理数据复制给渲染目标。

SDL_RenderCopy(sdlRenderer,sdlTexture,NULL,NULL);

(7)显示画面。

SDL_RenderPresent(sdlRenderer)。

执行步骤1~4实现SDL初始化显示设置,接收到解码线程发送的消息,调用步骤5~7即可实现对YUV图像的显示。

5 应用效果

软件界面如图5所示。选择飞机与服务器,点击开始按钮,通过组播接收服务器视频数据包。应用效果表明,该软件能够实现多路遥测视频的解码与显示,时延满足实时监控需求。

图5 实际应用效果

6 结束语

为了解决机载多路视频实时监控的问题,设计了基于FFMPEG和SDL的遥测视频实时解析软件。客户端通过UDP组播接收服务器发送的PCM视频数据包,通过解包并拼成完整的一帧视频数据,送给FFMPEG进行解码并通过SDL进行显示。该软件已经应用于多个型号试飞视频实时监控中,正确性和可靠性得到验证,为保障型号试飞的高效顺利进行发挥了重要作用。

猜你喜欢
解码器遥测缓冲区
科学解码器(一)
科学解码器(二)
科学解码器(三)
线圣AudioQuest 发布第三代Dragonfly Cobalt蓝蜻蜓解码器
远程控制式遥测地面站关键技术研究
大型民机试飞遥测视频编解码方法研究
基于WPF的遥测CAS信息实时监控系统设计开发
自适应模糊PID控制的遥测方舱温度调节方法
缓冲区溢出漏洞攻击及其对策探析
初涉缓冲区