- 收藏
- 点赞
- 分享
- 举报
基于v4l2 ffmpeg x264的视频远程监控 (arm mini2440 )
[i=s] 本帖最后由 ebaina 于 2013-1-30 00:07 编辑 [/i]
网络上盛传的基于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摄像头上传上来的视频 [attach]477[/attach] [attach]478[/attach]
废话少说,一步一步实现
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部分[code]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/ffmpeg[/code]运行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[code]SRCPATH=. prefix=/opt/webcam/ffmpeg exec_prefix=${prefix} bindir=${exec_prefix}/bin libdir=${exec_prefix}/lib includedir=${prefix}/include ARCH=ARM SYS=LINUX CC=arm-linux-gcc CFLAGS=-Wshadow -O3 -fno-fast-math -Wall -I. -I$(SRCPATH) -std=gnu99 -fPIC -fomit-frame-pointer -fno-tree-vectorize DEPMM=-MM -g0 DEPMT=-MT LD=arm-linux-gcc -o LDFLAGS= -lm -lpthread LIBX264=libx264.a AR=arm-linux-ar rc RANLIB=arm-linux-ranlib STRIP=arm-linux-strip[/code]#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中了[code]all: webcam_server
webcam_shower
CC=arm-linux-g++ LD=arm-linux-ld 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
.cpp.o: $(CC) $(CXXFLAGS) $<
webcam_server: $(OBJS_SERVER) $(CC) -o $@ $^ -L./ffmpeg/lib $(LIBS_SERVER)
webcam_shower: $(OBJS_SHOWER) $(CC) -o $@ $^ $(LIBS_SHOWER)
clean: rm -f *.o rm -f webcam_server rm -f webcam_shower[/code]#make
这一步会出错,报c与c++兼容问题,在include/libavutil/common.h中添加如下,即可
ifndef UINT64_C
define UINT64_C(value)__CONCAT(value,ULL)
endif
最后就得到了编译好的web_server了,将web_server复制到mini2440中,并且将之前编译的第三方编解码库/lib下的所有.so文件复制到mini2440的 /usr/lib中
插上usb摄像头,webcam_server就可以再mini2440中运行了
最后是编译pc端的webcam_shower,这个很简单,按顺序从头编译就好
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
-
2016-08-03 11:08:32
-
2019-04-10 21:28:45
-
2024-06-13 18:37:26
-
2018-01-10 09:50:58
-
2023-12-25 09:09:33
-
2018-12-27 20:39:38
-
2015-08-20 14:50:19
-
2024-09-29 08:25:41
-
2018-12-05 16:16:17
-
2022-06-23 13:50:33
-
2022-12-01 11:55:39
-
2021-03-14 15:00:26
-
2017-07-27 14:37:22
-
2018-12-06 09:46:39
-
2020-05-16 17:47:17
-
2024-01-24 16:06:51
-
2020-10-06 12:13:28
-
2017-03-31 14:51:49
-
2015-10-14 09:17:45
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明