mediamtx流媒体服务器测试

MediaMTX简介

在web页面中直接播放rtsp视频流,重点推荐:mediamtx,不仅仅是rtsp-CSDN博客

mediamtx github

MediaMTX(以前的rtsp-simple-server)是一个现成的和零依赖的实时媒体服务器和媒体代理,允许发布,读取,代理和记录视频和音频流。它被设想为一个“媒体路由器”,将媒体流从一端路由到另一端。使用go语言开发的

特性:

  • 向服务器发布直播流
  • 从服务器端读取直播流
  • 流自动从一种协议转换为另一种协议
  • 在不同的路径上同时服务多个流
  • 记录流到磁盘
  • 认证用户;使用内部或外部身份验证
  • 重定向阅读器到其他RTSP服务器(负载平衡)
  • 通过API查询和控制服务器
  • 在不断开现有客户端连接的情况下重新加载配置(热重新加载)
  • 读取普罗米修斯兼容的指标
  • 在客户端连接、断开、读取或发布流时运行钩子(外部命令)
  • 兼容Linux, Windows和macOS,不需要任何依赖或解释器,它是一个单一的可执行文件

一、启动及配置

1、下载

mediamtx有各个环境下编译好的可执行文件,直接下载对应的版本即可,不用再交叉编译

https://githubfast.com/bluenviron/mediamtx/releases/tag/v1.4.2

包中只有mediamtx执行文件和mediamtx.yml配置文件

2、配置

mediamtx.yml配置文件中配置了各个流媒体配置,各个流服务的端口如下:

  • rtmp server端口:1935
  • rtsp server端口:8554
  • hls server端口:8888
  • webrtc server端口:8889
  • SRT server端口:8890
  • API端口:9997

3、启动

mediamtx会默认匹配下面配置文件,如果是部署在的其他目录下,启动时需要手动指定配置文件路径

  • /usr/html/rtsp-simple-server.yml
  • /usr/html/mediamtx.yml
  • /usr/local/etc/mediamtx.yml
  • /usr/etc/mediamtx.yml
  • /etc/mediamtx/mediamtx.yml

/usr/mediamtx/mediamtx /usr/mediamtx/mediamtx.yml

二、在web中播放webrtc

在web中不能直接播放rtsp流,需要通过mediamtx流媒体服务器转换成rtmp或hls或webrtc流

经查阅mediamtx使用说明可知,mediamtx可直接在web中通过在网页中嵌入iframe就可直接播放webrtc视频流 和 HLS视频流,而且还支持多路转流,也就是可以在web中播放多路rtsp视频流。

  • HLS视频流会有时延,webrtc几乎是实时的
  • 在RK3568上经测试,同时播放2路webrtc视频流还算流畅,但是到4路就有点卡顿了,top查看cpu占用率,4个cpu基本已满负荷

1、单路播放

webrtc1.html

iframe中的src地址需要根据推流的路径修改

<!DOCTYPE html>
<html>
<head>
  <title>WebRTC Video Stream Example</title>
  <style>
    #video-frame {
      width: 640px;
      height: 480px;
      border: 1px solid black;
    }
  </style>
</head>
<body>
  <div>
    <iframe id="webrtc-frame" src="http://192.168.7.216:8889/video" width="1280" height="720" scrolling="no" frameborder="0" allowfullscreen></iframe>
    <button id="fullscreen-button">Toggle Fullscreen</button> 
  </div>

  <script>
    var iframeElement = document.getElementById("webrtc-frame");

    function enterFullscreen() {
      if (iframeElement.requestFullscreen) {
        iframeElement.requestFullscreen();
      } else if (iframeElement.mozRequestFullScreen) {
        iframeElement.mozRequestFullScreen();
      } else if (iframeElement.webkitRequestFullscreen) {
        iframeElement.webkitRequestFullscreen();
      } else if (iframeElement.msRequestFullscreen) {
        iframeElement.msRequestFullscreen();
      }
    }

    function exitFullscreen() {
      if (document.exitFullscreen) {
        document.exitFullscreen();
      } else if (document.mozCancelFullScreen) {
        document.mozCancelFullScreen();
      } else if (document.webkitExitFullscreen) {
        document.webkitExitFullscreen();
      } else if (document.msExitFullscreen) {
        document.msExitFullscreen();
      }
    }

    document.getElementById("fullscreen-button").addEventListener("click", function() {
      if (isFullScreen()) {
        exitFullscreen();
      } else {
        enterFullscreen();
      }
    });

    function isFullScreen() {
      return document.fullscreenElement ||
        document.mozFullScreenElement ||
        document.webkitFullscreenElement ||
        document.msFullscreenElement;
    }
  </script>
</body>
</html>

屏幕显示

pc端访问

2、多路播放

webrtc2.html

iframe中的src地址需要根据推流的路径修改

<!DOCTYPE html>
<html>
<head>
  <title>WebRTC Video Stream Example</title>
  <style>
    .video-grid {
      display: grid;
      grid-template-columns: 1fr 1fr;
      grid-template-rows: 1fr 1fr;
      gap: 10px;
      height: 100vh; /* 让视频占据整个可视区域的高度 */
    }
    .video-item {
      width: 100%;
      height: 100%;
      border: 1px solid black;
    }
  </style>
</head>
<body>
  <div class="video-grid">
    <iframe class="video-item" src="http://192.168.7.216:8889/video193" scrolling="no" frameborder="0" allowfullscreen></iframe>
    <iframe class="video-item" src="http://192.168.7.216:8889/video194" scrolling="no" frameborder="0" allowfullscreen></iframe>
    <iframe class="video-item" src="http://192.168.7.216:8889/streamOnInit" scrolling="no" frameborder="0" allowfullscreen></iframe>
    <iframe class="video-item" src="http://192.168.7.216:8889/streamOnDemand" scrolling="no" frameborder="0" allowfullscreen></iframe>
  </div>
</body>
</html>

屏幕播放

pc端访问

三、推流方式

1、命令行手动转流

在启动mediamtx后,在后台通过ffmpeg命令行进行推流,然后访问webrtc流地址播放视频

rtsp端口:8554

webrtc端口:8889

(1)、rtsp转webrtc

ffmpeg -i rtsp://admin:wanweitech001@192.168.7.193/Streaming/Channels/101 -c copy -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/video

url地址:http://192.168.7.216:8889/video

(2)、本地mp4文件转webrtc

ffmpeg -re -i /root/camera.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/video

url地址:http://192.168.7.216:8889/video

2、内置命令转流

通过mediaMtx流媒体内置命令配置,将rtsp流使用ffmpeg进行转码推流到mediaMtx流媒体,其实就是将手动转流命令添加到配置文件中,然后指定其路径,让服务器启动时 或是 拉流时 自动执行命令进行转流

###############################################
# Path settings

# Settings in "paths" are applied to specific paths, and the map key
# is the name of the path.
# Any setting in "pathDefaults" can be overridden here.
# It's possible to use regular expressions by using a tilde as prefix,
# for example "~^(test1|test2)$" will match both "test1" and "test2",
# for example "~^prefix" will match all paths that start with "prefix".
paths:
  dhl:
    #source: rtsp://admin:wanweitech001@192.168.7.193/Streaming/Channels/101
    source: rtsp://admin:wanweitech001@192.168.7.193:554/h265/ch1/main/av_stream
  pc:
    source: rtsp://192.168.6.52:8554/pc
    
  streamOnInit:
    runOnInit: ffmpeg -i rtsp://admin:wanweitech001@192.168.7.193/Streaming/Channels/101 -c copy -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/streamOnInit
    
  streamOnDemand:
    runOnDemand: ffmpeg -i rtsp://admin:wanweitech001@192.168.7.193/Streaming/Channels/101 -c copy -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/streamOnDemand
    
  # Settings under path "all_others" are applied to all paths that
  # do not match another entry.
  all_others:

3、api控制

服务器可以通过其API进行查询和控制,这必须通过在配置中设置' API '参数来启用

3.1 配置文件

在 mediamtx.yml 配置文件中需要开启api功能,端口默认为9997,如下:

3.2 api接口

详细的api接口定义详见 API文档:MediaMTX API ,下面是测试了用到的几个api。是使用的ApiPost7演示调用api

  • 查看当前的所有配置:http://localhost:9997/v3/config/paths/list
  • 查看当前的视频流:http://localhost:9997/v3/config/paths/list
  • 修改配置:http://localhost:9997/v3/config/global/patch
  • 添加一个现有的视频流:http://localhost:9997/v3/config/paths/add/{name}
  • 删除一个视频流:http://localhost:9997/v3/config/paths/delete/{name}

(1)修改配置

http://192.168.7.216:9997/v3/config/global/patch

全局配置有很多,详细介绍可以查看作者的API文档说明。

(2)添加流

http://192.168.7.216:9997/v3/config/paths/add/apistream

添加一个现有的视频流,添加后访问 192.168.7.216:8889/apistream

body:

{ "source": "rtsp://admin:wanweitech001@192.168.7.193/Streaming/Channels/101" }

在web中播放

(3)删除视频流

http://192.168.7.216:9997/v3/config/paths/delete/apistream

四、记录码流到磁盘

要将可用流保存到磁盘,需要在配置文件中设置' record '和' recordPath '参数

 ###############################################
  # Default path settings -> Recording

  # Record streams to disk.
  record: yes
  # Path of recording segments.
  # Extension is added automatically.
  # Available variables are %path (path name), %Y %m %d %H %M %S %f %s (time in strftime format)
  recordPath: /usr/database/recordings/%path/%Y-%m-%d_%H-%M-%S-%f
  # Format of recorded segments.
  # Available formats are "fmp4" (fragmented MP4) and "mpegts" (MPEG-TS).
  recordFormat: fmp4
  # fMP4 segments are concatenation of small MP4 files (parts), each with this duration.
  # MPEG-TS segments are concatenation of 188-bytes packets, flushed to disk with this period.
  # When a system failure occurs, the last part gets lost.
  # Therefore, the part duration is equal to the RPO (recovery point objective).
  recordPartDuration: 100ms
  # Minimum duration of each segment.
  recordSegmentDuration: 1h
  # Delete segments after this timespan.
  # Set to 0s to disable automatic deletion.
  recordDeleteAfter: 24h

配置的大概意思就是mp4 segment是由一个个的part连接组成,recordPartDuration 配置的是一个part的时长,recordSegmentDuration配置的是一个segment的时长,也就是一个视频的时长,recordDeleteAfter用于配置自动删除超过多长时间的视频

五、H265视频码流播放测试

网络摄像头可以输出265编码格式的视频流,H265相比H264有更高的压缩率,相同的视频质量下可使用更低的比特率来实现更小的文件大小或带宽占用。但是H265比H264的编码算法也更加复杂,在解码播放时会占用更多资源,解码速度也会更慢一些

想要在web中能播放H.265码流的视频,需要具备2个条件

  1. 流媒体服务器支持H.265推流和拉流
  2. 浏览器支持播放H.265码流的视频,也就是浏览器可调用 H.265/HEVC 硬件解码器

1、mediamtx对H.265推流拉流支持情况

  • 支持H265码流的RTSP推流

  • WebRTC不支持H265拉流,HLS支持H265拉流

也就是说 HLS 是支持H265 RTSP --> HLS转流的,WebRTC还不支持H265 RTSP --> WebRTC转流,网上给的方案 是通过ffmpeg将265编码的视频流转成264编码的,然后输出264编码的webrtc视频流。但是经测试ffmpeg在RK3568平台上调用 硬件编解码 时会报错,调用不了硬件编解码 直接调用软件编解码,导致非常卡顿,帧率很低!

调用硬件编解码:

ffmpeg -i rtsp://admin:wanweitech001@192.168.7.193/Streaming/Channels/101 -vcodec h264_rkmpp -b:v 1024k -vf scale=1280:720 -bf 0 -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/video

调用软件编解码:

ffmpeg -i rtsp://admin:wanweitech001@192.168.7.193/Streaming/Channels/101 -vcodec libx264 -b:v 1024k -vf scale=1280:720 -bf 0 -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/video

2、浏览器对#H.265码流播放支持情况

一方面,由于H.265 是一种相对较新的视频编码标准,还有就是H265标准的专利授权问题,一些老版本的浏览器是不支持H.265视频播放的,Chrom原生就是不支持的,需要107版本以上浏览器。开启HEVC的支持可参考 链接。在Chrome浏览器地址栏输入about:gpu或 chrome://gpu 可查看对H265的支持情况

下面对几个浏览器做了下测试

浏览器

是否支持

86.0.4240.196版本360安全浏览器(win7)

可以播放

109.0.5414.120版本Chrome浏览器(win7)

不能播放

109.0.1518.12 版本Edge浏览器(win7)

不能播放

119.0.6045.200版本Chrome浏览器(win10)

可以播放

chromium-ozone-wayland_88.0.4324.150_aarch64

不能播放

在设备中播放时直接报错,设备中的chromium不支持H.265码流解码!!

在360安全浏览器中播放

3、播放H.265码流视频方法

虽然 Chrome 浏览器没有原生支持 H.265,但仍然有几种选择来播放 H.265 视频:

  1. 使用第三方媒体播放器插件:可以尝试安装支持 H.265 的媒体播放器插件,如 VLC 播放器、PotPlayer、Media Player Classic 等。这些播放器通常可以直接播放 H.265 视频。
  2. 转码为支持的编码格式:如果你有 H.265 视频文件,并且需要在 Chrome 浏览器中播放,你可以考虑将视频文件转码为 Chrome 支持的编码格式,如 H.264。可以使用视频转码工具(如 FFmpeg、HandBrake)进行转码。注意:转码带来的一些缺点可能包括视频质量损失、文件大小增加以及转码过程可能需要较长时间。
  3. 使用 WebAssembly 解码器:WebAssembly 是一种可以在浏览器中运行高性能、本地代码的底层技术。有一些开源的 H.265 解码器,如 libde265.js 和 x265.js,利用 WebAssembly 技术可以在 Chrome 浏览器中播放 H.265 视频。但这需要在你的网站中进行开发和集成。

总之,目前 Chrome 浏览器原生不支持直接播放 H.265 视频,但可以通过安装插件、转码视频或使用 WebAssembly 技术来实现在 Chrome 浏览器中播放 H.265 视频的需求

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL JDBC驱动包引入有版本要求吗

提示&#xff1a;有关数据库的任何操作&#xff0c;请事先都做好备份&#xff0c;一定不会错的&#xff1b; 文章目录 前言一、com.mysql.jdbc.Driver和com.mysql.cj.jdbc.Driver如何选择&#xff1f;1、概念2、引入驱动3、总结 前言 新老项目的交替中&#xff0c;如果你使用的…

天阳科技集团北京卡洛其项目管理专家李先林受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 天阳科技集团北京卡洛其项目管理专家李先林先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“应用软件项目管理标准化实践探讨”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1…

基于ChatGPT的大型语言模型试用心得

近年来&#xff0c;ChatGPT这样的大型语言模型&#xff0c;它如同一颗冉冉升起的新星&#xff0c;迅速在商业、教育、娱乐等多个领域照亮了创新的天空&#xff0c;极大地革新了我们的工作与日常生活。 最近我发现一些国内用户也能自由访问的中文ChatGPT APP。这个平台不仅提供…

Zabbix Centos8 安装笔记

Zabbix 安装笔记 安装环境 Centos 8 正常发行版 安装版本 Zabbix 7 (LTS) 安装步骤 1、关闭防火墙 systemctl stop firewalld && systemctl disable firewalld && setenforce 0 && sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/c…

【笔记】复制Edge的网址粘贴后自动变成中文标题超链接

问题 1、从edge复制的网址粘贴直接显示网页内容名称而不是网址url。 2、复制任何网址粘贴到CSDN里面粘贴时直接转换成标题超链接&#xff08;很讨厌的功能习惯&#xff09;。 而如上两种问题不是互相影响的&#xff0c;就算设置了Edge的粘贴方式&#xff0c;复制到CSDN的文章…

【Kubernetes】Helm--包管理工具

​​​​​​​ 微服务是什么&#xff1f; 微服务把大包解耦成小包&#xff0c;使用的时候使用java -jar包启动服务 Helm 什么是Helm&#xff1f; 在没使用 helm 之前&#xff0c;向 kubernetes 部署应用&#xff0c;我们要依次部署 deployment、svc 等&#xff0c;步骤较繁…

机器,学习没有捷径

1 捷径学习 1.1 你捷径学习了么 深度学习因为其优异的学习能力&#xff0c;已经成为推动人工智能发展当之无愧的主力军。深度学习在NLP和CV等不同的场景下都展现了优异的能力。但深度学习也存在一个与生俱来的问题&#xff1a;捷径学习。 捷径学习中的捷径表示的是一种有缺陷…

和鲸科技执行总裁殷自强:面向空间数据协同分析场景的模型生命周期管理方法

导读&#xff1a; 由 ACM SIGSPATIAL 中国分会主办的第五届空间数据智能学术会议&#xff08;SpatialDI 2024&#xff09;于 2024 年 4 月 25 日- 27 日在南京圆满召开&#xff0c;主题为“ AGI 时代下的空间数据智能”&#xff0c;旨在深入推动空间数据智能研究的理论进步与应…

mysql:简单理解mysql mvcc的可重复读

# 原理 假设有这样的sql begin select&#xff08;或update、insert、delete&#xff09; ... commit当执行【begin】的时候&#xff0c;标记有一个新事务要开始&#xff0c;但是事务还没有真正开始&#xff0c;事务id还没有产生当执行事务里面的第一个sql语句时&#xff08;…

【JS重点15】原型对象概述

目录 一&#xff1a;构造函数缺陷 二&#xff1a;原型 1 原型是是什么 2 原型对象的作用 3 原型对象this指向问题 4 利用原型对象添加方法 给JS内置构造函数Array添加最大值方法 给JS内置构造函数Array添加求和方法 三&#xff1a;Constructor属性 四&#xff1a;如何…

「茶桁 AI 秘籍-CV 篇」预告

Hi, 大家好。 我是茶桁。 咱们的《茶桁的 AI 秘籍》系列距离上一个系列课程《人工智能 BI 核心》已经有一段时间了&#xff0c;终于有时间可以写 CV 部分的课程&#xff0c;主要也是最近一段时间我确实有点忙不过来。 那么咱们 CV 的课程会有一些变化&#xff0c;就是会改为收…

AtCoder Beginner Contest 358 A~E(F,G更新中...)

A.Welcome to AtCoder Land 题意 给出两个字符串 S , T S, T S,T&#xff0c;请你判断是否满足&#xff1a; 字符串 S S S为AtCoder 字符串 T T T为Land 分析 输入后判断即可 代码 #include<bits/stdc.h> using namespace std; void solve() {string s, t;cin &g…

MacOS系统中Java使用Opencv4.10.0库的编译过程和使用方法(附编译后的包)

编译开始 到官方下载源码&#xff1b;官方 解压后进入 opencv-4.10.0 目录 执行命令预编译&#xff0c;查看是否有Java的支持 cmake -S . -B build -DCMAKE_INSTALL_PREFIX/usr/local/opencv开始正式编译 # 进入build目录 cd build # make编译 {N} 取决于你有几个CPU、几个线…

AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获取(流程优化)

系列篇章&#x1f4a5; No.文章1AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎的构建与初步实践2AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎之GLM-4大模型技术的实践探索3AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎之知乎网站数据获…

【在线OJ】vue分页+SpringBoot分页模板代码

一、Vue <template><div><el-table:data"user"style"width: 120%"><el-table-columnlabel"id"width"180"><template slot-scope"scope"><i class"el-icon-time"></i>&…

几个小创新模型,KAN组合网络(LSTM、GRU、Transformer)时间序列预测,python预测全家桶...

截止到本期&#xff0c;一共发了8篇关于机器学习预测全家桶Python代码的文章。参考往期文章如下&#xff1a; 1.终于来了&#xff01;python机器学习预测全家桶 2.机器学习预测全家桶-Python&#xff0c;一次性搞定多/单特征输入&#xff0c;多/单步预测&#xff01;最强模板&a…

中国城市建设统计年鉴(1978-2022年)

数据年份&#xff1a;1978-2022 数据格式&#xff1a;excel、pdf 数据内容&#xff1a;以2022年为例&#xff0c;《中国城市建设统计年鉴—2022》根据各省、自治区和直辖市建设行政主管部门上报的2022年及历年城市建设统计数据编辑。 共分13个部分&#xff0c;包括城市市政公用…

Java课程设计:基于swing + mysql的酒店管理系统

文章目录 一、项目介绍二、项目展示三、源码展示四、源码获取 一、项目介绍 项目功能 1、散客开单&#xff1a;完成散客的开单&#xff0c;可一次最多开5间相同类型的房间。 2、团体开单&#xff1a;完成团体的开单&#xff0c;开放数量没有限制&#xff0c;可同时开不同类型…

Java阻塞队列:ArrayBlockingQueue

Java阻塞队列&#xff1a;ArrayBlockingQueue ArrayBlockingQueue是Java中的一个阻塞队列&#xff08;Blocking Queue&#xff09;实现&#xff0c;它是线程安全的&#xff0c;并且基于数组实现。ArrayBlockingQueue常用于生产者-消费者模型&#xff0c;在这种模型中&#xff…

北京人工智能数据运营平台发布,并开源大规模数据集

6月14日&#xff0c;AI行业顶级盛会2024北京智源大会正式拉开帷幕。作为大会的重要组成部分&#xff0c;智源大会“人工智能数据新基建”论坛同步召开。本论坛由北京智源人工智能研究院主办&#xff0c;中国互联网协会人工智能工委会和中国移动研究院承办。本次论坛邀请到来自中…