基于ARM9的视频采集传输系统

时间:2012-11-10来源:网络

  FFMPEG是一个音视频数据的采集记录、编码及流式传输的完全解决方案。该项目包括下面组件:

  a) FFMPEG是音视频文件格式转换的命令行方式的工具,同时支持实时的采集编码TV card数据。

  b) FFserver可以通过HTTP/RTSP方式进行多媒体数据的流式播放。

  c) FFplayer是基于FFMPEG库和SDL的播放器。

  d) libavcodec包括了全部FFMPEG音视频的编解码库,libavformat包括了全部支持的音视频格式的语法和生成库。

  FFMPEG库支持的编解码支持格式非常丰富,而且编解码速度很快;支持指定音视频捕捉设备实时处理数据源并将其保存;FFMEPG能够通过命令行参数指定视频编解码、格式转换的帧频、帧大小及比特率、码率控制缓冲区的大小;并且,FFMPEG可以通过激活视频的高级选项来对编解码的方式进行控制,包括设置帧内编码、视频量化标度的设置、设定p帧以及b与i帧间的qp因子和偏差、运动估计及DCT/IDCT算法的选择,b帧和运动矢量以及交织编码方式的使用。对于视频捕捉设备的选择也可以通过参数来选定,如/dex/video0或DV1394专用通道等。

  FFMPEG库能够在多种平台上运行,包括Linux、Windows和Mac OS等系统,在嵌入式系统中,由于嵌入式Linux具有源代码完全开放、可移植性强和对网络的支持好等特点,所以选用了ARM-Linux系统,该系统支持这次选用的ARM9架构的CPU,而FFMPEG是针对通用PC的X86架构的CPU设计的,因此要将FFMPEG移植到ARM9架构的系统上。首先需要通过将其交叉编译成可在ARM-linux上运行的库。具体步骤如下。

  将下载的最新的FFMPEG源代码包解压缩再生成FFMPEG目录,然后针对所开发系统的交叉编译链,通过修改configure文件来生成Makefile文件,

  然后用make命令通过读取生成的Makefile文件来自动编译生成所需要的FFMPEG库文件和可以在ARM开发板上运行的二进制可执行文件。编译成功以后就可以通过宿主机的NFS服务将宿主机安装到开发板上,这样就可以到相关目录下测试所编译的FFMPEG能否正常地工作:

  即将对音频文件cat.wav和原始的yuv视频文件编码生成cat.mpg,如果没有输入数据文件,则音视频捕捉设备就将起作用,说明所需要的交叉编译生成的FFM-PEG库可以正确地运行。

2.4 视频采集编码程序的关键技术

  在设计视频采集程序时主要使用FFMPEG的libavformat和libavcodec这两个函数库,许多视频文件格式一般只是定义如何将音视频流编码进一个独立的文件,而不明确指出其使用的编码工具,libavformat库的功能主要是分析视频文件的语法格式,并将它从流中分离出原始的音视频流,libavcodec库的功能则是按照流格式处理原始的音视频流编解码。

  在使用libavformat/libavcodec库函数对视频文件进行处理时,首先通过调用av_register_all()函数对其初始化,这个函数中定义了所有库所能支持的文件格式和编码器,因此当读取一个文件时,通过调用此函数来自动使用所对应的格式或者编码库。视频文件打开则通过av_open_input_file函数来实现:

  这个函数的最后3个参数分别定义了文件的格式、缓冲区的大小和格式的参数;在这里赋值NULL和0来指定libavformat库函数自动检测格式和使用默认的缓冲区的大小。然后就可以读取文件的流信息:

  来填充AVFormatContext中关于流区域的内容,接着通过一个循环寻找到第1段视频流:

  这样就可以读取视频流的内容来指定选用的编解码器并将编解码器打开:

  这里的定义CODEC_CAP_TRUNCATED是指当视频流被分割成小的数据包以后,由于每一帧视频的数据量会发生变化,这就需要两个视频帧的边缘与数据包的边缘匹配,因此在这里定义这个宏来告诉编码器该如何处理它。最后调用avcodec_alloc_frame()函数来分配帧缓冲。

  在编码端需要使用libavformat库函数来读取这些数据包,滤除掉不需要的非视频流数据,然后循环调用libavcodec库函数GetNextFrame(AVFormatContext *pFormatCtx,AVCodecContext * pCodecCtx,int video-Stream,AVFrame * pFrame)来处理每帧数据进行编解码。

  视频采集端采用从Video4Linux视频设备源中捕捉视频帧,Video4Linux是Linux下用于获取音频和视频的API接口,现有的Video4Linux有v41和v412两个版本,我们采用v4l进行编程,在Linux下,将所有外没都看做一种特殊的文件,称之为设备文件,因此利用v4l API获取视频图像可以通过调用open、ioctl等函数,像对普通文件一样对硬件进行初始化、设置硬件属性和调用硬件中断等操作。在打开视频采集设备后,分别通过ioctl(vd->fd,VIDIOCGCAP,(vd->ca-pability))函数的VIDIOCGCAP控制命令,来获取关于视频采集设备所能显示的最大图像大小,信号源的通道数和通过ioctl(vd->fd,VIDIOCGPICT,(vd->picture))的VIDIOCGPICT来获取一些关于图像的亮度、对比度等信息。Video4Linux方式获取视频图像的方式有overlay和mmap两种,在这里采用了MMAP方式,MMAP方式允许直接将设备内存映射到用户进程的地址空间中,这样就可以直接在进程中读写内存来控制设备。在使用libavformat/libavcodec库从Vide-o4Linux视频设备源中捕捉视频帧时需要调用av_open_input_file()函数,因此,最后还需要修改此函数中的设备属性配置,使之与我们所选用的没备相对应。

3 测试结果及展望

  在这里使用了ffserver流媒体服务端组件来实现流媒体传输,首先需要配置ffserver.conf文件中关于服务端主机的端口号、传输带宽、延迟,流媒体文件属性等信息。然后启动ffserver读取配置文件,就可以在接收端通过WMP(Windows Media Player)输入服务端URL看到实时采集的视频图像。经测试,目前该嵌入式流媒体服务器在传输MPEG-4视频时的帧率可以达到20帧/s,接收端观察图像流畅,画面清晰。

  本文提出了一种基于ARM9架构MC9328MX21的嵌入式系统上实现MPEG-4流媒体视频采集传输系统,通过在ARM-Linux操作系统下移植libavformat/libavcode库,利用该函数库良好的可移植性和Video4Linux完成了本地视频图像的采集、编码等功能,并向网络发送流媒体打包数据。该系统具有实时性好、可移植性强、低功耗和可远程移动控制嵌入式系统的特点,并且采用软件实现其主要功能,有利于系统的二次开发及升级,其应用范围和前景将非常广阔。

1 2

关键词: ARM9 视频采集 传输系统

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版