码迷,mamicode.com
首页 > 其他好文 > 详细

成功在mini2440上移植ffmpeg ----fwqlzz love is for ever

时间:2016-05-13 00:28:36      阅读:396      评论:0      收藏:0      [点我收藏+]

标签:

在mini2440上,整个移植过程分三个步骤:(1)编译x264;(2)编译ffmpeg;(3)移植成功后,进行测试,即使用ffmpeg录像。

(1)编译x264

官网上下了个最新的x264,地址http://www.videolan.org/developers/x264.html。我下载的文件是last_x264.tar.bz2。

120版本地址

http://pan.baidu.com/s/1jG81TSq

解压命令为#tar  -jxv  -f  last_x264.tar.bz2,解压后的目录为x264-snapshot-20130313-2245。

进入解压后的目录,执行命令./configure --disable-asm,则会生成config.mak。之后就需要修改这个config.mak文件了,改写ARCH=ARM SYS=LINUX CC=arm-linux-gcc,其中CC写成你自己的交叉编译环境位置,相应的AR、RANLIB也是,具体如下图所示。

(注意:如果不进行如下面所示的修改,编译的就是x86的264环境

http://blog.csdn.net/to_cm/article/details/7108986

技术分享

我记得第10行和第11好像删除了-m32这个选项,如果后面执行make没有出错的话,可以不用管这个了。

然后执行make

再执行make install,因此x264已经编译成功了。在/usr/local/include/目录下会有个x264.h头文件,在/usr/local/lib/目录下会有个libx264.a的库文件。

技术分享技术分享

(2)编译ffmpeg

官网上下载FFmpeg 0.8.14,地址:http://ffmpeg.org/download.html,解压之后tar xzvf 

1.0版本下载地址

http://pan.baidu.com/s/1nt8vNfz

配置编译
(2.1) for x86
#./configure --prefix=/usr/local/ffmpeg/

它会依懒于yasm 一些模块,可以下载yasm-1.2.0.tar.gz,下载地址

http://pan.baidu.com/s/1hqmlu7q

解压后直接./configure make和make install

  (2.2)for arm

执行下面命令:

./configure --cross-prefix=arm-linux- --enable-cross-compile --target-os=linux --cc=arm-linux-gcc --arch=arm --prefix=/usr/local/arm_ffmpeg --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-pthreads --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-yasm --disable-stripping
这里没有使用ffplay,需要的可以自己加上,参考http://blog.csdn.net/liaozc/article/details/6025610中说要用到SDL库,可以试试。在--cc  --prefix根据自己的目录修改,然后就是make 和 make install ,之后在--prefix下找到自己要用到的lib include文件夹。

注意:【1】在上面这条很长的configure命令执行后,会有一个警告warning,说找不到一个arm-linux-ptkconfig,什么faile之类的提示信息。我没有截图,大概是这样的警告信息,这个可以不用管它。我换了好几个文件,重新上面的步骤,都会出现这个警告,在这里浪费了很多时间。

【2】执行make这个过程耗时很久,这个需要耐心。
【3】执行make install后,在/usr/local/下会生成一个ffmpeg文件夹,如下图所示。

技术分享

(3)移植成功后,进行测试,即使用ffmpeg录像

注:因为我的mini2440开发板剩余空间不够,所示我是用nfs启动开发板,如果空间够用的话,直接把库文件放到板子里也是一样的。

将上图/usr/local/ffmpeg/lib文件下后缀名为.so和.so.*这两种库文件复制到开发板中(如果缺某个库的话,在后面执行./ffmpeg是会报错,说找不到)

技术分享

上图红框中只是一部分库文件,他们都是成对出现,只是后缀名不一样。

 

因为开发板里面没有ffmpeg这条命令,需要把/usr/local/ffmpeg/bin/目录下的ffmp可执行文件拷贝到开发板上,然后增加其可执行权限(chmod +x ffmpeg)

技术分享

然后再执行命令:#./ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 /mnt/test.avi,执行过程如下图所示:

技术分享

这个录像过程输入q,即可停止录像。生成的test.avi文件在/mnt/目录下。这个我们用普通的播放器就可以观看。

技术分享

 技术分享

ffmpeg编译x86环境

./configure --target-os=linux --cc=gcc --prefix=/usr/local/ffmpeg --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-pthreads --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-yasm --disable-stripping




网络上盛传的基于mini2440的摄像头监控一般是基于 MJPEG-Streamer。

这种方法利用的是V4L2的底层驱动,然后配合mjpeg这种格式的流传输,然后通过浏览器浏览视频和控制。

下面用一个更接近真实的IP-camera的方案来实现。

首先先看一下网友sunkwei写的《基于v4l2的webcam应用,本地预监》

http://blog.csdn.net/sunkwei/article/details/6530343

文本照搬他的代码,只是将他的webcam_server交叉编译到arm上,webcam_shower编译到pc上。

这种方案是用的V4L2的视频驱动,然后配合ffmpeg、x264的软件编解码,通过udp上传至pc显示,视频的编解码真的非常麻烦,幸好有很多开源的编解码库可以使用,几百行的代码就可以实现h.264的流编码与传输。

usb摄像头得到的数据格式一般是YUV422,如果用的是cmos 摄像头可能是raw原始数据格式,YUV422,是在raw基础上色彩抽点编码,因为人眼对亮度的敏感大于对色彩的敏感,所以并非对所有的色彩编码,这样的数据量会非常的大,视频编解码格式就不讨论了,很多很复杂,当然,你会了,就不会觉得难。

ffmpeg和x264的作用是将YUV422再编码成H.264


上图看效果,这是在linux中接的图,窗口中显示的是从2440usb摄像头上传上来的视频

技术分享

这是实物图,手机拍的

技术分享


废话少说,一步一步实现

1、平台

硬件:arm mini2440,usb摄像头

软件:fedora14,arm-linux-gcc v4.4.3

2、源文件

ffmpeg-0.10.1.tar.gz

last_x264.tar.bz2

zlib-1.2.5.tar.gz (mini2440中没有libz.so,但是程序运行时需要这个库支持,所以下载源文件交叉编译)

以上文件只要会搜索的人都能找到

最后是

网友sunkwei写的webcam应用程序,下载地址:

http://download.csdn.net/detail/sunkwei/3425209


下面开始交叉编译,编译过程中会遇到几个小问题,一一解决

1、编译zlib

解压zlib-1.2.5.tar.gz

#tar -xzvf zlib-1.2.5.tar.gz

进入源文件目录

#cd zlib-1.2.5

运行configure配置makefile

#./configure --prefix=/opt/webcam/ffpeg

--prefix=/opt/webcam/ffpeg的意思是最后执行make install时,将文件安装在/opt/webcam/ffmpeg,不然会默认安装在/usr/local/lib中,其实这里不写这个参数,最后一起在makefile中修改也可以的。

配置后会在当前目录下生成Makefile

修改Makefile以便能够用arm-linux-gcc编译,其实就是把gcc 改成arm-linux-gcc,ar改成arm-linux-ar等

下面是改好的makefile部分

  1. SFLAGS=-O3 -fPIC -D_LARGEFILE64_SOURCE=1  
  2. LDFLAGS= -L. libz.a  
  3. TEST_LDFLAGS=-L. libz.a  
  4. LDSHARED=arm-linux-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map  
  5. CPP=arm-linux-gcc -E  
  6.   
  7. STATICLIB=libz.a  
  8. SHAREDLIB=libz.so  
  9. SHAREDLIBV=libz.so.1.2.5  
  10. SHAREDLIBM=libz.so.1  
  11. LIBS=$(STATICLIB) $(SHAREDLIBV)  
  12.   
  13. AR=arm-linux-ar rc  
  14. RANLIB=arm-linux-ranlib  
  15. LDCONFIG=ldconfig  
  16. LDSHAREDLIBC=-lc  
  17. TAR=tar  
  18. SHELL=/bin/sh  
  19. EXE=  
  20.   
  21. prefix =/opt/webcam/ffmpeg  
运行configure是的--prefix 就是最后这个参数,这里修改也行的

然后make,make install

#make

#make install

zlib的编译应该不会出现问题,在/opt/wecam/ffmpeg中是编译好的文件,在子文件夹lib中的.so文件最后要复制到2440里


2、编译x264

应为编译ffmpeg时需要要添加对x264的支持,所以要先编译好x264,一边让编译ffmpeg时能够找到它

解压last_x264.tar.bz2

#tar -xvzf last_x264.tar.bz2

#cd x264-snapshot-20120316-2245

# ./configure --host=arm-linux --prefix=/opt/wecam/ffmpeg --enable-shared --disable-asm

配置选项中已经添加了host的选项,所以makefile就不用再修改了,但是要修改config.mak

  1. SRCPATH=.  
  2. prefix=/opt/webcam/ffmpeg  
  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-linux-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-linux-gcc -o   
  14. LDFLAGS= -lm -lpthread  
  15. LIBX264=libx264.a  
  16. AR=arm-linux-ar rc   
  17. RANLIB=arm-linux-ranlib  
  18. STRIP=arm-linux-strip  

#make

#make install

x264编译也不会出现问题的,如果有,把之前安装的pc端的x264全部删掉


3、编译ffmpeg

解压ffmpeg-0.10.1.tar.gz

#tar -xzvf ffmpeg-0.10.1.tar.gz

#cd ffmpeg-0.10.1

#./configure --enable-cross-compile --target-os=linux --cross-prefix=arm-linux- --cc=arm-linux-gcc --enable-shared --arch=armv6 --enable-gpl --enable-libx264 --prefix=/opt/webcam/ffmpeg --extra-cflags=-I/opt/webcam/x264/include --extra-ldflags=-L/opt/webcam/x264/lib/

配置需要注意的是--extra-cflags=-I/opt/webcam/ffmpeg/include --extra-ldflags=-L/opt/webcam/ffmpeg/lib/ 指定x264库的位置

#make

#make install

以上,所有依赖的库就都编译好了,下面编译webcam应用程序


所有的源文件不做除了修改udp上传用的ip地址和makefile文件外,不做任何修改,源码存放位置/opt/webcam

1、修改server.cpp ip

将#define TARGET_IP "192.168.1.220" 后面的ip改成你的pc linux的ip,依旧是客户端webcam_shower所在的pc的ip地址

2、修改shower.cpp中的

inet_addr("192.168.1.220"); 将ip修改为pc linux的ip,就是自己的ip,socket绑定端口用

3、修改makefile,以便交叉编译webcam_server,注意,之前编译zlib x264 ffmpeg都在放在webcam/ffmpeg中了

  1. all: webcam_server  
  2. #webcam_shower  
  3. CC=arm-linux-g++  
  4. LD=arm-linux-ld  
  5. CXXFLAGS=   -c -g -O0 -fPIC -I./ffmpeg/include -L./ffmpeg/lib  
  6.   
  7. OBJS_SERVER=    capture.o vcompress.o sender.o server.o  
  8. OBJS_SHOWER=    vshow.o recver.o shower.o  
  9. LIBS_SERVER=    -lavcodec -lswscale -lavutil -lx264 -lpthread -lz  
  10. LIBS_SHOWER=    -lavcodec -lswscale -lavutil  
  11.   
  12. .cpp.o:  
  13.     $(CC) $(CXXFLAGS) $<  
  14.   
  15. webcam_server: $(OBJS_SERVER)  
  16.     $(CC) -o $@ $^ -L./ffmpeg/lib $(LIBS_SERVER)   
  17.   
  18. webcam_shower: $(OBJS_SHOWER)  
  19.     $(CC) -o $@ $^ $(LIBS_SHOWER)  
  20.   
  21. clean:  
  22.     rm -f *.o  
  23.     rm -f webcam_server  
  24.     rm -f webcam_shower  

#make

这一步会出错,报c与c++兼容问题,在include/libavutil/common.h中添加如下,即可

  1. #ifndef   UINT64_C  
  2. #define   UINT64_C(value)__CONCAT(value,ULL)  
  3. #endif  


最后就得到了编译好的web_server了,将web_server复制到mini2440中,并且将之前编译的第三方编解码库/lib下的所有.so文件复制到mini2440的 /usr/lib中

插上usb摄像头,webcam_server就可以再mini2440中运行了


最后是编译pc端的webcam_shower,这个很简单,按顺序从头编译就好了


成功在mini2440上移植ffmpeg ----fwqlzz love is for ever

标签:

原文地址:http://blog.csdn.net/fwqlzz/article/details/51348650

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!