#video-stream #audio-video #meet #elements #gstreamer #jitsi #xmpp

jitsi-xmpp-parsers

为Jitsi Meet提供非标准XMPP元素的类型

6个版本

0.2.0 2023年6月17日
0.1.4 2022年9月8日
0.1.1 2022年8月22日
0.1.0 2022年3月7日

#162视频


4 个crates中使用(3个直接使用)

MPL-2.0 许可协议

55KB
1K 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 安装在 /usr/local/bin 的 Alpine 3.18.0镜像。

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库。可以通过将--no-default-features传递给Cargo来关闭此功能,并启用以下功能之一

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, Version 2.0许可,https://www.mozilla.org/en-US/MPL/2.0/

依赖项gstreamer根据GNU Lesser General Public License, Version 2.1许可,https://gnu.ac.cn/licenses/old-licenses/lgpl-2.1.en.html

贡献

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

除非您明确表示,否则根据Apache-2.0许可证定义的任何有意提交以包含在这些crate中的贡献,均应根据上述方式双许可,不附加任何额外条款或条件。

致谢

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

依赖项

~4.5MB
~69K SLoC