EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-2-15 17:07 编辑 / t4 C! |' Z: }8 t5 p
; g' c$ g, N6 c( i
今天来介绍一个解决方案MJPG-Streamer。MJPG-Streamer的原理是将USB摄像头采集的图像以JPEG格式发送出去,然后持续更新图片形成一个视频流。 / h% ]. O- x# T9 t k, q7 y: B) j# b
它的优势有两个: 一个是和浏览器的兼容性最好,可以轻松地在浏览器中显示,而无需担心浏览器是否支持Flash或流媒体协议;二是采用JPEG没有前后帧的关联,所以如果出现丢包只影响当前画面,而不会像H.264那样可能连续一段时间的马赛克图像。 ! E2 d& }1 J; t8 _- Q6 T1 Z
当然也有缺点: 它的缺点是JPEG流的压缩效率比较低,比H.264浪费带宽。 9 v" S' i. C! W4 w1 n! L$ l
二. Libjpeg库的编译 MJPG-Streamer要用到libjpeg,所以首先需要编译libjpeg。,我使用的是最新的9e版本。将源代码解压到jpeg-9e目录后,在该命令下执行configure命令进行配置: 1 ./configure --host=ARM-linux-gnueabihf --prefix=/mnt/boaled/jpeg-9e/_install/ ( K! z$ a* E. ^5 ~# J5 {- j" t
其中的host是指明所使用的编译器,prefix是指定编译后文件安装的目录。 然后执行下面的命令: 1 make 2 make install
! r O: ` U7 o I
/ ~& V/ M; L6 ~
5 s1 r1 H5 |' u8 [9 z# V2 ]% `/ B! x" f' q/ u6 l" v
命令执行完毕,就会在prefix所指定的目录下生成4个目录,其中include目录包括所需要的头文件,而lib目录下包括库文件。这些在后面会用到。
0 X1 s4 f$ `" }编译后需要把libjpeg.so.9.5.0拷贝到开发板的 /usr/lib 目录下,并建立一个指向该文件的软连接libjpeg.so.9。
3 Z/ w+ u" S9 D另外,开发板原来带有libjpeg.so.8.0.2这个版本。如果不希望安装更新版本, 6 }' H" M. H. I! I/ X; N
三. MJPG-Streamer的编译 MJPG-Streamer有两个主要版本(建议在PC打开链接): 1.http://sourceforge.net/projects/mjpg-streamer/这个是原始版本,不过原作者已经放弃更新了。 2.https://github.com/jacksonliam/mjpg-streamer/ 这个是后续更新的版本。 " H" M1 [$ |* ]. G
要在飞凌嵌入式OKA40i-C开发板上使用,只能使用sourceforge那个版本。因为github的版本虽然更新,但是它对内核的版本有要求,至少3.18以上。 / ^# s* U: L8 I
OKA40i-C开发板提供的内核版本是3.10,无法正确处理新版本的某些V4L2消息。另外,github版本采用CMake进行编译,后面所介绍的编译方法也不适用。 ( ^9 Y; I* q# S7 c* d
进入下方地址: https://sourceforge.net/p/mjpg-streamer/code/HEAD/tree/ 点右上的“Download Snapshot”下载最新版的mjpg-streamer-code-182。这里可以看到两个mjpg-streamer目录。一般使用mjpg-streamer-experimental这个版本,它支持的功能更多一些。 * u- Z7 B1 J9 l/ D6 A
, W. n" D+ Z" F t! E
2 Z: Z6 P3 u& r- Z% N W0 T6 P2 s2 N W- m) R4 b- f1 f, ?, H |
在编译之前,需要先修改plugins/input_uvc目录下的makefile文件,在其中加入如下两行:
# y3 j& a- [% j
; w/ f1 F! z7 W! X5 T
; v9 n0 L5 r; G3 L
. F* c3 Q. H1 x
# v$ n, g+ V% p" E1 Z8 Z Q% l5 I这两行的作用就是编译时能够找到我们前面生成的libjpeg库。如果想修改MJPG-Streamer的插件设置,也可以修改mjpg-streamer-experimental目录下的makefile: $ G( _- N% Q C @, M! e& d
0 G( V' ]7 d) w% v2 ?, ^0 T- y6 l; K0 e; _, U$ T- p
6 D, X9 _" V+ M1 H& b% @
: I3 D7 Z* p: X- r" ?, G
在本次测试中用不到其他插件,所以就采用默认配置。 然后在命令行执行下面的命令就可以编译了。 1 make CC=arm-linux-gnueabihf-gcc
0 o5 E4 c/ N5 q7 b3 F% P, V
' o. G( x. u. Q+ @9 ?2 i, {1 z$ p7 u( t
* p" H3 V. b* M1 `* r0 l编译成功后把mjpg_streamer和几个so文件都拷贝到开发板上并正确设置好权限就可以运行了。
% J! c" @! a2 _( O0 p3 n四. 测试结果 在input_testpicture插件中带有一幅默认图片,即使你手上没有摄像头,也可以使用该插件测试MJPG-Streamer的功能。 在开发板的终端输入如下命令: 1 ./mjpg_streamer -i "input_testpicture.so" . C$ c8 B, X L
5 a% |% F& ], z% f9 ^$ Z& a* u5 O2 W3 p& l9 q. A' L( A
3 y# G9 F) p& l- U# z
如果使用USB摄像头,需要使用input_uvc.so插件,在开发板的终端输入命令,结果如下图所示: 1 ./mjpg_streamer -i "input_uvc.so -r 800x600" -o "output_http.so" 8 H7 h9 @) [5 P/ V- [! ^2 k
1 q7 y2 K! e: z# H" \+ o4 i/ n
+ R+ y. A5 T) D0 ]; {8 l$ a
z& H! w N$ @1 S T: E8 p$ E+ `! t3 w/ s
|