|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
9 d7 |# s$ a$ i& C网络上盛传的基于mini2440的摄像头监控一般是基于 MJPEG-Streamer。8 x# }) b$ V8 M* g, S
: L* x1 P( W8 d6 u; ~
这种方法利用的是V4L2的底层驱动,然后配合mjpeg这种格式的流传输,然后通过浏览器浏览视频和控制。4 W( Q4 T; H' i
" K. f' o7 F' P: j- p
usb摄像头得到的数据格式一般是YUV422,如果用的是cmos 摄像头可能是raw原始数据格式,YUV422,是在raw基础上色彩抽点编码,因为人眼对亮度的敏感大于对色彩的敏感,所以并非对所有的色彩编码,这样的数据量会非常的大,视频编解码格式就不讨论了,很多很复杂,当然,你会了,就不会觉得难。
" t1 U! E" H/ ^6 L+ i
& Z4 L; `2 _( x; s$ b7 effmpeg和x264的作用是将YUV422再编码成H.2640 s- w7 F7 i7 b; c6 h; Q7 i
/ l, y8 f* e4 h- c0 ?/ Y0 v
0 _. R3 L( s- Y3 e5 r, `) _4 g上图看效果,这是在linux中接的图,窗口中显示的是从2440usb摄像头上传上来的视频
4 v! N. C+ b) ^1 b6 G+ c. Y
6 C! l, ~& A' J8 \ t5 e
. ~1 b5 c" l: U! R, j/ K1 B5 o$ ]% G3 a7 Z' a3 J! F
这是实物图,手机拍的& i, c5 Z' d/ B: a
+ \, S, J! w8 p( x" E
2 a1 g6 u! w- ]* ~# s Q D
4 |, u9 w8 F7 y9 Y' Z; W& r废话少说,一步一步实现, v- s% _- o$ @2 R2 l8 x# I
% n2 `7 ?" [; }9 ~3 O+ _
1、平台' k8 H S" j( g+ ^6 \* V' J
- d- a, x! K$ i7 |1 ?( k
硬件:ARM mini2440,usb摄像头* f+ O, L' Z* Q7 H6 I Z
* s, i1 q, k# m$ }) q软件:fedora14,arm-linux-gcc v4.4.3
/ x" x0 @% E9 Y& f. O# z5 B3 S$ V4 a7 P/ X, `! I+ p
2、源文件
% T5 _9 _/ O; g0 K8 j7 w
( o2 R* f' |7 z7 Fffmpeg-0.10.1.tar.gz
& o4 h7 D" F* ?7 N+ ?5 {7 y _4 K* C# r& {, ~- \
last_x264.tar.bz2
}5 R0 w/ ^* q/ B' t- Wzlib-1.2.5.tar.gz (mini2440中没有libz.so,但是程序运行时需要这个库支持,所以下载源文件交叉编译)4 |; ?6 Q0 Y( K: E, D
以上文件只要会搜索的人都能找到' V& r2 F; c& E8 }
/ ]% x$ \8 @* B+ \ P
下面开始交叉编译,编译过程中会遇到几个小问题,一一解决
X- E0 i& M# n6 R! o, ^& m* B) p2 S }
1、编译zlib
7 ~" l* k F J( C) K1 g5 u& g5 }/ n0 ?! Z" d i1 ^9 H
解压zlib-1.2.5.tar.gz
( b# r" }$ e4 G- ^4 S- f6 i$ ^
#tar -xzvf zlib-1.2.5.tar.gz: h* K" o, c# U/ _! X
' @7 s1 x9 A$ m& v
进入源文件目录
; f5 ^7 t6 a/ d3 V! ?0 ]6 M, ?1 c
$ H. D: Y; u5 G7 h#cd zlib-1.2.5
* \- |. X J0 m: x* M9 Y8 W& r0 h7 q1 _5 d
8 u( {+ k% e7 |1 @% m: F- f( c" k运行configure配置makefile4 N+ ^! Q. P1 z P3 I4 o
$ H. C, a4 U: W5 l5 m) N
#./configure --prefix=/opt/webcam/ffpeg% _. J$ L% Z4 }" w, P
( f6 V7 s' ^. w. t
--prefix=/opt/webcam/ffpeg的意思是最后执行make install时,将文件安装在/opt/webcam/ffmpeg,不然会默认安装在/usr/local/lib中,其实这里不写这个参数,最后一起在makefile中修改也可以的。
" [( P0 t/ X" u3 ]" c) v
9 B) n8 g% w% b& |7 H( i9 ~配置后会在当前目录下生成Makefile
9 |4 }$ P3 R) z5 b( H9 K- k( w
, r3 b* _3 \3 X J( r% s) S" q修改Makefile以便能够用arm-linux-gcc编译,其实就是把gcc 改成arm-linux-gcc,ar改成arm-linux-ar等
/ V: Y8 K+ [: Q* A* ?+ I: F7 a6 F( t% y( W- i7 F6 h+ S
下面是改好的makefile部分. d6 Y: [( b7 i# d# n
/ f, a* f$ J3 H. \& ]* WSFLAGS=-O3 -fPIC -D_LARGEFILE64_SOURCE=1
+ K2 Z6 T5 L& Q! H+ jLDFLAGS= -L. libz.a
3 g- y3 U7 ~; t1 f( N* l8 aTEST_LDFLAGS=-L. libz.a9 ~ }$ E3 n2 i0 O
LDSHARED=arm-linux-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
. C8 E: N1 q% ~% ]. r& Q2 J8 ^+ RCPP=arm-linux-gcc -E% o) \! z, g" l9 c8 G9 [3 ^, P
) W( \- a/ T8 r2 y6 v: q3 H
STATICLIB=libz.a
+ ?( F$ y3 z/ R6 _3 _; KSHAREDLIB=libz.so
$ ^5 h" L, i( f& P" Q- U' j |SHAREDLIBV=libz.so.1.2.5
( ^2 Z4 M2 K1 ?* U# m; ^* aSHAREDLIBM=libz.so.14 H7 D' `- w7 b7 {
LIBS=$(STATICLIB) $(SHAREDLIBV)* x% s) w, o' N5 B B% S/ N
" r0 P& i4 a/ t/ F! a6 CAR=arm-linux-ar rc/ F# Y ?6 Z* _+ } m! n
RANLIB=arm-linux-ranlib
) S& L2 Z- ]* r* Y& i" ILDCONFIG=ldconfig
$ I) C, o5 y! g: [2 i0 ?# ZLDSHAREDLIBC=-lc/ v; W3 Y/ o) @& o1 x! v
TAR=tar1 F# l- w) y0 _7 c3 z% I
SHELL=/bin/sh
" P3 C: ~7 a( Y4 K6 w, mEXE=2 u3 ]* r% ^) U
8 n6 W f2 v7 L- e* Q- |prefix =/opt/webcam/ffmpeg& T0 i% R& s' J
运行configure是的--prefix 就是最后这个参数,这里修改也行的9 d+ C3 z$ j0 {0 E( N' o2 V
然后make,make install
: R1 u5 b2 ]! Q) Q# S! P& _3 X
$ p7 j) E# ?* C5 Q& ~5 u! ~- d#make. n+ S1 N2 a, ]4 s$ K; s' O$ K j
4 X) v( D: z- E( n9 {: w5 C, k4 F
#make install
. ]1 n* C y" L2 a5 H3 B
" N" }! `; K; ?, m4 a( szlib的编译应该不会出现问题,在/opt/wecam/ffmpeg中是编译好的文件,在子文件夹lib中的.so文件最后要复制到2440里
! L4 ]5 H+ j+ y8 v2 j
# S+ ~9 g' N5 j0 t9 U5 I0 t9 N ]* |% Z, a) ^' y Q
2、编译x264
& _5 g- x! V$ b
) n, G) M0 L4 C0 w8 g应为编译ffmpeg时需要要添加对x264的支持,所以要先编译好x264,一边让编译ffmpeg时能够找到它
5 |6 s. L9 b8 C
# L! t- C0 M* Y9 D; X0 z9 a6 a解压last_x264.tar.bz2* E% d5 C. c( ^: h4 B
+ A# K3 E6 C, h) m- N! p5 |#tar -xvzf last_x264.tar.bz2
9 `" X; l. n ~! J% G6 Z) I+ C, c
6 H5 t0 H$ r9 G! F#cd x264-snapshot-20120316-2245% \+ k8 x) f- h9 Y ^
& T3 s. p) A- R2 |# ./configure --host=arm-linux --prefix=/opt/wecam/ffmpeg --enable-shared --disable-asm
* D# ^& @; w. c' W: \- O6 g6 e
( }9 w; }8 N `5 f配置选项中已经添加了host的选项,所以makefile就不用再修改了,但是要修改config.mak5 E8 g2 O9 k9 @0 z
- Q, |/ f6 ?+ {& J. s9 O
SRCPATH=.& q# a+ T% U/ _: U, f
prefix=/opt/webcam/ffmpeg
+ O) Y8 V6 H3 ] I; Z1 v( iexec_prefix=${prefix}
! Q( |* l) F' [- Ebindir=${exec_prefix}/bin
# U8 o2 y u- ] e9 \- W% Y& }9 Nlibdir=${exec_prefix}/lib0 Q/ l9 `: s% W, r- s
includedir=${prefix}/include: y( O9 V4 M4 I' E, b" K' V
ARCH=ARM" g& W9 l" E3 f6 O
SYS=LINUX
1 k6 a$ h, j5 e% H$ LCC=arm-linux-gcc$ o" ?" O. B) f. {, y: S
CFLAGS=-Wshadow -O3 -fno-fast-math -Wall -I. -I$(SRCPATH) -std=gnu99 -fPIC -fomit-frame-pointer -fno-tree-vectorize
9 I- S% c( B8 B6 JDEPMM=-MM -g0
, N- L% d4 ~" @$ C) o* |0 t3 b; mDEPMT=-MT
. B/ @ i7 Y& e% \8 L! ULD=arm-linux-gcc -o
5 Q# E: e; g+ dLDFLAGS= -lm -lpthread
* f* Y0 c2 B2 J$ T& Q z2 KLIBX264=libx264.a
- t, S* [) `7 y/ {7 YAR=arm-linux-ar rc
. O' c! s( g) k/ e8 N+ l) vRANLIB=arm-linux-ranlib
2 q5 P. r/ {# ySTRIP=arm-linux-strip2 M9 _2 B( X9 M5 K
#make, j, S2 O4 C' S9 D# r! ^
/ ^% Z$ g: B$ X
#make install B* N- f6 S% i5 S7 w1 R2 a( e1 j
6 @- Q( O; t: a' Q3 W, b( O
x264编译也不会出现问题的,如果有,把之前安装的pc端的x264全部删掉) \+ [9 V4 j6 R$ M/ j1 M
& l. {- S) Y. J3 v) X+ ^
% N7 W8 S* k ~' w8 B \0 @3、编译ffmpeg
: k% m# Z$ h7 V
3 E: y7 M, V: p7 @) {6 `解压ffmpeg-0.10.1.tar.gz7 u0 u$ l( h, b6 y* S' L- a
( X& j, Z0 G5 m#tar -xzvf ffmpeg-0.10.1.tar.gz
?0 l, _' J& d" |, {9 R
0 Z) |2 d, f* e# v( Q9 I2 H; R' r- \#cd ffmpeg-0.10.1+ _9 O1 X& q8 y7 j. B
5 @$ s& Y- ^6 e, K1 H O8 [1 E#./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/1 Z- d# j+ z; x* p
% H3 O' |6 G9 c* s( a配置需要注意的是--extra-cflags=-I/opt/webcam/ffmpeg/include --extra-ldflags=-L/opt/webcam/ffmpeg/lib/ 指定x264库的位置* u& T- M% N3 g0 e" L$ y9 O; ^
" h% W/ S; a/ m$ F1 j* E+ f4 W#make" k2 b, ~3 X3 {. D% i5 S
" _. A) v7 X* |' v9 k' q#make install
@5 {8 k( b* E& t! I9 \/ W( @* h$ I! W1 Q" k
以上,所有依赖的库就都编译好了,下面编译webcam应用程序7 R# \% P6 u# Y5 {! i: P: |: e
3 U$ ^$ b r# f; U6 L2 E( k6 u' L
8 _; n' k% |5 F所有的源文件不做除了修改udp上传用的ip地址和makefile文件外,不做任何修改,源码存放位置/opt/webcam1 |- N _: ^, a8 ` F7 ~
( g: ]7 F4 Y8 C! H
1、修改server.cpp ip
( c1 C( S$ B$ s6 K/ E3 n3 w
2 v8 T- E7 ?3 Y+ c- J" \0 `% Z将#define TARGET_IP "192.168.1.220" 后面的ip改成你的pc linux的ip,依旧是客户端webcam_shower所在的pc的ip地址
$ b5 Q5 s s# Q* R1 o; w" G& Z6 D1 |7 x( ~* Q! I
2、修改shower.cpp中的
1 V& r' j& E) u/ N' e! \
3 J7 g* ]8 b8 N% q- |inet_addr("192.168.1.220"); 将ip修改为pc linux的ip,就是自己的ip,socket绑定端口用
* {5 j Q7 H/ y) ^8 ?
7 b) g& e3 \5 N* ~! {3 L3、修改makefile,以便交叉编译webcam_server,注意,之前编译zlib x264 ffmpeg都在放在webcam/ffmpeg中了 m2 T- y( Z! ]
# ]- h) h+ z. g" p+ M/ Z3 `$ Rall: webcam_server
! _* U7 k+ F5 X: ]3 {2 k2 Z#webcam_shower" D: h+ D$ e2 b4 _ Q
CC=arm-linux-g++, {) j y ?% Q6 z4 h! y8 p/ B" ]
LD=arm-linux-ld
6 x: E9 r% Y" ]% c0 r- j [CXXFLAGS= -c -g -O0 -fPIC -I./ffmpeg/include -L./ffmpeg/lib
3 {1 b+ M2 H/ d8 B/ M, j$ N8 w: |9 v6 Q. J1 `
OBJS_SERVER= capture.o vcompress.o sender.o server.o; g) ?2 f/ I! D1 R5 L+ V) ^
OBJS_SHOWER= vshow.o recver.o shower.o
7 [3 X, R2 S2 q# }! T* HLIBS_SERVER= -lavcodec -lswscale -lavutil -lx264 -lpthread -lz) A& r' ?+ v$ D: l h- M) H
LIBS_SHOWER= -lavcodec -lswscale -lavutil
+ C$ j" k; H+ y2 `" X
' y4 q2 \4 q6 R4 B+ P/ J% p.cpp.o:* H0 b& R" _2 u) E& l+ E0 z9 K
$(CC) $(CXXFLAGS) $<
8 o9 P" V1 }; X t! X# g& `* I9 B* S7 X% G2 G
webcam_server: $(OBJS_SERVER)
; x9 `* | z: C6 T $(CC) -o $@ $^ -L./ffmpeg/lib $(LIBS_SERVER) 9 y+ H0 d0 R O( `: i' B1 v
2 b7 l+ A% t- x: R& Q9 swebcam_shower: $(OBJS_SHOWER)4 K( Y; L& B' M8 G0 G: n& K8 \- {
$(CC) -o $@ $^ $(LIBS_SHOWER)/ G: j; W' n1 P" W1 R
! E* a, D# f; V% T# y- fclean:- z: i7 Z$ }' f) D
rm -f *.o) O& ~# C/ u0 s' d7 d1 {3 w: Y" l
rm -f webcam_server$ v3 u6 G/ C6 N
rm -f webcam_shower& U7 m# t" r3 w# c! ?2 H4 l# Q
/ J" c( Z& w! a! X: E b. g( i
#make
! R; X8 q; w& f) ~0 x这一步会出错,报c与c++兼容问题,在include/libavutil/common.h中添加如下,即可
3 z7 K! e, d. x) T& Z0 L
' K8 Z' i, |( y: n5 Y#ifndef UINT64_C& [/ s% q6 L1 W) H& X
#define UINT64_C(value)__CONCAT(value,ULL)" t5 c, d5 U; _" B0 i4 m, m2 m# y
#endif
" l6 b- G5 M! D+ ?. t( s
+ C* c2 A$ \# s/ ?/ y: @7 O V( ]9 S
最后就得到了编译好的web_server了,将web_server复制到mini2440中,并且将之前编译的第三方编解码库/lib下的所有.so文件复制到mini2440的 /usr/lib中
9 S" l i* v- a# Z0 X. D) l8 g
1 L" h- `+ b2 I: K插上usb摄像头,webcam_server就可以再mini2440中运行了
) `% a1 D% r4 q% w9 T+ t
9 O8 `5 ^1 W! u7 }& h7 \1 \* \# O; {; Y
最后是编译pc端的webcam_shower,这个很简单,按顺序从头编译就好了 |
|