mediamtx流媒体服务器测试

news2024/11/23 15:24:34

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 视频的需求

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

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

相关文章

android13 应用冷启动

1 概述 launcher 通过binder到systemserver中atms中发送startActivity请求 startProcess向zygote发送启动新进程请求 zygote收到请求&#xff0c;fork新进程并调用ActivityThread的main初始化 新进程启动&#xff0c;发送attachApplication给ams&#xff0c;告诉他新进程启动…

C++ 44 之 指针运算符的重载

#include <iostream> #include <string> using namespace std;class Students04{ public:int m_age;Students04(int age){this->m_age age;}void showAge(){cout << "年龄是&#xff1a; " << this->m_age << endl;}~Students0…

155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题

设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int get…

RestTemplate远程请求的艺术

1 简说 编程是一门艺术,追求优雅的代码就像追求优美的音乐。 很多有多年工作经验的开发者,在使用RestTemplate之前常常使用HttpClient,然而接触了RestTemplate之后,却愿意放弃多年相处的“老朋友”,转向RestTemplate。那么一定是RestTemplate有它的魅力,有它的艺术风范。…

CCAA质量管理【学习笔记】​​ 备考知识点笔记(三)质量管理方法与常见工具

第二部分 质量管理领域专业知识 《质量管理体系基础考试大纲》中规定的考试内容&#xff1a; 3.2 质量管理领域专业知识 a) 了解质量管理方法与工具相关知识&#xff0c;包括&#xff1a; 质量管理方法与工具的内涵与作用、发展历程与应用现状、分类与选择常用的应用软件…

使用 Vue CLI 脚手架生成 Vue 项目

最近我参与了一个前端Vue2的项目。尽管之前也有过参与Vue2项目的经验&#xff0c;但对一些前端Web技术并不十分熟悉。这次在项目中遇到了很多问题&#xff0c;所以我决定借此机会深入学习Vue相关的技术栈。然而&#xff0c;直接开始深入钻研这些技术可能会显得枯燥&#xff0c;…

随笔-来了,安了

依照领导定的规矩&#xff0c;周五又去了分公司&#xff0c;赋能一线去了。到了地方就是开会->现场解决问题->干饭->开会过需求、提供解决方案&#xff0c;充实得厉害。强度也不小&#xff0c;中午干的一大碗饭&#xff0c;到五点就饿了。 六点带着分公司催着上线的需…

jupyter notebook中使用不同的anaconda环境及常用conda命令

conda命令 在jupyter notebook中使用不同的anaconda环境其他常用conda命令 在jupyter notebook中使用不同的anaconda环境 创建环境 myenvname 需替换为自己的环境名称 conda create --name myenvname python3.7激活环境 conda activate myenvname 在该环境中安装Jupyter N…

MongoDB~事务了解;可调一致性模型功能与因果一致性模型功能分析

背景 MongoDB 从 3.0版本引入 WiredTiger 存储引擎之后开始支持事务&#xff0c;MongoDB 3.6之前的版本只能支持单文档的事务&#xff0c;从 MongoDB 4.0版本开始支持复制集部署模式下的事务&#xff0c;从 MongoDB 4.2版本开始支持分片集群中的事务。 根据官方文档介绍&…

C++11 move左值转化为右值

单纯的左值只能用左值引用和右值只能用右值引用有些局限&#xff0c;在一些情况下&#xff0c;我们也需要对左值去调用右值引用&#xff0c;从而实现将左值里的内容转移到右值中 标准定义&#xff1a; 功能就是将一个左值强制转化为右值&#xff0c;然后实现移动语义 注意&…

IP地址、子网掩码、网段、网关

前面相同就是在同一个网段 如果子网掩码和网络号相与的结果是一样的&#xff0c;那么他们就在同一个子网 IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?_掩码248可以用几个ip-CSDN博客

CTFshow之RCE代码命令远程执行第29关到第40关详细讲解。一定教会

不在沉默中崛起&#xff0c;便在沉默中变态 --莫迪大仙 引言&#xff1a;最近学习没有头绪&#xff0c;想着把ctf随便刷一刷&#xff0c;过过瘾&#xff0c;试着看能不能每条10到15道题目&#xff0c;并且写下相关的学习记录&#xff0c;持续十天&#xff01;今天是RCE板块29关…

解决 kali 中使用 vulhub 拉取不到镜像问题

由于默认情况下&#xff0c;访问的镜像是国外的&#xff0c;而从 2023 年开始&#xff0c;docker 的镜像网站就一直访问不了&#xff0c;所以我们可以把镜像地址改成国内的阿里云镜像地址。 1、在 cd /etc/docker/目录下创建或修改daemon.json文件 sudo touch daemon.json 2、在…

统计信号处理基础 习题解答10-13

题目&#xff1a; 利用矩阵求逆引理&#xff0c;证明&#xff08;10.32&#xff09;和&#xff08;10.33&#xff09;。提示&#xff1a;首先证明&#xff08;10.33&#xff09;然后利用它来证明&#xff08;10.32&#xff09; 解答&#xff1a; 由&#xff08;10.28&#xf…

【TypeScript】类型兼容(协变、逆变和双向协变)

跟着小满zs 学习 ts&#xff0c;原文&#xff1a;学习TypeScript进阶类型兼容_typescript进阶阶段类型兼容 小满-CSDN博客 类型兼容&#xff0c;就是用于确定一个类型是否能赋值给其他的类型。如果A要兼容B 那么A至少具有B相同的属性。 // 主类型 interface A {name: string,a…

LVS-DR模式详解:提升网站性能的最佳解决方案

LVS-DR模式原理 用户请求到达Director Server&#xff1a; 用户请求到达Director Server&#xff08;负载均衡服务器&#xff09;&#xff0c;数据包首先到达内核空间的PREROUTING链。数据包源IP&#xff1a;CIP&#xff0c;目标IP&#xff1a;VIP&#xff0c;源MAC&#xff1a…

JProfiler 性能分析案列——基于 dump.hprof 堆内存快照文件分析排查内存溢出

在 windows 环境下实现。 一、配置 JVM 参数 配置两个 JVM 参数&#xff1a; -XX:HeapDumpOnOutOfMemoryError&#xff0c;配置这个参数&#xff0c;会在发生内存溢出时 dump 生成内存快照文件&#xff08;xxx.hprof&#xff09;-XX:HeapDumpPathF:\logs&#xff0c;指定生成…

LVS负载均衡:理解IPVS和IPVSADM的内部工作原理

LVS 负载均衡工作模式 LVS&#xff08;Linux Virtual Server&#xff09; 共有三种工作模式&#xff1a;DR、Tunnel、NAT。 DR&#xff08;Direct Routing&#xff09;&#xff1a; 技术原理&#xff1a;DR模式下&#xff0c;LVS调度器接收到请求后&#xff0c;直接通过MAC地址…

个人网站制作 Part 26 添加在线日历功能 | Web开发项目添加页面缓存

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加在线日历功能&#x1f528;使用日历服务&#x1f527;步骤 1: 选择日历服务&#x1f527;步骤 2: 安装FullCalendar&#x1f527;步骤 3: 创建FullCalendar组件&…

基于微信小程序的童书购买系统的设计与实现

基于微信小程序的童书购买系统的设计与实现 摘 要 《“十三五”规划》第一次把“保障妇女、未成年人、残疾人的基本权利”作为重要内容&#xff0c;充分体现了党和国家对广大人民群众的关心&#xff0c;为广大人民群众营造了良好的学习氛围&#xff0c;并出台多项文件及政策&…