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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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

背景描述

在远古时代,互联网刚开始发展的时候,世界上出现了一种叫做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 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 /control {
            rtmp_control all;
        }
         location /live {
            flv_live 1935;
         }
         location /ts {
            ts_live 1935 app=live;
         }
         location /hls {
            # Serve HLS fragments
             types {
                 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 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 /control {
            rtmp_control all;
        }
         location /live {
            flv_live 1935;
         }
         location /ts {
            ts_live 1935 app=live;
         }
         location /hls {
            # Serve HLS fragments
             types {
                 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

一份超全的监控摄像头RTSP地址格式手册(含海康、大华等10+品牌) 本文详细解析了海康、大华等10+品牌监控摄像头RTSP地址格式,提供实战指南和代码示例,帮助开发者快速配置视频流。涵盖OpenCV集成、多线程优化及常见问题排查,是智能安防和物联网开发的必备手册。 阅读详情

相关推荐

AGX Xavier 搭建360环视教程【补充二:RTSP车载的不用】

这时候服务器(Jetson 或 X86 工控机)通过 RTSP 拉流,做硬件解码、处理、分析,之后再推送结果(流或检测结果)到监控中心或云端。海康、大华这类工业相机或者安防相机,原生就是 RTSP 输出,H.264/H.265 编码,方便通过局域网或公网远程接入。,而是车载专用摄像头(鱼眼镜头),通过专用线束直接连接 ECU(车载域控制器)。,为了便于分布式部署、远程访问,普遍支持 RTSP / ONVIF 协议。:高速差分信号,可传视频、电源和控制,车规级,低延迟,长距离传输。

xiaoyaolangwj的博客 1019

局域网播放摄像头视频

1,需求:在没有外网的情况下想将摄像头视频集成到自己的开发环境中(arm架构环境); 2,开发环境:arm架构,qt,摄像机 3,方案:因为目前没有哪个摄像机有arm框架下的sdk,所以想通过rtsp流的方式将视频载入。 1)生成rtsp流:摄像机有本地ip:192.168.1.169(默认地址 IP:192.168.1.168,端口:554);可以根据摄像头技术得知rtsp地址为:rtsp://192.168.1.169:554/main ; 2)本机配置:需要在同一个网段,pc上配置如下,用网.

MangoKing 2939

360浏览器插件打开rtsp视频流.zip

使用插件在ie,360等ie内核浏览器中播放rtsp视频流

监控摄像机的rtsp地址 rtsp://用户名:密码@ip地址/stream1

rtsp://用户名:密码@ip地址/Stream/Channels/101。rtsp://用户名:密码@ip地址/stream1。rtsp://用户名:密码@ip地址/stream2。

好记性不如烂笔头 4053

博客摘录「 各品牌网络监控摄像头RTSP地址查询」2023年5月23日

各厂商摄像头RTSP地址

misone的专栏 3507

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

目前传统安防行业已经竞争已经非常激烈,方案也很成熟,但是随着互联网、移动终端的发展,传统安防已经明显落伍。将安防行业的摄像头实现互联网直播监控,方便用户随时随地可以在电脑、手机上直接观看、交互是目前的趋势。 安防摄像机,目前基本都能提供RTSP流,但是根据摄像机所处网络不同,可以分为固定IP摄像机头、局域网内摄像头、和4G网络摄像头。 1、固定IP摄像机头 对于这种摄像头,可以从公网直接访问到实时视频流。这样的话,对应这种摄像头最简单的互联网直播方案就是公网上的服务器直接拉取摄像头RTSP流,然后提

EasyNVR官方技术博客 1187

安防摄像机手机直播方案介绍

安防行业背景目前传统安防行业已经竞争已经非常激烈,方案也很成熟。但是随着互联网、移动终端的发展,传统安防已经显的落伍。将安防行业的摄像头实现互联网直播监控,方便用户随时随地可以在电脑、手机上直接观看、交互是目前的趋势。方案介绍安防摄像机,目前基本都能提供RTSP流。但是根据摄像机所处网络不同,可以分为固定IP摄像机头、局域网内摄像头、和4G网络摄像头。1. 固定IP摄像机头对于这种摄像头,可以从公网

2010

监控摄像头进行网页直播和微信直播的技术方案

前言再小的技术点也会有他的市场! 一直以来,都有一些不被看好,认为是成本太高,无法大规模展开的软件和产品形态,就好比每一座城市都会有他的著名小吃一样,即使是慕名而来的人源源不断,受众群体也总是有限,但这并不妨碍这些小而美的美食服务于一方用户;在萤石/乐橙/微吼/趣看类型直播应用大规模开展的今天,高大上的直播形态视乎占据了主流,然而这些对于普通型的公司似乎成本有点高,而且不能够长线、无忧地进行,我所

2万+

如何从海康平台上拉流接入RTSP安防网络摄像头/海康大华硬盘录像机网页无插件直播流媒体服务器EasyNVR?

背景需求 随着雪亮工程、明厨亮灶、手机看店、智慧幼儿园监控等行业开始将传统的安防摄像头进行互联网、微信直播,我们知道摄像头直播的春天了。将安防摄像头或NVR上的视频流互联网直播常用的RTMP、HTTP-FLV、HLS等流格式再分发给用户端进行直播,不管身处何地都可以通过移动通讯设备查看监控设备,这些功能是EasyNVR互联网直播系统研发和设计的初衷和基础功能。另外EasyNVR增值功能是可通...

EasyNVR官方技术博客 3292

SkeyeVSS将安防网络摄像机进行类似于萤石云、乐橙云等模式的互联网视频云直播的几种方案

SkeyeVSS将安防网络摄像机或者NVR进行类似于萤石云、乐橙云等模式的互联网视频云直播的解决方案有几种: 一、RTMP推流的方式 第一步,拉取RTSP流,获取到音视频编码帧数据; 第二步,通过RTMP流媒体协议将网络摄像机音视频流推送到RTMP流媒体服务器; 第三步,将流媒体通过RTMP直播的方式推送给CDN,并通过CDN强大的流媒体分发能力进行rtmp/hls等协议进行互联网直播;或者通过NGINX集群流媒体服务器,通过其强大的http并发能力进行flv/hls等流媒体协议进行分发直播。 二、GB/T

OpenSkeye的博客 7525

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

LiveGBS设计文档 一、介绍 28181协议全称为GB/T28181《安全防范视频监控联网系统信息传输、交换、控制技术要求》,是由公安部科技信息化局提出,由全国安全防范报警系统标准化技术委员会(SAC/TC100)归口,公安部一所等多家单位共同起草的一部国家标准(以下简称28181)。28181协议在全国平安城市、交通、道路等监控中广泛采用,若想做统一的大监控平台,则支持28181协议接入是必...

5107

国标GB/T28181流媒体服务器安防4G摄像头互联网直播流媒体解决方案EasyGBS服务需要开放哪些端口?

EasyGBS就是基于GB28181协议实现的可接入海康、大华、华为、科达、宇视等各家摄像头、NVR、平台,做到统一管理,以及统一视频接入、并实现WEB端无插件直播,同时支持PC浏览器、手机浏览器、微信等直播、回放。

EasyGBS的博客 1948

流媒体服务器+终端(android,ios,web),如何从海康平台上拉流接入RTSP安防网络摄像头/海康大华硬盘录像机网页无插件直播流媒体服务器EasyNVR?...

背景需求随着雪亮工程、明厨亮灶、手机看店、智慧幼儿园监控等行业开始将传统的安防摄像头进行互联网、微信直播,我们知道摄像头直播的春天了。将安防摄像头或NVR上的视频流互联网直播常用的RTMP、HTTP-FLV、HLS等流格式再分发给用户端进行直播,不管身处何地都可以通过移动通讯设备查看监控设备,这些功能是EasyNVR互联网直播系统研发和设计的初衷和基础功能。另外EasyNVR增值功能是可通过接...

weixin_39601641的博客 751

国标(GB28181)摄像头无插件对讲及网页直播

GB28181视频网页和小程序监控和对讲

wjfeng007的博客 2827

GB/T28181国标流媒体服务,liveweb安防视频监控平台,安防监控摄像头网页直播技术方案

随着4G/5G网络的发展,以及有限带宽越来越大,人们对视频直播的需求也越来越多。不仅普通的互联网直播发展很快,传统的安防监控也开始互联网话,走起了互联网直播的录。雪亮工程、明厨亮灶、手机看店、智慧幼儿园监控等等都是将传统的安防摄像头进行互联网直播,有些甚至做成了web无插件直播和微信直播

liveweb视频汇聚平台 468

SkeyeVSS接入无固定IP监控摄像头实现网页无插件化直播点播监控解决方案

方案背景 在项目中,通常会用到无固定IP的的4G/5G摄像头,这种摄像头通常我们不能通过固定的IP地址去访问它的RTSP流或者通过Onvif协议去主动访问设备。 解决方案 对于无固定IP的摄像头,我们通常可以通过GB/T28181协议,将设备主动接入到SkeyeVSS,设备端配置GB28181协议接入如下图所示: 分别配置设备端国标接入的SIP服务器ID、SIP服务器IP、SIP服务器端口分别对应SkeyeVSS系统接入服务的对应唯一国标编码、服务器IP和SIP端口配置接口,设备配置国标接入的sip服务器

OpenSkeye的博客 9735

RTSP网络摄像机进行网页和微信直播的方案

本人自Babosa的博客http://blog.csdn.net/xiejiashu/article/details/73401647前言为了实现将区域内(学校、工程、小区等等)各种型号的传统网络摄像机实现统一的网络直播,供远程PC、手机实时查看。EasyDarwin团队精心打造了EasyNVR的产品。可以只是一套夸平台的软件运行在现场环境内的任意一台PC上, 也可以直接使用EasyDarwin提

1万+
上一篇: 分布式直播系统(十)【一条配置搞定流量计费】
下一篇: nginx-rtmp支持h265编码
im-pingo
博客等级 码龄7年 304粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值