首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

树莓派搭建视频监控平台

上一次用树莓派搭建了Nexus私服,终于让树莓派不再成为吃灰派了,这次用树莓派搭建视频监控平台,并实现视频画面推流到流媒体服务器。

1. 安装nginx

要实现将视频画面推动到媒体服务器,需要搭建一个流媒体服务器,这里选择nginx + flv module 来搭建,需要用到的源码包如下:

nginx1.15.4.tar.gznginx-http-flv-module-1.2.6.tar.gzopenssl-1.1.0j.tar.gzpcre-8.40.tar.gz

将上面所有的源码在/usr/local/src下面解压,然后配置并编译安装nginx。

cd nginx1.15.4sudo ./configure \--sbin-path=/usr/local/nginx/nginx \--conf-path=/usr/local/nginx/nginx.conf \--pid-path=/usr/local/nginx/nginx.pid \--add-module=../nginx-http-flv-module-1.2.6 \--with-http_flv_module --with-http_mp4_module \--with-http_ssl_module \--with-pcre=../pcre-8.40 \--with-http_ssl_module \--with-openssl=../openssl-1.1.0jsudo makesudo make install

安装完成后会在/usr/local/中多一个nginx目录,这里就是安装好的nginx,这里备份默认nginx配置nginx.conf,然后编写自己的nginx配置。

cd /usr/local/nginxsudo mv nginx.conf nginx.conf.defsudo vim nginx.conf

自己的nginx.conf如下:

worker_processes 1;events { worker_connections 1024;}rtmp { server { listen 1935; application live { live on; } }}

2. 测试推流

nginx + flv module 搭建完后可以是用 ffmpeg 测试推流,首先启动nginx。

cd /usr/local/nginxsudo ./nginx

然后在windows平台中使用ffmpeg推流

ffmpeg.exe -ss 0 -i out.mp4 -acodec copy -f flv rtmp://192.168.1.26:1935/live/t1

最后用VLC播放视频流,如果以上所有操作没有出现错误,将可以在VLC中看到视频画面。

3. 测试摄像头

要搞视频监控还需要一个摄像头,这里使用的是树莓派CSI接口中的摄像头,如果摄像头功能没有开启的话需要在树莓派开启。

sudo raspi-config

选择 1. Interfacing Options

然后再选择 P1 Camera

选择“是”,然后重启树莓派。

sudo reboot

树莓派重启之后,可以执行下面指令用摄像头截图,如果截图成功说明摄像头配置成功。

sudo modprobe bcm2835-v4l2sudo raspistill -v -o camera.jpg

4. 平台开发

所有环境准备完成后,剩下的就是开发一个可以管理摄像头推流的平台了,这里选用JavaCV + JFinal来开发视频监控管理平台。

下载JFinal demo

从JFinal官网下载JFinal 4.9 demo for maven的源码,导入Eclipse开发工具,删除不需要的代码包括数据库配置等。

只留下我们需要的代码:

DemoConfig.javaIndexController.javaindex.html

开发摄像头推流器

使用OpenCV采集摄像头的视频帧,然后使用FFmpeg推流,编码方式采用H264,帧率是25。

package com.demo.stream;/** * @author itqn */public class StreamSender implements Runnable { private static final int FPS = 25; private String rtmpUri; private OpenCVFrameGrabber grabber; private FFmpegFrameRecorder recorder; private boolean running = false; public int width; public int height; public StreamSender(String rtmpUri) { this.rtmpUri = rtmpUri; this.init(); } @Override public void run() { running = true; long startTime = System.currentTimeMillis(); long timestamp = 0; while (running) { timestamp = 1000 * (System.currentTimeMillis() - startTime); if (timestamp > recorder.getTimestamp()) { recorder.setTimestamp(timestamp); } try { recorder.record(grabber.grab()); } catch (Throwable e) { close(); } try { TimeUnit.MILLISECONDS.sleep(1000 / FPS); } catch (Exception ignore) {} } } public void close() { running = false; try { TimeUnit.SECONDS.sleep(1); } catch (Exception ignore) {} destroy(); } private void init() { try { grabber = new OpenCVFrameGrabber(0); grabber.start(); Frame frame = grabber.grab(); width = frame.imageWidth; height = frame.imageHeight; recorder = new FFmpegFrameRecorder(rtmpUri, width, height); recorder.setFormat("flv"); recorder.setFrameRate(FPS); recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); recorder.setVideoOption("preset", "slow"); recorder.setVideoOption("tune", "zerolatency"); recorder.start(); } catch (Throwable e) { throw new RuntimeException(e); } } private void destroy() { try { recorder.close(); } catch (Throwable ignore) {} try { grabber.close(); } catch (Throwable ignore) {} }}

编写控制接口

调整一下IndexController的代码,新增启动监控和停止监控的接口。

public void start() { String rtmpUri = get("rtmpUri"); if (StrKit.isBlank(rtmpUri)) { redirect("/?e=1"); return; } try { StreamManager.INSTANCE.startSender(rtmpUri); redirect("/"); } catch (Throwable e) { redirect("/?e=2"); }}public void stop() { StreamManager.INSTANCE.stopSender(); redirect("/");}

编写播放页面

rtmp流播放采用videojs这个库

5. 部署平台

平台开发完成后需要将平台部署到树莓派中运行起来即可,JFinal默认的demo已经提供了启停脚本,所以只需要在Eclipse中执行 mvn install 即可。

打包成功后,在项目的target目录下面会有如下结构:

jfinal_demo_for_maven-release\jfinal_demo_for_maven\-\config\-\lib\-\webapp\-\jfinal.sh# 另外我们需要将target目录下的jfinal_demo_for_maven-4.9.jar复制到lib目录下。

将上面的jfinal_demo_for_maven整个目录FTP上传到树莓派中,启动平台:

sudo ./jfinal.sh start# 这里可以改动jfinal.sh中指定的平台访问端口

启动成功后,可以在电脑上访问平台:

http://192.168.1.26:8080

然后填写推流地址,点击开始监控即可。

这样,基于树莓派的视频监控平台就部署好了。如果要关闭视频监控,只需要点击页面上的断开监控即可。

6. 拓展玩法

这里为了实践我是自己在树莓派上搭建了一个基于nginx + flv module 的流媒体服务器,当然还有很多玩法。

比如:

a. 在线上服务器搭建流媒体服务器,然后将视频流推送到线上服务器,这样就可以实现远程视频监控。

b. 另外也可以将视频流推送到直播平台,实现直播。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200709A0635600?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券