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

第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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python逻辑型数据也叫什么_Python入门 | 运算符和数据类型

自用总结。 零散知识 1.Python的计算方法:运算符、函数、方法 1) 方法与函数的区别: 方法与特定类型的对象有关,是属于某个对象的函数,对象始终是该方法的第一个参数。e.g. islower()方法是检查字符串中字符是否为小写形式的方法&…

Flask 第三方组件之 WTForms

简介 WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。 安装: pip3 install wtforms 用户登录注册示例 1. 用户登录 当用户登录时候,需要对用户提交的用户名和密码进行多种格式校验。如: 用户不能为…

机器学习原理与算法(六) 支持向量机

版权声明:本系列文章为博主原创文章,转载请注明出处!谢谢! 本章索引: 从第3章的Logistic回归算法开始,我们一直在讨论分类问题。在各种不同的分类算法中,...,我们一直在讨论如何分类…

读《程序员的SQL金典》[2]--函数

一、数学函数 1.RAND SELECT RAND () ---0.302870228294199取0-1之间的随机小数。 2.小数取整 CEILINT(data)舍掉小数部分并向上取整。FLOOR(data)舍掉小数部分并向下取整。SELECT TOP 3 FWeight, CEILING(FWeight ),FLOOR( FWeight) FROM T_PersonRound(m,d):四舍…

html div模块前留空白,html – 3个DIV彼此相邻,中间填充空白

您好我想问你如何将3 DIV放在一起,而中间一个填补第一和第三DIV之间的空白.我想在第一个NAD第三个DIV中有动态按钮,我需要中间DIV来填充第一和第三个DIV之间的空间.我会破坏纯CSS / HTML(没有JavaScript)这是我的尝试:http://jsfiddle.net/4smx3627/#wrapper{height…

mplayer安装记录 源码分析

mplayer源码下载地址: http://www.mplayerhq.hu/MPlayer/releases/ 下载最新的MPlayer-1.0rc4 #mkdir /usr/local/mplayer #mkdir /usr/local/codecs #cd MPlayer-1.0rc4 #./configure --prefix/usr/local/mplayer --codecsdir/usr/local/ codecs --langua…

python人脸识别代码百度ai_python百度AI人脸识别API测试

1、注册账号 2、创建应用 3、得到AK和SK 4、用AK SK获取access_token 可用下面的代码: #!/usr/bin/python3.5 # encoding:utf-8 import requests # client_id 你的AK client_secret 你的SK host https://aip.baidubce.com/oauth/2.0/token?grant_typeclient_crede…

Flask 第三方组件之 SQLAlchemy

一、介绍 SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 安装:pip3 install sqlalc…

httpservlet获取请求端IP地址

request.getRemoteAddr(); 转载于:https://www.cnblogs.com/panxuejun/p/7623850.html

html 中怎样显示enum,JavaScript如何枚举?

JavaScript中对象的属性分为两种:数据属性和访问器属性。然后根据具体的上下文环境的不同,又可以将属性分为:原型属性和实例属性。原型属性是定义在对象的原型(prototype)中的属性,而实例属性一方面来自构造的函数中,然…

iperf测试网卡性能

Iperf是一个网络性能测试工具。可以测试TCP和UDP带宽质量,可以测量最大TCP带宽,具有多种参数和UDP特性,可以报告带宽,延迟抖动和数据包丢失 因为产品上确定要要用的PHY是千M的&a…

acrobat 控件可以发布吗_短视频可以同时在多个平台发布吗?

我们在做自媒体内容创业中,很多人都在做视频版块,那么一个短视频到底能不能多平台同时发布呢?那么今天,我来分享给大家,希望能够帮到你解决困惑。1.作品可以多平台分发:大家不确定是否能多平台分发&#xf…

红河学院计算机科学与技术,2016年红河学院计算机科学与技术专业最低分是多少?...

类似问题答案2016年厦门理工学院计算机类(含计算机科学与技术、网络工程、空间信息与专业最低分...学校 地 区 专业 年份 批次 类型 分数 厦门理工学院 福建 计算机类(含计算机科学与技术、网络工程、空间信息与 2016 一批 理科 491 学校 地 区 专业 年份 批次 类型 分数 厦门理…

Flask 第三方组件之 script

Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任务;使得脚本和系统分开; …

CentOS四种方法自建yum仓库

将ISO光盘镜像作为yum本地仓库(适用于不能联外网的环境): 1、 禁用所有可用的yum仓库,为方便演示,直接全部删除: # cd /etc/yum.repos.d # ls # rm -rf * 2、 创建光盘挂载点,挂载光盘&#x…

python substr_python数据分析-数据对象(一)

Python基本数据类型一般分为:数字、字符串、列表、元组、字典、集合这六种基本数据类型。不可变(3 个):Number(数字)、String(字符串)、Tuple(元组)&#xff…

VLC框架分析

功能部份: VLC媒体播放器的核心是libvlc ,它提供了界面,应用处理功能,如播放列表管理,音频和视频解码和输出,线程系统。所有libvlc源文件设在的/src目录及其子目录: # config/ :从命令行和配置…

html表格里的超链接点不了,Excel如何添加和取消超链接 Excel超链接打不开是怎么回事...

很多用户在制作excel表格的时候都会添加一些超链接,在制作完成后发布到网页,阅读者可以通过超链接打开指引的网页或者文件,超链接对制作excel表格的用户有非常大的帮助,虽然添加超链接的步骤非常简单,不过还是有些exce…

yum 安装apache php mysql

安装: yum install -y httpd php 查看版本:、 rpm -qa httpd php httpd-2.2.15-54.el6.centos.x86_64 php-5.3.3-48.el6_8.x86_64 修改apache配置文件: vim /etc/httpd/conf/httpd.conf 在#ServerName www.example.com:80行下添加一行 Server…

Python 散点图线性拟合_机器学习之利用Python进行简单线性回归分析

前言:在利用机器学习方法进行数据分析时经常要了解变量的相关性,有时还需要对变量进行回归分析。本文首先对人工智能/机器学习/深度学习、相关分析/因果分析/回归分析等易混淆的概念进行区分,最后结合案例介绍如何利用Python进行简单线性回归…