基于ZedBoard的Webcam设计(五):x264编码在zedboard上的实现(软编码)

基于ZedBoard的Webcam设计(五):x264编码在zedboard上的实现(软编码)


(原创)基于ZedBoard的Webcam设计(四):MJPG编码和AVI封装中,我们在zed上完成了视频的采集和存储,但是MJPG只是对一帧一帧图片进行编码,编码效率只有10%。x264-snapshot提供了开源x264源代码,已经广泛用于嵌入式解决方案中。本小节将介绍zed上x264-snapshot源码的配置,并在zed上使用High版本、main版本对一个33M的测试视频进行编码,测试编码效率。

硬件平台:Digilent ZedBoard

开发环境:Windows XP 32 bit + Wmare 8.0 + Ubuntu 10.04 +Qt+ arm-linux-xilinx-gnueabi交叉编译环境 

Zedboard linux: Digilent OOB Design  

 

一、x264开源包获取

x264-snapshot提供了开源x264源代码,已经在X86和ARM架构下均已实现。linux下可以使用git获得最新的代码包

git clone git://git.videolan.org/x264.git

也可以通过网页下载:

http://download.videolan.org/pub/videolan/x264/snapshots/

二、配置、安装x264-snapshot

下载到源码后,对其进行配置,以便在后续make时编译出zed上可以运行的可执行程序

1、解压源码包后,进入源码目录

./configure --host=arm-xilinx-linux-gnueabi --prefix=/opt/rcq --enable-shared --disable-asm

congfig之后,设定了host为arm-xilinx-linux-gnueabi,install路径是/opt/rcq

2、修改config.mak文件

针对zed的gcc,需要修改config.mak文件

复制代码
 1 SRCPATH=.
 2 prefix=/opt/rcq
 3 exec_prefix=${prefix}
 4 bindir=${exec_prefix}/bin
 5 libdir=${exec_prefix}/lib
 6 includedir=${prefix}/include
 7 ARCH=ARM
 8 SYS=LINUX
 9 CC=arm-xilinx-linux-gnueabi-gcc
10 CFLAGS=-Wshadow -O3 -fno-fast-math  -Wall -I. -I$(SRCPATH) -std=gnu99 -fPIC -fomit-frame-pointer -fno-tree-vectorize
11 DEPMM=-MM -g0
12 DEPMT=-MT
13 LD=arm-xilinx-linux-gnueabi-gcc -o 
14 LDFLAGS= -lm -lpthread
15 LIBX264=libx264.a
16 AR=arm-xilinx-linux-gnueabi-ar rc 
17 RANLIB=arm-xilinx-linux-gnueabi-ranlib
18 STRIP=arm-xilinx-linux-gnueabi-strip
19 AS=
20 ASFLAGS= -DHAVE_ALIGNED_STACK=1 -DPIC -DHIGH_BIT_DEPTH=0 -DBIT_DEPTH=8
21 RC=
22 RCFLAGS=
23 EXE=
24 HAVE_GETOPT_LONG=1
25 DEVNULL=/dev/null
26 PROF_GEN_CC=-fprofile-generate
27 PROF_GEN_LD=-fprofile-generate
28 PROF_USE_CC=-fprofile-use
29 PROF_USE_LD=-fprofile-use
30 default: cli
31 install: install-cli
32 SOSUFFIX=so
33 SONAME=libx264.so.129
34 SOFLAGS=-shared -Wl,-soname,$(SONAME)  -Wl,-Bsymbolic
35 default: lib-shared
36 install: install-lib-shared
37 LDFLAGSCLI = 
38 CLI_LIBX264 = $(LIBX264)
复制代码

其中9、13、16、17、18行为修改后的。

3、make

make install
make

完运行库的安装和成执行文件的生成

三、在zed上测试x264

将可执行x264和测试rcq.yuv文件拷贝到zed上,使用默认运行命令

./x264 rcq.yuv --input-res 640x480 -o rcq.flv

其中--input-res 640x480设定输入yuv视频帧的大小,rcq.flv是输出文件,可以设定为.mkv/.mp4/H264等。从控制台可以看到

使用的profile是最高等级High level 3.0,但是的编码速率只有1.40fps……情何以堪……

编码结束后:

生成的rcq.flv文件大小348k,相比较原来的rcq.yuv文件大小33M,压缩率在1%。

可以使用最快编码方式,命令和参数如下

./x264 rcq.yuv --input-res 640x480 -o rcq.flv --no-8x8dct --aq-mode 0 --b-adapt 0 --bframes 0 --no-cabac --no-deblock --no-mbtree --me dia --no-mixed-refs --partitions none --rc-lookahead 0 --ref 1 --scenecut 0 --subme 0 --trellis 0

编码速率能有22fps,这样还凑合。生成的rcq.flv文件大小787K,压缩率在5%。

四、x264命令和参数(fullhelp)

View Code

五、关于YUV420的格式说明

复制代码
YUV格式有两大类:planar和packed。
对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的。

一般的录像程序是先从摄像头得到yuv420 planar的数据,然后编码成h264格式 帧,最后存储成3gp/mpeg等格式的视频文件。

以720×488大小图象YUV420 planar为例,其存储格式是:
共大小为(720×480×3>>1)字节,分为三个部分:Y,U和V
Y分量:    (720×480)个字节  
U(Cb)分量:(720×480>>2)个字节
V(Cr)分量:(720×480>>2)个字节
三个部分内部均是行优先存储,三个部分之间是Y,U,V 顺序存储。
即YUV数据的0--720×480字节是Y分量值,
           720×480--720×480×5/4字节是U分量
           720×480×5/4 --720×480×3/2字节是V分量。

一副w*h的yuv420图像数据的大小为w*h*1.5422 和4:20 转换:

最简单的方式:
YUV4:2:2 ---> YUV4:2:0  Y不变,将U和V信号值在行(垂直方向)在进行一次隔行抽样。
YUV4:2:0 ---> YUV4:2:2  Y不变,将U和V信号值的每一行分别拷贝一份形成连续两行数据。
复制代码

 六、测试视频

 =====================================================

0、x264-snapshots:http://download.videolan.org/pub/videolan/x264/snapshots/

1、zed可执行文件:x264.rar

2、测试yuv文件:rcq.part1.rar rcq.part2.rar

3、其他通用测试yuv序列:http://www.cipr.rpi.edu/resource/sequences/sif.html


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值