|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
, j7 e: l, I( y c
网络上盛传的基于mini2440的摄像头监控一般是基于 MJPEG-Streamer。/ T% r& }4 Q. ?4 b+ u
# G# R8 a7 r( F- a9 o# L/ j. w这种方法利用的是V4L2的底层驱动,然后配合mjpeg这种格式的流传输,然后通过浏览器浏览视频和控制。1 d$ ?; Z0 V7 w) ]: [ @
5 U I/ D* ]4 ^# Qusb摄像头得到的数据格式一般是YUV422,如果用的是cmos 摄像头可能是raw原始数据格式,YUV422,是在raw基础上色彩抽点编码,因为人眼对亮度的敏感大于对色彩的敏感,所以并非对所有的色彩编码,这样的数据量会非常的大,视频编解码格式就不讨论了,很多很复杂,当然,你会了,就不会觉得难。. N) L' R, G3 E) G* O% Z
4 N: U: v1 z# N
ffmpeg和x264的作用是将YUV422再编码成H.264
1 k2 X. j C# F* N$ {8 ~% }# f; d& n' h
) _3 h$ I/ i& N a
上图看效果,这是在linux中接的图,窗口中显示的是从2440usb摄像头上传上来的视频
# f& ^9 t& o4 h* J2 g0 J6 E- b2 }% ?
+ N; }& G( O" k( i* c9 P4 ]
" r& J3 T) v8 H$ ?
这是实物图,手机拍的, H8 E% K7 X w k
6 U% {( Y' u$ j+ ~6 Z( w
1 f3 c) k, F% J) d/ s" ~, x. F
6 \! h& _( o! q废话少说,一步一步实现
" G2 |+ D3 C0 q, ~. `* e+ S3 `+ G! @2 F3 G( }8 _% T) t( l, \1 g
1、平台) O) e% e: p o9 }% b, a8 a+ J
/ D/ d- C6 A% J- d+ z- r硬件:ARM mini2440,usb摄像头
F# A4 T+ T6 v0 G5 V( l+ z! K% L, d. J. o
软件:fedora14,arm-linux-gcc v4.4.3
8 e7 z# ?9 M9 {: z6 @% u+ L# ~ d: B* {7 o2 s
2、源文件8 G- _% j& S, s3 x% f7 A! H
' W2 O- i$ | I9 _
ffmpeg-0.10.1.tar.gz' W8 @4 I. A3 i* `
5 x0 p0 O* j' v8 a& Glast_x264.tar.bz2
+ s5 C _/ v6 @ y& A' Bzlib-1.2.5.tar.gz (mini2440中没有libz.so,但是程序运行时需要这个库支持,所以下载源文件交叉编译)
* m+ M0 l3 o( ?6 Y以上文件只要会搜索的人都能找到
5 B8 ?+ D/ L; b( _, L
q( L* T3 O- x+ \/ i0 x. o! k下面开始交叉编译,编译过程中会遇到几个小问题,一一解决
7 I# o' d$ B* y. B$ u- u" a; ~; J% k1 {5 [+ W8 I
1、编译zlib: f8 }5 e+ ^% [$ k! p# n7 k
$ t; s% ^3 Z/ T- j5 o; e3 F
解压zlib-1.2.5.tar.gz2 s( G' t5 [( P3 z0 I. i+ T
# T( f: U! L3 z) `& G# I# q
#tar -xzvf zlib-1.2.5.tar.gz
6 s. ]+ ]' S& o; N
" D1 y6 g( o$ O1 L8 I8 j. U5 s7 |; V9 N进入源文件目录. e, U2 k' p" c7 m$ h* O5 h3 _+ _
3 J6 O' w3 v5 I ` N#cd zlib-1.2.5
- y. ~# Z$ P( f2 a5 \ M9 x# M; R( Z0 J; O$ e$ g3 I
运行configure配置makefile$ n; e8 r1 k! m, R) o
: y; G& i& l3 l6 b2 \6 i#./configure --prefix=/opt/webcam/ffpeg. Z) i# I4 _) J; o7 H- k
2 a' G d' M/ H1 M: H5 } G. ]- h
--prefix=/opt/webcam/ffpeg的意思是最后执行make install时,将文件安装在/opt/webcam/ffmpeg,不然会默认安装在/usr/local/lib中,其实这里不写这个参数,最后一起在makefile中修改也可以的。/ U" u- p: R7 c' v& k8 y2 W* n3 K5 x
+ ^, }- z3 v: l g4 q配置后会在当前目录下生成Makefile- R2 h1 n# a. n5 O- y
# f* g! g1 h1 w* I ?! l
修改Makefile以便能够用arm-linux-gcc编译,其实就是把gcc 改成arm-linux-gcc,ar改成arm-linux-ar等
+ n. f# s+ A3 x, L( s }
. r t, Q4 F$ w9 e# i; ~! l下面是改好的makefile部分
" Z( p F$ @2 {5 f0 j+ r" ^& A: C% J% @5 x' Z
SFLAGS=-O3 -fPIC -D_LARGEFILE64_SOURCE=14 o- M: ]8 m- q! c& S* G
LDFLAGS= -L. libz.a
" R# l# X) b, V8 bTEST_LDFLAGS=-L. libz.a
2 `4 t/ d+ i% s$ G6 i9 v- J& ?LDSHARED=arm-linux-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
4 ~) l4 e% r2 h# NCPP=arm-linux-gcc -E
+ S! C" n$ j: `$ Z2 z: `% H
. U$ f. f% F# `" w2 M+ ?& z( zSTATICLIB=libz.a6 A: ^! Z/ C* q
SHAREDLIB=libz.so
9 J! I8 N" U3 |" E3 z# ESHAREDLIBV=libz.so.1.2.53 N" k0 M2 Y2 d6 f; G* v; i
SHAREDLIBM=libz.so.13 l+ C x( N0 [/ E! c/ v
LIBS=$(STATICLIB) $(SHAREDLIBV)
9 Q5 c* B% q. Q8 L$ B
! O( ^# d9 J& b9 _1 nAR=arm-linux-ar rc* }2 j9 _6 [1 |8 J5 [. x
RANLIB=arm-linux-ranlib
% `& l- J& h' F0 JLDCONFIG=ldconfig( [# V8 p9 W# v& J
LDSHAREDLIBC=-lc0 n5 H/ C' R! t- o1 Y+ D' w
TAR=tar1 x7 u6 }& X; j& A& s% F' V
SHELL=/bin/sh
2 E& B) n! A$ B( J7 g- {EXE=- j* H' v* B* b& o& M3 C
b# S5 z: P$ [' Qprefix =/opt/webcam/ffmpeg
# M$ K% B) q4 w, x& T3 A0 ?运行configure是的--prefix 就是最后这个参数,这里修改也行的
( N& ^ m3 I' r1 Q+ P然后make,make install0 U( Y) ?& T8 I
" X1 `' Q; w; F& G% ?
#make0 a( I2 o5 c: Q( ~9 N; z
& ~: O3 B& X! p9 @#make install( V9 m: R4 G3 t
8 O( I8 h- L$ Y/ _+ [; vzlib的编译应该不会出现问题,在/opt/wecam/ffmpeg中是编译好的文件,在子文件夹lib中的.so文件最后要复制到2440里& i }8 X2 l; Q6 N7 [" M3 s/ }
3 J6 K" d* x# J7 Z# a* C# Y, U) C( R: o; \4 t$ I& W
2、编译x264
" z" g# d# _; U: _% U8 ^/ ?: F D0 x4 S3 y
应为编译ffmpeg时需要要添加对x264的支持,所以要先编译好x264,一边让编译ffmpeg时能够找到它
0 Q8 x9 Z+ \8 ^3 y
: e% N% y1 {# O! i5 C" j解压last_x264.tar.bz2
# O, O. O( @) C( p8 I; h. _: N) a
) }: r5 V/ K- s# L% ]8 _7 @#tar -xvzf last_x264.tar.bz2
( a% { t$ G# X. t i! ]/ M' j3 K! A+ v" Y
#cd x264-snapshot-20120316-2245: l/ k& m6 Y7 M! s
1 P1 g1 i" d) [% w9 W6 t# ./configure --host=arm-linux --prefix=/opt/wecam/ffmpeg --enable-shared --disable-asm
! O9 V: E; W6 h% h6 t4 ~4 S+ U4 r6 k2 {- j Y( z9 `/ l2 E
配置选项中已经添加了host的选项,所以makefile就不用再修改了,但是要修改config.mak/ w, e6 d* K( ]) O1 Q: ~
% D+ T. z% S4 L1 L8 P/ R
SRCPATH=.
' h* [' d6 X. X& x: j$ @prefix=/opt/webcam/ffmpeg" w! B: ]5 c% ]1 ^5 d6 h& }
exec_prefix=${prefix}
: \9 F8 D0 k; b* V) o4 f9 Jbindir=${exec_prefix}/bin, l2 N# Q, L! X% m
libdir=${exec_prefix}/lib
" N% s# ?" i N) b: bincludedir=${prefix}/include
8 s; _) y6 i% I4 h! H+ [; J- rARCH=ARM N: J6 D) j; C- o4 l
SYS=LINUX K* O. u( h+ H/ l, P5 D& ?
CC=arm-linux-gcc" l+ ^5 j& o% h1 ]! A6 q8 ^8 r
CFLAGS=-Wshadow -O3 -fno-fast-math -Wall -I. -I$(SRCPATH) -std=gnu99 -fPIC -fomit-frame-pointer -fno-tree-vectorize
- D# Z: F0 }' C" Y: V& P$ l! NDEPMM=-MM -g0
) y" {1 X( n: |' \) {DEPMT=-MT! }$ S* v/ U& T( \7 S# w
LD=arm-linux-gcc -o . v. e4 F4 v7 G0 {( V/ {
LDFLAGS= -lm -lpthread8 F7 u9 p; T J7 |- c
LIBX264=libx264.a
% I& F0 @8 l& o, `9 Q; nAR=arm-linux-ar rc $ \) ^+ }; C* ^8 W( K
RANLIB=arm-linux-ranlib. W' x8 ~% u* ^) D. H h& L' m5 ]: V
STRIP=arm-linux-strip) |' p/ ^& g) o3 P9 Z# m, C
#make8 M9 P8 q: Q! d
3 M" @. J2 q4 A6 f! u: L#make install
; n3 H" p! p" X9 ?" I; z2 H9 Q2 g" ~) K' I, O' j
x264编译也不会出现问题的,如果有,把之前安装的pc端的x264全部删掉8 S" c0 a) F5 ?$ m3 D8 n
1 l4 Q& K: t: k2 H
- W( h; D3 b' D! }) _9 H' m' j3、编译ffmpeg
/ Z5 @+ R) ]8 E* M1 f# G, C( s, [" r) P+ Y& T
解压ffmpeg-0.10.1.tar.gz* G( h9 w$ {' I5 u7 a8 j
) |- n' v( w y$ Z5 n) r#tar -xzvf ffmpeg-0.10.1.tar.gz2 L; g+ ~0 Q5 U" o
7 `; r$ f9 c2 X; U6 m+ Q' Y
#cd ffmpeg-0.10.1
9 i% ?$ m, J9 L: S+ J8 m& j" @& C
+ Z8 x) B$ \6 e6 T: D; o#./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/+ } N4 p' l3 D4 S" t
. X3 a+ U) m6 [# O
配置需要注意的是--extra-cflags=-I/opt/webcam/ffmpeg/include --extra-ldflags=-L/opt/webcam/ffmpeg/lib/ 指定x264库的位置
! i( b" V @6 x6 y! {. B+ D" U* Z, w) h# O! Y% t1 F1 A' o% U+ v4 j
#make& ~+ n% t. D0 p
1 w: K- m0 B& {* D: R9 N9 w#make install9 a2 B9 ~! f; C
0 L, |8 N+ s# Y+ k3 ?- ^$ P' A
以上,所有依赖的库就都编译好了,下面编译webcam应用程序
+ [. f; h- I4 H2 _+ |. H
% h% b+ r$ g$ ^. C
0 v4 h* h' P c/ y" U所有的源文件不做除了修改udp上传用的ip地址和makefile文件外,不做任何修改,源码存放位置/opt/webcam
- K# |3 Y" f! ^1 ~& D
- Y' b# h# U8 e, g3 H1、修改server.cpp ip
" n# a. g3 r" h
) d! O( e" G- S. P0 A; h8 v将#define TARGET_IP "192.168.1.220" 后面的ip改成你的pc linux的ip,依旧是客户端webcam_shower所在的pc的ip地址
T) i( X4 R+ I6 M/ l, Z4 L3 |
( J7 n" Z. d n+ A$ J: ?2、修改shower.cpp中的
! G, l3 W3 q+ P" G+ h7 R q
# M1 Y: S" l! ?+ pinet_addr("192.168.1.220"); 将ip修改为pc linux的ip,就是自己的ip,socket绑定端口用' H* K# o( y3 O3 Y! O. H
, T2 i. Z: f4 B5 G8 v) P
3、修改makefile,以便交叉编译webcam_server,注意,之前编译zlib x264 ffmpeg都在放在webcam/ffmpeg中了
# X9 {7 C1 Y P% i0 p0 n# {* t
8 n! C7 ]- I% [8 ^all: webcam_server
. B. e3 u3 r) N' _0 F ^#webcam_shower: E5 G" @$ Q {
CC=arm-linux-g++
3 k* K* ]) T4 W" ELD=arm-linux-ld
+ J/ z2 U. c/ JCXXFLAGS= -c -g -O0 -fPIC -I./ffmpeg/include -L./ffmpeg/lib3 o7 g7 p7 @% x# O* g; p- z, [
2 Y+ J/ n) V3 _" y" J, o" d/ d8 d! j
OBJS_SERVER= capture.o vcompress.o sender.o server.o
X7 R6 ?$ R r4 F& XOBJS_SHOWER= vshow.o recver.o shower.o- a* Y5 A& w1 g# G
LIBS_SERVER= -lavcodec -lswscale -lavutil -lx264 -lpthread -lz* p: L1 W( [. k( W6 t
LIBS_SHOWER= -lavcodec -lswscale -lavutil
: _4 i" M' z( Z l3 J) W# G2 g% Q) G. X0 h8 `, q. n
.cpp.o: K, B( @. o5 J7 t; a: X3 I
$(CC) $(CXXFLAGS) $<8 X- A1 ?3 H' W# d0 ?7 _
: n# q: r7 ?& \* F. r; y
webcam_server: $(OBJS_SERVER)7 T, S6 e9 ]9 L9 F
$(CC) -o $@ $^ -L./ffmpeg/lib $(LIBS_SERVER)
6 z# b/ [3 n, x1 _) s& o
$ y7 y" G, y: E6 O( ]$ Xwebcam_shower: $(OBJS_SHOWER)
. C2 ` R1 R/ M f8 }8 d0 v $(CC) -o $@ $^ $(LIBS_SHOWER)* X! M% W- P7 O# i) w9 V
' t- J9 [. a J- z; J8 Pclean:
9 D; }! M; e" A; L3 C rm -f *.o- E) A w n+ a2 H: y
rm -f webcam_server9 A+ Y( l& h, R+ }8 i
rm -f webcam_shower
: U' F: _6 `3 f+ i
2 L* ]7 n: V( Q: s: w, Q#make
: L: V. K/ a/ b, e7 o2 Q8 C& g, P这一步会出错,报c与c++兼容问题,在include/libavutil/common.h中添加如下,即可) I5 s; U' _. w
, r) j4 ]- m5 S1 O4 j#ifndef UINT64_C2 _9 R9 [+ B7 O: y$ X3 L
#define UINT64_C(value)__CONCAT(value,ULL)7 B4 V- T$ _ b4 q; O
#endif
, |) ~0 p: f" N. Z( h6 F2 g! f4 d7 d! Z; @. e
1 Z% i" x! b) v8 \ `( U最后就得到了编译好的web_server了,将web_server复制到mini2440中,并且将之前编译的第三方编解码库/lib下的所有.so文件复制到mini2440的 /usr/lib中) ?+ }# g5 F3 w/ X7 p" Y" N
3 U1 ^4 _+ f" N0 w- I: A4 i9 X' |
插上usb摄像头,webcam_server就可以再mini2440中运行了
3 [* r$ b( Y; y
1 d/ T7 j" i2 x, i H! S6 J- o
, T6 ]: X2 ?1 ~2 K/ a& \% B" B" A最后是编译pc端的webcam_shower,这个很简单,按顺序从头编译就好了 |
|