mini2440 基于v4l2 ffmpeg x264的视频远程监控

mini2440 基于v4l2 ffmpeg x264的视频远程监控http://blog.renren.com/blog/176465243/852648218?frommyblog
http://blog.csdn.net/ghostyu/article/details/7371310

1、平台

硬件:mini2440,usb摄像头

软件:RED HAT 5,arm-linux-gcc 4.3.2

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

下面开始交叉编译:(可能需要安装yasm来支持X264,方便起见:提前解压last_X264命名为X264,ffmpeg-0.10.命名为ffmpeg)

补充:http://www.tortall.net/projects/yasm/releases/yasm-0.6.0.tar.gz

#tar xzvf yasm-0.6.0.tar.gz
#cd yasm-0.6.0
#./configure --prefix=/usr/local/yasm
#make
#make install

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/ffmpeg

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

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

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

下面是改好的makefile部分

SFLAGS=-O3 -fPIC -D_LARGEFILE64_SOURCE=1
LDFLAGS= -L. libz.a
TEST_LDFLAGS=-L. libz.a
LDSHARED=arm-linux-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=arm-linux-gcc -E

STATICLIB=libz.a
SHAREDLIB=libz.so
SHAREDLIBV=libz.so.1.2.5
SHAREDLIBM=libz.so.1
LIBS=$(STATICLIB) $(SHAREDLIBV)

AR=arm-linux-ar rc
RANLIB=arm-linux-ranlib
LDCONFIG=ldconfig
LDSHAREDLIBC=-lc
TAR=tar
SHELL=/bin/sh
EXE=

prefix =/opt/webcam_show/ffmpeg

然后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(先用bzip解压,而后tar)

#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/

#make可能会出现char * state重复定义错误,很容易修改(注意是否生成-lavcodec -lswscale -lavutil 所需的库)

#make install

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

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

1、修改server.cpp ip

将#define TARGET_IP "127.0.0.0" 改成你的pc linux的ip,即客户端webcam_shower所在的pc的ip地址

2、修改shower.cpp中的

inet_addr("127.0.0.0"); 将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. OBJS_SERVER= capture.o vcompress.o sender.o server.o
  7. OBJS_SHOWER= vshow.o recver.o shower.o
  8. LIBS_SERVER= -lavcodec -lswscale -lavutil -lx264 -lpthread -lz
  9. LIBS_SHOWER= -lavcodec -lswscale -lavutil -lx264 -lX11 -lXext -lz
  10. .cpp.o:
  11. $(CC) $(CXXFLAGS) $<
  12. webcam_server: $(OBJS_SERVER)
  13. $(CC) -o $@ $^ -L./ffmpeg/lib $(LIBS_SERVER)
  14. webcam_shower: $(OBJS_SHOWER)
  15. $(CC) -o $@ $^ $(LIBS_SHOWER)
  16. clean:
  17. rm -f *.o
  18. rm -f webcam_server
  19. 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的 /lib中;插上usb摄像头,webcam_server就可以再mini2440中运行了

最后是编译pc端的webcam_shower,由于显示终端在Linux PC机上完成,即X86构架,所以不需要交叉编译,把以上过程按GCC顺序编译,最好另建文件夹避免出错比如webcam_show。

1 编译zlib

makefile直接用gcc编译即可,其他内容不变。

2 编译X264

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

# make

# make install

3 编译ffmpeg

./configure --enable-shared --enable-gpl --arch=x86--disable-yasm--enable-libx264 --prefix=/opt/webcam_show/ffmpeg --extra-cflags=-I/opt/webcam_show/ffmpeg/include --extra-ldflags=-L/opt/webcam_show/ffmpeg/lib/

红色部分原因不是很理解,报错后修改如此。。。

#make

#make install

webcam_show编译(最终生成webcam_shower)

1.查看IP是否为自己X86中的Linux Ip地址

2.修改makefile,由于为C++程序开发,利用GCC++编译

#all: webcam_server
all: webcam_shower
CXX=g++
CXXFLAGS=-c -g -O0 -fPIC -I./ffmpeg/include -L./ffmpeg/lib

OBJS_SERVER=capture.o vcompress.o sender.o server.o
OBJS_SHOWER= vshow.o recver.o shower.o
LIBS_SERVER=-lavcodec -lswscale -lavutil -lx264 -lpthread -lz
LIBS_SHOWER= -lavcodec -lswscale -lavutil -lx264 -lz -lX11 -lXext

.cpp.o:
$(CXX) $(CXXFLAGS) $<

webcam_server: $(OBJS_SERVER)
$(CXX) -o $@ $^ $(LIBS_SERVER)

webcam_shower: $(OBJS_SHOWER)
$(CXX) -o $@ $^ -L./ffmpeg/lib $(LIBS_SHOWER)

clean:
rm -f *.o
rm -f webcam_server
rm -f webcam_shower

#make

修改c与C++兼容问题webcam_show/ffmpeg/include/libavutil/common.h

  • #ifndef UINT64_C
  • #define UINT64_C(value)__CONCAT(value,ULL)
  • #endif

#make clean

#make

生成webcam_shower

运行#./webcam_shower报错:

./webcam_shower: error while loading shared libraries: /lib/libx264.so.125: cannot restore segment prot after reloc: Permission denied

解决办法:

1.#vim /etc/ld.so.conf

添加一行:/opt/webcam_show/ffmpeg/lib

#ln -s /opt/webcam_show/ffmpeg/lib/libx264.so.125 /lib/libx264.so.125

2.#chcon -t texrel_shlib_t /opt/webcam_show/ffmpeg/lib/libx264.so.125

结果:ERR:bind 3020


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值