EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-2-15 17:07 编辑 2 w$ W/ r) g* V) ^. h5 j8 E X# C
, D2 _5 t! {) m4 H) W今天来介绍一个解决方案MJPG-Streamer。MJPG-Streamer的原理是将USB摄像头采集的图像以JPEG格式发送出去,然后持续更新图片形成一个视频流。 1 s, b) ~) J3 b/ T9 R5 R
它的优势有两个: 一个是和浏览器的兼容性最好,可以轻松地在浏览器中显示,而无需担心浏览器是否支持Flash或流媒体协议;二是采用JPEG没有前后帧的关联,所以如果出现丢包只影响当前画面,而不会像H.264那样可能连续一段时间的马赛克图像。 ! V7 M8 j" I9 w2 X6 K! Y1 \5 a
当然也有缺点: 它的缺点是JPEG流的压缩效率比较低,比H.264浪费带宽。
; s5 t7 J, s, [+ ?' m二. Libjpeg库的编译 MJPG-Streamer要用到libjpeg,所以首先需要编译libjpeg。,我使用的是最新的9e版本。将源代码解压到jpeg-9e目录后,在该命令下执行configure命令进行配置: 1 ./configure --host=ARM-linux-gnueabihf --prefix=/mnt/boaled/jpeg-9e/_install/
) ~9 i8 u& v' q5 J3 h# M其中的host是指明所使用的编译器,prefix是指定编译后文件安装的目录。 然后执行下面的命令: 1 make 2 make install
1 c \! q7 A6 z% C+ {
6 X9 j+ m6 ?+ D
4 I% Y) e; U6 X. \* x
, i/ a8 b0 z$ w# }' B命令执行完毕,就会在prefix所指定的目录下生成4个目录,其中include目录包括所需要的头文件,而lib目录下包括库文件。这些在后面会用到。 ; q6 |3 H- ]# O' x6 v
编译后需要把libjpeg.so.9.5.0拷贝到开发板的 /usr/lib 目录下,并建立一个指向该文件的软连接libjpeg.so.9。 ) @' t$ r- \. Z: g& T
另外,开发板原来带有libjpeg.so.8.0.2这个版本。如果不希望安装更新版本,
[9 J3 i* l# s+ _. S三. MJPG-Streamer的编译 MJPG-Streamer有两个主要版本(建议在PC打开链接): 1.http://sourceforge.net/projects/mjpg-streamer/这个是原始版本,不过原作者已经放弃更新了。 2.https://github.com/jacksonliam/mjpg-streamer/ 这个是后续更新的版本。
; ]! b5 B) M5 ]9 l, O% N. I要在飞凌嵌入式OKA40i-C开发板上使用,只能使用sourceforge那个版本。因为github的版本虽然更新,但是它对内核的版本有要求,至少3.18以上。
7 ]. @/ X; c! |% G& s+ g+ s; Q0 ~+ eOKA40i-C开发板提供的内核版本是3.10,无法正确处理新版本的某些V4L2消息。另外,github版本采用CMake进行编译,后面所介绍的编译方法也不适用。 4 W+ l4 [* E4 A2 v: O
进入下方地址: https://sourceforge.net/p/mjpg-streamer/code/HEAD/tree/ 点右上的“Download Snapshot”下载最新版的mjpg-streamer-code-182。这里可以看到两个mjpg-streamer目录。一般使用mjpg-streamer-experimental这个版本,它支持的功能更多一些。
$ Z# E0 z: m& T) K; g
2 w& J1 y! c8 P& Q7 o
8 @2 s# U- j* g+ k& v. D
/ a7 M( J# Q( q( Q- V在编译之前,需要先修改plugins/input_uvc目录下的makefile文件,在其中加入如下两行: % r* _& ^7 A M' e' r" N+ M! R' g9 I
3 b9 @+ l! k: O2 q0 C! J6 `
( F8 l1 S: Q" o7 N5 L: g& b" r; ?7 N* D, J
8 S" U" J- ~; ?
$ p% J* ?2 R" G6 t这两行的作用就是编译时能够找到我们前面生成的libjpeg库。如果想修改MJPG-Streamer的插件设置,也可以修改mjpg-streamer-experimental目录下的makefile:
- J3 _2 f& F! l# J- X$ G! u }7 A. c
: `7 [" P) r/ ^& @. P( }3 F+ E
1 j( G$ }) ?/ T
" J* R# M% V2 p4 ~5 u. j4 [3 G) Z) ~+ F) c o) S: g1 q
在本次测试中用不到其他插件,所以就采用默认配置。 然后在命令行执行下面的命令就可以编译了。 1 make CC=arm-linux-gnueabihf-gcc # {) a- G, F) U0 a/ q' y
" s" C" ~9 e, Q# S* H
6 d1 V! Z$ d( [% |7 |# x
% q3 r4 Q. k1 B9 b; T3 m编译成功后把mjpg_streamer和几个so文件都拷贝到开发板上并正确设置好权限就可以运行了。
3 D$ P6 o8 t" R8 F2 `" L四. 测试结果 在input_testpicture插件中带有一幅默认图片,即使你手上没有摄像头,也可以使用该插件测试MJPG-Streamer的功能。 在开发板的终端输入如下命令: 1 ./mjpg_streamer -i "input_testpicture.so" % @+ T! S4 g+ p0 W. e( {
" k0 g- }2 g3 F$ k1 a
7 H& O0 A/ i3 A7 ?& \3 Q; u, A
6 p3 L2 Z. D5 n; V如果使用USB摄像头,需要使用input_uvc.so插件,在开发板的终端输入命令,结果如下图所示: 1 ./mjpg_streamer -i "input_uvc.so -r 800x600" -o "output_http.so"
2 a; g. d% n* _+ ~2 d, R" e
7 [) s- L1 l2 f; u. R
3 i! b: u$ f5 D4 X, v' c+ L/ z
' ]. w0 @6 ?0 m6 h1 W7 m E% R4 B2 n& e
|