一、问题描述:

为了实现在浏览器中播放摄像机的视频流,所以使用了ffmpeg对摄像机的rtsp流转码再推流到流媒体服务器(nginx + rtmp + nginx-http-flv-module)的方案。但这套方案存在一个问题:随着接入的摄像机越来越多,需要启动的推流路数也会越来越多,服务器端对CPU、内存、网络带宽的压力也会越来越大。

二、解决方法:

无人观看的摄像机不取流(判断是否有浏览器在拉流播放,如果没有,则停止相应的推流)。目前主流的流媒体服务器(nginx,srs,ZLMediaKit等)都支持检测拉流端是否拉流,并提供相关的接口。

三、nginx检测拉流端是否在拉流

以nginx为例,其提供了事件回调接口。可以用on_play和on_play_done来监听客户端播放与播放结束事件。具体可以参考nginx的官方英文文档:https://github.com/arut/nginx-rtmp-module/wiki/Directives#on_play

下面给大家列出中文翻译:

语法:on_play url。上下文:rtmp, server,application。

描述:

设置 HTTP 播放回调。每次一个客户分发播放命令时,一个 HTTP 请求异步发送,命令处理会挂起 - 直到它返回结果码。之后再解析 HTTP 结果码。

HTTP 2XX 返回码的话继续 RTMP 会话。

HTTP 3XX 返回码的话 重定向 RTMP 到另一个流,这个流的名字在 HTTP 返回头的 Location 获取。如果新流的名字起始于 rtmp:// 然后远程 relay 会被创建。relay 要求 IP 地址是指定的而不是域名,并且只工作在 1.3.10 版本以上的 nginx。另请参考 notify_relay_redirect。

其他返回码的话 RTMP 连接丢弃。

语法:on_play_done url。上下文: rtmp, server, application。和on_done一样的行为,但只作用于play和event。然而HTTP状态代码不检查此回调。

nginx的配置如下。下面的配置表示,当一个客户端播放/拉流时,nginx会向ip为192.168.4.112的服务器发送http post请求;当一个客户端停止播放/停止拉流时,nginx也会向ip为192.168.4.112的服务器发送post请求。

rtmp {server {listen 1935;chunk_size 4000;application live {live on;on_play http://192.168.4.112:8777/on_play;on_play_done http://192.168.4.112:8777/on_play_done;     }}
}

四、wireshark抓包分析

按照上述nginx的配置,当客户端向rtmp://192.168.4.105:1935/live/test3拉流时(192.168.4.105为nginx所在电脑的ip),nginx会向ip为192.168.4.112的服务器发送http post请求。使用wireshark抓取到的数据如下:

当客户端向rtmp://192.168.4.105:1935/live/test3停止拉流时(192.168.4.105为nginx所在电脑的ip),nginx会向ip为192.168.4.112的服务器发送http post请求。使用wireshark抓取到的数据如下:

当客户端向http://192.168.4.105:8050/flv_live?port=1935&app=live&stream=test3拉流时(192.168.4.105为nginx所在电脑的ip),nginx会向ip为192.168.4.112的服务器发送http post请求。使用wireshark抓取到的数据如下:

当客户端向http://192.168.4.105:8050/flv_live?port=1935&app=live&stream=test3停止拉流时(192.168.4.105为nginx所在电脑的ip),nginx会向ip为192.168.4.112的服务器发送http post请求。使用wireshark抓取到的数据如下:

五、遇到问题

1.设置on_play监听客户端播放事件后,启动推流后,拉流无法播放。导致该问题的原因为:得要有HTTP 2XX 返回码的话才能继续rtmp/http-flv会话。也就是说,当拉流时,nginx会发送一个http post请求,然后得返回http 2XX才能拉流。所以你自己写的服务器在接收nginx请求后必须返回http 2XXX,比如返回“HTTP/1.1 200 OK”给nginx,如下图所示:

rtsp流转码为rtmp/http-flv流的视频监控/直播系统中,视频流路数越来越多时,服务器端对CPU、内存、网络带宽的压力越来越大的解决方法相关推荐

  1. 关于海康摄像头rtsp流转码推流到前端的若干尝试和总结

    最近由于工作需要,业务系统需要集成网络摄像头.项目是架构,所以涉及到推流到前端页面的问题.我之前也没怎么解除过视频相关的问题,相关技术了解不多.相面就分不同篇幅简单梳理一下这个问题. 网络摄像头是现在 ...

  2. 利用FFmpeg将 IPCamera 的RTSP转码成RTMP发布在RED5

    利用FFmpeg将 IPCamera 的RTSP转码成RTMP发布在RED5   因为最近的项目需求,要做IP摄像头的网络直播,初步的想法是想使用Red5作为流媒体服务器,使用RTMP协议发布. 整理 ...

  3. 终端服务器安全层在协议流中检测到错误,并已取消客户端连接。客户端IP:x.x.x.解决方法

    终端服务器安全层在协议流中检测到错误,并已取消客户端连接.客户端IP:x.x.x.解决方法 事件类型: 错误 事件来源: TermDD 描述: RDP 的 "DATA ENCRYPTION& ...

  4. RTSP/GB28181/SDK/Ehome协议人脸识别/车牌识别视频智能分析系统EasyCVR获取播放地址和流地址方法介绍

    视频联网共享服务EasyCVR人脸识别/车牌识别智能分析系统是一个集视频联网共享.存储.流媒体转发.视频转码.视频上云.智能分析等多种功能为一体的流媒体视频服务融合型平台.目前EasyCVR还可以集成 ...

  5. 【操作教程】RTSP/GB28181/SDK/Ehome协议人脸识别/车牌识别视频智能分析系统EasyCVR如何获取播放地址和流地址?

    视频联网共享服务EasyCVR人脸识别/车牌识别智能分析系统是一个集视频联网共享.存储.流媒体转发.视频转码.视频上云.智能分析等多种功能为一体的流媒体视频服务融合型平台.目前EasyCVR还可以集成 ...

  6. 自制Linux功能板-新增功能(基于RTMP流媒体传输协议的视频监控)

    目录 一.ffmpeg工具 1.简介 2.移植相关库 二.RTMP的nginx服务器 1.简介 2.移植 三.运行测试 1.启动nginx 2.使用 FFmpeg 推流 引言:小板子能联网还有摄像头, ...

  7. 拉转直播将直播源再分发解决方案-虚拟的直播支持RTMP/HLS/FLV流输出

    丰富的场景 场景一:有一个在线的教育直播,需要在公司内网中分发,可以在DMZ区拉转一路,分发多路到内网的电脑中. 场景二:有很多路传统的非HLS的在线流,我需要可以在手机上观看. 场景三:比如一个广告 ...

  8. 直播流播放,视频监控/直播监控。 使用火山引擎VePlayer播放50+直播流保证流程运行。思路理解后类比腾讯TRTC和阿里播放器

    大家感觉有用的话,麻烦点赞收藏一下.也是踩坑踩出来的. 目标:50个直播流同时渲染,保证视频流播放正常. 代码在最后面,重点是 1. 视频流为 m3u8格式.(如果服务端传递回flv地址,大家自己re ...

  9. Android源码编译遇到Java虚拟机内存不够等相关Jack问题,解决方法

    1:源码根目录下prebuilts/sdk/tools/jack-admin diff --git a/tools/jack-admin b/tools/jack-admin index f028d2 ...

最新文章

  1. Lync 小技巧-34-通过Lync Server 2013的URI批量启用UM
  2. centos运行java图形化界面_CentOS设置默认启动命令行(不启动图形界面)
  3. 【转】dijkstra算法
  4. MOSS点滴(1):如何开发和部署feature
  5. mysql sum函数返回类型_MySQL的sum函数返回的门类
  6. 创建字节跳动之前,张一鸣读过哪些硬核技术书?
  7. php参数传递及数据库连接方法
  8. bean validation校验方法参数_Springboot 使用校验框架validation校验
  9. Servlet 快速开始 表单中文字段
  10. 谷歌云盘文件快速下载方法
  11. 读KVM虚拟化技术实战与原理解析
  12. python回归分析
  13. 想考华为认证HCIP-RoutingSwitching,应该看什么书?
  14. Java基础:volatile详解
  15. 中国电信 CTWing 物联网平台运营数据大解密
  16. pythonmath库round计算_Python tensorflow.math.round()用法及代码示例
  17. DIY超好吃的橙子果酱
  18. Linux x8664汇编,xorl%eax,g86生成的x86_64汇编代码中的%eax
  19. 纯 CSS3 实现波浪效果
  20. 北京联通201校园宽带详解与解除限制方法

热门文章

  1. 联想ThinkSystem融合架构简介 - ThinkAgile SX for Nutanix
  2. python:彩色照转黑白照
  3. 【Jenkins】win 10 / win 11:Jenkins 的下载、安装、部署(Jenkins 2.134 基于 Java 8)
  4. 综述 | 图像计算传感器
  5. 上海计算机学院网上报名,上海市学历积分报名网,成年人考试网上报名
  6. 修改 SSH 端口号
  7. PPPwizard1.4.3软件使用说明中文翻译稿
  8. 机器视觉设计,如何正确的选择相机和镜头?
  9. 《5G NR标准:下一代无线通信技术》读书笔记——LTE概述
  10. 古琴销售怎么做阳php学,古琴到底能否自学?如何才能学好古琴?