其成员函数分别完成了与Au1200 CIM接口相连摄像头设备的打开、控制、读写、映射以及释放等基本功能。例如通过ioctl操作对摄像头进行配置:
(2)库与协议栈部分
为了支持上层应用程序的运行,软件系统中还必须包含众多与之相关的函数库和协议栈。其中,主要包括了与系统运行相关的基本函数库,与音视频编解码相关的音视频编码库,与用户界面相关的Qtopia库以及各种接口协议组成的协议栈。
(3)应用层部分
视频监控的软件流程图如图4所示。启动摄像头后,将采集到的视频数据映射到内存中。通过输出控制,选择视频数据的流向。其中,数据处理部分主要涉及与ffmpeg相关的视频压缩处理。
(4)用户控制部分
系统采用Qtopia-core-opensource-4.2.2开发用户界面。由于采用按键控制的方式,需要将按键驱动程序添加到QT库中。通过中断的方式,可以捕获按键信号,并通过QT中的信号与槽的机制控制信号传输,使得当每个按钮被按下时,触发用户程序中的某个函数,并将相应的信号量传递出去,从而实现对整个系统的控制。
4 基于ffmpeg的软压缩方法
ffmpeg是一个开源免费的软件,它提供了录制、转换以及流化音视频的完整解决方案。使用ffmpeg软压缩的方式,不增加系统额外的硬件开销,对采集到的视频数据进行实时压缩。在视频处理应用程序的编写过程中,需要按照ffmpeg定义的数据结构来描述视频数据,调用ffmpeg中的各种库函数,将摄像头采集到的视频数据按照设定的格式进行压缩,并存成视频文件,其处理流程如图5所示。
其中包括:
(1)ffmpeg初始化:定义与视频处理相关的数据结构AVFormatContext,AVOutputFormat,AVStream,AVCodecContext,AVCodec,AVFrame,AVPicture等,并通过av_register_all(),av_alloc_format_context()等函数初始化相应的数据结构。
(2)压缩参数设置:主要涉及到视频压缩的相关参数,如帧率、视频分辨率、编码类型等,通过av_set_parameters()函数进行设置。
(3)图像格式转换和视频数据填充:按照视频监控要求,利用img_convert()等函数对图像格式进行转换,并将转换后的视频数据通过avpicture_fill(),fill_yuv_image()等函数填充到AVPicture数据结构中,以供编码器使用。
(4)ffmpeg视频编码:利用avcodec_encode_rid-eo(),av_rescale_q()等函数,调用ffmpeg编码库进行视频编码。
(5)文件存储操作:利用av_write_header(),av_write_frame(),av_write_trailer()等函数将压缩后的视频数据写入指定文件中。
(6)采集结束:采集结束后,利用avcodec_close(),av free()等函数释放内存资源,退出程序。
ffmpeg提供功能丰富的音视频函数库,包括libav-codec,libavformat,libavdevice,libavfilter,libavutil和libswscale等,可为用户提供许多音视频处理相关的操作。系统应用程序中调用到的ffmpeg相关函数主要依赖libavformat库(支持所有的普通音视格式的解析器和产生器的库)和libavcodec库(具有高效、高可复用的音频/视频编解码库)。
5 结 语
本文介绍了基于Au1200无线车载视频监控的设计与实现,着重介绍了基于ffmpeg软压缩方法对视频数据的压缩和存储的实现,在实际应用中具有价值。