arm mini2440 基于v4l2 ffmpeg x264的视频远程监控 ----fwqlzz love is for ever

来源:互联网 发布:python开发量化交易 编辑:程序博客网 时间:2024/06/05 07:47

网络上盛传的基于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部分

[plain] view plain copy
  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

[plain] view plain copy
  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中了

[plain] view plain copy
  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中添加如下,即可

[cpp] view plain copy
  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,这个很简单,按顺序从头编译就好了

27
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 h面和w面联系线怎么办 造梦西游3到80级怎么办 加95的车加了92怎么办 95的车加92的油怎么办 宝宝六个月了奶水变少了怎么办 六个月的宝宝不爱吃奶粉怎么办 脸上挤黑头留下的小坑怎么办 小孩身上起红疙瘩很痒怎么办 肛门上长了个肉疙瘩怎么办 脚撞了一下肿了怎么办u 怀孕9个月同床了怎么办 结婚两年了都没怀孕怎么办 怀孕快40周了没有生的迹象怎么办 生完小孩掉头发很厉害怎么办 我27岁欠50多万怎么办 8岁童牙齿摔松了怎么办 我的眉毛后半边很稀少怎么办 剑三95修为满了怎么办 21三体综合症临界高风险怎么办 率土之滨没地了怎么办 老公有外遇怎么办他还舍不得小三 11选5输了6万 怎么办 k宝密码忘了怎么办5次 k宝密码输错5次怎么办 上火了牙疼怎么办怎样快速止疼 身体不吸收营养胖不起来怎么办 突然牙疼怎么办教你立刻止疼 蛀牙疼怎么办教你立刻止疼 做了牙套的牙疼怎么办 牙疼怎么办教你立刻止疼 七个月宝宝便秘拉不出来怎么办 喝酒脸上起了很多小红疙瘩怎么办 我的脸又痒又红怎么办 脸又红又痒又烫怎么办 满脸痘痘怎么办全部都是红的 身上起大片扁疙瘩很痒怎么办 我急用钱借钱又借不到怎么办 小孩蛀牙牙疼怎么办教你立刻止疼 牙齿里面长了个小牙齿怎么办 2岁宝宝又吐又拉怎么办 u盘坏了怎么办没反应了