找回密码
 注册
关于网站域名变更的通知
查看: 399|回复: 1
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-2-1 18:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
- p+ X' {; o5 R- C
网络上盛传的基于mini2440的摄像头监控一般是基于 MJPEG-Streamer。
- r1 d) M, {+ y, C# b" L6 {, ^
4 G( T0 {  ?6 k这种方法利用的是V4L2的底层驱动,然后配合mjpeg这种格式的流传输,然后通过浏览器浏览视频和控制。' w2 U& [) x  R: G
/ `( e( `; a5 J3 c
下面用一个更接近真实的IP-camera的方案来实现。7 a/ M1 |0 p7 b+ N
6 n" L$ u. O* v
这种方案是用的V4L2的视频驱动,然后配合ffmpeg、x264的软件编解码,通过udp上传至pc显示,视频的编解码真的非常麻烦,幸好有很多开源的编解码库可以使用,几百行的代码就可以实现h.264的流编码与传输。
- z5 b% W7 `- [" D
9 e6 b! y. v) ]- o7 @' busb摄像头得到的数据格式一般是YUV422,如果用的是cmos 摄像头可能是raw原始数据格式,YUV422,是在raw基础上色彩抽点编码,因为人眼对亮度的敏感大于对色彩的敏感,所以并非对所有的色彩编码,这样的数据量会非常的大,视频编解码格式就不讨论了,很多很复杂,当然,你会了,就不会觉得难。
; m0 E/ |9 n7 s8 c, Z5 s/ H* U/ S& K+ @$ h
ffmpeg和x264的作用是将YUV422再编码成H.2644 x! M! L) D% t/ v" \, a

( J, u9 s* R: V4 W# p9 X+ L5 J( {1 s8 ~1 i/ D6 U; k+ x- N3 A: }# x
上图看效果,这是在linux中接的图,窗口中显示的是从2440usb摄像头上传上来的视频
& `) T) d) I. A* Z( u! Q
4 p7 k2 p5 E8 b! F6 P' V : |9 X6 B. \( c" L, M

: S; |3 D$ W* N' a3 ]" X; }+ Q% }这是实物图,手机拍的
: \4 D. o( w" [8 J* O; [; }' L
% Z4 e- B) s$ R% X# ?. P* x + P5 T7 K6 a- _7 `; G+ h
9 b$ J# R: U0 R6 ]" }$ u9 D% |% f: ^
废话少说,一步一步实现
! N! P/ O) x$ ?& p$ Y/ X# S" r' G% k* G+ E! Z8 t, E& Y6 d; K  |
1、平台
+ _  @+ n% \  I  W! W+ r
- g# w7 f3 R) X" D硬件:ARM mini2440,usb摄像头
5 G; N* Z7 m# |% [. F: F4 i6 F- h+ c; x
软件:fedora14,arm-linux-gcc v4.4.3
  Z2 w& z+ S7 ]  b) k* U
" x0 p/ K: J. H& v6 w( O2、源文件
' t7 s' j3 J9 m* [) y
' Q; t+ x) o" affmpeg-0.10.1.tar.gz
* ~$ Q% @5 x6 ]  W1 w
8 j, d% t8 z) ]' W& Z3 f6 I0 Tlast_x264.tar.bz2
0 d% W% G3 y8 g" izlib-1.2.5.tar.gz (mini2440中没有libz.so,但是程序运行时需要这个库支持,所以下载源文件交叉编译): C; K4 f6 J* Q
以上文件只要会搜索的人都能找到6 q6 t$ o5 p$ d% |6 k, T( a
8 D5 P) Z/ `8 o- c2 A2 ^( y
下面开始交叉编译,编译过程中会遇到几个小问题,一一解决; \+ Y, h5 c' w; c* W2 n$ h

, |, ^; z. M( T5 I0 ?3 a5 k4 p1、编译zlib
4 T6 V% v% O/ [( @( K. J" G" U6 O2 V6 N  m
解压zlib-1.2.5.tar.gz
7 B& f! x5 T* u9 R0 ]
; M/ [' L  M0 q9 Y#tar -xzvf zlib-1.2.5.tar.gz
+ H/ {& U8 q  Z$ b% b
3 z* X3 v' S% y- B; T" ?进入源文件目录, @% W2 g& `9 Y7 W1 L
' t  d6 U$ a& b4 J# p
#cd zlib-1.2.5/ r* j9 {6 ?2 p9 o) z6 H

6 p( [4 n6 [$ B7 h# Y/ D运行configure配置makefile
% L6 K& U; P2 o5 [+ g
5 Z& I4 `2 k3 ?; U: _4 ^#./configure --prefix=/opt/webcam/ffpeg
4 q$ Z4 @: i1 s+ E6 g0 `
" y4 X9 g5 Z6 t$ v--prefix=/opt/webcam/ffpeg的意思是最后执行make install时,将文件安装在/opt/webcam/ffmpeg,不然会默认安装在/usr/local/lib中,其实这里不写这个参数,最后一起在makefile中修改也可以的。5 f) h) x: _/ z0 `/ T
* d/ D0 b1 q" S/ ]) g: \$ A
配置后会在当前目录下生成Makefile2 t, B( T/ Q& @7 P
9 K4 K" j& N7 L) ~. P7 Z4 k
修改Makefile以便能够用arm-linux-gcc编译,其实就是把gcc 改成arm-linux-gcc,ar改成arm-linux-ar等
5 Q% \3 ?2 R# _! d6 y9 C! x3 L, I5 D' r  z" F7 @0 w1 Q
下面是改好的makefile部分) a: w' @1 J1 U; e: g

; x8 f0 [0 S4 q+ Z& p6 HSFLAGS=-O3 -fPIC -D_LARGEFILE64_SOURCE=1' H7 I3 x$ D$ J" M& `
LDFLAGS= -L. libz.a
) M$ n2 ]7 O6 @* ]8 {$ \TEST_LDFLAGS=-L. libz.a, i- ?. e* n& @
LDSHARED=arm-linux-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map0 F- B- {/ R0 g7 _: N
CPP=arm-linux-gcc -E4 ?, \4 U# Y8 P# Y7 D  v2 D& X
: }; n+ n/ |+ h
STATICLIB=libz.a
- R5 P; t8 l" ^2 ]& r) LSHAREDLIB=libz.so
4 ^( S7 l0 x6 z3 d# {  d4 u) }3 d- ~SHAREDLIBV=libz.so.1.2.5- x9 ]. \; i# n- [2 o5 L
SHAREDLIBM=libz.so.1# S* M6 r4 i# S1 s+ \, O, m0 J
LIBS=$(STATICLIB) $(SHAREDLIBV)) l5 o1 F; Z( u8 [2 U

( ^1 o& ^% V7 p1 o4 s( J# Y! dAR=arm-linux-ar rc
! Y1 m0 ]6 w( P) oRANLIB=arm-linux-ranlib
) c& ~/ f. n7 w( p  CLDCONFIG=ldconfig
, l5 M% |7 a5 }+ aLDSHAREDLIBC=-lc# |1 e  V2 `; G/ n$ D
TAR=tar( v3 b! o/ W$ U" |9 W
SHELL=/bin/sh
( ]6 B+ N* J, K& jEXE=
8 F  h& v2 h( b8 d' C: i
4 t) x1 A) P% w) H6 _0 Sprefix =/opt/webcam/ffmpeg4 S' S7 z9 ]4 }/ w
运行configure是的--prefix 就是最后这个参数,这里修改也行的) v# @# C7 q" E
然后make,make install& C7 ?8 b, h( l) l9 x
5 K4 \# K, X+ w9 m" N+ d  t
#make0 q  y; i/ d6 F- G8 n! @
( U0 N# H/ e" {8 u# S. w
#make install
/ R7 q  i9 b. g  Z
+ i0 u" b7 U  D+ n- q( Pzlib的编译应该不会出现问题,在/opt/wecam/ffmpeg中是编译好的文件,在子文件夹lib中的.so文件最后要复制到2440里
3 K# v6 m9 h* t/ s
# ~- T' ]3 z( J7 y  n/ d$ g4 d( G, r* I! n7 C5 E9 \: S. _  k- P" U
2、编译x264( W0 T' N; N, m, O, |. W

, h$ }4 `& U" g7 `7 d- o4 }, z& S应为编译ffmpeg时需要要添加对x264的支持,所以要先编译好x264,一边让编译ffmpeg时能够找到它
& c; g8 N- i1 A2 J- V* k; G% w/ |* }2 |& [( p: z0 h, U
解压last_x264.tar.bz2
& b# ?6 @; k8 k" I1 [3 y- L9 ]$ w1 U$ i1 E% _
#tar -xvzf last_x264.tar.bz26 v; T9 x4 j( c4 H; D, F% h: V
+ Y6 U3 H$ C8 A* E7 p
#cd x264-snapshot-20120316-2245( {3 h7 g- T5 {* D+ B3 Q
. v; ]% [' j) D, \
# ./configure --host=arm-linux --prefix=/opt/wecam/ffmpeg --enable-shared --disable-asm
9 ~; y/ P4 N5 N' l( `7 @9 Z6 b2 O+ h3 i7 Q
配置选项中已经添加了host的选项,所以makefile就不用再修改了,但是要修改config.mak
9 s2 z+ d& p% }) ^( S# D0 ], l; X, Q2 S0 E" Q4 b
SRCPATH=.. A; j* K- H4 F% V! u! P2 ~9 u
prefix=/opt/webcam/ffmpeg
6 K0 J3 G& I$ q0 k" Q" l5 J  |exec_prefix=${prefix}
: Q$ ]  R* Z: ~% r2 P% @bindir=${exec_prefix}/bin+ c6 B' W$ b( D- u/ ~/ P0 ^- M
libdir=${exec_prefix}/lib
5 g. t9 F7 \/ Pincludedir=${prefix}/include
% \# }2 E7 c$ Y! X! u2 PARCH=ARM3 g- ]" t7 z! s+ A" f9 \7 S* |
SYS=LINUX. i9 i- \2 V, N6 W3 i: p" {6 p$ B
CC=arm-linux-gcc
8 b% U1 A. m9 }, L: v& b7 ACFLAGS=-Wshadow -O3 -fno-fast-math  -Wall -I. -I$(SRCPATH) -std=gnu99 -fPIC -fomit-frame-pointer -fno-tree-vectorize( A" m  I' m  V& G* K# t/ w$ [
DEPMM=-MM -g0
' O0 o" _: Y' l2 b8 eDEPMT=-MT8 y+ q# X3 v, ?: @  Y
LD=arm-linux-gcc -o 9 G, L+ X& V$ @! h+ x$ s
LDFLAGS= -lm -lpthread" `; [0 x0 |8 w9 }+ \2 \& e
LIBX264=libx264.a
3 ^5 h2 e& k2 h. XAR=arm-linux-ar rc
' Y: W! M1 g4 [( d# O% `# fRANLIB=arm-linux-ranlib
1 h+ n0 v) G) h5 Q- cSTRIP=arm-linux-strip
( |% ~1 {6 |& \! A( O7 u$ x) ~* D#make$ U/ l) I! F  z& }4 S2 O, g! ^

1 {$ N/ f" [' F' \#make install
. I) g% X' o* ]! O( ]* O0 i! J* A9 ?" ]! x+ j7 l% b% {
x264编译也不会出现问题的,如果有,把之前安装的pc端的x264全部删掉4 N7 M! a6 v- b2 I! k0 N) j: O1 n

3 G  F5 B- I) E0 C5 P- ]& {1 [. \! h1 Q' ^* F
3、编译ffmpeg
- b: l& v6 m: |! v/ F, s
# Q2 G" S) v8 C3 d9 J& @; O解压ffmpeg-0.10.1.tar.gz. ^% c7 M% U8 k0 Z, C/ f& S

" w$ l# S/ G* {' j( G7 p' {) k4 N#tar -xzvf ffmpeg-0.10.1.tar.gz6 b$ `1 X" Q5 h: v/ p, p8 ~
. t# v1 Q  f- f3 k7 l
#cd ffmpeg-0.10.1# G2 A; W4 [& k
: _1 b) }# O1 n# l2 D
#./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/
* f# D; B, z6 n& x& S3 v) D( h9 o+ O1 S3 C4 Z4 e2 Y( I2 Q; y, a0 c. A
配置需要注意的是--extra-cflags=-I/opt/webcam/ffmpeg/include --extra-ldflags=-L/opt/webcam/ffmpeg/lib/ 指定x264库的位置! I/ S4 `4 |. e0 d& u( \

! ^$ T8 P5 Z. D6 r# d7 H#make1 ~3 `# Q) F0 C3 ?9 {- x& n

$ W2 n- T: Y) t9 ]$ `( Z8 d#make install
( E5 K& R$ h% F. L8 R0 x
2 q6 I: R4 q9 L以上,所有依赖的库就都编译好了,下面编译webcam应用程序. \0 k) A, d# n$ b
& i2 m; ?* x. N9 D' O
8 P; k" C% F8 A# \5 ]; K
所有的源文件不做除了修改udp上传用的ip地址和makefile文件外,不做任何修改,源码存放位置/opt/webcam# ^. G% s$ V. @! V' q  N8 I+ Z8 ~

1 V4 B$ Z' T% a) o3 j1、修改server.cpp ip
9 v' m( G5 n  g. l& D! }  f6 L" o2 f
将#define TARGET_IP "192.168.1.220" 后面的ip改成你的pc linux的ip,依旧是客户端webcam_shower所在的pc的ip地址
% y/ h( T+ ]9 e; m5 k
4 \- I+ m4 W  a9 ~( N: B2、修改shower.cpp中的
  Y; T8 V9 a( B( b
# z: A; X7 d2 }  f, ^5 w; R3 m" Yinet_addr("192.168.1.220"); 将ip修改为pc linux的ip,就是自己的ip,socket绑定端口用9 S3 t) R* v4 U& Z* f
; K) S* Z0 x0 y
3、修改makefile,以便交叉编译webcam_server,注意,之前编译zlib x264 ffmpeg都在放在webcam/ffmpeg中了1 q4 V. d7 k3 \8 e; j- F0 M+ z

- ~' l5 g; \0 V& y3 Hall: webcam_server9 Q. T1 ]9 F  M
#webcam_shower
) E, X# o: `1 y1 [# k* \CC=arm-linux-g++3 h2 L! r( e1 w
LD=arm-linux-ld! X% g8 C3 I) T! b- x( U
CXXFLAGS=        -c -g -O0 -fPIC -I./ffmpeg/include -L./ffmpeg/lib( C  P. p/ q( u- |

& h% S: i7 d6 Q2 B8 {2 n5 LOBJS_SERVER=        capture.o vcompress.o sender.o server.o$ s% `9 O; ]  y
OBJS_SHOWER=         vshow.o recver.o shower.o; H# u" M$ D/ ?$ k1 Z2 x
LIBS_SERVER=        -lavcodec -lswscale -lavutil -lx264 -lpthread -lz8 W! B/ J9 R" ~, ?* B. h
LIBS_SHOWER=    -lavcodec -lswscale -lavutil
2 q9 N  l; `# h/ x- ^7 m5 u$ @- Q: y/ K
.cpp.o:2 W  e. i, W& l( o! ~/ A
        $(CC) $(CXXFLAGS) $<
6 s6 n5 H6 I% p0 c9 Q
: s0 r% U* G- cwebcam_server: $(OBJS_SERVER)
, h: F* Y: [; G  P$ O$ w1 h        $(CC) -o $@ $^ -L./ffmpeg/lib $(LIBS_SERVER)
3 i( r, }1 J" S: w8 Q
7 a6 F% x$ b: e9 O( k' D4 h# owebcam_shower: $(OBJS_SHOWER)2 {. V7 @$ O/ k1 B
        $(CC) -o $@ $^ $(LIBS_SHOWER)
& u- H9 ?9 K# g8 U* p9 S6 c" x4 m( w0 R5 q2 P  m' b
clean:9 }) @4 w+ f! k2 W+ o4 B: G
        rm -f *.o
) m' [2 X- r5 _* w        rm -f webcam_server
/ m; q3 ~8 p- {1 F        rm -f webcam_shower
* y1 k9 ^6 e  @; I# v
$ f" C2 e/ s) w3 o& @/ ^7 f#make
8 b9 a3 T6 ?2 |/ L! e这一步会出错,报c与c++兼容问题,在include/libavutil/common.h中添加如下,即可6 `* G0 g* ]' M4 f
6 T7 N& b% s; |0 M
#ifndef   UINT64_C5 k2 U1 p4 ~* g
#define   UINT64_C(value)__CONCAT(value,ULL)' _4 T0 h8 \+ P6 F( Z' t
#endif% |" y$ G& m5 ]1 X' A  T
2 {$ a: l8 w/ r

  y) U9 y% r* _3 h最后就得到了编译好的web_server了,将web_server复制到mini2440中,并且将之前编译的第三方编解码库/lib下的所有.so文件复制到mini2440的 /usr/lib中
' \( d, J3 G& v$ ^. \4 k
" m( y' Y0 R1 K6 v插上usb摄像头,webcam_server就可以再mini2440中运行了! q! A# G0 C6 }4 s5 }, l% e+ `
1 V* V3 _8 ]# S( Q) w
; J" u: M) Y$ l
最后是编译pc端的webcam_shower,这个很简单,按顺序从头编译就好了

该用户从未签到

2#
发表于 2021-2-1 19:02 | 只看该作者
arm mini2440 基于v4l2 ffmpeg x264的视频远程监控
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 19:41 , Processed in 0.187500 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表