EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-2-15 17:07 编辑 5 W) d8 V4 Z" l, B8 h0 A! J
% w4 u" J- j; c0 D/ B8 |今天来介绍一个解决方案MJPG-Streamer。MJPG-Streamer的原理是将USB摄像头采集的图像以JPEG格式发送出去,然后持续更新图片形成一个视频流。
$ c* L1 K2 t: B3 @它的优势有两个: 一个是和浏览器的兼容性最好,可以轻松地在浏览器中显示,而无需担心浏览器是否支持Flash或流媒体协议;二是采用JPEG没有前后帧的关联,所以如果出现丢包只影响当前画面,而不会像H.264那样可能连续一段时间的马赛克图像。
( M. ~; Z9 V7 r. N! Q7 I3 J, m当然也有缺点: 它的缺点是JPEG流的压缩效率比较低,比H.264浪费带宽。 4 o' s; L& w$ ^& c5 q( S L
二. Libjpeg库的编译 MJPG-Streamer要用到libjpeg,所以首先需要编译libjpeg。,我使用的是最新的9e版本。将源代码解压到jpeg-9e目录后,在该命令下执行configure命令进行配置: 1 ./configure --host=ARM-linux-gnueabihf --prefix=/mnt/boaled/jpeg-9e/_install/ ) m7 B" S" G% n, T( K& ^' g9 |5 x
其中的host是指明所使用的编译器,prefix是指定编译后文件安装的目录。 然后执行下面的命令: 1 make 2 make install , X7 D' A! [) @5 B7 X1 ` J
5 U& t5 Z- D# g Z* X ?1 d! [. v6 j* ]6 J) A8 q1 N
2 n7 u' b. [1 ]9 J
命令执行完毕,就会在prefix所指定的目录下生成4个目录,其中include目录包括所需要的头文件,而lib目录下包括库文件。这些在后面会用到。 5 i; f; {/ W- i- t
编译后需要把libjpeg.so.9.5.0拷贝到开发板的 /usr/lib 目录下,并建立一个指向该文件的软连接libjpeg.so.9。
/ z/ {" {2 s7 ]另外,开发板原来带有libjpeg.so.8.0.2这个版本。如果不希望安装更新版本,
! m- v" q- E' j+ a! ?9 v4 D三. MJPG-Streamer的编译 MJPG-Streamer有两个主要版本(建议在PC打开链接): 1.http://sourceforge.net/projects/mjpg-streamer/这个是原始版本,不过原作者已经放弃更新了。 2.https://github.com/jacksonliam/mjpg-streamer/ 这个是后续更新的版本。 + V2 H1 N/ X% ~
要在飞凌嵌入式OKA40i-C开发板上使用,只能使用sourceforge那个版本。因为github的版本虽然更新,但是它对内核的版本有要求,至少3.18以上。
! b# W) A- y EOKA40i-C开发板提供的内核版本是3.10,无法正确处理新版本的某些V4L2消息。另外,github版本采用CMake进行编译,后面所介绍的编译方法也不适用。
& P. d( ?$ a' G- G0 z2 y1 Q进入下方地址: https://sourceforge.net/p/mjpg-streamer/code/HEAD/tree/ 点右上的“Download Snapshot”下载最新版的mjpg-streamer-code-182。这里可以看到两个mjpg-streamer目录。一般使用mjpg-streamer-experimental这个版本,它支持的功能更多一些。 + Q/ G9 t0 p0 P/ C, I. P/ j
3 W6 ]! l& ]/ d# t$ Y) F$ A
2 ~" M" |# l O9 v! X0 R3 B2 t1 G6 ?$ P5 s, c+ J" F
在编译之前,需要先修改plugins/input_uvc目录下的makefile文件,在其中加入如下两行: ( u6 u4 i8 [. Z; _( l6 v% E6 b) |+ R
1 g/ y3 s/ I: Y4 t; r/ R4 e _4 h+ v+ c( ]. H
& _& }" W9 A% a7 G
! O' V- [- f6 Z* L4 g) n" f这两行的作用就是编译时能够找到我们前面生成的libjpeg库。如果想修改MJPG-Streamer的插件设置,也可以修改mjpg-streamer-experimental目录下的makefile: \; X* ]. C+ T& y& k% [8 _
4 P# C4 z; h% o" Z: e" D5 d' x5 [! N8 q2 M6 Z' Q0 Y
; o* t2 G1 d! b1 Y) j6 I$ z0 o$ {9 `
: n+ G1 }+ Z$ k8 `" m/ v c在本次测试中用不到其他插件,所以就采用默认配置。 然后在命令行执行下面的命令就可以编译了。 1 make CC=arm-linux-gnueabihf-gcc
- ?+ M) _6 ]$ F+ E2 [( C' r& x8 m
" k% i8 f( {% f' z( V- j( u! O( `8 w! U0 h$ d9 w [* P
" V* R' i) q' b5 @编译成功后把mjpg_streamer和几个so文件都拷贝到开发板上并正确设置好权限就可以运行了。
1 |9 k8 I; {1 A: m# L3 V四. 测试结果 在input_testpicture插件中带有一幅默认图片,即使你手上没有摄像头,也可以使用该插件测试MJPG-Streamer的功能。 在开发板的终端输入如下命令: 1 ./mjpg_streamer -i "input_testpicture.so" ) z2 l0 v1 c/ n8 T# _
5 r' V7 P3 L) X9 R( \: @1 ~2 c1 X' i Y! l, H
7 e$ A& Q. M# ] C( E5 ^/ V' g4 q; Q7 F如果使用USB摄像头,需要使用input_uvc.so插件,在开发板的终端输入命令,结果如下图所示: 1 ./mjpg_streamer -i "input_uvc.so -r 800x600" -o "output_http.so" 8 z) m% h2 H: X B5 K+ N9 r
2 k+ N2 [ ~" N- s/ c0 t8 P: q/ X$ C, `" W* o6 Q
/ Q/ L' V' ?- r, W" w
: ^7 |+ l P) U5 a! W/ p. q |