转载请注明出处:https://blog.csdn.net/impingo
项目地址:https://github.com/im-pingo/pingos
项目官网:http://pingos.io

将安防摄像头快速接入互联网直播服务器

  • 背景描述
  • 接入流媒体服务器
  • 实现原理
    • rtsp转rtmp服务器实现原理
  • 测试方法
  • QQ交流群:697773082

背景描述

在远古时代,互联网刚开始发展的时候,世界上出现了一种叫做IPC的东西,它可以通过TCP或者UDP将视频数据传送给播放器。开始的时候人们惊叹这种技术带来的便利,因为人们终于可以在自己电脑上安装播放器然后观看IPC捕获的画面。
随着互联网的普及和智能手机的普及,人们的欲望也在野蛮生长,终于他们不再满足于在固定的一台电脑前观看IPC监控的视频。而是希望随时随地可以看到想看的IPC直播内容。
有些厂商意识到了这一点,前些年各大安防厂商开始支持输出rtmp协议,这就很方便的能够与互联网对接。
更有一些互联网公司针对家用和商用场景直接就出了一些互联网安防设备,在他们平台申请个账号,购买设备直接联网。如360水滴摄像头、海康萤石等等。
但是由于世界上遗留的IPC设备实在太多,无法做到给每一台设备都实现rtmp协议,这种情况下就需要我们将IPC支持的rtsp协议转换成rtmp协议了。

接入流媒体服务器

支持rtmp协议的安防监控设备是这样接入流媒体服务器的:

rtmp
rtmp/http-flv/hls
rtmp/http-flv/hls
安防摄像头
公网rtmp服务器
浏览器
手机

不支持rtmp协议的安防设备是这样接入流媒体服务器的:

rtsp
rtmp
rtmp/http-flv/hls
rtmp/http-flv/hls
安防摄像头
ffmpeg
公网rtmp服务器
浏览器
手机

需要注意的是,图二中使用ffmpeg将rtsp协议转换成rtmp协议
为了方便实施,可以利用ffmpeg命令行工具直接做协议转换。
如下命令:

ffmpeg -i rtsp://xxxxxx -vcodec copy -acodec aac -f flv rtmp://ip/app/stream-name

这样做的问题在于,如果你的安防设备过多,你需要手动开启很多个ffmpeg任务。而且如果你新增或者减少一些设备,还要去修改你的ffmepg 任务,除非你去开发一套自动伸缩的系统来管理这些任务。
有没有一种比较简单,不需要开发工作又自动化的方式呢?有!!!

实现原理

rtsp拉流
rtmp拉流
rtmp/http-flv/hls
rtmp/http-flv/hls
安防设备
内外双网卡rtmp服务器
公网rtmp服务器
浏览器
手机

触发流程是这样的:

播放器公网rtmp服务器双网卡rtmp服务器安防设备播放请求(rtmp/http-flv/hls)判断如果播放器请求的流不在本机器上则向双网卡rtmp服务器回源拉流拉流请求(rtmp)rtmp拉流返回流媒体数据(rtsp)返回流媒体数据(rtmp)返回流媒体数据播放器公网rtmp服务器双网卡rtmp服务器安防设备

解释:
关键之处在于“双网卡rtmp服务器”,这台服务器的功能是能够拉取rtsp流,同时能够将rtsp协议转换成rtmp协议。

rtsp转rtmp服务器实现原理

首先,搭建nginx-rtmp-module服务器,搭建流程参考我以前的博文分布式直播系统(二)【搭建单点rtmp\http-flv\hls流媒体服务器】。

exec_pull bash -c "ffmepg -i rtsp://$parg_ip/$parg_uri -vcodec copy -acodec aac -f flv rtmp://127.0.0.1/live/$name";

使用这个配置可以在有观众请求进来时,nginx-rtmp服务器向目IPC设备发起rtsp拉流,并且将rtsp协议转换成rtmp协议回推给本机。等待公网服务器过来拉流。

如果IPC设备rtsp地址为:rtsp://192.168.1.2/stream/1
双网卡rtmp服务器的公网地址为:34.2.1.2
公网rtmp服务器地址为:34.2.1.3

双网卡rtmp服务器配置模板如下:

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;multi_listen unix:/tmp/rtmp 1935;
}stream_zone buckets=1024 streams=4096;rtmp {log_format log_bandwidth '{"app":"$app","name":"$name","bitrate":$bitrate,"args":"$args","timestamp":$ntp,"ts":"$time_local","type":"$command","remote_addr":"$remote_addr","domain":"$domain"}';access_log logs/bandwidth.log log_bandwidth trunc=60s;server {listen 1935;serverid 000;out_queue 2048;application live {rtmp_auto_pull on;rtmp_auto_pull_port unix:/tmp/rtmp;#           live_record on;
#live_record_path /tmp/record;#            recorder r1{
#                record all;
#                record_path /tmp/record;
#            }exec_pull bash -c "ffmepg -i rtsp://$parg_ip/$parg_uri -vcodec copy -acodec aac -f flv rtmp://127.0.0.1/live/$name";live on;hls on;hls_path /tmp/hls;hls_fragment 4000ms;hls_max_fragment 6000ms;hls_playlist_length 12000ms;hls_type event;hls2memory on;mpegts_cache_time 20s;hls2_fragment 1300ms;hls2_max_fragment 1600ms;hls2_playlist_length 3900ms;wait_key on;wait_video on;cache_time 3s;low_latency off;fix_timestamp 0s;
# h265 codecid, default 12hevc_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 /control {rtmp_control all;}location /live {flv_live 1935;}location /ts {ts_live 1935 app=live;}location /hls {# Serve HLS fragmentstypes {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}root /tmp;expires -1;add_header Cache-Control no-cache;add_header 'Access-Control-Allow-Origin' '*';}location /hls2 {hls2_live 1935 app=live;add_header 'Access-Control-Allow-Origin' '*';add_header Cache-Control no-cache;}location / {chunked_transfer_encoding on;root html/;}}
}

公网服务器配置模板:

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;multi_listen unix:/tmp/rtmp 1935;
}stream_zone buckets=1024 streams=4096;rtmp {log_format log_bandwidth '{"app":"$app","name":"$name","bitrate":$bitrate,"args":"$args","timestamp":$ntp,"ts":"$time_local","type":"$command","remote_addr":"$remote_addr","domain":"$domain"}';access_log logs/bandwidth.log log_bandwidth trunc=60s;server {listen 1935;serverid 000;out_queue 2048;application live {rtmp_auto_pull on;rtmp_auto_pull_port unix:/tmp/rtmp;#           live_record on;
#live_record_path /tmp/record;#            recorder r1{
#                record all;
#                record_path /tmp/record;
#            }#            exec_publish bash -c "ffmepg -i rtmp://127.0.0.1/live/$name -c copy /tmp/mp4/$name-$starttime.mp4";pull rtmp://34.2.1.2/live app=live; # 双网卡rtmp服务器地址live on;hls on;hls_path /tmp/hls;hls_fragment 4000ms;hls_max_fragment 6000ms;hls_playlist_length 12000ms;hls_type event;hls2memory on;mpegts_cache_time 20s;hls2_fragment 1300ms;hls2_max_fragment 1600ms;hls2_playlist_length 3900ms;wait_key on;wait_video on;cache_time 3s;low_latency off;fix_timestamp 0s;
# h265 codecid, default 12hevc_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 /control {rtmp_control all;}location /live {flv_live 1935;}location /ts {ts_live 1935 app=live;}location /hls {# Serve HLS fragmentstypes {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}root /tmp;expires -1;add_header Cache-Control no-cache;add_header 'Access-Control-Allow-Origin' '*';}location /hls2 {hls2_live 1935 app=live;add_header 'Access-Control-Allow-Origin' '*';add_header Cache-Control no-cache;}location / {chunked_transfer_encoding on;root html/;}}
}

测试方法

配置模板里和下面出现的ip地址和ipc的rtsp地址都是为了方便描述虚构的,你要根据自己的实际情况配置真实地址

从公网rtmp服务器播放视频:
rtmp://34.2.1.3/live/s0?ip=192.168.1.2&uri=/strea/0
http://34.2.1.3/live/s0?ip=192.168.1.2&uri=/strea/0

QQ交流群:697773082

QQ交流群:697773082

如何将安防摄像头接入互联网直播服务器相关推荐

  1. LiveNVR传统安防摄像机接入互联网直播-支持多种分屏展示

    LiveNVR安防流媒体服务,支持RTSP稳定拉流接入,支持Onvif协议接入,支持RTMP/HLS/HTTP-FLV分发,将传统安防监控设备互联化,无插件直播等. 将传统的安防摄像机,通过RTSP拉 ...

  2. 通过GB28181实现对安防摄像头的直播回放控制

    介绍 目前在安防行业中,GB28181协议越来越被重视,也越来越通用,越来越稳定.各个安防设备厂家已经基本都支持GB28181协议,通过GB28181协议可以实现获取设备的视频视频.录像数据.云台控制 ...

  3. GB28181实现对安防摄像头的直播回放控制

    介绍 目前在安防行业中,GB28181协议越来越被重视,也越来越通用,越来越稳定.各个安防设备厂家已经基本都支持GB28181协议,通过GB28181协议可以实现获取设备的视频视频.录像数据.云台控制 ...

  4. 通过GB28181实现对安防摄像头的直播回放控制-更适合非固定网络环境业务

    介绍 目前在安防行业中,GB28181协议越来越被重视,也越来越通用,越来越稳定.各个安防设备厂家已经基本都支持GB28181协议,通过GB28181协议可以实现获取设备的视频视频.录像数据.云台控制 ...

  5. 安防摄像头互联网直播方案LiveGBS设计文档

    LiveGBS设计文档 一.介绍 28181协议全称为GB/T28181<安全防范视频监控联网系统信息传输.交换.控制技术要求>,是由公安部科技信息化局提出,由全国安全防范报警系统标准化技 ...

  6. 不同网络情况的安防摄像头如何通过手机进行直播?

    目前传统安防行业已经竞争已经非常激烈,方案也很成熟,但是随着互联网.移动终端的发展,传统安防已经明显落伍.将安防行业的摄像头实现互联网直播监控,方便用户随时随地可以在电脑.手机上直接观看.交互是目前的 ...

  7. 安防摄像头Onvif、RTSP、GB28181转web无插件直播卡顿分析

    监控摄像头网络直播 越来越多人的开始讲普通安防摄像机接入网络流媒体服务器,进行网络直播.这方面的解决方案比较多,最近测试了一个比较轻巧的解决方案:LiveNVR.这个就是实现接入普通RTSP/Onvi ...

  8. 安防监控摄像头接入云端实现直播、录像和大屏展示

    应用背景 LiveGBS是通过GB28181协议接入各种安防摄像头.NVR.视频监控平台并实现物联网直播的流媒体服务软件. LiveQing云平台则是可以接入多个LiveGBS,实现统一管理.直播.录 ...

  9. 传统大华海康宇视安防摄像头RTSP流如何转webrtc直播低延时无插件浏览器视频播放

    传统大华海康宇视安防摄像头RTSP流如何转webrtc直播低延时无插件浏览器视频播放 1.问题场景 2.WEBRTC延时对比 3.LiveNVR支持WEBRTC输出 4.RTSP/HLS/FLV/RT ...

最新文章

  1. heidiSQL使用简介
  2. 生成建表脚本up_CreateTable
  3. 刚发版就被客户购买,升级后的神策用户画像究竟有什么魔力?
  4. java xml 合并_Java中合并XML文档的设计与实现
  5. git checkout 单个文件_IntelliJ IDEA下的使用 Git
  6. Linux环境变量配置的三个方法--/etc/profile,~/.bashrc,shell
  7. win7更改适配器设置没有本地连接解决方法
  8. 过年,设计师都爱的烫金红色PSD装饰素材
  9. 腾讯 WeGame 被迫下架《怪物猎人:世界》究竟该怪谁?| 畅言
  10. 补间动画android
  11. 【Hinton论文翻译与理解】How to represent part-whole hierarchies in a neural network_202102
  12. SEO 基础知识遇上圣诞节
  13. Qt - 跨平台程序打包发布
  14. html如何做动态桌面壁纸,wallpaper engine怎么自己做壁纸?动态壁纸制作方法
  15. 悬赏任务小程序搭建抖音点赞app任务发布接单平台任务分销公众号开发
  16. 江西宜春三名公务员擅自驾公车钓鱼被通报-公车钓鱼-公务员-公车
  17. 如何让固定资产管理不再一地鸡毛
  18. 用Defraggler打造自己的免费自动磁盘整理工具
  19. 顺丰快递业务接入API总览-快递鸟
  20. 在命令行中查看apk的签名信息

热门文章

  1. part3_模块五作业
  2. 牛顿法求解柯西分布参数的最大似然估计(P055)
  3. iOS之AR开发--demo制作篇:图片识别
  4. 「GoTeam 招聘时间」深信服科技 Go 开发工程师(成都)
  5. 产品经理如何写PRD文档[最全]
  6. SAP那些事-职业篇-25-顾问的价值
  7. xtu P1114 家谱
  8. 互联网注定被抛弃,未来30年属于硬科技!深层逻辑是这样的
  9. 从购买服务器到网站搭建成功保姆级教程~超详细
  10. vin码构成以及自动识别的用途。