EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-2-15 17:07 编辑 `- o. R: }2 S
- _. q: K# y5 Y' v
今天来介绍一个解决方案MJPG-Streamer。MJPG-Streamer的原理是将USB摄像头采集的图像以JPEG格式发送出去,然后持续更新图片形成一个视频流。 - x; S. {% E/ y
它的优势有两个: 一个是和浏览器的兼容性最好,可以轻松地在浏览器中显示,而无需担心浏览器是否支持Flash或流媒体协议;二是采用JPEG没有前后帧的关联,所以如果出现丢包只影响当前画面,而不会像H.264那样可能连续一段时间的马赛克图像。 . Q" O$ ]4 f4 v: I. Z9 i5 J
当然也有缺点: 它的缺点是JPEG流的压缩效率比较低,比H.264浪费带宽。
N) `4 o0 J- ^ ^* Y: a9 z二. Libjpeg库的编译 MJPG-Streamer要用到libjpeg,所以首先需要编译libjpeg。,我使用的是最新的9e版本。将源代码解压到jpeg-9e目录后,在该命令下执行configure命令进行配置: 1 ./configure --host=ARM-linux-gnueabihf --prefix=/mnt/boaled/jpeg-9e/_install/
# @, j! P% S, p2 g5 {其中的host是指明所使用的编译器,prefix是指定编译后文件安装的目录。 然后执行下面的命令: 1 make 2 make install
2 q9 A! g9 \4 U
$ Y4 x- d0 X, g Q- x- x
1 d0 L/ J/ O9 W' B& K( g6 L
% C3 B6 M+ ]0 G& ~命令执行完毕,就会在prefix所指定的目录下生成4个目录,其中include目录包括所需要的头文件,而lib目录下包括库文件。这些在后面会用到。 # |3 L! Z2 I! K k
编译后需要把libjpeg.so.9.5.0拷贝到开发板的 /usr/lib 目录下,并建立一个指向该文件的软连接libjpeg.so.9。 1 ^1 F5 y1 h0 I6 X3 V' u9 `
另外,开发板原来带有libjpeg.so.8.0.2这个版本。如果不希望安装更新版本, $ }3 i0 t4 L/ |7 e
三. MJPG-Streamer的编译 MJPG-Streamer有两个主要版本(建议在PC打开链接): 1.http://sourceforge.net/projects/mjpg-streamer/这个是原始版本,不过原作者已经放弃更新了。 2.https://github.com/jacksonliam/mjpg-streamer/ 这个是后续更新的版本。
# ]3 s h* O& o要在飞凌嵌入式OKA40i-C开发板上使用,只能使用sourceforge那个版本。因为github的版本虽然更新,但是它对内核的版本有要求,至少3.18以上。
; O/ {/ d* S, ~) N; @' KOKA40i-C开发板提供的内核版本是3.10,无法正确处理新版本的某些V4L2消息。另外,github版本采用CMake进行编译,后面所介绍的编译方法也不适用。 3 L% l0 h6 s/ N( J9 T
进入下方地址: https://sourceforge.net/p/mjpg-streamer/code/HEAD/tree/ 点右上的“Download Snapshot”下载最新版的mjpg-streamer-code-182。这里可以看到两个mjpg-streamer目录。一般使用mjpg-streamer-experimental这个版本,它支持的功能更多一些。
$ C- t* M1 H8 o% A+ @. P
2 C2 d n# y9 w/ J7 |
& L8 W: H1 h3 U; A* B( t1 c9 I9 f8 N( E) O
在编译之前,需要先修改plugins/input_uvc目录下的makefile文件,在其中加入如下两行:
( A+ H; h$ }1 Q$ x* W, v$ [
, _4 Y( A! G' z$ g! f2 n- _: z
& }2 g! O6 O5 c7 i) O* b% {1 t U$ B) Z6 b
$ s$ ^% d. `+ ^& `7 S* {这两行的作用就是编译时能够找到我们前面生成的libjpeg库。如果想修改MJPG-Streamer的插件设置,也可以修改mjpg-streamer-experimental目录下的makefile: 1 D/ N- u) h/ K" s
5 D0 @( J3 i0 p* U" ~2 V
, S1 n( h5 Y" e- D/ p8 p
" Z0 R( e: R5 c) V7 a! D
% Y; c6 M& Q/ ^' r在本次测试中用不到其他插件,所以就采用默认配置。 然后在命令行执行下面的命令就可以编译了。 1 make CC=arm-linux-gnueabihf-gcc 7 O( Q$ `. J' w6 \* ^
- C- S/ @' b! q. B5 Y* e* B. C/ G0 Z, i8 _
+ A: ]3 c$ y [* s' a
编译成功后把mjpg_streamer和几个so文件都拷贝到开发板上并正确设置好权限就可以运行了。 / S8 ^2 u' A8 @* ]" ~8 Y1 P" p
四. 测试结果 在input_testpicture插件中带有一幅默认图片,即使你手上没有摄像头,也可以使用该插件测试MJPG-Streamer的功能。 在开发板的终端输入如下命令: 1 ./mjpg_streamer -i "input_testpicture.so" & ^0 Y, e4 r$ y7 f% t
7 V" L _3 d( U. x
; N3 q8 B; c, v# N" I: v" z! y7 R6 V" x# u3 g2 _
如果使用USB摄像头,需要使用input_uvc.so插件,在开发板的终端输入命令,结果如下图所示: 1 ./mjpg_streamer -i "input_uvc.so -r 800x600" -o "output_http.so" - h$ c; G1 Z' O' j; n
9 f0 f: ^% B( ^( c3 D
9 M. y/ \& f) P! M
' |: M4 Y( J9 }- I% L, J6 |- P% K# {
, E( u6 u! ]. C! P
|