本文将分享我进入视频流媒体世界的心路历程——我发现,这个领域就像一片海洋,有数不清的方法和组件需要驾驭。我的目标是带领大家了解我所尝试过的方法,并让大家了解我所使用的基本结构。由于这是我的第一篇文章,所以不要期待我有多么精炼的叙述,这更多的是我探索和学习的真实记录。
我带着一个粗略的想法和一个要解决的问题开始了这段旅程:了解视频流如何在本地网络中工作。当时,我对如何在云中实现这一过程知之甚少。在探索过程中,我发现了开源流媒体服务器 MediaMTX。我发现它的资源库信息量非常大,它成为我学习和实验的基础。
MediaMTX 地址:https://github.com/bluenviron/mediamtx。
基本设置
开始设置 MediaMTX 服务器时,发现设置非常简单。通过提取 Docker 镜像并在我的 Docker Desktop 上运行,我很快就启动并运行了服务器。
现在,让我们来看看基本的视频流设置。
在简单的视频流设置中,有三个主要组件:
- 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 服务器,我有几个选项可供选择:
- FFmpeg
- OBS Studio
- GStreamer
- 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 和相关组件的过程中既充满挑战又收获颇丰,希望本文能为您的项目提供一些有用的见解和灵感。
作者:Rajat Singh
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/51581.html