使用 MediaMTX 探索视频流:视频流初学者之旅

本文将分享我进入视频流媒体世界的心路历程——我发现,这个领域就像一片海洋,有数不清的方法和组件需要驾驭。我的目标是带领大家了解我所尝试过的方法,并让大家了解我所使用的基本结构。由于这是我的第一篇文章,所以不要期待我有多么精炼的叙述,这更多的是我探索和学习的真实记录。

我带着一个粗略的想法和一个要解决的问题开始了这段旅程:了解视频流如何在本地网络中工作。当时,我对如何在云中实现这一过程知之甚少。在探索过程中,我发现了开源流媒体服务器 MediaMTX。我发现它的资源库信息量非常大,它成为我学习和实验的基础。

MediaMTX 地址:https://github.com/bluenviron/mediamtx。

基本设置

开始设置 MediaMTX 服务器时,发现设置非常简单。通过提取 Docker 镜像并在我的 Docker Desktop 上运行,我很快就启动并运行了服务器。

现在,让我们来看看基本的视频流设置。

使用 MediaMTX 探索视频流:视频流初学者之旅
视频流设置

在简单的视频流设置中,有三个主要组件:

  • Source:这可以是你的电脑摄像头、闭路电视摄像头、无人机摄像头或任何提供视频源的设备。
  • Video Streaming Server:该服务器负责管理视频源——从采集到传送到各个客户端。虽然这背后还有更多复杂的工作,但我们还是先从最基本的开始吧。
  • Client:客户端可以是Web应用程序、视频管理系统(VMS)或任何其他想要查看源视频流的实体。

乍一看,这种设置似乎简单易懂。但是,随着规模的扩大或系统要求的复杂化,情况就会变得越来越复杂。

除组件外,该流程的一个重要方面是数据摄取和摄取过程中的数据流。这种通信涉及多种协议,如 WebRTC、RTSP、HLS 等。

回到我的探索…

随着 MediaMTX 服务器的启动和运行,我需要使用 FFmpeg 来获取流媒体源。只需一个命令即可轻松安装 FFmpeg:

brew install ffmpeg

(补充一下:我使用的是 macOS。)

使用以下命令启动流:

ffmpeg -f avfoundation -framerate 30 -video_size 1280x720 -i “0” -c:v libx264 -preset ultrafast -f hls -hls_time 2 -hls_list_size 3 -hls_flags delete_segments+append_list+omit_endlist stream.m3u8

在深入研究服务器的使用之前,我想确保 FFmpeg 能正常运行。为此,我使用 Python 启动了一个基本的 HTTP 服务器,以检查 FFmpeg 正在生成的数据流:

python3 -m http.server 8000

接下来,我想在 Angular 应用程序中查看我的数据流。于是,我用几个组件创建了一个基本的 Angular 项目。通过在组件的视频标签中输入流的来源,我能够看到来自笔记本电脑摄像头的视频流。虽然这是一个很好的起点,但设置的延迟为 25-30 秒,对于视频流应用程序来说,这个延迟相当高。

该设置是通过 HLS 协议运行的,因此延迟并不令人意外。此外,它只能在 Safari 中运行。要在 Chrome 或 Firefox 中运行,我需要使用 video.js 或 hls.js 等库。

高级设置

接下来,我想探索使用 RTSP(实时流媒体协议)进行低延迟流媒体传输。要从源(在本例中是我的 PC 摄像头)捕获流并将其发布到 MediaMTX 服务器,我有几个选项可供选择:

  1. FFmpeg
  2. OBS Studio
  3. GStreamer
  4. VLC Player

我决定使用 GStreamer,因为我在 FFmpeg 设置中遇到了一些问题,并且不想安装 OBS Studio 或 VLC Player 等其他应用程序。安装 GStreamer 后,我使用以下命令开始流式传输:

gst-launch-1.0 autovideosrc ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=ultrafast ! h264parse ! rtspclientsink location=rtsp://localhost:8554/mystream

运行该命令后,我看到流正在向 MediaMTX 服务器推送帧。不过,我在 MediaMTX 服务器端遇到了一个与访问相关的错误。为了解决这个问题,我需要在 MediaMTX 服务器的配置文件中添加流名称(本例中为 mystream),并允许其发布。下面是我修改配置的过程:

.
.
paths:
  mystream:
    source: publisher
    record: true
.
.

完成后,日志确认 MediaMTX 服务器可以正常接收流。为了验证流,我订阅了 RTSP 流,并使用 ffplay 命令观看:

ffplay rtsp://localhost:8554/mystream

通过这种设置,我观察到视频流的延迟仅为 2-3 秒。不过,由于 RTSP 流无法在 Angular 应用程序中直接订阅(据我研究),我需要将其转换为另一种格式,如 HLS 或 MPEG-DASH。

但后来,我在 MediaMTX 文档中发现了一些有趣的东西:服务器开箱即支持多种协议(SRT、WebRTC、RTSP、RTMP、HLS),无需任何转换。

我决定使用 WebRTC 从服务器检索流。

在我的 Angular 应用程序中,我使用 video.js 捕捉 WebRTC 流并将其显示在我的托管应用程序上。通过这种最终设置,我可以实现不到一秒的延迟。

下面是最终设置的样子:

使用 MediaMTX 探索视频流:视频流初学者之旅
使用 WebRTC 进行高级设置,实现低延迟流式传输

探索选项

我想重申的是,根据我的经验,建立视频流解决方案主要是在各种组件和协议之间进行权衡,以找到最适合您特定需求的方案。我的选择是出于好奇和娱乐,所以我没有深入比较不同的协议和组件。

为了给您一个更广阔的视角,下面的图表展示了我遇到的一些软件、协议、插件和库。这些只是构建视频流设置的众多选择中的一小部分:

使用 MediaMTX 探索视频流:视频流初学者之旅
视频流的软件、协议和库概述

视频流是一个迷人而复杂的领域,有各种各样的工具和技术可供探索。我在使用 MediaMTX 和相关组件的过程中既充满挑战又收获颇丰,希望本文能为您的项目提供一些有用的见解和灵感。

作者:Rajat Singh

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/51581.html

(0)

相关推荐

发表回复

登录后才能评论