EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-2-15 17:07 编辑
9 M/ c: @9 G, n: o9 M: R3 e# v9 o( C1 L% k+ D4 {; P3 u0 Y
今天来介绍一个解决方案MJPG-Streamer。MJPG-Streamer的原理是将USB摄像头采集的图像以JPEG格式发送出去,然后持续更新图片形成一个视频流。
5 {3 Z- m3 C4 Q' N# g8 l# k) ]它的优势有两个: 一个是和浏览器的兼容性最好,可以轻松地在浏览器中显示,而无需担心浏览器是否支持Flash或流媒体协议;二是采用JPEG没有前后帧的关联,所以如果出现丢包只影响当前画面,而不会像H.264那样可能连续一段时间的马赛克图像。
3 b, t" _0 n- ~* s+ @: D3 W6 ~, n当然也有缺点: 它的缺点是JPEG流的压缩效率比较低,比H.264浪费带宽。
' P9 ~) ]* {1 |8 q' i二. Libjpeg库的编译 MJPG-Streamer要用到libjpeg,所以首先需要编译libjpeg。,我使用的是最新的9e版本。将源代码解压到jpeg-9e目录后,在该命令下执行configure命令进行配置: 1 ./configure --host=ARM-linux-gnueabihf --prefix=/mnt/boaled/jpeg-9e/_install/
8 \7 k2 L9 w; F5 {0 V其中的host是指明所使用的编译器,prefix是指定编译后文件安装的目录。 然后执行下面的命令: 1 make 2 make install
7 k3 j1 _% M' ~# k; p0 X
% q$ R1 x8 E/ m8 M. B- y8 F. Y) P$ @$ J2 q% U/ Y L# h0 V
7 B- ~; D3 P" ~/ r9 U( j, c. y' d命令执行完毕,就会在prefix所指定的目录下生成4个目录,其中include目录包括所需要的头文件,而lib目录下包括库文件。这些在后面会用到。 & u O3 C) |5 Q' l, [. G) \
编译后需要把libjpeg.so.9.5.0拷贝到开发板的 /usr/lib 目录下,并建立一个指向该文件的软连接libjpeg.so.9。
8 @0 |* {2 n2 Y: N另外,开发板原来带有libjpeg.so.8.0.2这个版本。如果不希望安装更新版本, 0 H! @ X& L0 t/ T3 e
三. MJPG-Streamer的编译 MJPG-Streamer有两个主要版本(建议在PC打开链接): 1.http://sourceforge.net/projects/mjpg-streamer/这个是原始版本,不过原作者已经放弃更新了。 2.https://github.com/jacksonliam/mjpg-streamer/ 这个是后续更新的版本。 4 M! }& ^% s' q* z. x& C! l
要在飞凌嵌入式OKA40i-C开发板上使用,只能使用sourceforge那个版本。因为github的版本虽然更新,但是它对内核的版本有要求,至少3.18以上。
9 n) ]! ^" N/ q) K& G: pOKA40i-C开发板提供的内核版本是3.10,无法正确处理新版本的某些V4L2消息。另外,github版本采用CMake进行编译,后面所介绍的编译方法也不适用。
/ K2 M7 `) o2 l/ S* t进入下方地址: https://sourceforge.net/p/mjpg-streamer/code/HEAD/tree/ 点右上的“Download Snapshot”下载最新版的mjpg-streamer-code-182。这里可以看到两个mjpg-streamer目录。一般使用mjpg-streamer-experimental这个版本,它支持的功能更多一些。 3 U$ X2 k1 E9 E) R* E" V
; S1 N. V3 i7 d2 Q1 }- p/ D' B8 }! u( s5 p: A4 r! u+ i
0 T3 q% x F7 k9 m" A3 h" U在编译之前,需要先修改plugins/input_uvc目录下的makefile文件,在其中加入如下两行: 2 h+ `6 `( N1 N! _( j
7 X2 j7 T4 z) T% A, K' v
0 ~1 `" ~6 E+ L( I$ |' D3 o
2 }5 _' S( e7 C1 m3 B) s5 V9 M6 y
这两行的作用就是编译时能够找到我们前面生成的libjpeg库。如果想修改MJPG-Streamer的插件设置,也可以修改mjpg-streamer-experimental目录下的makefile:
9 y( h' @7 k* {
3 x* v7 n: @& e3 g+ m$ ]
8 u- k- E; \* W+ v, Q, P5 x" N4 u6 n$ @# D
* k) h) ^+ s* F: C+ X在本次测试中用不到其他插件,所以就采用默认配置。 然后在命令行执行下面的命令就可以编译了。 1 make CC=arm-linux-gnueabihf-gcc : X" b( ~/ Y/ o- E5 Z2 j" t
6 o- ]- ~3 t5 }0 n& v% z9 D
% P) Y K+ w8 {; f2 n* N& F1 L# ^0 C, X1 p" G
编译成功后把mjpg_streamer和几个so文件都拷贝到开发板上并正确设置好权限就可以运行了。 9 r, N# q- R5 N/ l3 B+ N0 k
四. 测试结果 在input_testpicture插件中带有一幅默认图片,即使你手上没有摄像头,也可以使用该插件测试MJPG-Streamer的功能。 在开发板的终端输入如下命令: 1 ./mjpg_streamer -i "input_testpicture.so"
% v* F3 Q1 W* K, q9 b, o" }# O
: y: m% D. v+ Z2 j1 v
6 X2 W/ @+ s% O; ~. Y; [" I% `6 p! V& A* s/ h, v
如果使用USB摄像头,需要使用input_uvc.so插件,在开发板的终端输入命令,结果如下图所示: 1 ./mjpg_streamer -i "input_uvc.so -r 800x600" -o "output_http.so" # {% Q' [$ ?/ A; o1 j+ {
f+ X9 F [$ c g0 I6 e% @7 D' O
( t: A7 v; a/ F* @. `+ S
) I8 N! [: J. _1 k |