|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
: u# _/ r. y/ p% y7 \% D网络上盛传的基于mini2440的摄像头监控一般是基于 MJPEG-Streamer。
: }' h) f1 z' s: V# T) H$ N1 j; D+ Q/ L; S
这种方法利用的是V4L2的底层驱动,然后配合mjpeg这种格式的流传输,然后通过浏览器浏览视频和控制。- j& y6 a W: T+ f( F( [
: U3 C- \" S' Jusb摄像头得到的数据格式一般是YUV422,如果用的是cmos 摄像头可能是raw原始数据格式,YUV422,是在raw基础上色彩抽点编码,因为人眼对亮度的敏感大于对色彩的敏感,所以并非对所有的色彩编码,这样的数据量会非常的大,视频编解码格式就不讨论了,很多很复杂,当然,你会了,就不会觉得难。
, A5 c5 @* s3 c: l% Q5 x: l: O1 x' e& C5 K. z( {
ffmpeg和x264的作用是将YUV422再编码成H.264# B( j6 H+ Q% I' t7 E
+ N3 f# o# X4 ]- _6 i) |
- S! n' w- r3 c; l: o$ Z上图看效果,这是在linux中接的图,窗口中显示的是从2440usb摄像头上传上来的视频8 j# ]3 b; R S: Z, y/ D5 r7 t( y
0 K; w. y& y0 V6 i5 g5 C8 O! W
5 |7 ?( B8 F0 l3 e5 }' o& x9 X9 D/ k$ p( k
这是实物图,手机拍的5 j, Q$ z1 h% l' C- }9 I! i/ C3 C1 r
# [+ k# X2 r# s: n! L) I# P
% s$ [- G/ }% F+ S! M3 z% k( i
$ y$ D8 P, u% n E, L; ?) ^- g废话少说,一步一步实现
0 S/ z- x# b3 [: n* l( D; `/ r
3 s0 k6 N' x- P$ d+ X1、平台
( H. O# Q+ Y1 u, F" L8 @0 u2 R/ D' p1 F
硬件:ARM mini2440,usb摄像头6 c# X/ B8 y1 o, Y9 ^
: K! q9 p* O( y2 ?1 g. c# l! ~
软件:fedora14,arm-linux-gcc v4.4.3( T9 d. @' H; d' V! x/ |
; R9 {: I; S3 Y" }9 c, m2、源文件
9 i8 k, g2 q: U# l, B
0 Z* H3 i, ^# \6 uffmpeg-0.10.1.tar.gz" x& G2 L1 m( y( R( @; c
1 |9 o1 v" B6 I% p; A8 S- D
last_x264.tar.bz2
8 q! ?2 {, l- t5 jzlib-1.2.5.tar.gz (mini2440中没有libz.so,但是程序运行时需要这个库支持,所以下载源文件交叉编译)3 Q$ p) e8 ]* N. z
以上文件只要会搜索的人都能找到( `8 n( i" J9 h6 {1 Z* v
/ ]2 d6 J1 y* T% v下面开始交叉编译,编译过程中会遇到几个小问题,一一解决 ?# N% H6 \4 L- w
/ _/ v/ u6 u- v* S% S2 C# d6 l
1、编译zlib
8 ~' n; v" F* L: s) r; F5 W, p# H; X) o( N) y) ^9 F
解压zlib-1.2.5.tar.gz
a) V/ s4 E) H# i1 T6 s0 m0 m: }; D! A' O, S, Q
#tar -xzvf zlib-1.2.5.tar.gz7 G; p- y3 i5 K4 ?
, |: `% Z* _5 W- R
进入源文件目录
9 X2 A- H2 a9 b l" d4 v
; S6 ~8 ?6 w8 H# P8 |8 V#cd zlib-1.2.5
# ?3 n8 \. H- p6 e5 h$ _
2 f9 D' n# v0 I5 i, K! @% B运行configure配置makefile
' X6 t* c$ V% C. n$ j, Z C% u9 O$ H; [8 U. |
#./configure --prefix=/opt/webcam/ffpeg+ [9 Y6 T1 K5 ^! w
- Q9 ]4 H6 x# F8 l$ D1 @
--prefix=/opt/webcam/ffpeg的意思是最后执行make install时,将文件安装在/opt/webcam/ffmpeg,不然会默认安装在/usr/local/lib中,其实这里不写这个参数,最后一起在makefile中修改也可以的。
7 @5 o6 q$ c2 _) a4 |( F
" D2 R E- y0 v3 A3 F. i配置后会在当前目录下生成Makefile8 J) S, ?6 h# V' h9 `
. @! z$ V# G; L6 ~! }* z# k
修改Makefile以便能够用arm-linux-gcc编译,其实就是把gcc 改成arm-linux-gcc,ar改成arm-linux-ar等
! q5 ~9 \& B, N. F
, m0 S4 g2 o5 @1 `6 }" d4 X# }& ^下面是改好的makefile部分, T2 C, m7 T/ ?8 J
7 X0 Y$ B# A' M, h) }) dSFLAGS=-O3 -fPIC -D_LARGEFILE64_SOURCE=1+ h9 E- u: e% k+ D! r
LDFLAGS= -L. libz.a* @. ^+ q8 \6 D" |/ {& _
TEST_LDFLAGS=-L. libz.a
6 b' h1 E. t8 X; a4 R$ E% b: LLDSHARED=arm-linux-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map5 W9 e. [6 x% k0 T2 D# g% e% i
CPP=arm-linux-gcc -E
$ E; s& @' K* j. D4 d
) Z, |% s$ ]+ r: q+ WSTATICLIB=libz.a& ^8 ]" {2 v: n2 i$ S: `9 \
SHAREDLIB=libz.so
9 Z6 \2 w% X f P7 d- B% E* kSHAREDLIBV=libz.so.1.2.5# r) X- Q3 P# j/ r/ P( s; i+ Y
SHAREDLIBM=libz.so.1. B- l% L7 f& m9 M. J
LIBS=$(STATICLIB) $(SHAREDLIBV)
! c+ O4 j) x9 N3 a7 ?# o, {) p
* }2 ^* O- Q2 i+ ~AR=arm-linux-ar rc
( J( ]6 [: E2 Z3 q5 M& \RANLIB=arm-linux-ranlib/ g3 y4 }' j5 ?6 O9 _* j u5 M2 @
LDCONFIG=ldconfig+ B& V& D$ \ ]1 A( [
LDSHAREDLIBC=-lc
3 ?2 P) l: x5 e6 _6 STAR=tar7 h$ V% Q% h9 e2 W0 X! U
SHELL=/bin/sh
" E4 I3 R0 F! b& @2 y" F; dEXE=3 H' f: g5 j% S8 W. l$ H
x/ S& v* d2 Y0 v1 t+ Q
prefix =/opt/webcam/ffmpeg
. ]; y1 w- d$ X' b. c运行configure是的--prefix 就是最后这个参数,这里修改也行的
! p% Y% P' w5 @6 T% L8 e然后make,make install
) M2 g9 `2 u n$ G, W$ \% u7 [
b; I1 n9 K3 e2 |; Q#make
& B' g0 @3 @4 w4 c9 ]! ]8 V+ H ]" Q9 s, }0 r" ?9 O
#make install% q6 f a1 D1 K0 f% V. ^; u
# H* M6 W* K% i$ G+ u' K. ?
zlib的编译应该不会出现问题,在/opt/wecam/ffmpeg中是编译好的文件,在子文件夹lib中的.so文件最后要复制到2440里
+ ? ]; Y, Q a m1 Y
9 \) u* O5 o# [& p. W1 [9 z5 e" S7 Z, _+ `0 Z2 \# f+ O
2、编译x2646 E1 b7 l F# r+ J
- p8 m( l3 Q, L9 Y) G; V应为编译ffmpeg时需要要添加对x264的支持,所以要先编译好x264,一边让编译ffmpeg时能够找到它
1 Y m& U) F! Y5 o! f) C+ E4 ^3 p: @6 [
解压last_x264.tar.bz21 Z' R' N R; j+ r% [# d& n; y1 E
/ l( Q; m* _, k; e#tar -xvzf last_x264.tar.bz2; I* z7 m- p9 @# `7 D( Z5 ~
& `4 |* a- G4 ^% v# x7 x" z# E4 b#cd x264-snapshot-20120316-22451 d2 B% `% ~% [6 I
$ }8 c0 h/ p. ^9 ?7 ?9 ]/ t' J1 L9 B
# ./configure --host=arm-linux --prefix=/opt/wecam/ffmpeg --enable-shared --disable-asm0 Z! N3 @7 R& w+ \1 J
6 b7 X1 q' w/ l! |' V
配置选项中已经添加了host的选项,所以makefile就不用再修改了,但是要修改config.mak# Z/ r( _5 ?6 z
2 W4 {- E5 i0 C" ~6 ]SRCPATH=.) g- f' A5 q: Z
prefix=/opt/webcam/ffmpeg
8 v5 g& ^1 k6 O. n W( D3 D0 Aexec_prefix=${prefix}* y8 \3 L5 [. q& F& o6 C6 x
bindir=${exec_prefix}/bin
, z: Q; R5 x4 zlibdir=${exec_prefix}/lib
% _) H( X# h3 qincludedir=${prefix}/include
) t: N# V. W0 s5 r( oARCH=ARM% p7 M/ h( ~% w
SYS=LINUX) Q' h" ~1 m# f$ @' e
CC=arm-linux-gcc* H1 s. s# S4 p- i6 L! s
CFLAGS=-Wshadow -O3 -fno-fast-math -Wall -I. -I$(SRCPATH) -std=gnu99 -fPIC -fomit-frame-pointer -fno-tree-vectorize
( E2 L' Q) @5 N, b% k1 m3 I5 ADEPMM=-MM -g00 v/ s8 S" M- G5 n6 |" e5 P x
DEPMT=-MT
0 |* C( J& _( p: _# x3 ]% f! B0 bLD=arm-linux-gcc -o , E: B1 i! {/ Y) J$ S9 O
LDFLAGS= -lm -lpthread# f- w* \) S- V
LIBX264=libx264.a8 l O( R$ `2 _0 J) ^: K, w
AR=arm-linux-ar rc ; y; O+ y! j* ] U8 d5 I' A
RANLIB=arm-linux-ranlib
, n9 v) R- W4 d: X6 _STRIP=arm-linux-strip
* o, m# @: l' W#make
5 s7 }3 j0 N! S$ Q3 Q5 F
' W9 v4 s$ R. q/ p" y#make install. l6 h, K+ _/ b. l6 x
+ d6 o" N' `, |, M/ j) ~$ b1 a
x264编译也不会出现问题的,如果有,把之前安装的pc端的x264全部删掉
+ f- W1 x- K" _9 N% I
- u; ]1 t* d. c# ^( c/ E8 V" x* W! G) K# q% |* H9 y' Q
3、编译ffmpeg7 I4 O" u/ S* k8 J
6 N7 j4 n0 }2 z ` R/ Q
解压ffmpeg-0.10.1.tar.gz
9 m8 R7 I( k- }6 Q' o8 k4 i
7 {& L8 S7 _- K; f# I; a#tar -xzvf ffmpeg-0.10.1.tar.gz: t9 ^/ D9 w: S3 L, h. h
u% e" l& B0 U5 L c2 k
#cd ffmpeg-0.10.1
2 ~: G( A( ?2 z. q. g6 L9 E @( `3 U. a. O, K# W1 k: x
#./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/
U8 u5 g1 |" t/ Q4 w& b" }! E1 l0 N- O; M
配置需要注意的是--extra-cflags=-I/opt/webcam/ffmpeg/include --extra-ldflags=-L/opt/webcam/ffmpeg/lib/ 指定x264库的位置- ]0 w) A. o# K2 v+ A5 I
k: R( K C$ K- e
#make+ G4 P" y8 b% M, I) b2 J0 U
( Z. L5 ? y1 @% }" L
#make install
! F p/ t! c4 `$ R
. w. J! \+ m7 `& ?, E$ g8 M. x" T以上,所有依赖的库就都编译好了,下面编译webcam应用程序, N& Z: o# @" X4 j! {( ]
& J7 u( d' O& ]% _' F
9 N' K7 j) p; n& A所有的源文件不做除了修改udp上传用的ip地址和makefile文件外,不做任何修改,源码存放位置/opt/webcam3 e) o% P2 m0 s5 z) E8 `
# ^3 Y) f! i% ?* ]1 _1、修改server.cpp ip0 ?. Z) z, p3 N1 x6 S
0 D* f2 p' u1 x将#define TARGET_IP "192.168.1.220" 后面的ip改成你的pc linux的ip,依旧是客户端webcam_shower所在的pc的ip地址
/ K1 R' p2 Q' x `) a/ R
+ p: U9 b0 M# P5 t! [3 j2、修改shower.cpp中的9 n( N3 I3 j& P1 o* J0 Q$ M) E
, p% N2 \% ^7 g9 L `% i" m
inet_addr("192.168.1.220"); 将ip修改为pc linux的ip,就是自己的ip,socket绑定端口用
8 v& F" F- {: ]( D' Y
7 H) v4 N- P7 X5 X+ a3、修改makefile,以便交叉编译webcam_server,注意,之前编译zlib x264 ffmpeg都在放在webcam/ffmpeg中了; l2 j& @: H0 |2 a. x4 H$ N9 N5 V( @
# K, d1 j q* c9 W3 p$ ^! C
all: webcam_server
] `$ z# L4 F+ O#webcam_shower
K7 ~: I/ C2 q* h+ b- s) TCC=arm-linux-g++
* ~9 N: U5 ^( @$ ^9 [. j4 L6 s rLD=arm-linux-ld
[. L$ G! J. pCXXFLAGS= -c -g -O0 -fPIC -I./ffmpeg/include -L./ffmpeg/lib8 T# u0 i" m E0 V C: ?
3 E4 r y7 Z9 T1 x! L$ p. M. y; v7 COBJS_SERVER= capture.o vcompress.o sender.o server.o
* ^, [+ V6 [: n1 F* KOBJS_SHOWER= vshow.o recver.o shower.o
0 \2 x0 |3 g( RLIBS_SERVER= -lavcodec -lswscale -lavutil -lx264 -lpthread -lz
+ I. |8 I+ o% v0 }LIBS_SHOWER= -lavcodec -lswscale -lavutil
8 K1 m D4 A* v/ [6 D
9 v) k7 f- S# P5 p- L.cpp.o:
* ^4 y; |9 A9 o O $(CC) $(CXXFLAGS) $<
3 h8 j( J8 d+ b. I' q+ R2 n0 A, E- K0 R8 X. u) A8 @
webcam_server: $(OBJS_SERVER)' L0 S1 n3 B6 ?2 c5 s
$(CC) -o $@ $^ -L./ffmpeg/lib $(LIBS_SERVER) " j0 A5 e# l2 Z u# S: u
) k, j' k& q8 Q3 W- G: u8 ^
webcam_shower: $(OBJS_SHOWER)& @5 u( A& `0 o4 c6 K
$(CC) -o $@ $^ $(LIBS_SHOWER)6 b3 \, v; q9 p5 t \% r
9 W/ g3 ^. m9 j0 q8 W; vclean:8 x6 I4 W7 g5 a- D
rm -f *.o8 i/ l- G+ s3 j3 Y( z4 s
rm -f webcam_server
, C! `8 p: m2 v rm -f webcam_shower; b T! F9 g* u' L+ Y
: N3 d' ?( ?( @0 P
#make
/ {* }* F. g1 G这一步会出错,报c与c++兼容问题,在include/libavutil/common.h中添加如下,即可& _8 q# k% J8 F a
2 `; m9 s7 `; u6 b#ifndef UINT64_C
Z6 t" h, N7 h9 H7 w8 H) M#define UINT64_C(value)__CONCAT(value,ULL)
1 G& c1 m: I% \, l#endif
, D6 N& j) Q0 ~& C/ k3 ^; C. N
% T9 r* t9 P- e4 G
7 U3 Z0 b" F. R, K( q; T最后就得到了编译好的web_server了,将web_server复制到mini2440中,并且将之前编译的第三方编解码库/lib下的所有.so文件复制到mini2440的 /usr/lib中
# @4 f W n I6 g) A4 @0 c# P
\) ^& B: H7 Q+ {插上usb摄像头,webcam_server就可以再mini2440中运行了
. t) I: Z8 g+ D6 e/ X" \- A0 \7 u! O% R( J
! @; D- P Z9 w3 n
最后是编译pc端的webcam_shower,这个很简单,按顺序从头编译就好了 |
|