7 个稳定版本

1.2.2 2024年6月20日
1.2.1 2023年9月4日
1.2.0 2023年8月25日

#46视频

Apache-2.0AGPL-3.0-only

80KB
1.5K SLoC

SRT 到 WHEP

此应用程序接受一个通过 SRT 流的 MPEG-TS,并使用 WHEP 作为信令协议输出到 WebRTC recvonly 客户端。用例示例

  • 基于浏览器的传入流的信心监控器
  • 在浏览器或平板电脑中的程序或预览输出监控器

支持呼叫者和监听者模式下的 SRT 流。在 MacOS 和 Ubuntu 上运行。

screenshot

设计原则

在构思此项目时,我们做出了有意识的设计选择,以使其功能和行为与我们的愿景保持一致

  • 无视频转码:我们有意在此组件中避免实现视频转码。这一决定源于保持原始视频流完整性的愿望。这种方法适用于信心监控或预览等用例。如果您无论如何想要转码视频,这里有一个示例
  • 服务器端发起模式:我们的项目目前不支持 WebRTC-HTTP 输出协议 (WHEP) 的客户端发起模式。相反,我们采用了服务器端发起方法。在此模式下,服务器提供 SDP 提供者,因为它了解可用的流。
  • 关注 SDP 提供者/应答交换:我们的服务器主要关注 SDP(会话描述协议)提供者和应答的交换。虽然 WebRTC 通常涉及 ICE(交互式连接建立)协商以建立点对点连接,但我们目前没有在项目中包括 ICE 协商。我们仍然强调 SDP 相关信息的有效交换。

合规性表

这里有一份支持的生产软件列表。

源类型 支持 详情
FFMpeg 一个完整的、跨平台的音频和视频录制、转换和流式传输解决方案
OBS 免费的开源视频录制和直播软件
GStreamer 一个基于管道的多媒体框架
Agile Live 一个基于软件的平台,使用标准、现成的硬件和数据中心构建块来生产媒体。
Intinor Direkt Intinor Direkt系列是针对互联网直播的编解码器产品线。

开始使用

建议如下

  • Mac用户:遵循我们的综合构建说明,并使用Chrome进行流式传输。
  • Ubuntu用户:可以从中源构建程序或使用Docker运行。两种方法都受支持。

一些有用的命令可以在这里找到。

安装

cargo install srt_whep

# recommended for pretty log viewer (optional)
cargo install bunyan

例如,使用我们的测试src Docker容器生成SRT测试源

docker run --rm -p 1234:1234/udp eyevinntechnology/testsrc

然后,在监听模式下,SRT流(在监听模式下)将在srt://127.0.0.1:1234可用。然后运行srt-whep应用程序

srt-whep -i 127.0.0.1:1234 -o 127.0.0.1:8888 -p 8000 -s caller | bunyan

它将以主叫模式连接到SRT测试流,因为生成的SRT流是监听模式。

WHEP端点在https://127.0.0.1:8000/channel可用。然后您可以使用WHEP播放器播放它。可能的问题在问题中讨论。

如果您没有安装Rust,可以使用Docker Hub上发布的Docker容器镜像

docker run --rm --network host eyevinntechnology/srt-whep \
  -i 127.0.0.1:1234 \
  -o 0.0.0.0:8888 \
  -p 8000 -s caller

请注意,容器需要在主机模式下运行(仅在Linux上受支持)。

从源构建

OSX

要求

  • 已安装XCode命令行工具
  • 从GStreamer网站安装GStreamer 二进制文件
  • 已安装Rust和cargo

请确保已定义以下环境变量

export PATH=$PATH:/Library/Frameworks/GStreamer.framework/Versions/Current/bin
export PKG_CONFIG_PATH=/Library/Frameworks/GStreamer.framework/Versions/Current/lib/pkgconfig
export GST_PLUGIN_PATH=/Library/Frameworks/GStreamer.framework/Versions/Current/lib
export DYLD_FALLBACK_LIBRARY_PATH=$GST_PLUGIN_PATH

使用Cargo构建

cargo check
cargo install bunyan # Optional, for pretty printing of logs
cargo build --release

二进制文件现在可在./target/release/srt-whep中找到。有关如何运行它的说明,请参阅下面。

Debian(bullseye / bookworm)

要求

  • 已安装Rust和cargo

安装GStreamer构建依赖项。

apt-get update
apt-get -y install build-essential \
  curl \
  pkg-config \
  libssl-dev \
  libunwind-dev \
  libgstreamer1.0-dev \
  libgstreamer-plugins-base1.0-dev \
  libgstreamer-plugins-bad1.0-dev \
  gstreamer1.0-plugins-base \
  gstreamer1.0-plugins-good \
  gstreamer1.0-plugins-bad \
  gstreamer1.0-plugins-ugly \
  gstreamer1.0-libav \
  gstreamer1.0-tools \
  gstreamer1.0-x \
  gstreamer1.0-alsa \
  gstreamer1.0-gl \
  gstreamer1.0-gtk3 \
  gstreamer1.0-qt5 \
  gstreamer1.0-pulseaudio \
  gstreamer1.0-nice

使用Cargo构建

cargo check
cargo install bunyan # Optional, for pretty printing of logs
cargo build --release

二进制文件现在可在./target/release/srt-whep中找到。有关如何运行它的说明,请参阅下面。

Docker容器

构建容器(使用多阶段构建)

docker build -t srt-whep:dev .

容器必须在主机模式下运行(仅在Linux主机上工作,不支持Docker Desktop for Mac,Docker Desktop for Windows)

docker run --rm --network host srt-whep:dev \
  -i <SRT_SOURCE_IP>:<SRT_SOURCE_PORT> \
  -o 0.0.0.0:8888 \
  -p 8000 -s caller

用法

要使用地址srt://127.0.0.1:1234在监听模式下摄取SRT流,并在端口8000上公开WHEP端点,请使用此命令运行应用程序。

cargo run --release -- -i 127.0.0.1:1234 -o 127.0.0.1:8888 -p 8000 -s caller | bunyan

这将也在srt://127.0.0.1:8888在监听模式下进行SRT流的直通。要在ffplay,VLC或GStreamer中查看直通流,请运行

ffplay srt://127.0.0.1:8888
# or
gst-launch-1.0 playbin uri="srt://127.0.0.1:8888"

WHEP端点现在在https://127.0.0.1:8000/channel可用。然后您可以使用WHEP播放器播放它。

如果要摄取的SRT流是主叫模式,请使用此命令运行应用程序。

cargo run --release -- -i 127.0.0.1:1234 -o 127.0.0.1:8888 -p 8000 -s listener | bunyan

这也要求SRT地址127.0.01:8888在主叫模式下运行。

成功流式的技巧

当与SRT流一起工作时,有几个重要考虑因素可能会影响您流式传输体验的成功

  1. 流生成和回放工具
  • 可以使用不同的工具,如FFmpeg,GStreamer,FFPlay和VLC,来生成和播放SRT流。我们已测试了我们的程序与这些工具一起使用,因此您可以选择满足您需求的一个。
  • 请注意SRT流配置中的模式选项,它可以设置为callerlistenerrendezvous。此选项决定了流的运行行为,并且需要正确配置以实现成功的流传输。
  1. FFmpeg流中的比特率参数
  • 使用FFmpeg生成流时,指定比特率参数至关重要。如果不这样做,可能会导致VLC/GStreamer无法播放该流。
  1. 视频编解码器和配置文件
  • WebRTC连接失败通常可以归因于不兼容的视频编解码器。虽然我们努力支持H.264 (AVC)和H.265 (HEVC)流,但重要的是要注意,大多数主流浏览器只支持AVC用于WebRTC。
  • Safari是唯一支持H.265的浏览器,它有自己的RTP有效载荷格式和自定义视频配置文件要求,与标准(《RFC 7798》)不同。因此,它不能直接使用。有一个PR可以修复WebKit项目中这个H265分片问题,但目前没有人查看它。
  • 根据讨论,目前支持H.265 / HEVC似乎相当具有挑战性。
  1. 编解码器和配置文件兼容性
  • H.264的基准、主和高级配置文件等视频配置文件在流兼容性中起着至关重要的作用。虽然Chrome支持所有配置文件,但Safari只接受基准配置文件。有关更多详细信息,请参阅此表
  1. SRT流延迟
  • SRT流可以配置为具有不同的延迟。例如,如果您使用GStreamer生成SRT流,可以将srtsinksrtsrc的延迟参数设置为满足您的需求。例如,latency=200将延迟设置为200ms,这对于大多数用例是合适的。
  • 我们的工具默认为流添加最小延迟。如果您想测量端到端延迟,可以尝试使用带有时钟覆盖层(添加非常低的延迟)的OBS生成流。然后,您可以将流中的时钟与我们的WHEP播放器内置的时钟进行比较。端到端延迟应在300~500毫秒左右。

讨论和问题

所有相关讨论都记录在问题中。如果您有任何问题,请随时提出新问题。

  • 我们记录了一套已知限制在此。如果您遇到问题,建议您查看。
  • 如果您怀疑gstreamer中缺少插件,可以使用gst-inspect-1.0 <plugin>进行检查。例如,gst-inspect-1.0 srtsink
  • 要获取更多详细的日志,可以将环境变量GST_DEBUG设置为2。例如,在终端中运行:export GST_DEBUG=2

许可协议(Apache-2.0)

版权所有 2023 Eyevinn Technology AB

根据Apache License,版本2.0(“许可证”);除非遵守许可证,否则不得使用此文件。您可以在以下位置获得许可证副本:

http://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则根据许可证分发的软件是以“原样”为基础分发的,不提供任何形式的保证或条件,无论是明示的还是暗示的。有关许可证的特定语言,请参阅许可证。

支持

加入我们在Slack上的社区,您可以在那里发布关于我们任何开源项目的任何问题。Eyevinn的咨询业务还可以为您提供以下服务:

  • 此组件的进一步开发
  • 将此组件定制并集成到您的平台中
  • 支持和维护协议

如果您感兴趣,请联系[email protected]

关于Eyevinn技术

Eyevinn技术是一家专注于视频和流媒体的独立咨询公司。独立的方式是我们不与任何平台或技术供应商有商业联系。

在Eyevinn,每位软件开发咨询顾问都有一笔专用于开源开发和向开源社区贡献的专项资金。这为我们提供了创新、团队建设和个人能力发展的空间。这也为我们公司提供了一种回馈开源社区的方式。

想了解更多关于Eyevinn以及在这里工作的感受吗?请通过[email protected]联系我们!

依赖关系

~50–67MB
~1.5M SLoC