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 视频
每月下载 69 次
在 gst-meet 中使用
195KB
4.5K SLoC
gst-meet: 将Jitsi Meet会议与GStreamer管道集成
注意:gst-meet处于 alpha 阶段,正在积极开发中。命令行选项和lib-gst-meet API可能会更改。
gst-meet提供了一组库和工具,用于将Jitsi Meet会议与GStreamer管道集成。您可以作为参与者将音频和视频输入到会议中,并将其他参与者的音频和视频流输出。
感谢GStreamer的灵活性和广泛的插件,这为许多新的可能性打开了大门。
依赖关系
gstreamer
1.22gst-plugins-good
、gst-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
中都找到 audio
或 video
元素,则使用 --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-meet
、lib-gst-meet
、nice
和nice-sys
受以下任一许可证的许可:
- Apache License,版本2.0,(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
依赖项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