树莓派实时视频直播 - MJPEGStreamer

发布于 2020-01-10 17:04

0x01 背景

之前买的树莓派,开始新鲜时做了WIFI小车,后面虽然一直想完善小车,但迫于懒,一直把树莓派放着吃灰。我最开始是想基于树莓派做个能认识人,能说话的机器人的,加轮子不是我本意,感觉后面改成平衡车也不错啊。我的逻辑很简单,认识人需要做人脸识别,对话需要能语音识别和语音合成,另外机器本身有人体感应传感器。这几个功能我初步试了下,人脸识别的调用网络API延迟太高,只能考虑对应的离线SDK或者直接整OpenCV来搞,发现了一个神仙项目SeetaFace,感兴趣的可以去看看。语音的话,目前貌似只能考虑科大讯飞和百度的离线SDK,也不知道收不收费。说了这么多,人脸识别首先要能看见。所以我加入了一枚平平无奇的摄像头,试验了Golang下的OpenCV库,后面分别实现了FFMPEG+NGINX-RTMP、H264-LIVE、及其他几个搜到的实时流服务器方案,但感觉延迟都还挺高的。这篇主要讲一下,安装使用最简单的MJPGStream。其实还有更简单的就是VNC进去机器使用机器自带命令查看摄像头的实时流。

0x02 MJPEGStream及原理

这玩意是个啥,首先肯定和JPEG有关啊,现在用我的理解来讲,一般我们做实时直播,都是视频流,而视频又由很多的视频帧组成,视频帧其实也是一张张的图片。这个玩意就是用图片的方式来推流实现实时直播的效果。
MJPEGStream通过拉取摄像头的流数据,按一定的频率取出视频帧,并输出jpeg格式的图片,前端Web端通过 HTML中的img标签从给定的MJPEG流地址即可获取不断变化的图片流,达到实时直播效果。

0x03 优势及劣势

这玩意优点是用的流量少,相对延迟低。理论上这个延迟应该比直接视频推流的要好很多的,实际上比起我用的另外一种方式的视频流方式延迟并没有好很多,只能说比大部分的好,但肯定不是最优秀的那个。还有一个劣势就是这个图的质量也是真的渣。都不到480P的图的画质,内网千兆有线,大概率和网络环境无关,延迟大概在0.5-0.8秒左右。

0x04 安装使用

1.首先你得有个树莓派。其次你得有个摄像头,无论CSI还是USB的,都行

2.SSH到树莓派,开启摄像头,Camera 设置为 enable,重启后生效

sudo raspi-config

3.从 Github 克隆仓库源代码,或者直接打包下载Zip都行

git clone https://github.com/jacksonliam/mjpg-streamer.git

4.然后装一下依赖,用于后续编译

sudo apt-get install cmake libjpeg8-dev

5.进入mjpeg-streamer的文件夹,编译并安装

cd mjpg-streamer-experimental

make all

sudo make install

6.写一个启动脚本:run_mjpegstreamer.sh

#!/bin/bash
cd /home/pi/mjpg-streamer-master/mjpg-streamer-experimental 
export LD_LIBRARY_PATH=.
./mjpg_streamer -o "output_http.so -w ./www" -i "input_raspicam.so"

7.给./run_mjpegstreamer.sh启动脚本加上执行权限

chmod +x run_mjpegstreamer.sh

我的树莓派的主机名是:raspberrypi,你可以用你自己的树莓派的IP或者hostname

然后,使用http://raspberrypi:8080/stream.html查看效果

或者也可以直接看视频流:http://raspberrypi:8080/?action=stream

8.如果有需要,可以加入开机启动

sudo vi /etc/rc.local

exit 0之前加入内容

/usr/bin/bash /home/pi/run_mjpgstream.sh >/dev/null 2>&1 &

这样大功告成了,是不是很简单呐。

mjpeg.png

9.如果你还想外网访问,可以使用FRP,NGROK

总之,Happy Hacking!