EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-2-15 17:07 编辑 * z' J" C$ F) R5 Z
* ~8 S" v+ R( W2 n9 M; s今天来介绍一个解决方案MJPG-Streamer。MJPG-Streamer的原理是将USB摄像头采集的图像以JPEG格式发送出去,然后持续更新图片形成一个视频流。 0 Q+ z. n6 x! V8 A7 U
它的优势有两个: 一个是和浏览器的兼容性最好,可以轻松地在浏览器中显示,而无需担心浏览器是否支持Flash或流媒体协议;二是采用JPEG没有前后帧的关联,所以如果出现丢包只影响当前画面,而不会像H.264那样可能连续一段时间的马赛克图像。 5 D: v0 \( ^7 K ~8 ~" L
当然也有缺点: 它的缺点是JPEG流的压缩效率比较低,比H.264浪费带宽。
0 S/ ?/ v% X8 c二. Libjpeg库的编译 MJPG-Streamer要用到libjpeg,所以首先需要编译libjpeg。,我使用的是最新的9e版本。将源代码解压到jpeg-9e目录后,在该命令下执行configure命令进行配置: 1 ./configure --host=ARM-linux-gnueabihf --prefix=/mnt/boaled/jpeg-9e/_install/
$ [7 O0 u9 ?# h' f/ _# M其中的host是指明所使用的编译器,prefix是指定编译后文件安装的目录。 然后执行下面的命令: 1 make 2 make install
9 }5 w8 [5 P. ~
) s- m. S) U0 G; [+ n" x9 z+ p. Z# T- n1 o+ Z; N1 e1 f8 z7 p
2 W& B1 e1 S' ^
命令执行完毕,就会在prefix所指定的目录下生成4个目录,其中include目录包括所需要的头文件,而lib目录下包括库文件。这些在后面会用到。 , Y9 I% t U( M) T5 H, w
编译后需要把libjpeg.so.9.5.0拷贝到开发板的 /usr/lib 目录下,并建立一个指向该文件的软连接libjpeg.so.9。 1 k+ P( U/ |1 \" ~6 t* [1 d
另外,开发板原来带有libjpeg.so.8.0.2这个版本。如果不希望安装更新版本, " x3 _/ [, X2 R/ B4 P$ s& u7 k
三. MJPG-Streamer的编译 MJPG-Streamer有两个主要版本(建议在PC打开链接): 1.http://sourceforge.net/projects/mjpg-streamer/这个是原始版本,不过原作者已经放弃更新了。 2.https://github.com/jacksonliam/mjpg-streamer/ 这个是后续更新的版本。
8 p" s, i( q8 N9 W0 A' _要在飞凌嵌入式OKA40i-C开发板上使用,只能使用sourceforge那个版本。因为github的版本虽然更新,但是它对内核的版本有要求,至少3.18以上。 ) v% Y0 r7 F- X6 K1 K p
OKA40i-C开发板提供的内核版本是3.10,无法正确处理新版本的某些V4L2消息。另外,github版本采用CMake进行编译,后面所介绍的编译方法也不适用。
( W1 Y" }& T. ^1 U4 Y' F H进入下方地址: https://sourceforge.net/p/mjpg-streamer/code/HEAD/tree/ 点右上的“Download Snapshot”下载最新版的mjpg-streamer-code-182。这里可以看到两个mjpg-streamer目录。一般使用mjpg-streamer-experimental这个版本,它支持的功能更多一些。
( s) Q" V% L! C- y
' d4 B, U3 A2 v1 D
" L0 ]2 P% m) q: {9 O! _* u
" w( z! W# ]5 q+ J/ M在编译之前,需要先修改plugins/input_uvc目录下的makefile文件,在其中加入如下两行: * q, ?1 V7 U/ k p8 `; ^
+ ?) X$ D- m0 L: K! P2 P
3 d* r, A) o" i+ r; ]3 n$ J9 E/ v: }2 O2 R3 x2 S3 d* s' u
2 q z- c8 Y9 d( r0 y/ p
这两行的作用就是编译时能够找到我们前面生成的libjpeg库。如果想修改MJPG-Streamer的插件设置,也可以修改mjpg-streamer-experimental目录下的makefile: 6 b" g! [0 Z; _. H3 s( \
2 k9 ~, D g) D' h: j+ L; y
! H* S# n% M( d }0 p
0 Z6 @: h" f& d) @% H7 h; J2 `
' o4 ~8 x8 E- }8 W* y, ?3 P( e L在本次测试中用不到其他插件,所以就采用默认配置。 然后在命令行执行下面的命令就可以编译了。 1 make CC=arm-linux-gnueabihf-gcc 0 H7 j X6 R' u) z
, ^: d |$ z% e9 Z9 m, m! j5 U7 g
3 F+ @* q" Q' L# l9 s/ l' U1 a" `$ g; y+ B+ [
编译成功后把mjpg_streamer和几个so文件都拷贝到开发板上并正确设置好权限就可以运行了。
9 K! z, m( ^" `' i四. 测试结果 在input_testpicture插件中带有一幅默认图片,即使你手上没有摄像头,也可以使用该插件测试MJPG-Streamer的功能。 在开发板的终端输入如下命令: 1 ./mjpg_streamer -i "input_testpicture.so"
$ x, h+ P! z3 f0 z5 b/ x. k
" D3 S' S- w" ?6 C# v5 E6 K" t4 |& Q w) W4 X0 O7 a7 T
" [7 E$ t: ^7 [/ l5 ~
如果使用USB摄像头,需要使用input_uvc.so插件,在开发板的终端输入命令,结果如下图所示: 1 ./mjpg_streamer -i "input_uvc.so -r 800x600" -o "output_http.so"
# k: `$ a4 j% X2 D, }; ]
. x! i( k2 q" f8 T. \, J2 n
4 K1 C1 x0 w. s% [$ A# u q1 A- j0 H7 X, P) E5 m
7 R% p8 V4 }3 h9 F* ]; r) o7 K
|