我在OCI上尝试运行WebRTC(SFU格式)

WebRTC是什么

    • Web Real-Time Communicationの略

 

    • リアルタイム通信のためのオープンソースプロジェクト&規格

Googleが2011年からオープンソース化して開発
2021年にW3C、IETFにて標準規格となる

動画ライブ配信で良く使われている
全主要ブラウザがサポート(Apple, Google, MS, Mozilla, Opera, etc.)
OSSも数多くありバックエンド開発が容易な環境が揃っている

我们在WebRTC中采用了SFU(Selective Forwarding Unit)格式,并且使用了LiveKit这个丰富的开源软件来在OCI上运行。
https://livekit.io/
https://docs.livekit.io/concepts/livekit-sfu/
*此软件的许可证是Apache License 2.0。

OCI提供了每月免费10TB的数据传输成本,非常适用于像WebRTC这样数据传输量大的工作负载。

OCI的环境建设

首先,作为最简单的配置,我们会在一个虚拟机(IaaS)上构建。我们将在一个虚拟机上同时运行sfu服务器和web应用程序。

VCN
短文中的VCN

vcn.jpg
egress.jpg

虚拟机 jī)

vm.jpg

如果操作系统中的每个端口都被防火墙阻止,那么需要将其开放。LiveKit在使用的端口如下所示:
https://docs.livekit.io/oss/deployment/vm/#firewall

更改操作系统上的防火墙设置。
https://docs.livekit.io/oss/deployment/vm/#instance-firewall

sudo firewall-cmd --list-all
sudo firewall-cmd --zone=public --permanent --add-port=80/tcp
sudo firewall-cmd --zone=public --permanent --add-port=443/tcp
sudo firewall-cmd --zone=public --permanent --add-port=7881/tcp
sudo firewall-cmd --zone=public --permanent --add-port=443/udp
sudo firewall-cmd --zone=public --permanent --add-port=50000-60000/udp
sudo firewall-cmd --reload

负载均衡器 hé qì)

由于它是一个单一节点,因此在演示功能上不需要,但为了域名设置,我们将配置一个灵活的负载均衡器。
※灵活的负载均衡器↓

lb.jpg
listener.jpg
lb_domain.jpg

DNS(域名系统)

dns.jpg

搭建LiveKit环境

只需要一个选项,将以下内容用中文进行本地化改写:SFU服务器。

你可以通过以下的 GitHub 上的步骤来执行。
https://github.com/livekit/livekit

总而言之,对于Linux系统,您可以通过使用SSH登录到上面创建的虚拟机,然后使用以下命令进行安装。

curl -sSL https://get.livekit.io | bash

如果处于开发模式,您可以使用以下方式启动。

livekit-server --dev

在启动时创建config.yaml文件。
※本次将关闭redis和turn功能。

port: 7880
log_level: info
rtc:
  tcp_port: 7881
  port_range_start: 50000
  port_range_end: 60000
  # use_external_ip should be set to true for most cloud environments where
  # the host has a public IP address, but is not exposed to the process.
  # LiveKit will attempt to use STUN to discover the true IP, and advertise
  # that IP with its clients
  use_external_ip: true
redis:
  # redis is recommended for production deploys
  # address: my-redis-server.name:6379
keys:
  # key value pairs
  # your_api_key: <api_secret>
  devkey: secret
# when enabled, LiveKit will expose prometheus metrics on :6789/metrics
#prometheus_port: 6789
turn:
  enabled: false
  # domain must match tls certificate
  domain: <turn.myhost.com>
  # defaults to 3478. If not using a load balancer, must be set to 443.
  tls_port: 3478

使用指定的yaml配置,在开发模式下启动LiveKit服务器。

livekit-server --dev --config /home/opc/config.yaml --bind 0.0.0.0 

发行代币的应用程序编程接口(API)。

要参与实时视频流媒体传输,需要指定以房间和用户名为键的访问令牌。在开发模式下,您可以使用下面的命令行界面(CLI),安装LiveKit并在服务器端分发它。

livekit-cli create-token \
    --api-key devkey --api-secret secret \
    --join --room my-first-room --identity user1 \
    --valid-for 24h

这次的演示中,我们创建了一个简单的 API,用于使用户能够动态从演示应用程序中获取访问令牌,我们使用了 LiveKit 服务器 SDK。SDK 支持几乎所有主流语言,但本次我们使用了 TypeScript(JavaScript)。具体的代码请查看 https://github.com/livekit/server-sdk-js。

    • 固定ルーム名(roomname)

 

    • ユーザ名をランダム文字列

 

    • ポート5000使用

 

    とするスクリプトです。
import * as http from "http";
import { AccessToken } from 'livekit-server-sdk';

const port = 5000;
const roomName = 'my-first-room';

const server = http.createServer(
  (request, response) => {

    response.setHeader("Access-Control-Allow-Origin", "*");
    const participantName = Math.random().toString(32).substring(2);
    // console.log("name=" + participantName);
    const at = new AccessToken('devkey', 'secret', {
      identity: participantName,
    });
    at.addGrant({ roomJoin: true, room: roomName });
    const token = at.toJwt();
    response.end(token);
  }
);
server.listen(port);

使用ts-node启动。

ts-node token/createToken.ts

直播工具示范应用

以下是公开发布的链接:
https://github.com/livekit/components-js

※请注意此次构建的方式如下:
https://github.com/livekit/livekit-react

展示屏幕

demo2.jpg

最后

我使用了WebRTC的开源软件LiveKit,在OCI上运行了一个SFU服务器。
通过使用开源软件,我可以轻松地在云服务器上搭建实时直播服务。
我们将在未来进行基于kubernates和redis的WebRTC功能验证。

广告
将在 10 秒后关闭
bannerAds