FreeSWITCH 1.10.10 简单图形化界面26-在网页上播放SIP设备视频


FreeSWITCH 1.10.10 简单图形化界面26-在网页上播放SIP设备视频

  • 1、前言
  • 2、大概流程
  • 3、测试环境
  • 4、安装流媒体服务器
  • 5、设置流媒体服务器接口
  • 6、简单写个web接口
  • 7、测试一下
    • 1、web播放
      • 在线播放器1
      • 在线播放器2
      • 本地video控件
    • 2、vlc播放
      • vlc播放rtmp
      • vlc播放rtsp
  • 8、总结

1、前言

在web上播放SIP设备的视频,通常使用jssip或者sipjs,使用webrtc技术及wss协议呼叫SIP设备,然后再使用video控件播放视频流。通过库,可实现双向的音视频通信。

如果有不需要双向通信的情况下(监听SIP设备、站岗等场景),只是想查看下SIP设备的视频流,最近在学习sip过程中,貌似也可以通过流媒体服务器实现在web上播放SIP设备的视频流。但是只是单向的,无法像使用js库那样进行对讲通话。
使用流媒体服务器,可以使用http、rtsp、rtmp播放视频流,前端没有使用js库那么复杂(js库必须使用wss协议,服务器需要部署wss证书等环境)

2、大概流程

部署流媒体服务器–>拉取流媒体–>流不存在–>调用web接口–>web接口把FreeSWITCH的终端视频流推送到流媒体服务器–>播放。
参考https://docs.zlmediakit.com/zh/guide/media_server/on-demand_streaming.html
如图:
在这里插入图片描述

开始瞎折腾

3、测试环境

参考安装步骤:https://blog.csdn.net/jia198810/article/details/137820796,安装一个FreeSWITCH作为测试环境。

参考使用手册:https://docs.qq.com/pdf/DVEZjSGhXVHhaUEFW?,设置一下,并添加账号,注册一个SIP终端。

4、安装流媒体服务器

安装流媒体服务器,本次使用的流媒体服务器是 ZLMediaKit,安装可参考https://docs.zlmediakit.com/zh/tutorial/

安装完毕后,运行,如下图:

在这里插入图片描述

端口554为rtsp端口
端口1935为rtmp端口
端口8080为http端口
端口8443为https端口

5、设置流媒体服务器接口

找到流媒体服务器的配置文件,修改web接口,ZLMediaKit的配置文件为config.ini,如下图:

在这里插入图片描述
找到hook,找到on_stream_not_found,设置为web接口的地址,如下图:
在这里插入图片描述

6、简单写个web接口

简单编写一个web接口,用于处理流媒体服务器的回调时,把SIP终端的视频流推送到流媒体服务器,如下:

from flask import Flask, request, jsonify
from subprocess import getoutputapp = Flask(__name__)@app.route('/on_stream_not_found', methods=['POST'])
def call():print(request.form)data = request.get_json() or request.form.to_dict()print(data)app_ = data.get('app', '')hook_index = data.get('hook_index', '')id_ = data.get('id', '')ip_ = data.get('ip', '')mediaServerId = data.get('mediaServerId', '')params = data.get('params', '')port = data.get('port', '')schema = data.get('schema', '')stream = data.get('stream', '')vhost = data.get('vhost', '')# 呼叫FreeSWITCH终端,并将流发布到流媒体服务器cmd = f"fs_cli -pfs8021 -x'bgapi originate {{absolute_codec_string='^^:PCMA:PMCU:H264'}}user/{stream} &record(rtmp://127.0.0.1/{app_}/{stream})'"print(cmd)output = getoutput(cmd)print(output)# 构建响应数据response_data = {"code": 200,"msg": "Success","data": {"max_time_length": 20,"upload_record": 1,"app": app_,"hook_index": hook_index,"id": id_,"ip": ip_,"mediaServerId": mediaServerId,"params": params,"port": port,"schema": schema,"stream": stream,"vhost": vhost}}# 返回 JSON 格式的响应return jsonify(response_data)@app.route('/on_stream_not_found', methods=['POST'])
def hangup():passif __name__ == '__main__':app.run(debug=True,host='0.0.0.0')
# 把终端的视频流推送到流媒体服务器
cmd = f"fs_cli -pfs8021 -x'bgapi originate {{absolute_codec_string='^^:PCMA:PMCU:H264'}}user/{stream} &record(rtmp://127.0.0.1/{app_}/{stream})'"

7、测试一下

通过ZLMediaKit,可以直接通过http、rtsp、rtmp播放媒体流。播放url规则,可参考https://docs.zlmediakit.com/zh/guide/media_server/play_url_rules.html#_3%E3%80%81%E6%B5%81%E5%AA%92%E4%BD%93%E6%BA%90%E5%AF%B9%E5%BA%94%E7%9A%84%E6%92%AD%E6%94%BE-url
如下:

# HLS(mpegts)
http://somedomain.com/live/0/hls.m3u8
https://somedomain.com/live/0/hls.m3u8
http://127.0.0.1/live/0/hls.m3u8?vhost=somedomain.com
https://127.0.0.1/live/0/hls.m3u8?vhost=somedomain.com# HLS(fmp4)
http://somedomain.com/live/0/hls.fmp4.m3u8
https://somedomain.com/live/0/hls.fmp4.m3u8
http://127.0.0.1/live/0/hls.fmp4.m3u8?vhost=somedomain.com
https://127.0.0.1/live/0/hls.fmp4.m3u8?vhost=somedomain.com# HTTP-TS/WS-TS(后缀为.live.ts,目的是为了解决与 hls 的冲突)
http://somedomain.com/live/0.live.ts
https://somedomain.com/live/0.live.ts
http://127.0.0.1/live/0.live.ts?vhost=somedomain.com
https://127.0.0.1/live/0.live.ts?vhost=somedomain.com
ws://somedomain.com/live/0.live.ts
wss://somedomain.com/live/0.live.ts
ws://127.0.0.1/live/0.live.ts?vhost=somedomain.com
wss://127.0.0.1/live/0.live.ts?vhost=somedomain.com# HTTP-fMP4/WS-fMP4(后缀为.live.mp4,目的是为了解决与 mp4 点播的冲突)
http://somedomain.com/live/0.live.mp4
https://somedomain.com/live/0.live.mp4
http://127.0.0.1/live/0.live.mp4?vhost=somedomain.com
https://127.0.0.1/live/0.live.mp4?vhost=somedomain.com
ws://somedomain.com/live/0.live.mp4
wss://somedomain.com/live/0.live.mp4
ws://127.0.0.1/live/0.live.mp4?vhost=somedomain.com
wss://127.0.0.1/live/0.live.mp4?vhost=somedomain.com

1、web播放

上面编写的web接口,当访问http://ip/live/[分机号].live.mp4时(其他url地址,如上),会呼叫指定的分机号,如下图:呼叫的是1100分机号。

在线播放器地址1:http://cloud.liveqing.com:18000/#/liveplayer
在线播放器地址2:http://player.ruiboyun.cn/

找个在线播放器(本地播放测试,请使用相关播放器本地部署),或者输入流媒体服务器的url地址,点击播放按钮后,流媒体服务器开始拉取媒体流,拉取失败后会调用web接口,web接口在呼叫FreeSWITCH进行推流,推流成功后,网页开始播放。如下图:

PS: 8000是媒体服务器的公网http端口,因为是公网,所以进行了端口映射,公网为8000,内网为媒体服务器的http端口8080。

在线播放器1

在这里插入图片描述

在线播放器2

在这里插入图片描述

本地video控件

编写一个简单本地video控件测试,代码如下:

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>播放SIP终端视频</title>
</head>
<body><h1>视频直播</h1><video width="640" height="480" controls autoplay><source src="http://210.51.10.231:8000/live/1100.live.mp4" type="video/mp4">您的浏览器不支持 video 标签。</video>
</body>
</html>

效果如下图:
在这里插入图片描述
linphone测试。
在这里插入图片描述

2、vlc播放

也可以通过rtsp、rtmp进行播放,播放url,如下:

http://210.51.10.231:8000/live/1100.live.flv
rtmp://210.51.10.231/live/1100
rtsp://210.51.10.231/live/1100
http://210.51.10.231:8000/live/1100/hls.m3u8
http://210.51.10.231:8000/live/1100.live.mp4

vlc播放rtmp

如下图:

在这里插入图片描述

vlc播放rtsp

如下图:在这里插入图片描述

8、总结

以上使用了ZLMediaKit流媒体服务器的按需拉取功能,此流媒体服务器功能强大,可以直接播放GB28181,可参考相关文档。

各类播放器支持url格式可能有不同,效果也有差异,延时等,可进行相关测试。祝君好运

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

https改造-python https 改造

文章目录 前言https改造-python https 改造1.1. https 配置信任库2. 客户端带证书https发送,、服务端关闭主机、ip验证 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每…

【项目日记(三)】梦幻笔耕-博客模块

❣博主主页: 33的博客❣ ▶️文章专栏分类:项目日记◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多项目内容 目录 1.前言2.获取博客列表3.获取博客详情4.新增博客5.更新博客6.删除博客7.拦截器9.统一处…

日常开发记录分享-SQL中的partition分区功能使用

文章目录 需求来源实现思路实施SQL 语句结构内部查询&#xff08;子查询&#xff09;外部查询 结果 partition的升级使用解释 验证一下看看分区 分区的一些操作1. 普通查询2. 分区表上的查询优化3. 插入数据4. 删除分区中的数据5. 分区维护操作添加新的分区删除分区重组分区 6.…

银河麒麟服务器V10 SP3 安装人大金仓V009R001C001B0030

原文链接&#xff1a;银河麒麟服务器V10 SP3 安装人大金仓V009R001C001B0030 Hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇关于在银河麒麟服务器V10 SP3上安装人大金仓V009R001C001B0030的文章。人大金仓是国内知名的数据库管理系统&#xff0c;它在高性能、高可靠…

【C++】标准库:介绍string类

string 一.string类介绍二.string类的静态成员变量三.string类的常用接口1.构造函数&#xff08;constructor&#xff09;2.析构函数&#xff08;destructor&#xff09;3.运算符重载&#xff08;operator&#xff09;1.operator2.operator[]3.operator4.operator 4.string的四…

算法从零到精通 (一) ~ 快慢双指针

1. 前言 快慢双指针是一种常用的算法技巧&#xff0c;通常用于解决涉及链表或数组的问题。它的基本思想是使用两个指针&#xff0c;一个移动速度快&#xff08;快指针&#xff09;&#xff0c;一个移动速度慢&#xff08;慢指针&#xff09;&#xff0c;来解决特定的问题。这两…

Docker搭建群晖

Docker搭建群晖 本博客介绍在docker下搭建群晖 1.编辑docker-compose.yml文件 version: "3" services:dsm:container_name: dsmimage: vdsm/virtual-dsm:latestenvironment:DISK_SIZE: "16G"cap_add:- NET_ADMIN ports:- 8080:50…

c# 端口监控 Helper 以及写一个端口监控工具

c# 端口监控 Helper 以及写一个端口监控工具 介绍核心代码&#xff1a;工具完整编码&#xff1a;1、编写界面2、打开定时控件的属性设置。3、编写定时控件的 Tick 事件结果&#xff08;运行效果&#xff09; 介绍 由于最近做上架比较多&#xff0c;会经常来确保服务器的服务&a…

Flink时间和窗口

目录 时间语义 水位线&#xff08;Watermarks&#xff09; 并行流中的水位线 窗口 滚动窗口—Tumbling Windows 滑动窗口—Sliding Windows 会话窗口—Session Windows 全局窗口—Global Windows 例子 时间语义 如图所示&#xff0c;由事件生成器&#xff08;Event Pr…

萤石举办2024夏季新品发布会,全力推进“2+5+N”智能家居新生态

7月24日&#xff0c;“智动新生&#xff0c;尽在掌控”2024萤石夏季新品发布会在杭州成功举办。本次发布会上&#xff0c;“智慧生活守护者”萤石深入挖掘应用场景&#xff0c;重磅发布了包括智能健康手表、智能家居AI主机、生态控制器、智家APP等多款创新性的产品及应用&#…

【JavaScript】`Map` 数据结构

文章目录 一、Map 的基本概念二、常见操作三、与对象的对比四、实际应用场景 在现代 JavaScript 中&#xff0c;Map 是一种非常重要且强大的数据结构。与传统的对象&#xff08;Object&#xff09;不同&#xff0c;Map 允许您使用各种类型的值作为键&#xff0c;不限于字符串或…

基于 HTML+ECharts 实现监控平台数据可视化大屏(含源码)

构建监控平台数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 监控平台的数据可视化对于实时掌握系统状态、快速响应问题至关重要。通过直观的数据展示&#xff0c;运维团队可以迅速发现异常&#xff0c;优化资源配置。本文将详细介绍如何利用 HTML 和 ECharts 实现一个…

关于 夜莺n9e 的简易部署

一、部署夜莺n9e 1.找一个服务器机器 #创建并进入目录 mkdir -p /data/n9e && cd /data/n9e2.准备n9e安装包 (如果存在&#xff0c;跳过) #下载并解压n9e wget https://download.flashcat.cloud/n9e-v6.7.3-linux-amd64.tar.gz tar -zxvf n9e-v6.7.3-linux-amd64.ta…

JL 跳转指令的理解

一般情况下&#xff0c;JU 和 JC 是最常见的跳转指令&#xff1b;但有时会用到JL 指令&#xff0c;JL 说起来更像是一组指令&#xff0c;类似C,C# 语言中的 switch case 语句&#xff0c;但是有个明显的不同&#xff0c;前者的判断条件可以是任意合理数字&#xff0c;后者范围…

制冷系统干燥过滤器

干燥过滤器(Drier Filter)主要是起到杂质过滤的作用。一般来说&#xff0c;这要根据冰箱、空调的制冷系统来确定干燥器的规格&#xff0c;如直径&#xff0c;内径&#xff0c;外径的规格&#xff0c;和内部件&#xff0c;如过滤碗&#xff0c;网布&#xff0c;和分子筛 为了确保…

C#测试控制台程序调用Quartz.NET的基本用法

Quartz.Net是常用的任务调用框架之一&#xff0c;既能在客户端程序中使用&#xff0c;也支持在网页程序后台调用。本文结合参考文献4中的示例代码学习其在控制台程序中的基本用法。   VS2022新建控制台项目&#xff0c;在Nuget包管理器中搜索并安装Quartz包&#xff0c;如下所…

JavaWeb笔记_JSPEL

一.JSP相关技术 1.1 JSP由来 当我们需要向页面输出大量的HTML代码的时候,我们需要通过response对象写多次来输出HTML代码 response.getWriter().write("<font>文本</font>"); 页面的展示和servlet密不可分,不利于后期代码维护,因此推出一种可以…

npm下载pnpm

一、提供node_global和node_cache的文件夹 若不存在&#xff0c;可自行新建文件夹 二、配置环境变量 配置NODE_PATH变量&#xff1a; 配置Path变量&#xff1a; 三、执行cmd指令 npm config set prefix "D:\Configure\nodejs\node_global" npm config set cache &…

公司邮箱一般是什么邮箱

公司邮箱一般是什么邮箱呢&#xff1f;公司邮箱是企业官方通信工具&#xff0c;体现专业形象&#xff0c;提高协作效率。选择时需考虑安全性、功能集成、性价比和技术支持。Zoho邮箱因简洁界面、丰富协作工具和出色安全性能受好评&#xff0c;提供多种套餐选择。 一、公司邮箱…

编写SpringBoot的自定义starter包

starter项目 先来看一下Starter的官方解释&#xff1a; Spring Boot Starter 是一种方便的依赖管理方式&#xff0c;它封装了特定功能或技术栈的所有必要依赖项和配置&#xff0c;使得开发者可以快速地将这些功能集成到Spring Boot项目中。Spring Boot官方提供了一系列的Star…