新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于ARM11的无线视频

基于ARM11的无线视频

作者:时间:2012-08-14来源:网络收藏

3 视频数据采集和编码设计

3.1 基于V4L2 视频数据采集设计

在Linux 系统下,对视频设备的各种操作是通过Video4Linux2 实现的,简称V4L2.应用程序通过V4L2 提供的接口函数实现视频设备的操作。整个视频数据采集的过程如图2 所示。

( 1) 打开视频设备, int open( const char *pathname, int flags)。调用该函数,若返回值为-1,表示打开失败,否则,表示所打开设备的文件描述符。

(2)取得设备信息。通过ioctl(cam_fp, VIDIOC_QUERYCAP, cap)函数来取得设备文件的属性参数并存储于cap 结构中,其中cam_fp 指的是打开的视频设备的文件描述符。

( 3)选择视频输入方式。通过ioctl(cam_fp,VIDIOC_ S_INPUT, chan)函数设置视频设备的输入方式,其中chan 的数据结构类型是v4l2_input,用来指定视频的输入方式。

( 4 ) 设置视频帧格式。通过ioctl(cam_fp ,VIDIOC_S _FMT, fmt)函数设置视频的帧格式,其中fmt 的数据结构类型是v4l2_format,用来指定视频的宽度、高度、像素大小等。

(5)读取视频数据。通过read(cam_fp, g_yuv,YUV_ SIZE)函数,把摄像头一帧的数据存放到g_yuv中,其中YUV_ SIZE 指的是每帧数据的大小。

(6)关闭视频设备。通过close(cam_fp)函数来实现视频设备的关闭。

基于ARM11的无线视频
图2 视频数据采集流程框图。

3.2 视频数据的H264 编码

为了提高视频数据编码速度,本系统采用的是H264 硬编码方式,硬编码具有不占用CPU 资源,运算速度快等优点,从而满足视频数据实时性的要求。

具体编码的过程如图3 所示。

(1)创建H264 编码结构。调用SsbSipH264EncodeInit (width, height, frame_rate, bitrate, gop_num)函数实现的,其中width 表示图像的宽度,height 表示图像的高度,frame_rate 表示帧频,bitrate 表示比特率或码率,gop_num 表示两个相离关键帧之间最多包含多少个帧(B 或P 帧)。

(2)初始化H264 编码结构,调用SsbSipH264Encode Exe (handle)函数。

(3)获取视频输入地址,SsbSipH264EncodeGetInBuf (handle, 0)函数来实现,该函数返回视频输入的首地址,存放在p_inbuf 中。

(4)输入视频数据,调用memcpy(p_inbuf, yuv_buf, frame_size)函数实现,p_inbuf 存放需要编码的数据,yuv_buf 存放原始视频数据,frame_size 表示数据的大小。

(5)编码视频数据,对p_inbuf 内容进行H264编码,调用SsbSipH264EncodeExe(handle)函数实现。

(6)输出已编码的数据,SsbSipH264EncodeGetOutBuf (handle, size),该函数返回已编码图像的首地址,size 表示已编码图像的大小。

(7)关闭硬编码设备,调用SsbSipH264EncodeDeInit (handle)函数实现的。

基于ARM11的无线视频
图3 H264 编码流程框图。



评论


相关推荐

技术专区

关闭