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

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

更多更新请关注我的博客:@超群天晴 http://www.cnblogs.com/surpassal/

 

相关阅读: 

(原创)基于ZedBoard的Webcam设计(一):USB摄像头(V4L2接口)的图片采集  

(原创)基于ZedBoard的Webcam设计(二):USB摄像头图片采集+QT显示  

(原创)基于ZedBoard的Webcam设计(三):视频的采集和动态显示  

(原创)基于ZedBoard的Webcam设计(四):MJPG编码和AVI封装  

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

 

 

硬件平台: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

相关文章
相关标签/搜索