在过去的几个月里,我们一直在非常努力地开发 W3C WebRTC 规范的 Elixir 实现,现在我们很高兴地正式宣布它的第一个版本 —— ex_webrtc 的 0.1 版本!
但为什么呢?我们在 Elixir 中使用 WebRTC 已经有好几年了,但主要是使用 Membrane Framework 将一些 C 和 Erlang 库粘合在一起,除了一些问题之外,大部分都很好:
- 有时我们需要为底层库做贡献,或者更糟糕的是,维护我们自己的分叉——这很费劲;
- 很难让外部工程师了解我们的代码,因为它与通常的 WebRTC API 完全不同;
- Membrane 的设计非常出色,但我们意识到 WebRTC API 并不能很好地映射到管道模型中,这给一些事情带来了不必要的困难。
考虑到之前的经验和这些问题,我们决定从头开始编写一个(几乎)纯 Elixir、符合 W3C 标准、开源的 WebRTC 实现,并提供整个网络堆栈。我们的目标是为 Elixir 生态系统创建一个与 Pion 或 WebRTC.rs 等项目类似的解决方案。到目前为止,我们的方向是正确的!
在了解 0.1 版的具体内容之前,请查看本快速教程,了解如何使用 Phoenix Framework、Elixir Nx 和 Elixir WebRTC 创建一个 Web 应用程序,根据浏览器的网络摄像头视频馈送执行图像识别!
0.1 版有哪些内容?
第一个版本重点关注三个方面:
- 符合标准的 API;
- 易于与 Elixir 生态系统集成;
- 学习资源。
API
ExWebRTC 尝试与众所周知的 JavaScript API 保持一致,同时又与 Elixir 保持一致。这样做的目的是让熟悉 WebRTC 的人能够轻松上手,但又不影响 Elixir 强大而独特的神奇功能。0.1 版本已经提供了 JavaScript API 中的大部分功能。
例如,JS.NET 中的这段代码:
const pc = new RTCPeerConnection();
const tr = pc.addTransceiver("audio");
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
映射到以下 Elixir 代码:
{:ok, pc} = PeerConnection.start_link()
{:ok, tr} = PeerConnection.add_transceiver(pc, :audio)
{:ok, offer} = PeerConnection.create_offer(pc)
:ok = PeerConnection.set_local_description(pc, offer)
简单集成
Elixir WebRTC 的目标之一是吸引 Elixir 用户,并易于集成到现有的 Elixir 项目中!有鉴于此,我们编写了 ExWebRTC Dashboard —— Phoenix的统计可视化。只需添加 ExWebRTCDashboard 作为 Phoenix LiveDashboard 的附加页面,就能获得与 Chrome 浏览器的 chrome://webrtc-internals 类似的功能。
# add this to your Phoenix app's router.ex
live_dashboard "/dashboard",
additional_pages: [exwebrtc: ExWebRTCDashboard]
了解一些 WebRTC
了解 W3C 规范及其所有怪异之处并非易事。我们花了好几天时间阅读 RFC(我个人最喜欢的是 RFC 8829,是冬日夜晚喝一杯热巧克力的好读物 ☕ ),逆向工程 Chrome 浏览器的实现,并在 webrtc-pc repo 中提出问题(有时是愚蠢的问题)。
我们想把所有这些知识汇集在一起,Mastering Transceivers 指南就是朝着这个方向迈出的第一步。它由一系列示例组成,解释了 WebRTC 收发器的一些技巧和窍门。每个示例都包含 JS(您可以在浏览器中快速运行并进行实验,这一切都要归功于 JS Fiddle!)和 Elixir 代码段,这让您更容易理解浏览器 API 与我们的 API 之间的映射关系。我们希望将来能为 Elixir 代码添加 Livebooks!
下一步是什么?
我们对迄今为止取得的成就感到无比兴奋,对未来的发展更是充满期待!我们对 0.2 版本的计划是
- 添加对服务质量功能的支持,如全传输拥塞控制(WebRTC 信号源,如浏览器,使用它来估算它们能使用多少网络带宽,从而估算媒体的质量)或重传(请记住,WebRTC 通常使用 UDP,而 UDP 是不可靠的);
- 增加对某些 ICE 功能的支持,如 mDNS ICE 候选者(防止私有 IP 地址泄漏)或 TURN 服务器(在某些情况下,无法使用 P2P 连接,TURN 服务器需要转发网络流量);
- 改进 QoL 和性能,修复 Bug(这些 Bug 肯定存在)。
译自:https://blog.swmansion.com/introducing-elixir-webrtc-a37ece4bfca1
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/webrtc/43196.html