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;写作不易啊^ _ ^。   而且听说点赞的人每…

git操作的一些备忘录

1.回退本地合并 git merge --abort 2.撤销上一次的提交 方法一&#xff1a;(已经提交到git线上仓库了&#xff0c;git reset操作&#xff0c;会把之前提交的都删除&#xff0c;感觉有点危险) 想要让Git回退历史&#xff0c;有以下步骤&#xff1a; 使用git log命令&#xff0c…

SpringSecurity--DelegatingFilterProxy工作流程

什么是 DelegatingFilterProxy&#xff1f; DelegatingFilterProxy 是 Spring 提供的一个特殊的过滤器&#xff0c;它起到了桥梁的作用&#xff0c;可以让你在 Spring 容器中管理 Servlet 容器中的过滤器。 为什么需要 DelegatingFilterProxy&#xff1f; 通常情况下&#x…

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

❣博主主页: 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;它在高性能、高可靠…

AWS全服务历史年表:发布日期、GA和服务概述一览 (全)

我一直在尝试从各种角度撰写关于Amazon Web Services&#xff08;AWS&#xff09;的信息和魅力。由于我喜欢技术历史&#xff0c;这次我总结了AWS服务发布的历史年表。 虽然AWS官方也通过“Whats New”发布了官方公告&#xff0c;但我一直希望能有一篇文章将公告日期、GA日期&…

【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;来解决特定的问题。这两…

计算机软考之计算机网络知识详解

目录 计算机网络概述计算机网络体系结构 OSI参考模型TCP/IP模型 物理层 传输介质信号传输 数据链路层 数据帧错误检测与纠正 网络层 IP协议路由协议 传输层 TCP协议UDP协议 应用层 常见应用层协议 网络安全 常见安全威胁安全措施 实战案例分析总结 计算机网络概述 计算机网络…

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…

在未来有可能实现无药无手术可以治病吗?

在未来&#xff0c;随着科技的不断进步和人类对健康的追求&#xff0c;无药无手术治病的可能性是存在的。虽然目前的技术水平和医疗手段还无法完全实现这一目标&#xff0c;但是我们可以从多个方面推论出未来可能出现的无药无手术治病的情景。 首先&#xff0c;随着生物科技的发…

基于NER、触发词与依存句法分析的言论抽取

言论抽取技术简介 言论抽取&#xff08;Opinion Mining&#xff09;&#xff0c;是自然语言处理&#xff08;NLP&#xff09;领域中的一个重要分支&#xff0c;主要用于从文本中自动提取和分析情感信息。随着社交媒体、电子商务和在线评论的兴起&#xff0c;言论抽取技术变得越…

红狮金业解读:分析高价位黄金的后续投资吸引力

在全球经济格局不断变化的背景下&#xff0c;黄金作为传统的避险资产一直备受投资者关注。近期&#xff0c;金价持续走高&#xff0c;引发了市场对黄金是否仍然是优质资产配置的讨论。本文红狮启富将从长期需求、价格驱动因素的变化以及汇率影响三个角度&#xff0c;深入分析黄…

开发语言的基本构成。

许多人都对设计一套自有知识产权的开发语言感兴趣。那么&#xff0c;如何按照功能模块设计开发语言&#xff1f; 开发语言必须提供以下基本功能&#xff1a; 数据存储组织和管理&#xff1b;数据定位和访问&#xff1b;数据定义和解释方案&#xff1b;通用算法包&#xff1b;迭…

关于线性代数(考研)

1.AE的特征值的问题 若λ是A的特征值&#xff0c;对应的特征向量是x&#xff0c;则Axλx&#xff0c;所以(AE)xAxExλxx(λ1)x&#xff0c;所以λ1是AE的特征值。所以若A的特征值是1&#xff0c;1&#xff0c;0&#xff0c;则AE的特征值就是11&#xff0c;11&#xff0c;01&am…

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

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

VUE 子组件可以直接改变父组件的数据吗

子组件不可以直接改变父组件的数据。‌在Vue中&#xff0c;‌数据流是单向的&#xff0c;‌即父组件通过props向子组件传递数据&#xff0c;‌而子组件不能直接修改父组件的数据。‌这是为了维护数据流动的单向性和数据的可维护性。‌ 如果子组件需要修改父组件的数据&#xf…

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等多款创新性的产品及应用&#…