#gstreamer #audio-video #video-stream #meet #pipeline #jitsi #element

lib-gst-meet

将GStreamer管道连接到Jitsi Meet会议

10个版本 (破坏性)

0.8.0 2023年6月17日
0.7.0 2023年1月6日
0.6.0 2022年3月9日
0.5.0 2022年3月7日
0.1.0 2021年8月13日

#282 in 视频

Download history 5/week @ 2024-03-10 26/week @ 2024-03-31 1/week @ 2024-04-07

每月下载 69
gst-meet 中使用

MIT/Apache

195KB
4.5K SLoC

gst-meet: 将Jitsi Meet会议与GStreamer管道集成

注意:gst-meet处于 alpha 阶段,正在积极开发中。命令行选项和lib-gst-meet API可能会更改。

gst-meet提供了一组库和工具,用于将Jitsi Meet会议与GStreamer管道集成。您可以作为参与者将音频和视频输入到会议中,并将其他参与者的音频和视频流输出。

感谢GStreamer的灵活性和广泛的插件,这为许多新的可能性打开了大门。

依赖关系

  • gstreamer 1.22
  • gst-plugins-goodgst-plugins-bad(与gstreamer相同版本)以及您在管道中想要使用的任何其他插件
  • glib
  • libnice

构建

  • pkg-config
  • Rust工具链(rustup是安装的最简单方式)

从源码构建

安装上述依赖项,以及它们(如果您的发行版使用)的-dev包。

检出仓库,然后使用cargo进行构建

cargo build --release

gst-meet二进制文件可在target/release中找到。

从crates.io安装

目前建议从该仓库构建gst-meet,而不是使用cargo install来安装crates.io上发布的版本。一旦发布minidom的固定版本,我们将向crates.io发布新版本。

cargo install --force gst-meet

--force如果已安装,将升级gst-meet。)

Docker

提供了一个 Dockerfile,它生成一个包含 gst-meet 的 Alpine 3.18.0 镜像,该镜像安装在 /usr/local/bin

Nix

对于 Nix 用户,提供了一个 shell.nix。在仓库内部,运行 nix-shell --pure 来获取一个带有访问所有必需依赖项(其他什么都没有)的 shell。然后使用 cargo build --release 继续操作。

要将 gst-meet 集成到您的应用程序中,请添加对 lib-gst-meet 的 Cargo 依赖项。

使用方法

您可以将 GStreamer 管道片段传递给 gst-meet 工具。

--send-pipeline 用于发送音频和视频。如果其中包含名为 audio 的元素,则此音频将流式传输到会议。音频编解码器必须是 48kHz Opus。如果其中包含名为 video 的元素,则此视频将流式传输到会议。视频编解码器必须与传递给 --video-codec 的编解码器匹配,默认为 VP9。

--recv-pipeline 用于接收音频和视频,如果您想一个管道处理所有参与者。如果其中包含名为 audio 的元素,则为每个新参与者请求该元素上的一个接收垫,并解码音频发送到该垫。类似地,如果其中包含名为 video 的元素,则要求该元素上每个新参与者有一个接收垫,并将解码并缩放的视频发送到该垫。

--recv-pipeline-participant-template 用于接收音频和视频,如果您想为每个参与者使用单独的管道。此管道将为会议中的每个其他参与者创建一次。如果其中包含名为 audio 的元素,则参与者的解码音频将发送到该元素。如果其中包含名为 video 的元素,则参与者的解码和缩放视频将发送到该元素。字符串 {jid}{jid_user}{participant_id}{nick} 分别替换为参与者的完整 JID、用户部分、MUC JID 资源部分(也称为参与者/占用 ID)和昵称。

您可以使用 --recv-pipeline--recv-pipeline-participant-template 一起使用,例如,使用单个 audiomixer 元素处理所有音频,但分别处理每个视频流。如果在 --recv-pipeline--recv-pipeline-participant-template 中都找到 audiovideo 元素,则使用 --recv-pipeline 中的元素。

示例

以下是一些 gst-meet 使用示例。GStreamer 参考提供了有关可用管道元素的完整详细信息。

gst-meet --help 列出了完整的用法信息。

将 Opus 音频文件流式传输到会议。这非常高效;文件中的 Opus 数据直接流式传输,无需转码。

gst-meet --web-socket-url=wss://your.jitsi.domain/xmpp-websocket \
         --room-name=roomname \
         --send-pipeline="filesrc location=sample.opus ! queue ! oggdemux name=audio"

将 FLAC 音频文件流式传输到会议,将其转码为 Opus。

gst-meet --web-socket-url=wss://your.jitsi.domain/xmpp-websocket \
         --room-name=roomname \
         --send-pipeline="filesrc location=shake-it-off.flac ! queue ! flacdec ! audioconvert ! audioresample ! opusenc name=audio"

将包含VP9视频和Vorbis音频的.webm文件流式传输到会议。该管道通过VP9流高效传输,无需转码,并将音频从Vorbis转码为Opus

gst-meet --web-socket-url=wss://your.jitsi.domain/xmpp-websocket \
         --room-name=roomname \
         --send-pipeline="filesrc location=big-buck-bunny_trailer.webm ! queue ! matroskademux name=demuxer
                          demuxer.video_0 ! queue name=video
                          demuxer.audio_0 ! queue ! vorbisdec ! audioconvert ! audioresample ! opusenc name=audio"

将默认的视频和音频输入流式传输到会议,编码为VP9和Opus,显示最多两个远程参与者的视频流,每个视频流以360p并列显示,并播放所有传入音频的混合(一个非常基本但完全原生的Jitsi Meet会议!)

gst-meet --web-socket-url=wss://your.jitsi.domain/xmpp-websocket \
         --room-name=roomname \
         --recv-video-scale-width=640 \
         --recv-video-scale-height=360 \
         --send-pipeline="autovideosrc ! queue ! videoscale ! video/x-raw,width=640,height=360 ! videoconvert ! vp9enc buffer-size=1000 deadline=1 name=video
                          autoaudiosrc ! queue ! audioconvert ! audioresample ! opusenc name=audio" \
         --recv-pipeline="audiomixer name=audio ! autoaudiosink
                          compositor name=video sink_1::xpos=640 ! autovideosink"

为每个其他参与者录制一个.webm文件,包含VP9视频和Opus音频

gst-meet --web-socket-url=wss://your.jitsi.domain/xmpp-websocket \
         --room-name=roomname \
         --video-codec=vp9 \
         --recv-pipeline-participant-template="webmmux name=muxer ! queue ! filesink location={participant_id}.webm
                                               opusenc name=audio ! muxer.audio_0
                                               vp9enc name=video ! muxer.video_0"

功能标志

默认情况下,使用带有系统原生根证书的rustls TLS库。可以通过向Cargo传递--no-default-features来关闭此功能,并启用以下功能之一

tls-rustls-native-roots  use rustls for TLS with the system's native root certificates (the default)
tls-rustls-webpki-roots  use rustls for TLS and bundle webpki's root certificates
tls-native               link to the system native TLS library
tls-native-vendored      automatically build a copy of OpenSSL and statically link to it

使用tls-insecure功能构建添加了--tls-insecure命令行标志,该标志禁用证书验证。请谨慎使用。

tls-*标志仅影响用于WebSocket连接(到XMPP服务器和到JVB)的TLS库。Gstreamer使用其自己的TLS库选择其元素。DTLS-SRTP(媒体流)由Gstreamer处理,并使用自动生成的临时证书,这些证书通过XMPP信令通道进行认证。

使用log-rtp功能添加--log-rtp命令行标志,该标志在DEBUG级别记录每个RTP和RTCP包的信息。

调试

有时很难正确获得GStreamer管道语法和结构。为此,您可以尝试设置GST_DEBUG环境变量(例如,3相当详细,而6会生成大量每包输出)。您还可以将GST_DEBUG_DUMP_DOT_DIR设置为目录的相对路径(该目录必须已存在)。包含管道图的.dot文件将保存到此目录,并可以使用GraphViz中的dot工具转换为.png;例如 dot filename.dot -Tpng > filename.png

许可证

gst-meetlib-gst-meetnicenice-sys受以下任一许可证的许可:

任选其一。

依赖项xmpp-parsers受Mozilla Public License,版本2.0的许可,https://www.mozilla.org/en-US/MPL/2.0/

依赖项gstreamer受GNU Lesser General Public License,版本2.1的许可,https://gnu.ac.cn/licenses/old-licenses/lgpl-2.1.en.html

贡献

欢迎以拉取请求的形式提供任何类型的贡献。

除非您明确声明,否则您根据Apache-2.0许可证定义的贡献,有意提交以包含在这些crate中,将按照上述双重许可,无需任何额外的条款或条件。

致谢

gst-meet的开发由AVStack赞助。我们提供全球分布式的、可扩展的、管理的Jitsi Meet后端。

依赖关系

~28–45MB
~863K SLoC