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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

2 s$ j& W) q( L" D' y网络上盛传的基于mini2440的摄像头监控一般是基于 MJPEG-Streamer。5 L0 ^' M. d, F1 n' o0 g
1 n3 I; J2 i0 V0 S" _
这种方法利用的是V4L2的底层驱动,然后配合mjpeg这种格式的流传输,然后通过浏览器浏览视频和控制。" X/ m8 ^" C, H* z" [
1 j8 n+ a- @- a3 r) Z2 a
usb摄像头得到的数据格式一般是YUV422,如果用的是cmos 摄像头可能是raw原始数据格式,YUV422,是在raw基础上色彩抽点编码,因为人眼对亮度的敏感大于对色彩的敏感,所以并非对所有的色彩编码,这样的数据量会非常的大,视频编解码格式就不讨论了,很多很复杂,当然,你会了,就不会觉得难。# m* X0 r+ U% B* U* i
$ ~' r( e9 C' d6 O* L
ffmpeg和x264的作用是将YUV422再编码成H.264
/ A+ M# x. d* S& G7 q4 j
. ]& n6 G6 N9 k# ]& P  C3 U. W" I. h0 T. ]2 R! {/ |) Q
上图看效果,这是在linux中接的图,窗口中显示的是从2440usb摄像头上传上来的视频
+ @& |8 r4 v. H1 f. H0 i$ q& x. T( `8 l

- l: m7 W, d) h7 ~( d% q, E
3 g( k" s( _) c" V& {7 t, X) Z这是实物图,手机拍的( K2 s4 O/ N. O1 a, \

( n# g2 L, b, K, b' w$ R
* M, m. m3 p0 ^9 |% M8 \* N3 x: u
" o' r( V' @0 ~" y$ v! \废话少说,一步一步实现
# Q5 i. G6 }) Y" X$ q$ y) c+ V, K9 j( I
1、平台
& M' r7 k4 D+ f$ d9 n& q4 ~, r' M+ a9 V, e
硬件:ARM mini2440,usb摄像头9 y" V: N" Y: Q8 X6 p  m* M
6 S& }! c6 f2 y1 ~* E$ _9 `
软件:fedora14,arm-linux-gcc v4.4.3
/ t$ }. [. G0 h+ K
' V; f, u6 P8 ]" ~. S. i5 r6 o2、源文件3 W) _% P# l& T& W9 j  c
) e) @) Y' {: N7 q
ffmpeg-0.10.1.tar.gz
& a( ~. c% Z5 I
& F- ?9 G, h# D: Y- O! T5 alast_x264.tar.bz2
6 ~% G( D' V% vzlib-1.2.5.tar.gz (mini2440中没有libz.so,但是程序运行时需要这个库支持,所以下载源文件交叉编译)
3 ]) u% t8 b' J% b! p5 y" E以上文件只要会搜索的人都能找到
# a; a4 i* |' p5 b& v% {0 u) I6 w+ _' J' P; Y9 ?
下面开始交叉编译,编译过程中会遇到几个小问题,一一解决
2 c% A# i# n& K$ ~+ q3 U( g9 }
3 M! z# ?. p: D1、编译zlib
$ G% n* S# D2 R! u5 `/ n% b; i: N) d8 m& S! e; c
解压zlib-1.2.5.tar.gz9 ?- F' U7 a; t# h* U
# g8 k/ Q1 I2 R6 I0 g2 W: Y# c
#tar -xzvf zlib-1.2.5.tar.gz2 w8 I6 v  @8 V( C/ T

2 L0 K; [! s% ~" r0 H* N进入源文件目录
/ e; B$ L" A$ z
0 c& K, R3 I9 G2 Q: c#cd zlib-1.2.5
7 }3 O& K$ P$ ~9 g) \/ @5 Z; N
1 {  u. |3 X3 a2 s( I/ G( Z$ _运行configure配置makefile
# m5 ^$ n9 v6 B0 g; }" R0 L0 A, N5 S# l( ^
#./configure --prefix=/opt/webcam/ffpeg
# Z; k' s3 m- I& s% K: L+ s+ c+ H5 ]$ V$ K3 E7 H3 a
--prefix=/opt/webcam/ffpeg的意思是最后执行make install时,将文件安装在/opt/webcam/ffmpeg,不然会默认安装在/usr/local/lib中,其实这里不写这个参数,最后一起在makefile中修改也可以的。
; f6 u/ R0 _3 Q: q! q( @9 [2 U7 P) [& u- Z  c# p  r6 u% a
配置后会在当前目录下生成Makefile
) _* a* e; o. n7 p1 A: Z  F# ]
5 N& j. C; Z  p5 _修改Makefile以便能够用arm-linux-gcc编译,其实就是把gcc 改成arm-linux-gcc,ar改成arm-linux-ar等
, u9 ^. i5 L) q4 s/ n
$ h' @$ g7 j3 X6 x$ @下面是改好的makefile部分
2 ^# I& R& ^6 E7 ]
% J' S) o  F7 n& C' f# SSFLAGS=-O3 -fPIC -D_LARGEFILE64_SOURCE=14 T( W: `( a2 ]' p, @) D
LDFLAGS= -L. libz.a; L' h* j0 a0 N$ s9 x/ I+ l
TEST_LDFLAGS=-L. libz.a
9 a# @# ~# x1 mLDSHARED=arm-linux-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map  [  C: c& d! w$ |- e3 K5 }
CPP=arm-linux-gcc -E+ e0 `" I' a/ o: j3 w
$ P1 ~$ F2 k& x7 O1 i
STATICLIB=libz.a( `2 ?5 L. y- K
SHAREDLIB=libz.so1 F, G* l, O0 A& W* O8 {
SHAREDLIBV=libz.so.1.2.5
2 O4 I# x1 J# q9 j, oSHAREDLIBM=libz.so.1% U- x( n4 R) F/ x5 p* x
LIBS=$(STATICLIB) $(SHAREDLIBV)/ v8 e/ Q! L' p7 `/ [  y; f2 I: U
0 Y/ \, ]2 A8 \! ^  ]4 N" F+ f
AR=arm-linux-ar rc" m/ n; o/ r1 b& s  l; x
RANLIB=arm-linux-ranlib
: R# f8 W( R6 I% y. `+ zLDCONFIG=ldconfig
4 e, j- g8 Z1 [" x& y8 h1 }- I' jLDSHAREDLIBC=-lc0 b) m& G7 x$ }. T3 J
TAR=tar, N  u! C2 G( \! U0 l9 k" [+ g8 d! h
SHELL=/bin/sh; {$ O; y& Q* C
EXE=
# u9 r9 T7 I  V0 [8 m! [, I1 D/ \
! u+ c- [3 _  gprefix =/opt/webcam/ffmpeg
+ d9 ?% A* i( u+ A& u- I6 {) F$ n运行configure是的--prefix 就是最后这个参数,这里修改也行的( N1 Y0 l9 ^6 [% j9 e
然后make,make install3 k" B& L1 R6 G% E; x" R) K; |
" P" r1 q, m6 t& @5 y* R$ Q* T6 b" G
#make: g8 Z" K7 L' l6 P
# I3 r0 }( ^) I3 O& u8 z4 \8 r
#make install
9 v7 m4 s8 P( T, D
% j# S5 L  ~8 f5 B  [zlib的编译应该不会出现问题,在/opt/wecam/ffmpeg中是编译好的文件,在子文件夹lib中的.so文件最后要复制到2440里, h# X  B4 x' |% b7 F
) \5 b2 N- u- W2 a) Q9 ~3 Q
" j1 K" m) R- I' V6 f/ M6 B% f- N
2、编译x264  ]5 l  E9 w& F/ i
! {* W7 W4 H) o& C$ F  n" t# c
应为编译ffmpeg时需要要添加对x264的支持,所以要先编译好x264,一边让编译ffmpeg时能够找到它
- S9 A( ~' w9 z( R) g3 ]
% S! g9 z- r3 s, G0 R' m6 b解压last_x264.tar.bz2
2 I0 N( Z. T3 T& P" V  I" `1 ?1 K; g, s  E: ~8 z& C* n
#tar -xvzf last_x264.tar.bz2
$ R" I$ y5 \: |( b% F) x2 @) ?$ J7 V+ o9 H
#cd x264-snapshot-20120316-22452 I) s# s+ Y9 j8 o, |" O" y

! m  A+ |. F1 k0 Y1 [: t# ./configure --host=arm-linux --prefix=/opt/wecam/ffmpeg --enable-shared --disable-asm
6 I% w2 k/ H/ K7 q
. Z& S$ \0 k$ F; d9 V6 z配置选项中已经添加了host的选项,所以makefile就不用再修改了,但是要修改config.mak
( i. L5 G& q3 t' M% N. m! q3 M8 r4 m4 g3 F' p4 n% X$ d
SRCPATH=.4 e' ^8 z2 t% J+ E
prefix=/opt/webcam/ffmpeg/ p' L$ x5 f2 u4 O& j
exec_prefix=${prefix}1 r/ x8 L& Z* \2 z% V
bindir=${exec_prefix}/bin
6 ]2 H  n5 t$ x  I( F! e( a0 _% Tlibdir=${exec_prefix}/lib& |  l3 b3 ~2 Q  x4 P! O" |3 Y# i
includedir=${prefix}/include
2 ~7 I% N9 ^2 X3 [! `6 HARCH=ARM
+ h1 ^1 y. E5 ESYS=LINUX
; D2 }  i  Z  E- ~# B  H$ bCC=arm-linux-gcc
# x) C# I: q' r! Y, d& E" lCFLAGS=-Wshadow -O3 -fno-fast-math  -Wall -I. -I$(SRCPATH) -std=gnu99 -fPIC -fomit-frame-pointer -fno-tree-vectorize5 s0 |* _+ C5 }2 R1 K5 g8 k, l. g
DEPMM=-MM -g03 s$ w/ o6 q& ?' T" H0 @/ d
DEPMT=-MT/ L/ }! M8 u1 X
LD=arm-linux-gcc -o 1 x- ]- n% H! S0 {# t
LDFLAGS= -lm -lpthread
& [! x) V# e! v; K) o, f- e7 xLIBX264=libx264.a+ _. I8 ~; ]; j9 q* z8 v: v+ ]. D
AR=arm-linux-ar rc
7 h2 z4 e5 M6 X- D- ]! U( j9 qRANLIB=arm-linux-ranlib
- G/ t( R, p9 a! MSTRIP=arm-linux-strip
7 k+ B$ `2 }/ S7 k, J% T5 p. I#make  Q8 A. w5 r+ A' w: K# z

. r3 b' @: p" K#make install
: k4 i- o$ N# N% s4 m  m/ Z( Z5 G1 |( g# |3 E
x264编译也不会出现问题的,如果有,把之前安装的pc端的x264全部删掉
  ^2 q- H4 j' b. N0 W: |0 p9 ?& \
7 Y+ E3 u& [7 K
" b  p. T( j7 ]- M$ p; C! a4 R" R3、编译ffmpeg
0 A2 Z0 z0 `4 }9 f  \0 m- n7 K: x2 _$ p1 C. \! C) b3 Y
解压ffmpeg-0.10.1.tar.gz
& j2 m* |2 v* w4 S+ \- O* l$ D: g+ s5 S& p. t9 Y2 n: J6 s
#tar -xzvf ffmpeg-0.10.1.tar.gz
( T! h: v9 o1 a9 I, g& k4 \
3 x9 P7 k% D+ y" O( c# v7 [' _' ?. j#cd ffmpeg-0.10.1
+ r8 A' H! d5 M2 {2 h! L+ q3 J9 S7 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/1 x) K2 e) |" X: E: P) u, V- P. m
5 A2 U' p9 p( A9 @
配置需要注意的是--extra-cflags=-I/opt/webcam/ffmpeg/include --extra-ldflags=-L/opt/webcam/ffmpeg/lib/ 指定x264库的位置
3 A# F7 m3 g- Z$ D/ ]8 H' J  u
: U3 ]  x- f/ B#make
% U% A( q, {; ~6 g3 P4 i4 g
. [+ h4 g- d' [1 W& E7 \& p% O! E#make install0 v$ G: u% d# B6 g: f+ F
- k/ C8 u3 a% M2 ]" D& s% p
以上,所有依赖的库就都编译好了,下面编译webcam应用程序
8 W/ O& l* E- [' J, D( E! a
# {4 w0 F3 u  J4 }0 e% u# S; D$ Q7 w) X
所有的源文件不做除了修改udp上传用的ip地址和makefile文件外,不做任何修改,源码存放位置/opt/webcam
4 j( b$ O4 H) A1 C8 |
  F, \8 a& z8 A0 N( j5 y1、修改server.cpp ip8 \7 ]1 t- v0 o
4 j) U3 h* ]0 U% m3 [# I% A
将#define TARGET_IP "192.168.1.220" 后面的ip改成你的pc linux的ip,依旧是客户端webcam_shower所在的pc的ip地址1 k1 l: Z% i, U2 L8 ?9 _$ K9 f
+ Y& `. t" {8 C1 l0 D7 T$ `
2、修改shower.cpp中的0 Z5 h- I4 N( T

/ b. U% g/ P' T. n' \inet_addr("192.168.1.220"); 将ip修改为pc linux的ip,就是自己的ip,socket绑定端口用5 a4 g& M" S( X* {% C& a

* @+ E- k2 g8 H( @1 [1 M. u3、修改makefile,以便交叉编译webcam_server,注意,之前编译zlib x264 ffmpeg都在放在webcam/ffmpeg中了
( N) O: C) B- V2 R9 X6 d
0 `6 N9 C. V! k$ t) D$ m  t& Qall: webcam_server6 S( S) a7 X, @0 M4 i
#webcam_shower& m' p: @# P" R. ~0 i
CC=arm-linux-g++
! k9 c" y0 ^+ b8 \/ HLD=arm-linux-ld
2 e% }% m% l. {  a( }8 ?CXXFLAGS=        -c -g -O0 -fPIC -I./ffmpeg/include -L./ffmpeg/lib
3 H' l2 a# {, U7 J( v9 b3 j, X1 @: f6 h1 [1 n. n3 P/ ~7 }
OBJS_SERVER=        capture.o vcompress.o sender.o server.o
, s/ h% n, C) }% k- ^* U: o' P8 C# WOBJS_SHOWER=         vshow.o recver.o shower.o
% t$ c# B% ^9 Z) O6 VLIBS_SERVER=        -lavcodec -lswscale -lavutil -lx264 -lpthread -lz
6 B3 d0 `* w2 u3 T1 _LIBS_SHOWER=    -lavcodec -lswscale -lavutil
  k7 n5 t" e+ j
0 u- S/ ]$ N' y  E! A1 o.cpp.o:4 e$ C% B8 ^; V$ t" X* @1 X$ c
        $(CC) $(CXXFLAGS) $<( j& r& w/ r2 T
' ^0 E2 f. I( w6 f% T3 ^' |7 x
webcam_server: $(OBJS_SERVER)
9 j8 Y8 i3 t, C+ p8 M4 w5 U- Q( h        $(CC) -o $@ $^ -L./ffmpeg/lib $(LIBS_SERVER) : s# W0 P" g( R. L, Z/ y6 T# @
5 l( s# t. c! K% d! B4 q9 h4 N6 N
webcam_shower: $(OBJS_SHOWER)
: J' C$ z5 S: y1 e' r% m/ u        $(CC) -o $@ $^ $(LIBS_SHOWER)$ N( y* p7 F) ?! _8 t' N7 o( r, R2 u

$ w9 N  O, b9 |5 n; o1 {7 Gclean:
4 G8 H' K4 d7 G* I# x' P& ^; s        rm -f *.o) J9 a5 t/ n5 Y- g: ]* N8 s" |
        rm -f webcam_server) H+ A8 j9 g( Z% a" J$ g0 Z
        rm -f webcam_shower
- c/ @6 `& t+ z
8 z& S- e6 A) Y; Q8 J#make' w7 G, G: a( I3 H' g- S
这一步会出错,报c与c++兼容问题,在include/libavutil/common.h中添加如下,即可
) `/ b3 [. R4 q" E
# Q7 F0 f0 i6 ]1 c9 B0 \: Y#ifndef   UINT64_C5 H" k1 ~7 D3 p
#define   UINT64_C(value)__CONCAT(value,ULL)+ k9 k& {7 g  K' O8 X
#endif3 `; F( j# v* m9 Z( }3 c& t& d  p
( F/ z& W& n3 s3 r" @  R

. ]5 A* Y+ t5 L. W  A' g最后就得到了编译好的web_server了,将web_server复制到mini2440中,并且将之前编译的第三方编解码库/lib下的所有.so文件复制到mini2440的 /usr/lib中) c  b4 ^; [" d" H! h

% G1 Z$ z9 k4 P* y5 K5 ^插上usb摄像头,webcam_server就可以再mini2440中运行了% _. p6 W4 z8 J6 B8 W% L
% \7 c! x9 W6 h7 N) m) u( l- u) g

; C2 ]+ \: D8 a: P) w最后是编译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 21:59 , Processed in 0.187500 second(s), 27 queries , Gzip On.

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

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

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