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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

: r* K2 P7 r$ F; q4 g网络上盛传的基于mini2440的摄像头监控一般是基于 MJPEG-Streamer。
4 @0 `, j7 Z2 I' l1 k# J
" S/ C8 r1 [6 v9 \这种方法利用的是V4L2的底层驱动,然后配合mjpeg这种格式的流传输,然后通过浏览器浏览视频和控制。. w/ |' S; w: k8 v

* H. _/ v0 d  I; |# \  _usb摄像头得到的数据格式一般是YUV422,如果用的是cmos 摄像头可能是raw原始数据格式,YUV422,是在raw基础上色彩抽点编码,因为人眼对亮度的敏感大于对色彩的敏感,所以并非对所有的色彩编码,这样的数据量会非常的大,视频编解码格式就不讨论了,很多很复杂,当然,你会了,就不会觉得难。
1 L6 o0 l+ {0 t
4 l" [" w4 X+ H2 b0 E0 uffmpeg和x264的作用是将YUV422再编码成H.264
7 D1 c# v# ]: A. r9 g5 E: ~4 ?/ B' \1 m
+ L4 ?! W7 M* K" W; ~
上图看效果,这是在linux中接的图,窗口中显示的是从2440usb摄像头上传上来的视频* Y/ k2 E5 I# k& t* U" l2 M

: h: |2 L( ?; j" Y5 [& e
. ^( l4 W  B9 N7 M2 k
: p' a. w4 q/ c这是实物图,手机拍的
7 p; J) F, d' k# ^+ L1 U& {3 \! s( I) j9 P: k; q, m

1 k; j0 O: B/ b& t/ R% e- x
. [3 i8 w$ i0 F6 {# T) n0 h废话少说,一步一步实现
6 j* P# S$ M5 A9 s) A
' D; A  ?7 }& f7 @* J- d1、平台2 o5 _5 p; L; h5 V8 V+ b6 w
) Q# M' d( z' G/ V* Y/ v, I& A
硬件:ARM mini2440,usb摄像头
; L* h6 L' q( A0 d- Y" ~3 j; q
! ?) j! V3 p" @/ o6 u软件:fedora14,arm-linux-gcc v4.4.3
% h) v# c1 ~( n3 H# ^; D; o; P3 x. B/ ]
2、源文件
0 f9 M" e, T6 x0 t  o; B$ s
* b! e1 V' X4 [+ `; Iffmpeg-0.10.1.tar.gz
0 b3 S5 \' x; P5 p" \
/ z1 f1 w$ q. y. t% Ylast_x264.tar.bz21 ]9 x$ \8 j+ D5 S" Q
zlib-1.2.5.tar.gz (mini2440中没有libz.so,但是程序运行时需要这个库支持,所以下载源文件交叉编译)
) ]* U! B( p5 v" n. r* J以上文件只要会搜索的人都能找到
; c, @6 o: {; V- z1 ]' i2 ^2 u
0 [6 }. M/ \$ ~: `& K. e下面开始交叉编译,编译过程中会遇到几个小问题,一一解决9 w9 t$ P8 T4 ?- C2 q! J

+ z( Z5 s+ ]  k) H. V. i; _1 \* I8 p1、编译zlib" w8 _8 L$ f/ Z: M
, w) `0 Y( m- s/ s0 r9 v( [2 s
解压zlib-1.2.5.tar.gz1 C' X, l9 ~, {5 E, p
+ U9 m; M: L6 y8 l2 ^5 |
#tar -xzvf zlib-1.2.5.tar.gz' n9 T& H+ I# o/ f1 @& J

& h( H3 x& Q1 s( F) Y  a进入源文件目录* V( f" y$ Q6 I7 h3 Q# E# Y: E& F9 R

9 H5 c$ c% _% ^- g# R#cd zlib-1.2.5
' G* {! b. m* o+ C
$ N& S! E) F: k9 {# s* F运行configure配置makefile: L% b) [* r3 a* I  e3 c$ v9 }2 a

5 t9 q' T7 T0 ?- i9 _( _#./configure --prefix=/opt/webcam/ffpeg
) l6 u2 |3 t$ d5 ^! b. ]" I
: T& B" k5 i* m. P# Q6 |4 h: s0 {8 s--prefix=/opt/webcam/ffpeg的意思是最后执行make install时,将文件安装在/opt/webcam/ffmpeg,不然会默认安装在/usr/local/lib中,其实这里不写这个参数,最后一起在makefile中修改也可以的。
0 A. l) M9 I4 y" B
& Z$ P( \5 z0 t  d( K1 _' E配置后会在当前目录下生成Makefile* @3 [5 q. B, P2 R8 s9 \2 V

# n) e2 p( a* l( \6 {+ j: X& _7 K修改Makefile以便能够用arm-linux-gcc编译,其实就是把gcc 改成arm-linux-gcc,ar改成arm-linux-ar等; M  P! P3 _' [$ R. N! x% E

6 [( N1 ^+ R% r) r; I3 ]下面是改好的makefile部分0 R+ `" T$ D6 S) Z+ \
* u& I" L6 U) i3 {) r! z
SFLAGS=-O3 -fPIC -D_LARGEFILE64_SOURCE=1
: W1 s, w# I5 C! L& sLDFLAGS= -L. libz.a
# w3 B( [/ ?* C7 {, O* QTEST_LDFLAGS=-L. libz.a' U( M! C( [6 o" \
LDSHARED=arm-linux-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map9 e  ?  _1 `/ s. E- d" f8 r1 c* |1 V0 K9 y
CPP=arm-linux-gcc -E
/ W: b* }% Q  f) N; Y$ p! g9 e5 _& A& B& g: [
STATICLIB=libz.a* A* T! i* {0 q; B/ ~. f
SHAREDLIB=libz.so; y- |5 G, j" D. v
SHAREDLIBV=libz.so.1.2.5. \" y, Z; }" J% J: k
SHAREDLIBM=libz.so.1
' I8 P4 V: H3 v( z& dLIBS=$(STATICLIB) $(SHAREDLIBV)
: K, Q# l! I# R  g3 c- \( J+ K+ A2 ~% S# v/ v
AR=arm-linux-ar rc9 S* C2 p, ~" x! M# z' N6 v
RANLIB=arm-linux-ranlib
# d  ]* Z; Z  Q5 G) f; `' CLDCONFIG=ldconfig
( h. g7 B# r6 ~' a( T9 qLDSHAREDLIBC=-lc7 j) J) e9 [" V* L  F2 x
TAR=tar/ {* _% [3 e; t$ z& ?9 d  k1 x
SHELL=/bin/sh
4 L; A2 a, h9 m6 n7 T5 wEXE=
" H  f  X+ S3 X3 A6 ^5 W% Y1 `% T, w/ N
prefix =/opt/webcam/ffmpeg% t5 e6 U" t1 V2 {( \( A/ m* l0 f
运行configure是的--prefix 就是最后这个参数,这里修改也行的
6 Y9 ^: v5 q7 E9 H然后make,make install+ u! N( S4 L3 L6 x$ h0 j

: H( s" v9 f( B, U9 A#make* X" C1 Z/ x5 v

: K/ o6 B4 O. f: K#make install
5 S7 A( d+ }8 H+ M! s; ?* @1 P7 }
! `# L4 g( @" C0 Z9 Gzlib的编译应该不会出现问题,在/opt/wecam/ffmpeg中是编译好的文件,在子文件夹lib中的.so文件最后要复制到2440里
+ x2 D" {8 i% W4 m. ^8 Q! j( |4 T. R* I8 r
( X8 m, I" Q* h  n. z' N' {! m4 T
2、编译x264
* J6 C0 h' \" O( ]* u3 h! ]# p; e+ F2 }9 |# e
应为编译ffmpeg时需要要添加对x264的支持,所以要先编译好x264,一边让编译ffmpeg时能够找到它
% F! ]4 P1 y& X# g/ M6 z& r+ n: N3 F: }" ~. f" @$ d; @
解压last_x264.tar.bz2
) T* H: @, Y9 }7 k
; F/ Z8 B; o6 O4 F; A7 y# w#tar -xvzf last_x264.tar.bz2
. {0 I. G- L6 a. U2 K
1 i1 C. T6 ^5 M/ `#cd x264-snapshot-20120316-22450 u5 E0 P- z/ R' W& Z& x9 P& y
* b' M. Y5 U$ N! z" A6 p
# ./configure --host=arm-linux --prefix=/opt/wecam/ffmpeg --enable-shared --disable-asm4 T" |  l! y# \* H, c+ _  V

! r& D" l7 q7 l' F4 y0 `6 @- z4 s配置选项中已经添加了host的选项,所以makefile就不用再修改了,但是要修改config.mak& G% N: `. H- }$ l
% t- g2 S5 |1 _/ H
SRCPATH=.
; R+ y4 l1 n, _prefix=/opt/webcam/ffmpeg
: g1 H. W5 W. A. ^* \* b7 O8 L; \" Fexec_prefix=${prefix}3 H0 R+ V9 t0 P7 j1 J% \) @
bindir=${exec_prefix}/bin1 H" J  Q$ Y+ F* c
libdir=${exec_prefix}/lib) U, ^& ]5 Q) e; k  C
includedir=${prefix}/include- p- E3 f5 i( n4 w$ n, t9 ]
ARCH=ARM
. ^) u4 w9 w, ?, PSYS=LINUX* n' P6 l8 S. k- u) O
CC=arm-linux-gcc
) A% }5 E, {1 D$ _  |CFLAGS=-Wshadow -O3 -fno-fast-math  -Wall -I. -I$(SRCPATH) -std=gnu99 -fPIC -fomit-frame-pointer -fno-tree-vectorize2 O0 ?8 S/ n/ v7 k- A. O9 j  ]: |" B
DEPMM=-MM -g0
! \; C$ R- l( X9 K& wDEPMT=-MT/ {* K, R& r6 Z( V9 {% z
LD=arm-linux-gcc -o
* \! O% e" c# [3 L+ xLDFLAGS= -lm -lpthread
9 e) @0 Z" D4 ~8 t8 B* j8 iLIBX264=libx264.a
5 t" v# R; g- P' `7 x% j- A8 CAR=arm-linux-ar rc
* R) \) \% Q' Z2 rRANLIB=arm-linux-ranlib1 y1 F6 j8 k' i, g6 l1 @! X1 D
STRIP=arm-linux-strip
- d+ G- W- X9 \, j% [/ l/ O5 a#make
9 |: M) B0 T) M* o% T- X! L# G
0 W1 s' O. Q; x/ v#make install
% K+ m& L4 j  h0 O/ l% O7 Z" ~  Q
: |/ o: L& c0 m7 b* H5 {. mx264编译也不会出现问题的,如果有,把之前安装的pc端的x264全部删掉
# W: Q# |( a9 [& v6 ~7 [$ z% i  \/ N8 S% V4 P! R" w( v
& l; G, Q5 M3 V; e
3、编译ffmpeg
1 Z# [, y, B+ `- _2 J! R7 l& E
& w: ~( j) K8 r% [2 W( Q1 y; |" v解压ffmpeg-0.10.1.tar.gz$ z- r. Q. x0 t2 E! \! S8 X

% p$ K0 ]/ a  d* U#tar -xzvf ffmpeg-0.10.1.tar.gz/ \# P! S8 o( y& e" ^9 n* w

0 {8 ]5 e9 V( m. Z) ?$ N" R( f2 T#cd ffmpeg-0.10.1: E" V( m7 D- v- F
2 s1 p; C7 R  t, w# |
#./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/) Z# ^- i, d. w% u6 Y+ p% N
9 K- Z, d' r7 C3 J: t- e3 ^- U
配置需要注意的是--extra-cflags=-I/opt/webcam/ffmpeg/include --extra-ldflags=-L/opt/webcam/ffmpeg/lib/ 指定x264库的位置
/ [8 \) q* v( z2 [+ C* b( k7 h. \2 e% w& \0 y
#make
$ N& h1 |7 a' g. b' I( U7 ?4 @- r8 [1 _  c/ m# @, g
#make install
# r2 x  E+ u2 ^$ l; H# C. w
1 V2 \! v$ E8 @- x9 z以上,所有依赖的库就都编译好了,下面编译webcam应用程序
6 m8 H' r6 s% A. ]% H) l% {9 I0 `0 i4 w8 @* ]9 |) J6 W3 e) b) `

1 r5 j3 ]; i; X" J7 B! I( j7 k& i所有的源文件不做除了修改udp上传用的ip地址和makefile文件外,不做任何修改,源码存放位置/opt/webcam
% r+ f0 c1 }0 o3 u+ z, ]% Y
# ?" v) l  U7 u2 T4 Y. F1、修改server.cpp ip; H. Y2 m2 @+ D* @1 E. q! r% v. ?

- f' U7 n( S& g5 t! l6 _# Y6 s% b将#define TARGET_IP "192.168.1.220" 后面的ip改成你的pc linux的ip,依旧是客户端webcam_shower所在的pc的ip地址& I( O/ O5 Q! A. `) L1 l7 n

' @7 f/ Y  F3 R9 M% n2 C6 V7 l) {2、修改shower.cpp中的6 F- A# n  J4 C' F- I

8 _7 _  A# k7 y- P( g- Kinet_addr("192.168.1.220"); 将ip修改为pc linux的ip,就是自己的ip,socket绑定端口用
; M# a- d% A" e8 h
$ X' T8 r% Q) ^3、修改makefile,以便交叉编译webcam_server,注意,之前编译zlib x264 ffmpeg都在放在webcam/ffmpeg中了+ u. G- x* \1 b/ W; l# q5 a  W7 }

6 ]' x& v- m4 |# @+ m% Lall: webcam_server
: a. N; ~" U6 y- S$ B1 ?' {# F#webcam_shower
! T& Q* {: L- Z( ^CC=arm-linux-g++2 T9 r' U' G" B% g
LD=arm-linux-ld
3 q5 B4 K' p: }3 ^' kCXXFLAGS=        -c -g -O0 -fPIC -I./ffmpeg/include -L./ffmpeg/lib- y; y- B% a( z/ Z' L
( E' [  U( a# I' z; j6 X6 \6 q
OBJS_SERVER=        capture.o vcompress.o sender.o server.o
$ p6 Z$ y7 o" J$ i4 ~* POBJS_SHOWER=         vshow.o recver.o shower.o
: [6 V# V- @$ L- XLIBS_SERVER=        -lavcodec -lswscale -lavutil -lx264 -lpthread -lz* |# R4 e3 o/ ^
LIBS_SHOWER=    -lavcodec -lswscale -lavutil$ I2 B: U! U5 I" S

. c3 O- A- K+ M2 f.cpp.o:* \# \7 L2 s2 t. e0 j
        $(CC) $(CXXFLAGS) $<
- b; X7 w/ Q/ L( C& d: f5 i5 A
  J! M" Q! q& S+ K0 z! J. F& Wwebcam_server: $(OBJS_SERVER)
1 Q: H& Q; Z' a6 U        $(CC) -o $@ $^ -L./ffmpeg/lib $(LIBS_SERVER)
; V( c$ U! E& G7 }3 a# z' ^$ ?6 M' c) g8 |3 e, u: L% d. B- v) |
webcam_shower: $(OBJS_SHOWER): J1 D3 U& B' e
        $(CC) -o $@ $^ $(LIBS_SHOWER): K  K# s. R% ?# k; b* b  V8 _! d

& v- d3 x$ d; n" x5 [6 Fclean:
7 P. o3 L8 }" B$ M) X3 f: `        rm -f *.o0 Y: F5 \) }! B: y+ P; K6 p: R+ k! P
        rm -f webcam_server
6 c+ i; f, M2 y5 ^- I& H; P4 e        rm -f webcam_shower
& y4 m9 ?1 s' Z% o$ }' Z- Z( t
4 }9 G4 }8 C4 Z) z#make/ r) D" Y2 Z0 ]; B  s
这一步会出错,报c与c++兼容问题,在include/libavutil/common.h中添加如下,即可6 R6 q9 G+ ?( d' m+ K

$ T/ G# g9 \& O: e* P5 B: L" X) m. A#ifndef   UINT64_C! |1 R% t4 t, K5 ^( e
#define   UINT64_C(value)__CONCAT(value,ULL)
! y9 ?9 T) r/ O: p9 E3 j% D+ l7 ~#endif
' e/ M( U0 K$ @3 x6 w8 H3 z9 D& A4 y1 e; |

+ @' S& {2 W$ k6 i2 L/ g( j最后就得到了编译好的web_server了,将web_server复制到mini2440中,并且将之前编译的第三方编解码库/lib下的所有.so文件复制到mini2440的 /usr/lib中
6 L. _5 P+ Z: i1 X% N' _; \" M# _, y! `% m9 B
插上usb摄像头,webcam_server就可以再mini2440中运行了4 L: a; o" S% p- K: F! d8 d  ?

7 Q) m& K" H# _% V1 d6 k
5 |. w3 E& u- @4 j0 ]0 J最后是编译pc端的webcam_shower,这个很简单,按顺序从头编译就好了

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 16:26 , Processed in 0.234375 second(s), 27 queries , Gzip On.

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

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

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