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个直接使用)
55KB
1K 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
安装在 /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
中找到相同的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库。可以通过将--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-meet
、lib-gst-meet
、nice
和nice-sys
根据您的选择许可为以下之一
- Apache License, Version 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, 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