现在的位置: 首页 > 综合 > 正文

基于FFMPEG 的跨平台视频编解码研究

2013年11月17日 ⁄ 综合 ⁄ 共 6114字 ⁄ 字号 评论关闭

第33卷 第11期
2011年11月
武 汉 理 工 大 学 学 报
JOURNALOF WUHANUNIVERSITYOFTECHNOLOGY Vol.33 No.11
췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍
Nov.2011
DOI:10.3963/j.issn.1671-4431.2011.11.029
基于FFMPEG 的跨平台视频编解码研究
胡 聪1,周 甜1,唐璐丹2
(1.桂林电子科技大学电子工程与自动化学院,桂林541004;2.桂林电子科技大学信息科技学院,桂林541004)
摘 要: 针对视频监控提出了视频编解码器的软件实现。监控客户端采用S3C2440作为嵌入式硬件平台,并通过
CMOS摄像头OV9650采集视频,经过FFMPEG编码传输给监控服务器端。监控服务器端接收到视频流后通过FFMPEG
实时解码播放,实现远程监控。实验结果表明,系统达到了监控客户端的视频采集、编码,监控服务器端解码和播
放。
关键词: FFMPEG; 编解码; 嵌入式; 视频; OV9650
中图分类号: TP391 文献标识码: A 文章编号:1671-4431(2011)11-0139-04
ResearchonCross-platform VideoCodecBasedonFFMPEG
HUCong1,ZHOUTian1,TANGLu-dan2
(1.CollegeofElectronicEngineeringandAutomation,GuilinUniversityofElectronicTechnology,
Guilin541004,China;2.InstituteofInformationandTechnology,GuilinUniversityof
ElectronicTechnology,Guilin541004,China)
Abstract: Asoftwareimplementationofvideocodecforvideomonitoringispresented.MonitorclientusedS3C2440
asembeddedhardwareplatform,acquiredvideowithOV9650ofCMOScamera,transmittedtothemonitoringserver
withFFMPEGcoding.Monitorserverreceivedvideostream,decodedandplayingreal-timebyFFMPEG,realizedremotemonitoring.
Theexperimentalresultsshowthatthesystemachievesthemonitorclientvideoacquisition,encoding,
andmonitorserverdecodingandplaying.
Keywords: FFMPEG; codec; embeddedsystem; video; OV9650
收稿日期:2011-09-17. 基金项目:国家自然科学基金(61172053). 作者简介:胡 聪(1981-),男,硕士,讲师.E-mail:hucong@guet.edu.cn
随着经济的发展,银行、交通、家居、仓储、国防等领域对安全防范、现场记录、报警系统的需求越来越大,
要求越来越高。视频监控系统主要具备远程现场的图像采集、处理、传输、实时显示及视频存储等功能。它
以监控目标实时性强、适于远距离传输、能提供直接有效的现场证据等突出优点,已在诸多领域成为人们不
可或缺的工具[1]。考虑到视频监控系统必须需要对视频信号进行编码解码,讨论了一种基于FFMPEG 的
视频监控系统的编解码研究。
1 FFMPEG 简介
FFMPEG是一个集录制、转换、音/视频编解码功能为一体的、完整的开源解决方案。FFMPEG 的开发
基于Linux操作系统,也可在大多数操作系统中编译和使用。FFMPEG 支持MPEG、DivX、MPEG4、AC3、
DV、FLV 等40多种编码,AVI、MPEG、OGG、ASF等90多种解码[2]。
2 系统方案
系统采用C/S设计模式来实现客户端与服务器端的交互,由服务器端向客户端发出监听请求,客户端
验证并进行连接。连接成功后,客户端监测点启动摄
像头进行视频数据采集,采集的视频数据是原始数据
rgb565(.rgb16)格式,经格式转换后,再经过FFMPEG
压缩成H.263格式视频,经通信网络传输到服
务器端计算机中;监控服务器端接收视频数据后,经
FFMPEG解码后,通过VFW(VideoforWindows)显
示在服务器端界面上。视频发送端采用SAMSUNG
公司的具有ARM9内核的S3C2440作为嵌入式微控
制器,服务器端采用普通PC机。系统方案如图1所
示。
3 客户端
客户端的主要工作首先是搭建嵌入式Linux平台,然后是搭建交叉编译环境,做完这些准备工作后,就
是开发摄像头驱动程序,并通过操作摄像头采集图像并经FFMPEG 压缩,监听服务器端的请求后发送给服
务器端。
3.1 建立嵌入式Linux平台
建立嵌入式Linux平台主要有以下步骤:
1)使用H-JTAG快速烧写BIOS到开发板。2)格式化NandFlash。3)安装bootloader。4)安装内核文
件。5)安装文件系统[3]。
3.2 搭建交叉编译环境
在Linux平台下,要编译内核、bootloader,还有其他一些应用程序,均需要交叉编译工具链。使用armlinux-
gcc4.3.2[3]。
3.3 摄像头驱动配置
OV9650是OmniVision公司生产的一系列CMOS摄像头中的一种,在接口上能够保持与S3C2440的
一致性。输出图像最大为130万像素,输出图像格式包括SXGA,VGA,QVGA,CIF,QCIF等,并提供加窗
功能以输出不同尺寸的图像。对于不同的输出图像格式,输出最高帧率可不同,最高可达120f/s。输出的8
位数据格式包括YUV/YCbCr(4∶2∶2)、GRB(4∶2∶2)、原始RGB数据3种[4]。
OV9650图像传感器在Linux中作为字符设备来描述,其驱动程序提供给应用程序一个流控制接口。
用户进程通过设备文件与硬件打交道,对设备文件的操作本质是一些系统调用。若要将系统调用和设备驱
动程序关联起来,须用到structfile_operations这个关键数据结构。因此,编写设备驱动的主要工作就是编
写数据结构中定义的子函数,并填充file_operation的各个域。
在开发阶段用makemodules命令将驱动程序编译成模块OV9650_2440.ko,用insmod命令来加载驱
动,可避免反复编译烧写内核[5]。驱动模块编译加载后,便可像操作普通文件一样对摄像头进行数据读取操
作[6]。在开发完成阶段中,可以把驱动程序编译进内核,以免每次都手动加载驱动。
加载了驱动程序后,像操作普通文件一样操作摄像头。如:定义intm filev4l2,通过m filev4l2 =
open(“/dev/camera”,O RDWR)打开摄像头,通过read(fd,&in rgb565,D SIZE)读取摄像头的视频
数据到数组in rgb565中,通过close(m filev4l2)[7]。有了视频数据后,就可以通过FFMPEG进行编码。
3.4 FFMPEG 编码
用FFMPEG编码时,首先对FFMPEG库初始化,注册所有的编解码器,配置编码器、码率、帧速率、编
码像素格式和分辨率等,然后开始编码。通过设置结构体AVOutputFormat的成员video codec的值设置
编码器,如:aofmt->video codec= CODEC ID H263设置H.263编码;通过设置结构体AVCodecContext
的成员pix fmt的值设置待编码的数据像素格式,如acc->pix fmt= PIX FMT YUV420P设置
YUV420像素格式;通过设置acc->bit rate,acc->width,acc->height等可以设置码率,宽度和高度等。
编码的核心函数是avcodec encode video。系统每采集一帧数据,就送给avcodec encode video函数进
行编码成H.263视频流。其编码流程如图2所示。
根据系统的要求,传输的视频流为H.263格式。
采集数据中,OV9560输出的是rgb565(.rgb16)格式,
首先需要转换成rgb888(.rgb24)格式,然后再转换成
yuv420(.i420)格式,然后再由FFMPEG 进行压缩编
码成H.263视频格式。其中RGB与YUV 的转换公
式如公式(1)[8]
Y =0.257R +0.504G +0.098B +16
U =-0.148R -0.291G +0.439B +128
V =0.439R -0.368G -0.071B +128
(1)
4 服务器端
服务器端的主要工作是监控所有客户端,按照需
要服务器端可以任意连接某个监控客户端。连接后接收数据,经过FFMPEG解码后显示在服务器端。
用FFMPEG 解码时,首先对FFMPEG 库初始
化,注册所有的编解码器,配置解码器和解码像素格式
等,然后开始解码。通过设置结构体AVCodec内容
设置待解码数据流格式,如:AVCodec*codec= avcodec
find decoder(CODEC ID H263)设置待解
码数据流格式为H.263;通过设置结构体AVPicture
的值设置解码像素格式,如:avpicture fill((AVPicture
*)pFrameYUV,out buffer,PIX FMT
YUV420P,D Width,D Height)设计解码像素格
式为YUV420。解码的核心函数是avcodec decode
video。其解码流程如图3所示。
4.1 服务器端解码
由于解码的是H.263视频流,因为不知道要解码的数据流长度,跟文件解码操作不一样[9]。在本设计
中,专门为解码器开辟了一个线程负责解码,同时也开辟了一个FIFO 队列进行数据的缓冲。解码时,接收
的数据不停地进入FIFO 队列,然后从头取固定的字节数进行解码。而且由于解码时解出的帧是完整的帧,
这就会出现解码后还会剩余不完整的帧字节,这些字节需要重新和后面的视频数据流拼接重新解码[10-11]。
用FFMPEG对H.263解码出来格式是YUV(.i420)格式,需要转换成RGB(.rgb24)格式显示。
4.2 服务器端显示
显示视频采用的是VFW(VideoforWindows)。显示的核心函数是DrawDibDraw 函数。DrawDib-
Draw 画图针对的是DIB图像,是一种BMP(Bitmap)图像。DrawDibDraw函数有13个参数,最重要的参数
是第7个和第8个参数,第7个参数是填入位图的头信息,第8个参数填入的是RGB(.rgb24)图像数
据[12-13]。
由于用DrawDibDraw画图时,图像上下颠倒,在采用DrawDibDraw 进行画图前,将rgbdata指向的缓
存中的图像数据进行行的颠倒操作,首先得知道图像的宽度,假如为Width,然后Width*3就是一行的字节
数,接着第一行的数据和最后一行的数据交换,第二行的和倒数第二行的数据进行交换,依次类推。
5 质量效果控制
系统在中国移动3G 通信环境
下进行实验,通道的数据流需设置
为H.263编码格式数据流,分辨率
需设为QCIF(176*144),帧率、关
表1 码率
时间点1 2 3 4 5 6 7 8 9
码率/(b·s-1)5914 5728 5968 3155 3227 3502 3557 2919 3000
键帧比例由实际情况可以自由设置,码率由实际情况拍摄的视频决定,由于传输通道带宽为48kb/s,所以码
率不能超过48kb/s。当设置关键帧比例为1/6时,帧率为6f/s时,实际测得码率如表1所示。
如果想画面流畅些,可以增大帧率,如果想增强视频的对移动物体的显示效果,可以增大关键帧比例,但
不能超过系统传输的带宽[14]。
6 压缩率
压缩编码采用H.263压缩编
码,采用关键帧比例为1/6时,实测
压缩率表格如表2所示。
压缩率与关键帧比例、实际视
表2 压缩率
时间点1 2 3 4 5 6 7 8 9
压缩率/% 2.59 2.51 2.61 1.38 1.41 1.53 1.55 1.27 1.31
频及运动等有关,关键帧比例越低、视频像素相似度越高、运动量越小,压缩率越高[15]。
7 结 语
随着视频压缩技术的日益成熟,嵌入式视频监控成为当今视频监控的主流。采用ARM9 内核的
S3C2440为嵌入式硬件平台,通过摄像头采集数据,在嵌入式Linux与Windows操作系统相结合的跨平台
上,实现FFMPEG的编解码,对实际嵌入式视频监控系统的设计开发,具有重要意义和实用价值[16]。
参考文献
[1] 杨晓健.基于ARM9的嵌入式视频采集系统设计[J].西安工程大学学报,2010,24(2):208-212.
[2] 蒋志峰.FFMPEG的快速音视频开发方法[J].单片机与嵌入式系统应用,2008(1):69-71.
[3] 师娟娟.基于ARM9的嵌入式Linux移植[J].武汉理工大学学报,2008,30(2):205-208.
[4] 杨海山,何东健.基于ARM 和Linux的视频采集系统研究与开发[J].微计算机信息,2009,25(11-2):122-124.
[5] 阙大顺,杜 玮.Vivi在S3C2410上的移植研究[J].武汉理工大学学报,2007,29(12):47-50.
[6] 熊平华,杨建刚.IP可视电话视频会议系统设计与实现[J].计算机工程与设计,2004(4):619-621.
[7] 冯国进.嵌入式Linux驱动程序设计从入门到精通[M].北京:清华大学出版社,2008:102-146.
[8] 冯永超,罗 敏,贺贵明.一种快速YUV RGB彩色空间变换方法[J].微型机与应用,2002(7):59-60.
[9] 詹慧静.MPEG-4编码特性剖析及应用研究[J].武汉理工大学学报,2005,27(6):103-106.
[10]吕 雪.基于网络多媒体的流媒体技术[J].武汉理工大学学报,2005,27(12):121-125.
[11]黎燕霞,李 扬,刘奕宏,等.基于S3C2440的视频采集驱动设计[J].仪器仪表用户,2009,16(3):98-99.
[12]查 婧,刘 波,曹剑中.嵌入式视频采集与网络传输系统[J].电子器件,2009,32(3):646-648.
[13]余兆明,李晓飞,陈春来.MPEG-4标准及其应用[M].北京:北京邮电大学出版社,2002.
[14]曹少坤.一种嵌入式网络摄像机的设计[J].微计算机应用,2008,29(10):69-73.
[15]张学武,杨学星,江 冰.基于H.263 的视频编码、解码的研究及软件实现[J].计算机工程与设计,2005,26(9):
2491-2493.
[16]郑旭东,张培仁,高修峰,等.嵌入式网络视频监控系统[J].仪表技术与传感器,2006(08):24-26.

抱歉!评论已关闭.