树莓派实时视频直播 - MJPEGStreamer
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 &
这样大功告成了,是不是很简单呐。
9.如果你还想外网访问,可以使用FRP,NGROK
总之,Happy Hacking!