FAQ

Sora JavaScript SDK のサンプルについて

Sora JavaScript SDK のサンプル

Sora の機能を一通り確認できるサンプルです。

https://github.com/shiguredo/sora-js-sdk/tree/develop/examples

Sora JavaScript SDK ドキュメントのサンプル

Sora JavaScript SDK の解説を目的としたサンプルです。

サンプル

WebRTC API

Sora JavaScript SDK には Sora との接続部分の機能のみを提供しています。

そのため、映像や音声、データなどを実際に処理する場合はすべて JavaScript の WebRTC API やライブラリなどを利用する必要があります。

WebRTC API - Web API | MDN

解像度を変更するにはどうしたらいいですか?

解像度の変更は getUserMediagetDisplayMedia API 側で行ってください。

背景をぼかすにはどうしたらいいですか?

時雨堂がオープンソースとして公開している @shiguredo/virtual-background - npm を利用することで簡単にブラウザで背景ぼかし機能を利用可能です。

以下で動作確認が可能です。 https://shiguredo.github.io/media-processors/examples/virtual-background.html

ライトを調整はできますか?

時雨堂がオープンソースとして公開している @shiguredo/light-adjustment - npm を利用することで簡単にブラウザでライト調整機能を利用可能です。

以下で動作確認が可能です。 https://shiguredo.github.io/media-processors/examples/light-adjustment.html

ノイズを抑制できますか?

時雨堂がオープンソースとして公開している @shiguredo/noise-suppression - npm を利用することで簡単にブラウザでノイズ抑制機能を利用可能です。

以下で動作確認が可能です。 https://shiguredo.github.io/media-processors/examples/noise-suppression.html

音声でステレオは利用できますか?

WebRTC の Opus はデフォルトで 2 チャンネル利用するためステレオに対応しています。

ただし、ステレオ音声を利用する場合はデフォルトで有効になっているエコーキャンセルを無効にする必要があります。

https://www.w3.org/TR/mediacapture-streams/#dom-mediatracksupportedconstraints-echocancellation

画面キャプチャはできますか?

MediaDevices.getDisplayMedia() を利用して画面のストリームを取得してください。

カメラを切り替えられますか?

トラックを切り替えたい場合は RTCRtpSender.replaceTrack() を利用して既存のトラックと置き換えを行ってください。

音声をミュートにできますか?

Sora JavaScript SDK はトラックのミュートは行いません。

トラックのミュートを行いたい場合は MediaStreamTrack.enabled を利用して、ミュートを行ってください。

Electron で利用したいです

Sora JavaScript SDK は Electron でも利用可能です。

MediaStreamTrack から MediaStream の ID を取得したいです

MediaStreamTrack から MediaStream の ID は取得できません。 そのため、もし取得したい場合は何かしらの方法で ID を保持しておく必要があります。

ただし removetrack コールバックは MediaStream が発火させるため event.target で発火した MediaStream を取得可能です。

MediaStream: removetrack event - Web APIs | MDN

CPU や帯域による解像度やフレームレートの制限を無効にしたいです

無効にできません。

ブラウザで CPU 負荷が高まったと判断して、利用ビットレートを下げたことにより解像度やフレームレートが下がる場合、 Chrome 102 までは googCpuOveruseDetection という設定があり、 false にすることで、判定を無効にできていましたが、 その設定は Chrome 103 にて廃止されました。

仕様

メディアストリームの扱い

Sora JavaScript SDK は音声や映像といったメディアストリームを SDK から扱うことはありません。

そのため音声や映像を扱う場合は MediaDevices.getUserMedia() API や MediaDevices.getDisplayMedia() API を利用し、 アプリケーション開発者がメディアストリームを取得し、Sora JavaScript SDK に渡す必要があります。

マルチトラック

Sora JavaScript SDK が配信可能なディアストリームは 1 本で 1 音声トラック、1 映像トラックとなります。 これは Sora の仕様になります。

そのため、マルチトラックには対応しておりません。

もし複数の音声や映像を 1 クライアントで配信したい場合は複数のコネクションを張るようにしてください。

"type": "answer" の SDP 書き換えは SDK の挙動に影響はありますか?

Sora JS SDK では createAnswer が生成した SDP をそのまま利用するようにしています。 そのため、書き換え処理で SDK 側には基本的に影響することはありません。

もし SDP 書き換えをを行う場合は "type": "answer" だけでなく、 "type": "re-answer" も書き換えるようにしてください。

注釈

WebRTC API を利用せずに手動で SDP を変更する処理を "SDP Munging" と呼びます。

Sora への影響については Sora または Sora Cloud のサポートまでご連絡ください。

シグナリング

Sora との接続が完了したことを通知するコールバックはありますか?

Sora JavaScript SDK には Sora との接続完了を通知するには、 Sora のシグナリング通知機能を利用してください。

シグナリング通知機能の connection.createdconnection_id を利用してください。

// 色々省略
     const sendrecv = soraConnection.sendrecv(channelId, metadata, options);
     await sendrecv.connect(stream);

     // シグナリング通知
     sendrecv.on("notify", (event: SignalingNotifyMessage) => {
             console.log("notify", event.event_type);
             if (
      // connection.created が Sora とクライアントの間で WebRTC が確立した事を通知しています
                     event.event_type === "connection.created" &&
                     // 自分の connection_id と一致
                     sendrecv.connectionId === event.connection_id
             ) {
                     // 接続が成功
                     console.log("self-connection_id: ", event.connection_id);
             }

   // 自分以外の参加者の connection_id の取得
             if (event.event_type === "connection.created") {
                     console.log("connection_id", event.connection_id);
             }
     });

データチャネルメッセージング

maxPacketLifeTime や maxRetransmits が設定できません

Sora のシグナリング仕様では snake_case での指定ですが、 Sora JavaScript SDK では camelCase での指定となります。

const options = {
   multistream: true,
   dataChannelSignaling: true,
   dataChannels: [
      {
      label: "#example",
      direction: "sendrecv" as DataChannelDirection,
      maxPacketLifeTime: 60000,
      },
   ],
};
const options = {
   multistream: true,
   dataChannelSignaling: true,
   dataChannels: [
      {
      label: "#example",
      direction: "sendrecv" as DataChannelDirection,
      maxRetransmits: 0,
      },
   ],
};
© Copyright 2023, Shiguredo Inc. Created using Sphinx 7.2.6