前言
最近接了个物联网小项目,需要远程监控室内温湿度,二氧化碳浓度和火灾报警等功能,本来找的机智云平台十分符合,但是后面又需要加摄像头监控功能,机智云目前还无视频服务功能,只好换平台。调研发现,onenet和阿里云物联网平台都支持视频接入,但是费用不菲还限流,而且app端并不完善,个人并不会app端开发,开发难度无疑很大,就放弃了。幸好看到blinker今年刚提供视频接口,而且app开发只需拖拽,很是方便,于是就开工了。
1.ffmpeg+nginx+hls低延迟推流
blinker的app端接入视频流很方便,只需要填入hls视频的http地址即可播放,具体可以参考blinker社区链接:blinker接入摄像头说明
由于hls延迟比较大的特性,这里使用pingos来推流github地址,可以缩短视频流延迟,不过仍然存在3~4s左右延迟,参考链接hls低延迟推流
树莓派端操作如下:
快速安装
$ git clone https://github.com/pingostack/pingos.git
$ cd pingos
$ ./release.sh -i
更改配置文件
新建文件nginx.conf,填入如下内容,并替换/usr/local/pingo/conf/nginx.conf文件
user root;
daemon on;
master_process on;
worker_processes 1;
#worker_rlimit 4g;
#working_directory /usr/local/openresty/nginx/logs;
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;
worker_rlimit_nofile 102400;
worker_rlimit_core 2G;
working_directory /tmp;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 1024;
multi_listen unix:/tmp/http 80;
}
stream_zone buckets=1024 streams=4096;
rtmp {
log_format log_json '{$remote_addr, [$time_local]}';
access_log logs/rtmp.log trunc=2s;
server {
listen 1935;
serverid 000;
out_queue 2048;
application live {
rtmp_auto_pull on;
rtmp_auto_pull_port unix:/tmp/rtmp;
live on;
hls on;
hls_path /tmp/hls;
hls_fragment 1300ms;
hls_max_fragment 1800ms;
hls_playlist_length 3900ms;
hls2memory on;
mpegts_cache_time 20s;
hls2_fragment 1000ms;
hls2_max_fragment 1300ms;
hls2_playlist_length 3000ms;
wait_key on;
wait_video on;
cache_time 3s;
low_latency off;
fix_timestamp 0s;
# h265 codecid, default 12
hevc_codecid 12;
}
}
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_X-Forwarded-For" "$http_X-Real-IP" "$host"';
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#reset_server_name www.test1.com www.test2.com;
#gzip on;
server {
listen 80;
location /rtmp_stat {
rtmp_stat all;
rtmp_stat_stylesheet /stat.xsl;
}
location /xstat {
rtmp_stat all;
}
location /sys_stat {
sys_stat;
}
location /live {
flv_live 1935;
}
location /hls {
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
expires -1;
add_header Cache-Control no-cache;
}
location /hls2 {
hls2_live 1935 app=live;
add_header 'Access-Control-Allow-Origin' '*';
}
location / {
chunked_transfer_encoding on;
root html/;
}
}
}
启动服务
cd /usr/local/pingos/
./sbin/nginx
摄像头推流
我用的usb免驱摄像头,下面参数其他摄像头并不一定适合
ffmpeg -f v4l2 -i /dev/video0 -b:v 300k -c:v h264_omx -f flv rtmp://树莓派ip/live/01
局域网测试
手机连接wifi,同一局域网内,打开浏览器输入以下地址即可
http://树莓派ip/hls2/01.m3u8
blinker的测试
手机安装blinker的app,界面拖拽入视频模块,编辑模式点击视频模块,有个需要填写的url链接,填入
http://树莓派ip/hls2/01.m3u8
2.阿里云服务器申请
自己到阿里云官网申请,有免费试用期,我申请了一个免费一个月的,带宽1M。记住公网ip,并修改登陆密码。之后可以在本地登陆
ssh root@公网ip
在网络与安全,安全组,配置规则中添加端口范围,类型tcp,分别添加两个端口9000/9000和7000/7000,是下面对应的frp端口。
3.frp配置
目前物联网平台没有免费提供视频流服务的,blinker也只能在局域网中实现视频监控,如果想实现远程监控,除非把视频流暴露在公网下。而我们平时使用的电脑ip基本都不是公网ip,所以需要云服务器配合frp来实现。
下载frp
地址:https://github.com/fatedier/frp/releases
需要下载服务器端和树莓派端frp软件。如果服务器端是linux64位,下载
frp_0.33.0_linux_amd64.tar.gz。树莓派端如果是32位的下载frp_0.33.0_linux_arm.tar.gz
服务器端配置
修改fprs.ini文件:
[common]
bind_port = 9000(这个端口需要阿里云服务器添加端口)
auto_token = xxxxx #option
vhost_http_port = 7000(hls的远程映射端口,需要阿里云服务器添加端口)
开启服务:
./frps -c frps.ini
树莓派端配置
修改fprc.ini文件:
[common]
server_addr = xx.xx.xx.xx #阿里云服务器地址,公网ip
server_port = 9000 #bind_port端口一致
auto_token = xxxxx #option
[HLS]
type = http
local_ip = 127.0.0.1
local_port = 80(这个端口表示hls的本地端口,不是1935)
custom_domains = xx.xx.xx.xx #阿里云服务器地址,公网ip
开启服务:
./frpc -c frpc.ini
最终测试
blinker的app端,视频填入地址(注意加端口)
http://服务器ip:7000/hls2/01.m3u8
OK