张国超 金巧园 代中华
(中国船舶重工集团公司第七二六研究所 上海市 201108)
计算机操作系统可以分为实时计算机操作系统和分时操作系统。分时操作系统的主要缺点是由于所有进程根据相同的时间片进行切换调度,用户无法根据实际需求指定进程优先级,这样的设计会导致重要的工作任务可能被意外打断,无法一些实时性要求比较高的应用场景。与此对应的实时操作系统为了解决上述问题,允许用户根据实际情况设定任务优先级,高优先级的任务在没有结束前,低优先级的任务无法打断,以此方式保证高优先级任务能够在规定时间内完成,极大满足了用户对实时响应的需求。VxWorks 操作系统是目前全球成熟度最高和应用最为广泛的嵌入式实时操作系统之一,并且以卓越的实时性和稳定性在被广泛的应用在很多诸如医疗基础设施、航空航天、船舶等关键基础设施及军事相关领域。几乎所有操作系统的用户都需要系统能够运行稳定,同时由于不同的应用场景千差万别,操作系统的模块化和可裁剪性也越来越重要,而VxWorks 凭借着其超高可靠性、功能模块的可裁剪性以及高实时性的卓越优势越来越赢得用户的青睐。在功能组件的可裁剪方面,VxWorks操作系统给用户提供非常灵活和简便的方式就能够根据自己的实际需要配置一个属于自己的操作系统内核镜像,默认的VxWorks 系统内核是非常小的,只有大约8KB 大小,功能也很有限,而功能强大的VxWorks 支持可裁剪的组件数量是非常庞大的,包括系统文件系统、网络服务、多任务、多核态支持、图形显示控制、远程服务、域名解析服务、文件传输服务、外设支持等很多高级功能组件,用户可以借助风河公司提供软件集成开发工具Workbench 等工具来实现定制功能,首先创建内核镜像项目,然后通过图形化方式非常容易的配置和定制所需要系统内核,这种高度的灵活性能够让用户非常快捷方便的根据实际应用情况定制或者定制后二次开发一款完全符合自己需求的操作系统镜像,为用户开发软件提供了很大的灵活和便利性,而且能够节约磁盘空间,去掉冗余的功能模块,节约系统资源的同时也提高了系统的运行速度和性能。在系统的实时性方面,受益于VxWorks 操作系统的高度可裁剪性,系统自身的资源占有率为最小化的,开销可控,与此同时系统设计之初实时性就是重要的设计标准和要求,系统的中断处理、任务调度算法、任务之间的通信等系统本身的时间开销很小,因此任务切换时间很少,为系统的实时性提供了基础保障。鉴于物理世界是并发的而不是串行的,因此操作系统的多任务并发是真实世界重要的模拟,在多任务调度算法方面,VxWorks 操作系统采用的是任务轮转方式和任务优先级方式结合的设计,这样的设计能够保证在相同的运算性能的计算机具有更高的实时性和可靠性。
对基于VxWorks 操作系统开发的很多军工、航空、航天、船舶制造等专用设备的应用软件研究发现,在这些应用场景下尤其是显示控制设备的软件,通常需要将执行任务的过程及操作过程的场景数据记录下来,同时在需要复盘分析时候再将记录的场景数据利用特定软件回放,分析任务执行完成操作复盘。场景数据的记录和回放传统做法是基于网络数据报文的方式,技术上一般利用交换机的汇聚口可以接收到经过交换机全部网络数据包的特点以及利用原始套接字能够接收到网口的全部网络数据的功能,并根据过滤条件捕获通过交换机的符合过滤条件的全部网络层数据,通过软件在原始报文前面增加时戳、报文唯一标志等附件头部后,将添加过头部的数据包作为待记录场景数据,利用系统文件操作接口以纯文本方式将场景数据存储在本地硬盘中,在需要进行场景回放时,使用定制的场景回放软件读取记录的文件到内存中,回放软件根据固定的网络通信协议进行数据报文分类和解析处理,将解析结果进行业务代码驱动,完成回放任务。
上述基于报文级别数据记录重演做法弊端是无法针对记录过程的操作进行记录和回放,失去重要的操作信息,并且记录和重演的方式对通信协议依赖性比较强,需要针对不同协议类型的项目分别开发记录和重演的软件,实现代价较高且不具有通用性。鉴于报文级别记录重演存在的问题,本文提出一种屏幕录取和回放的方式解决上述问题。目前Windows 操作系统、Linux/Unix 操作系统都有比较专业的、成熟的配套软件实现屏幕的录制,同时有相应的播放器实现录屏数据的回放。然而VxWorks 操作系统对于视频和图形支持比较有限,目前基于VxWorks 的屏幕录制和回放技术的研究成果也很少,因此本文采取周期性屏幕截屏并使用移植的x264 编码器进行图像数据压缩,形成场景数据的屏幕录制文件,应用移植的FFmpeg 提供的解码器实现场景记录的视频文件的解码和回放任务。
H.264 技术是新一代的视频编码和解码技术,它是由运动图像专家组(MPEG)和国际通信联盟(ITU)共同提出的,由于其具有较低的码率、高峰值信噪比、强大的容错性能、灵活的网络适配能力等从前或其他视频解压缩技术不具备的优势,因此已经成为了最为当前全球应用最为广泛的视频编码和解码技术。与以往的视频编码标准相比,H.264 标准采用优化设计降低接口输入参数的数量,使得应用接口的使用更加便捷并且容易使用,同时比以前的视频压缩技术具有更高的压缩能力。现代社会随着多媒体技术的蓬勃发展以及互联网技术和移动技术的广泛普及,作为新一代视频编码技术的H.264 考虑到压缩性能的同时考虑到了视频会议等流行网络应用的网络通信适配能力,能够实现在具有低误码率以及低丢包率的情况下支持多种不同的码率以适应网络带宽以及拥塞程度不同的网络状况,不同的网络通信状态可以切换不同的码率。H.264 视频编码技术支持帧内预测视频编码技术和帧间预测视频编码技术相结合的方式,针对于不同的视频类型和实际视频数据采用不同的预测技术能够大大节约空间,提高压缩效率。所谓帧内预测是指利用图像的空间相关性,假设在一个小邻域内的某个宏块,像素点之间是具有很大的空间相关性的,与此同时划分的宏块之间也具有较大的空间相关性,所以编码当前宏块时第一步可以根据上、下、左、右以及左上、左下、右上、右下八个周边宏块对当前宏块进行预测,第二步将真实值和预测值的差值(数据残差)进行数据压缩,因为数据残差本身的数据稀疏性,因此在原有基础上更进一步提高了压缩效率。利用离散余弦变换后可以将空间域的信息转换到频率域,由于空间的高相关性变换后的将会是一个稀疏的矩阵,即可以对其进行相应的压缩处理,很明显空间的相关性越强或者帧内的宏块划分的越合理得到的频率域矩阵会更加稀疏,压缩效果也会更加好压缩比更高。所谓帧间预测技术是指利用视频帧与帧之间时间域上的相关性,去除冗余信息达到压缩视频的效果。由于人类眼球具有瞬态记忆的能力,利用这一特点视频播放往往采用的播放频率达到60 帧每秒或以上即可以满足人类视觉需求,本来离散的视频帧我们看起来将会像是连续的,由于每秒的视频帧数量是高大60 帧甚至更高,因此视频帧之间在时间域上面应该是与上一个视频帧以及下一个视频帧之间比较相似,也就是具有高度的时间域的相关性,如果好好利用会最大限度的减少空间的数据冗余从而实现很高的压缩比。与帧内预测编码技术相同帧间视频编码技术也是以宏块作为编码的最小单位的,首先进行宏块的切分,切分后根据帧间预测类型(包括前向参考预测、后向参考预测以及双向参考预测)在参考帧上面进行宏块的全局搜索,将搜索到宏块作为参考宏块,然后计算待编码宏块与参考宏块的残差,最后与帧内预测编码类似,也是针对残差进行离散余弦变换,然后对变换后的矩阵进行压缩。由于离散余弦变换后的矩阵是一个浮点数矩阵,为了提高计算机处理效率,在不影响视频质量的前提下H.264 视频编码技术应用量化技术来对浮点数进行量化处理,量化技术在一方面提高了计算机处理速度从而提高编码速度的同时,会导致有一部分数据因为量化而损失,因此H.264 视频编码技术是一种有损的视频编码技术,同时视频编码的质量就可以根据原始视频与经过视频编码和解码后的视频之间的差异来衡量,主要的衡量方法包括两个视频间的平方误差和(SSD)、均方差(MSE)、绝对误差和(SATD)和峰值信噪比(PSNR),可以根据实际情况进行选择,平方误差、均方差、绝对误差越小或者峰值信噪比越高解码后的视频质量越高或者视频编码损失最小。
H.264 视频编码技术有官方实现的版本JM86,具有很高H.264 的功能特性的完备性,学术研究的算法大多基于该版本代码进行功能性能测试,但是由于其功能过多、软件复杂度很高、代码冗长不便于理解和移植,运行效率也比较低。当前全球应用较为广泛的视频编码器是x264,x264 是H.264视频编码器的一个开源实现版本,是全球最优秀的开放源代码的有损视频编码器之一。由于x264 视频编码器是一个纯C 语言实现的函数库,为用户提供一套便捷、统一的应用程序用户接口,用户可以根据实际运行环境非常方便的进行x264 视频编码器的本地移植,具有很好的通用性。
在Linux/Unix 操作系统下x264 视频编码器是原生适配的,不需要移植,只需要根据运行平台的CPU 类型及系统版本选择编译好的软件包即可,而对于VxWorks 操作系统,x264 默认是不支持的,需要经过一定的软件移植工作,才能够运行在VxWorks 操作系统。VxWorks 移植的主要步骤如下:
(1)在Windows 系统下安装msys2(Minimal System2);
(2)打开msys2 终端,进入下载好的x264 源代码目录,输入makefile 配置命令:./configure –enable-shared(生成共享库)–disable-asm(取消汇编功能),配置产生所需的makefile 文件;
(3)打开Workbench3.2,新建DKM 模式的工程,将步骤2 所生成的文件拷贝到新建的工程源代码路径;
(4)构建项目,产生VxWorks6.8 所需要的x264 函数动态库。
x264 仅完成解码器功能,为了实现压缩视频的解压缩本文选用目前应用最为广泛的开源软件FFmpeg作为解码器。FFmpeg 是一套开放源代码的数字视频工具套件,它的功能非常强大,不仅仅可以完成视频的解码功能同时还提供一系列工具库用来实现数字视频以及音频相关处理转换甚至记录等强大功能。FFmpeg 在设计时为了保证用户能够根据需要安装自己所需要的功能模块,功能划分非常合理和清晰,主要包括数字音频及视频格式通用模块(实现对当前应用最为广泛的通用数字音频以及视频格式的封装)、数字视频及音频解码器模块(实现对主流数字音频和视频格式的解码功能的封装)、数字视频及音频字幕处理和滤镜处理模块(实现对主流数字音频和视频格式的字幕及滤镜封装)等很多功能模块。用户在应用FFmpeg 的时候可以使用其自带的工具,例如自带的播放器或者编译好的FFmpeg 工具程序等,通过命令行参数应用不同的功能,另外一种使用FFmpeg 的方式也是应用最为广泛的方式是直接编写程序调用FFmpeg 提供的应用程序用户接口,链接时将编译好的FFmpeg 功能模块动态函数库链接到主程序中,这样的方式更加灵活,极大的满足用户各种特定的需求,但需要进行软件的移植工作。本文使用第二种方法,进行开源软件的移植,应用程序调用库函数接口。FFmpeg 主要是基于C 语言开发的,在Linux 操作系统上是原生适配的,但由于其开发语言主要是C 语言编写的,具有很高的可移植性,已经被广泛移植到Windows类操作系统、Mac OS 类操作系统等很多主流操作系统及各种硬件平台,但是目前针对VxWorks 操作系统FFmpeg 还没有官方适配的公开发行版本,为了完成在VxWorks 操作系统下使用FFmpeg 的功能模块,必须首先完成FFmpeg 在VxWorks 操作系统下的软件移植工作。移植过程中可以根据实际应用的需要选取其中全部或者部分功能组件进行配置,对于本文的情况,仅仅是场景回放时候需要应用FFmpeg 的解码功能对压缩好的场景记录文件进行解码和播放,因此只需要配置其中的视频解码器组件(libavacodec)和通用工具组件(libavutil)即可满足需求。移植的主要步骤是首先从其官方网站上下载FFmpeg 软件的开源代码压缩包,由于各种更新的存在现在有很多版本的FFmpeg,作者下载的是应用较多并且比较稳定的一个发行版本v3.2.1,接下来的具体移植步骤与上文叙述的x264 软件的移植步骤基本相同,利用Workbench 进行植代码的编译,编译结果为对应接口模块的静态或者动态函数库,完成移植后后续使用时,在代码中只需要包含特定的头文件,加载相应静态或者动态库即可以使用相应的函数接口。
按照本文章节2 和3 的软件移植步骤分别完成视频压缩和解压缩软件的移植工作,形成VxWorks 操作系统下可用的静态函数库,为后面的该系统下屏幕数据的记录和回放做好准备。在VxWorks 系统下屏幕录取的基本思路是首先按照固定频率(60Hz)截取当前屏幕,并将截取结果暂存到全局缓存中,将解图产生BMP 格式的截屏数据转换为x264 所需YUV 格式,利用x264 视频压缩接口对截取的YUV 数据进行视频压缩,并将视频编码结果存储到本地硬盘,保存格式为mp4,保存前首先检测磁盘空间是否充足。屏幕录取的主要流程如图1所示。
图1:VxWorks 系统下屏幕录取流程图
VxWorks 系统下屏幕录取的关键代码如下所示;
在VxWorks 系统下视频记录数据回放的基本思路是首先利用fread 函数读取所需回放的视频文件,利用FFmpeg函数库中解码器组件,进行视频解码,解码结果保存到YUV 文件中,完成视频的解码阶段。在视频回放阶段,利用视频播放模块进行YUV 视频的播放,主要步骤是,首先读取YUV 文件,并将YUV 格式的数据转换为BMP 格式,然后设置频率为60Hz 的定时器,定时将产生的BMP 格式数据更新到需显示的区域,并调用update 函数刷新界面,从而完成视频的回放功能。屏幕录制视频回放的主要流程如图2所示。
图2:VxWorks 系统下视频播放流程图
其中关键代码如下所示;
对于嵌入式操作系统其通常的开发调试步骤是首先在本地安装交叉编译环境,编写好的代码经过交叉编译后产生可以在目标机器运行的软件可执行程序,然后通过以太网络或者串口的方式将本地主机和目标设备连接在一起,将编译好的可执行程序通过网络(文件传输协议)或者串口导入到目标机,然后目标机可以编写启动脚本运行编译好的软件,对于调试过程需要本地编译环境特定工具的支持。这种传统的调试方法主要缺点是需要一个配套的硬件设备平台配合,开发调试成本较高,如果在经费有限的情况下还需要进行此类嵌入式系统应用程序的调试任务,一种便捷的方式是使用虚拟化技术虚拟嵌入式系统,在虚拟机中进行应用软件的调试。本文采用的是利用操作系统虚拟化软件结合VxWorks镜像来完成虚拟机的搭建工作。VxWorks 操作系统与很多嵌入式操作系统类似需要引导启动,因此首先需要创建一个引导系统,引导系统的配置主要步骤是首先打开Workbench 集成开发环境,使用默认设置创建类型为引导系统的新项目,默认配置情况下系统为最小内核,不提供控制台以及网络等高级支持,如果需要增加一些高级配置需要修改配置文件,本文所需环境增加的配置包括控制台、远程文件传输服务器、网络协议栈的支持。在编译好引导系统后下一步是制作BootRom 引导系统软盘,由于目前的计算机设备几乎都不支持软盘了,因此需要借助虚拟软盘软件利用硬盘资源模拟一个虚拟软盘,虚拟软盘能够实现软盘类似的功能。本文应用的是应用比较广泛的虚拟软盘软件RamDiskNT,该软件可以很好的在Windows 系统运行,实现虚拟软驱功能。其安装过程如同其它应用程序的类似,这里就不在展开描述。制作好系统引导盘后打开虚拟机软件VMWare,使用默认设置创建一个新的虚拟机,磁盘设置8GB,选用桥接网卡模式。我们选择配置方式为定制方式,现在只需要配置环境不需要安装系统,所以选择暂不安装系统,操作系统的类型选择其他设置系统启动顺序修改为软盘启动为第一启动项,然后虚拟机开机,就可以加载引导系统。使用这种方式完成VxWorks 的虚拟机搭建,运行软件运行环境为在x86 架构下的VxWorks6.8 操作系统,完成操作系统搭建后,启动系统,将编译好的软件通过ftp 导入到VxWorks6.8 虚拟机中,输入命令rtpSp"x264.vxe --fps 5 --crf 18 -o test.mkv,infile.yuv,352x288" 启动软件,就可以完成屏幕录制和压缩,利用ftp将test.mkv 导出,播放效果如图3所示。
图3:场景回放test.mkv 播放效果截图
本文给出了VxWorks 操作系统下,基于定时截屏技术,结合视频压缩思想,利用优秀的H.264 开源编码器x264 及开源解码器FFmpeg,实现了VxWorks 系统下屏幕的视频记录与重新播放的功能,利用虚拟机的方式模拟VxWorks 操作系统的软件运行环境并在给定的环境下完成VxWorks 操作系统下场景视频级别的记录和回放,文中提供了实施过程的关键实验步骤方法以及实验效果截图。实验结果表明,本文提出的基于VxWorks 的视频记录重演系统具备工程实现条件,同时本文提出的方法,弥补了在VxWorks 系统下传统场景记录及回放方法即报文级别数据记录重演方法的无法记录用户操作的关键缺陷,该方法能够完全记录用户的全程操作步骤,为后续复盘现场提供了重要依据。由于本文提出的方法是一种纯软件的工程实现,不需要新增加任何硬件的情况下,不需要修改原项目软件源代码,只需要运行本文提出的软件,即可实现场景数据视频级别的记录和回放,因此可以用于已经存在的旧项目系统升级完成新功能,同时由于软件所依赖的编程语言是c 或者c++编程语言,具有很高的跨平台和可移植性,应用前景非常广泛,具有较好的工程实用性。但由于视频录制过程中应用到视频解压缩算法,该算法具有较高的负责度,对所运行的硬件环境有一定要求,与此同时视频解压缩算法的运行需要一定时间,尤其是参数设置的如果是高分辨率和高码率的情况下,算法的运行时间会更加长,因此对于硬件配置较低的平台,视频压缩过程占用的CPU、内存等硬件资源会导致用户操作有卡顿感,针对以上出现的这种问题,作者在后续研究过程中会持续优化算法,争取提出相应的优化解决方案,解决上述问题从而提高用户操作的体验。