# WebRTC SFU Sora ドキュメント
このドキュメントは WebRTC SFU Sora 2024.2.2 に対応しています。
製品のお問い合わせなどは sora at shiguredo.jp までお願いいたします。
(このメールアドレスへの特定電子メールの送信を拒否いたします)
# LLM 向け
LLM が読み込みやすい形式でドキュメントを提供しています。
- 目次は [llms.txt](/llms.txt) にあります
- 全文は [llms-full.txt](/llms-full.txt) にあります
## 重要なお知らせ
### Safari 18.4 から Safari 18.5 において H.264 または H.265 の録画が正常に行えない問題が発生します
これは Safari の問題で、Sora の問題ではありません。
Safari が H.264 または H.265 の映像を配信する際に、正常なタイムスタンプを生成できない問題が発生しています。
この問題により、Safari で H.264 または H.265 の録画が正常に行われません。
この問題に対応したワークアラウンドを Sora 2024.2.3 で追加しています。
詳細は [Safari タイムスタンプバグに対するワークアラウンド](WORKAROUND.html#e73b7a) をご確認ください。
### 署名アルゴリズムに SHA-1 が利用されている中間証明書をご利用されているお客様へ
Sora 2023.2.0 から 2024.1.0 までは署名アルゴリズムが SHA-1 の中間証明書を利用した場合、
Bad Certificate エラーとして接続が拒否されます。
影響のある機能は下記の機能です。
- ウェブフック機能
- 音声ストリーミング機能
- 統計エクスポーター機能
もし、このエラーがログに出力された場合、 Sora 2024.1.3 をご利用ください。
### Sora RHEL 版の追加料金について
RHEL 9 のフルサポートが終了する 2027 年 6 月 1 日より、Sora RHEL 版をご利用のお客様については、
サポート費用としてライセンス料金に 10% (ただし最大で 10 万円) の料金を上乗せさせていただきます。
#### 料金例
- ライセンス料金が 60 万円の場合は 6 万円
- ライセンス料金が 84 万円の場合は 8.4 万円
- ライセンス料金が 120 万円の場合は 10 万円
- ライセンス料金が 252 万円の場合は 10 万円
RHEL の場合、Ubuntu と比べて維持や Sora の動作検証コストが大きいためで、
ご理解いただきますようお願いいたします。
### レガシー録画機能の廃止について
2023 年 12 月リリースの Sora 2023.2.0 で新しい録画機能を追加しました。
今までの録画機能はレガシー録画機能と名前を変更しました。
**2025 年** 12 月リリース予定の Sora でレガシー録画機能を廃止します。
移行については [レガシー録画機能から新しい録画機能への移行](LEGACY_RECORDING_TO_RECORDING.html) をご確認ください。
廃止については [レガシー録画機能の廃止](DEPRECATED.html#0e8157) をご確認ください。
レガシー録画機能をご利用のお客様は、新しい録画機能へ移行をご検討ください。
機能や移行に関してのご不明点などがあれば、サポートまでお問い合わせください。
### レガシーストリーム(非マルチストリーム)機能の廃止について
2024 年 6 月リリースの Sora 2024.1.0 でレガシーストリーム機能をデフォルトで無効にしました。
**2025 年** 6 月リリース予定の Sora でレガシーストリーム機能を廃止します。
移行については [レガシーストリーム(非マルチストリーム)機能からマルチストリームへの移行](LEGACY_STREAM_TO_MULTISTREAM.html) をご確認ください。
廃止については [レガシーストリーム(非マルチストリーム)機能の廃止](DEPRECATED.html#3923bc) をご確認ください。
レガシーストリーム機能をご利用のお客様は、マルチストリーム機能へ移行をご検討ください。
機能や移行に関してのご不明点などがあれば、サポートまでお問い合わせください。
### Ubuntu 24.04 版の提供開始について
Sora 2024.1.0 から Ubuntu 24.04 版の提供を開始しました。
Ubuntu 24.04 版への切り替えをご希望のお客様はサポートまでご連絡ください。
### Ubuntu 20.04 版の提供終了について
Ubuntu 20.04 は 2025 年 4 月末でサポートが終了となるのに合わせて、Sora の Ubuntu 20.04 版については以下のとおりとなります。
**パッケージの提供**
: 2024 年 6 月のリリースの 2024.1.0、およびその後リリースされる可能性のある 2024.1.x の提供をもって終了
**サポートの終了**
: 2024.1.0 およびおよびその後リリースされる可能性のある 2024.1.x に対しては 2025 年 6 月末で終了
Ubuntu 20.04 版をご利用のお客様は、早めに OS の変更をご検討の上、移行先の OS をサポートまでご連絡下さい。
### CentOS 7 版の提供終了について
CentOS 7 は 2024 年 6 月末でサポートが終了となるのに合わせて、Sora の CentOS 7 版については以下のとおりとなります。
**パッケージの提供**
: 2023 年 12 月にリリースの 2023.2.0、およびその後リリースされる可能性のある 2023.2.x の提供をもって終了
**サポートの終了**
: 2023.2.0 およびおよびその後リリースされる可能性のある 2023.2.x に対しては 2024 年 12 月末で終了
CentOS 7 版をご利用のお客様は、早めに OS の変更をご検討の上、移行先の OS をサポートまでご連絡下さい。
## 古いドキュメントについて
[古いドキュメント](OLD_DOCUMENT.html) をご確認ください。
- [2024.1.x から 2024.2.x への移行](2024_1_TO_2024_2.html)
- [レガシー録画機能から新しい録画機能 (セッション単位) への移行](LEGACY_RECORDING_TO_RECORDING.html)
- [レガシーストリーム(非マルチストリーム)機能からマルチストリーム機能への移行](LEGACY_STREAM_TO_MULTISTREAM.html)
- [リリースノート](RELEASE_NOTE.html)
- [用語集](GLOSSARY.html)
- [既知の問題](KNOWN_ISSUES.html)
- [実験的機能](EXPERIMENTAL.html)
- [非推奨機能](DEPRECATED.html)
- [廃止機能](OBSOLETE.html)
- [FAQ](FAQ.html)
- [トラブルシューティング](TROUBLESHOOTING.html)
- [ワークアラウンド](WORKAROUND.html)
- [Sora が期待どおりに動かない場合、または、動作に問題がある場合](SUPPORT.html)
- [Sora の仕様や使い方に関して質問がある場合](INQUIRY.html)
- [サポートライフサイクル](SUPPORT_LIFECYCLE.html)
- [チュートリアル](TUTORIAL.html)
- [本番稼働に向けて](PRODUCTION.html)
- [ライセンス](LICENSE.html)
- [ログファイル](LOG.html)
- [sora.conf リファレンス](SORA_CONF.html)
- [systemd](SYSTEMD.html)
- [Linux カーネルチューニング](LINUX_KERNEL_TUNING.html)
- [IPv6 での動作について](IPV6.html)
- [メタデータ](METADATA.html)
- [センシティブデータ](SENSITIVE_DATA.html)
- [アプリケーション連携チュートリアル](APP_INTEGRATE_TUTORIAL.html)
- [WebSocket 経由のシグナリング](SIGNALING.html)
- [DataChannel 経由のシグナリング](DATA_CHANNEL_SIGNALING.html)
- [シグナリングの型定義](SIGNALING_TYPE.html)
- [シグナリング通知](SIGNALING_NOTIFY.html)
- [シグナリング通知メタデータ](SIGNALING_NOTIFY_METADATA.html)
- [シグナリング通知メタデータ拡張機能](SIGNALING_NOTIFY_METADATA_EXT.html)
- [Sora クライアント要求仕様](SORA_CLIENT.html)
- [ウェブフック](WEBHOOK.html)
- [認証ウェブフック](AUTH_WEBHOOK.html)
- [認証ウェブフック成功時の払い出し](AUTH_WEBHOOK_RETURN.html)
- [セッションウェブフック](SESSION_WEBHOOK.html)
- [イベントウェブフック](EVENT_WEBHOOK.html)
- [統計ウェブフック](STATS_WEBHOOK.html)
- [ウェブフックの型定義](WEBHOOK_TYPE.html)
- [API](API.html)
- [シグナリング API](API_SIGNALING.html)
- [コネクション API](API_CONNECTION.html)
- [セッション API](API_SESSION.html)
- [サイマルキャスト API](API_SIMULCAST.html)
- [スポットライト API](API_SPOTLIGHT.html)
- [プッシュ API](API_PUSH.html)
- [録画 (セッション単位) API](API_RECORDING.html)
- [統計 API](API_STATS.html)
- [ライセンス API](API_LICENSE.html)
- [モード API](API_MODE.html)
- [転送フィルター API](API_FORWARDING_FILTER.html)
- [音声ストリーミング API](API_AUDIO_STREAMING.html)
- [実験的 API](EXPERIMENTAL_API.html)
- [セッション API](EXPERIMENTAL_API_SESSION.html)
- [シグナリング API](EXPERIMENTAL_API_SIGNALING.html)
- [RTP 転送 API](EXPERIMENTAL_API_RTP_FORWARDING.html)
- [シグナリング通知メタデータ拡張 API](EXPERIMENTAL_API_SIGNALING_NOTIFY_METADATA_EXT.html)
- [RTP ストリーム停止/再開 API](EXPERIMENTAL_API_RTP_STREAM_PAUSE_RESUME.html)
- [統計 API](EXPERIMENTAL_API_STATS.html)
- [RTC 統計情報 API](EXPERIMENTAL_API_RTC_STATS.html)
- [非推奨 API](DEPRECATED_API.html)
- [レガシー録画 API](DEPRECATED_API_LEGACY_RECORDING.html)
- [ユーザーエージェント統計情報 API](DEPRECATED_API_USER_AGENT_STATS.html)
- [廃止 API](OBSOLETE_API.html)
- [テスト API](TEST_API.html)
- [クラスター機能](CLUSTER.html)
- [クラスター機能チュートリアル](CLUSTER_TUTORIAL.html)
- [クラスター機能運用](CLUSTER_OPS.html)
- [クラスター機能録画](CLUSTER_RECORDING.html)
- [クラスター API](API_CLUSTER.html)
- [開発者ツール](DEVTOOLS.html)
- [マルチストリーム機能](MULTISTREAM.html)
- [サイマルキャスト機能](SIMULCAST.html)
- [サイマルキャストマルチコーデック機能](SIMULCAST_MULTICODEC.html)
- [スポットライト機能](SPOTLIGHT.html)
- [OBS Studio WHIP 対応機能](WHIP.html)
- [OBS Studio WHEP 対応機能](WHEP.html)
- [TURN 機能](TURN.html)
- [録画機能 (セッション単位)](RECORDING.html)
- [レガシー録画機能](LEGACY_RECORDING.html)
- [リアルタイムメッセージング機能](MESSAGING.html)
- [ICE コネクションステート機能](ICE_CONNECTION_STATE.html)
- [モード機能](MODE.html)
- [ヘルスチェック機能](OK.html)
- [メディア配信ワーカー機能](MEDIA_PUBLISH_WORKER.html)
- [音声ストリーミング機能](AUDIO_STREAMING.html)
- [転送フィルター機能](FORWARDING_FILTER.html)
- [マルチ転送フィルター機能](MULTI_FORWARDING_FILTER.html)
- [プレイアウト遅延機能](PLAYOUT_DELAY.html)
- [統計エクスポーター機能](STATS_EXPORTER.html)
- [Sora JavaScript (TypeScript) SDK](JS_SDK.html)
- [Sora iOS (Swift) SDK](IOS_SDK.html)
- [Sora Android (Kotlin) SDK](ANDROID_SDK.html)
- [Sora Unity (C++) SDK](UNITY_SDK.html)
- [Sora C++ SDK](CPP_SDK.html)
- [Sora Python (C++) SDK](PYTHON_SDK.html)
- [Sora C (C++) SDK ](C_SDK.html)
- [WebRTC 負荷試験ツール Zakuro](ZAKURO.html)
- [WebRTC 録画合成ツール Hisui](HISUI.html)
- [WebRTC 統計コレクター Kohaku](KOHAKU.html)
- [音声ストリーミングゲートウェイ Suzu](SUZU.html)
- [Sora Archive Uploader](SORA_ARCHIVE_UPLOADER.html)
- [Sora Exporter](SORA_EXPORTER.html)
- [Media Processors](MEDIA_PROCESSORS.html)
- [libwebrtc 音声処理](LIBWEBRTC_AUDIO.html)
- [libwebrtc リップシンク](LIBWEBRTC_LIP_SYNC.html)
- [libwebrtc ペーサー](LIBWEBRTC_PACER.html)
- [libwebrtc ミキサーのストリーム数上限](LIBWEBRTC_AUDIO_MIXER_MAX_STREAMS.html)
- [Microsoft Edge の WebRTC について](EDGE.html)
- [Apple Safari の WebRTC について](SAFARI.html)
- [nginx](NGINX.html)
- [HLS 配信](HLS.html)
- [お勧めのカメラとスピーカーフォン](CAMERA_SPEAKERPHONE.html)
- [オープンソースライセンス](OSS_LICENSE.html)
- [古いリリースノート](OLD_RELEASE_NOTE.html)
- [古いドキュメント](OLD_DOCUMENT.html)
# 2024.1.x から 2024.2.x への移行
## 概要
2024.1.x から 2024.2.x への移行について変更点や注意点をまとめています。
もし不明点がある場合はサポートまでお問い合わせください。
## レガシー録画機能のデフォルト無効
レガシー録画機能を利用する `sora.conf` の [legacy_recording](SORA_CONF.html#632f06) をデフォルトで `false` に変更しました。
レガシー録画機能を利用する場合は `true` へ変更をお願いします。
レガシー録画機能は 2025 年 12 月リリース予定の Sora にて廃止しますので、録画機能(セッション単位)への移行をお願いします。
以降については [レガシー録画機能から新しい録画機能 (セッション単位) への移行](LEGACY_RECORDING_TO_RECORDING.html) をご確認ください。
## セッション単位での同時接続数を制限する [trial_max_connections](SESSION_WEBHOOK.html#48346d) の追加
セッション単位での同時接続数を制限する [trial_max_connections](SESSION_WEBHOOK.html#48346d) を追加しました。
詳細については [trial_max_connections](SESSION_WEBHOOK.html#48346d) をご確認ください。
## JSON Lines 形式のログ出力に対してエスケープ処理を行わないよう変更
JSON Lines 形式のログ出力に対してエスケープ処理を行わないよう変更しました。
## ウェブフック送信を行わない場合でもログを出力するように変更
ウェブフックの送信を行わない (ignore) の設定した場合でも、以下のウェブフックはログを出力するように変更しました。
- [recording.started](SESSION_WEBHOOK.html#9b5c58) セッションウェブフック
- [session.updated](SESSION_WEBHOOK.html#2a5b1b) セッションウェブフック
- [session.vanished](SESSION_WEBHOOK.html#9f1b17) セッションウェブフック
- [connection.failed](EVENT_WEBHOOK.html#5266b6) イベントウェブフック
- [archive.started](EVENT_WEBHOOK.html#462c97) イベントウェブフック
- [recording.started](EVENT_WEBHOOK.html#9b5c58) イベントウェブフック
ただし、 [legacy_signaling_error](SORA_CONF.html#88aa33) が `true` かつ [ignore_connection_failed_webhook](SORA_CONF.html#45096a) が `true` の場合は、
[connection.failed](EVENT_WEBHOOK.html#5266b6) イベントウェブフックのログは出力されません。
## 既存のセッションの同時接続数が `0` の際に、このセッションと異なる `multistream` または `spotlight` 設定の新規接続が来た場合の挙動の変更
Sora にてセッションウェブフックの [multistream と spotlight が既存セッションと異なる場合の挙動](SESSION_WEBHOOK.html#c294e7) を変更します。
今までは既存セッションの同時接続数が `0` の場合に、 `multistream` または `spotlight` の設定が、
既存セッションと異なる新規接続が来た場合、
既存セッションを破棄し、新規セッションで接続できるようになっていましたが、
既存セッションを破棄せずにエラーになるように変更しました。
## プレイアウト遅延機能が配信側から視聴側への適用に変更
Sora 2024.1.x まで、プレイアウト機能は配信側にのみ適用されていましたが、
2024.2.x からは視聴側のみに適用されるようになりました。
詳細は [プレイアウト遅延](PLAYOUT_DELAY.html) をご確認ください。
## 録画の出力ファイルが MP4 形式に対応しました
[StartRecording](API_RECORDING.html#c5b527) API で `format` を `mp4` に指定するか、
[session.created](SESSION_WEBHOOK.html#1d1984) の払い出しで `recording_format` を `mp4` に指定することで、
MP4 形式で録画の出力ファイルが作成されます。
また、 `sora.conf` の [default_recording_format](SORA_CONF.html#f9fa7d) を `mp4` に設定することで、
録画の出力ファイルのデフォルトが MP4 形式になります。
- 2025 年 12 月リリース予定の Sora では [default_recording_format](SORA_CONF.html#f9fa7d) のデフォルトが `webm` から `mp4` になります
### ウェブフック
- [session.updated](SESSION_WEBHOOK.html#2a5b1b) や [session.destroyed](SESSION_WEBHOOK.html#ccb165) の `recording` の `format` を追加しました
- [recording.started](SESSION_WEBHOOK.html#9b5c58) に `format` を追加しました
### キーフレーム要求間隔の変更
MP4 形式での出力時に、Sora からクライアントへのキーフレーム要求 (PLI) の間隔を [default_recording_mp4_pli_interval](SORA_CONF.html#874e5b) で指定できるようになりました。
WebM 形式ではキーフレームの間隔が最大でも 31 秒までという制約がありましたが、 MP4 形式ではこの制約がなくなりました。
詳細は [MP4 形式のキーフレーム要求間隔の変更](RECORDING.html#1640d0) をご確認ください。
## WebSocket シグナリング時のフレームサイズが大きい場合のエラー改善
WebSocket のフレームサイズが大きい場合は今まで Websocket の Close Code 4490 で切断していましたが、
WebSocket の仕様に合わせて 1009 で切断するようになりました。
WebSocket シグナリングのメッセージサイズの最大は 5 MiB です。
## クライアントからの "type": "disconnect" による切断の改善
WebSocket シグナリングを利用している場合は、 WebSocket の Close フレームの Reason に `"TYPE-DISCONNECT"` が入るようになりました。
DataChannel シグナリングのみを利用している場合は、 DataChannel を閉じて終了します。
## WebSocket シグナリング利用時に Sora から正常切断が発生した際の改善
切断系 API やライフタイム期限などのSora からの正常切断時に、
WebSocket シグナリングを利用している場合、
WebSocket Close フレームの Code に 1000 、 Reason に切断理由が入るようになりました。
正常な場合の切断理由は以下の 3 つです。
- `LIFETIME-EXPIRED`- ライフタイムによるコネクションの破棄
- `SESSION-DESTROYED`- API やライフタイムなどによるセッションの破棄
- `DISCONNECTED-API`- API によるコネクションの破棄
## DataChannel シグナリングのみの利用時に Sora から切断が発生した際の `"type": "close"` メッセージの送信
DataChannel シグナリングのみの利用時に Sora から切断が発生した際、
DataChannel を閉じる前に `"type": "close"` メッセージを送信する設定を追加しました。
`sora.conf` の [data_channel_signaling_close_message](SORA_CONF.html#058a1e) を `true` に設定することで有効になります。
デフォルトは `false` です。
DataChannel が閉じられたのが正常な処理なのか、それとも何か問題が発生したのかを明確にするための仕組みです。
正常な場合の切断理由は以下の 3 つです。
- `LIFETIME-EXPIRED`- ライフタイムによるコネクションの破棄
- `SESSION-DESTROYED`- API やライフタイムなどによるセッションの破棄
- `DISCONNECTED-API`- API によるコネクションの破棄
### data_channel_signaling_close_message = false
```mermaid
sequenceDiagram
participant C as Client
participant S as Sora
participant A as App
note over C,S: WebRTC 確立
S-)C: "type": "switched"
"ignore_websocket_disconnect": true
A->>+S: Disconnect API
S->>-A: 200 OK
S->>C: DataChannels Close
```
### data_channel_signaling_close_message = true
```mermaid
sequenceDiagram
participant C as Client
participant S as Sora
participant A as App
note over C,S: WebRTC 確立
S-)C: "type": "switched"
"ignore_websocket_disconnect": true
A->>+S: Disconnect API
S->>-A: 200 OK
S->>C: "type": "close" over DataChannel
1000
"DISCONNECT-API"
S->>C: DataChannels Close
```
### "type": "close" メッセージの正常終了時の `reason` について
- 正常な切断では `code` は `1000` で、 `reason` には切断理由が入ります
- 異常による切断では `code` は `4490` で、 `reason` には切断理由がはいります
## Sora からの正常切断時の `reason` の値を空文字にする設定
[signaling_normal_close_reason](SORA_CONF.html#4486a4) はデフォルトで `true` で、切断理由が入りますが、
`false` にすることで切断理由を空文字を入れるようになります。
## シグナリングエラー時の改善
シグナリングエラー時のログの出力先やウェブフック `connection.failed` の通知タイミングを改善しました。
- シグナリング時のエラーが `sora.jsonl` に出力されなくなりました
- シグナリング時のエラーが `signaling_error.jsonl` に出力されるようになりました
- 認証失敗時のエラーが `sora.jsonl` に出力されなくなりました
- 認証失敗時のエラーが `signaling_error.jsonl` に出力されるようになりました
- イベントウェブフック [connection.failed](EVENT_WEBHOOK.html#5266b6) が認証失敗時には通知されなくなりました
- イベントウェブフック [connection.failed](EVENT_WEBHOOK.html#5266b6) が認証成功後に接続に失敗した時のみ通知されるようになりました
この設定は [legacy_signaling_error](SORA_CONF.html#88aa33) を `true` にすることで無効になります。
### 認証失敗時のエラーログの改善
認証失敗時のログを `sora.jsonl` から `signaling_error.jsonl` に出力するように変更しました。
認証時失敗時のエラーはシグナリングエラーと同等として扱うことにしました。
`sora.jsonl` に `ERROR` で出力されるシグナリング失敗のエラーメッセージは `connection.created` 以降に変更しました。
### イベントウェブフック connection.failed の改善
今まで connection.failed はシグナリング時にエラーが発生した場合通知する仕組みでしたが、
今後は認証が成功した後に接続が失敗した場合のみ通知されるように変更しました。
これにより、認証が失敗した場合には `connection.failed` ウェブフックは通知されなくなります。
そもそも認証の失敗自体は認証ウェブフックで判断しているため、通知自体が不要でした。
また認証ウェブフック処理前のバリデーションエラーなどは、
`channel_id` がなかったり `role` がなかったりなど、
ウェブフックに飛ぶ情報が不確定な情報が多いため、
ウェブフックを飛ばしても扱いに困ると判断しました。
### 2024.1.x までの挙動を維持する
`sora.conf` の [legacy_signaling_error](SORA_CONF.html#88aa33) を `true` に設定することで、
2024.1.x までと同等の `sora.jsonl` に認証失敗のエラーメッセージが出力されるようになります。
## シグナリングエラー時のエラーメッセージの改善
今まで細かいエラーを出力していましたが、わかりにくいエラーログが多かったため、
今まで出力していた詳細なエラーについては `signaling_error.jsonl` に出力するように変更しました。
### エラーメッセージ変更内容
- UNAUTHORIZED- AUTHENTICATION-FAILURE
- INTERNAL-ERROR- SIGNALING-INTERNAL-ERROR
- AUTH-WEBHOOK-RESPONSE-EMPTY-BODY
- AUTH-WEBHOOK-RESPONSE-UNEXPECTED-STATUS-CODE
- INVALID-AUTHZ-MEDIA
- WHEP-INCOMPATIBLE-UPSTREAM-TRACK
- DUPLICATED-CONNECTION-ID-ERROR
- INVALID-SPOTLIGHT-NUMBER
- DUPLICATED-CHANNEL-ID
- UNMATCH-CODEC-TYPE-ERROR
- SERVICE-UNAVAILABLE- EXCEED-MAX-CONNECTIONS
- BLOCK-NEW-CONNECTION
- BLOCK-NEW-SESSION
- TIMEOUT- CONNECTION-CREATED-WAIT-TIMEOUT-ERROR
- CONNECT-WAIT-TIMEOUT-ERROR
- ANSWER-TIMEOUT-ERROR
- PONG-TIMEOUT-ERROR,
- INVALID-MESSAGE- INVALID-JSON
- INVALID-SIGNALING-TYPE
- INVALID-SIGNALING-PARAMS
- MISSING-TYPE
- BAD-FINGERPRINT
- TOO-LARGE-JSON
- TOO-MANY-CANDIDATE
- INVALID-VIDEO-FORMAT
- FAILURE-SDP-PARSE
- MISSING-ICE-SDP
- INVALID-VIDEO-FORMAT
- INVALID-AUDIO-FORMAT
- FAILURE-JSON-DECODE
- UNEXPECTED-SIGNALING-TYPE
- UNKNOWN-AUDIO-CODEC-TYPE
- INVALID-AUDIO-BIT-RATE
- UNKNOWN-VIDEO-CODEC-TYPE
- INVALID-VIDEO-BIT-RATE
## クラスターのローリングアップデートについて
2024.1.x から 2024.2.x へのローリングアップデートができます。
1 台 1 台ローリングアップデートを行ってください。
2023.2.x から 2024.2.x へのローリングアップデートはできません、
かならず 2023.2.x からのアップデートを行う場合、
2024.1.x を経由してから 2024.2.x へアップデートを行っていください。
## 統計情報 total_received_intra_frame を total_received_key_frame に変更しました
統計情報に含まれる `total_received_intra_frame` を `total_received_key_frame` に変更しました。
[RequestKeyFrame](API_CONNECTION.html#716b40) API に合わせた変更になります。
## JoinCluster API を廃止しました
今後は全く同じ機能を提供している [RegisterClusterNode](API_CLUSTER.html#09ed96) API をご利用ください。
## ListClusterNodes API の include_all_known_nodes を廃止しました
[ListClusterNodes](API_CLUSTER.html#a70901) API の `include_all_known_nodes` を廃止しました
常にクラスターに登録されている全てのノード情報を返すようになりました。
詳しくは [ListClusterNodes API の include_all_known_nodes の廃止](OBSOLETE.html#bd63a0) をご確認ください。
## sora.conf の legacy_auth_webhook_log を廃止しました
移行用の設定 `sora.conf` の `legacy_auth_webhook_log` を廃止しました。
認証ウェブフックのエラーログは `auth_webhook_error.jsonl` に出力されるようになりました。
詳しくは [sora.conf の legacy_auth_webhook_log の廃止](OBSOLETE.html#c7a1d5) をご確認ください。
## sora.conf の legacy_event_webhook_connection_destroyed_reason を廃止しました
移行用の設定 `sora.conf` の `legacy_event_webhook_connection_destroyed_reason` を廃止しました。
`connection.destroyed` の `reason` には `normal` / `disconnected_api` / `session_destroyed` / `lifetime_expired` のいずれかが入るようになりました。
詳しくは [sora.conf の legacy_event_webhook_connection_destroyed_reason の廃止](OBSOLETE.html#c1c1cd) をご確認ください。
## [signaling_forwarding_filter](SORA_CONF.html#d15a40) を非推奨にしました
複数の転送フィルターを指定できる [signaling_forwarding_filters](SORA_CONF.html#bf0e30) を追加したことから、
[signaling_forwarding_filter](SORA_CONF.html#d15a40) を非推奨にしました。
2025 年 12 月リリース予定の Sora にて廃止します。
移行に際する不明点などはサポートまでお問い合わせください。
## 認証成功時とセッション生成時の払い出し `forwarding_filter` を非推奨にしました
複数の転送フィルターを指定できる `forwarding_filters` を追加したことから、
認証成功時とセッション生成時の払い出し `forwarding_filter` を非推奨にしました。
2025 年 12 月リリース予定の Sora にて廃止します。
移行に際する不明点などはサポートまでお問い合わせください。
## [session.vanished](MODE.html#9f1b17) ウェブフックを非推奨にしました
[Sora Exporter](SORA_EXPORTER.html) を利用する事で、より柔軟なセッションの監視ができることから、
[session.vanished](MODE.html#9f1b17) ウェブフックを非推奨にしました。
2025 年 6 月リリース予定の Sora にて廃止します。
移行に際する不明点などはサポートまでお問い合わせください。
## RTP ストリーム停止/再開 API を非推奨にしました
RTP ストリーム停止/再開 API は [転送フィルター](FORWARDING_FILTER.html) により同等の機能が提供でき、
重複機能となるため非推奨にしました。
今後は [転送フィルター](FORWARDING_FILTER.html) をご利用ください。
2025 年 12 月リリース予定の Sora にて廃止します。
移行に際する不明点などはサポートまでお問い合わせください。
# レガシー録画機能から新しい録画機能 (セッション単位) への移行
> **重要**
>
> レガシー録画機能は 2025 年 12 月リリースの Sora にて廃止します。
Sora 2023.2.0 から新しくセッション単位の録画機能を追加し、既存の録画機能をレガシー録画機能としました。
## レガシー録画の有効化
`sora.conf` にて [legacy_recording](SORA_CONF.html#632f06) を `true` にすることでレガシー録画機能を有効にできます。
## レガシー録画機能ではできて、新しい録画機能ではできないこと
### セッションが存在しない状態では録画の開始ができなくなった
レガシー録画機能では `20161101.StartRecording API` を利用することで、セッションが存在しない状態でも録画を開始することができました。
新しい録画機能ではセッションが生成される前に録画を開始することはできません。
代わりにセッションが生成されたタイミングで、
セッションウェブフック `session.created` の戻り値に `"recording": true` を指定することで、
セッション生成と同時に録画を開始することができます。
### セッションをまたいだ録画ができなくなった
レガシー録画機能では、一度録画を開始したら録画の期限が来るか、 `StopRecording` API を実行するまでは録画が続いてしまい、
録画したままという状態が残ってしまうことがありました。
新しい録画機能では、セッションが破棄されたタイミングで録画も終了するため、誰もそのチャネルに接続していないにもかかわらず、
録画したままという状態はなくなります。
## 変更点
### API の変更
- レガシー録画で利用していた `20161101.StartRecording` API と `20161101.StopRecording` API はバージョンを `20231220` に変更してください
- レガシー録画で利用していた [StartRecording](DEPRECATED_API_LEGACY_RECORDING.html#c5b527) API は [StartRecording](API_RECORDING.html#c5b527) API を利用してください
- レガシー録画で利用していた [StopRecording](DEPRECATED_API_LEGACY_RECORDING.html#fd0de5) API は [StopRecording](API_RECORDING.html#fd0de5) API を利用してください
- レガシー録画で利用していた [GetStartedRecording](DEPRECATED_API_LEGACY_RECORDING.html#8095d0) API は [GetSession](EXPERIMENTAL_API_SESSION.html#427a59) API を利用してください
- レガシー録画で利用していた [ListStartedRecording](DEPRECATED_API_LEGACY_RECORDING.html#838360) API は [ListSessions](EXPERIMENTAL_API_SESSION.html#748f19) API を利用してください
- レガシー録画で利用していた [ListArchiving](DEPRECATED_API_LEGACY_RECORDING.html#d4ba61) API には代わりの API がありません、今後 GetSessionRecordingState API を提供予定です- API の変更についてのご質問がある場合はサポートまでご連絡ください
### セッション生成時の録画開始
セッションが存在しないタイミングでの録画開始はできなくなりました。
代わりにセッションが生成されたタイミングで、
セッションウェブフック `session.created` の戻り値に `"recording": true` を指定することで、
セッション生成と同時に録画を開始することができます。
録画を開始するための API を実行する必要はありません。
### セッション破棄時の録画終了
セッション破棄時に録画を終了するようになりました。
録画を終了するための API を実行する必要はありません。
`expire_time` で指定した時間よりも先にセッションが破棄された場合は、その時点で録画を終了します。
### expire_time のオプション化
レガシー録画では `StartRecording` API の `expire_time` は必須でしたが、
新しい録画では `expire_time` はオプションに変更しています。
- `expire_time` を指定しない場合は未定義になります。ウェブフックなどでは項目が含まれなくなります- レガシー録画では `expire_time` 未定義の場合は `0` が入っていました
- `expire_time` が未指定の場合は、 `expired_at` も項目として含まれなくなります
- `expire_time` に `0` は指定できなくなり、 `0` より大きい値のみ指定可能になりました
- 分割録画ファイルのみ出力を行う場合でも `expire_time` が指定できるようになりました
### セッションウェブフック `recording.started` と `recording.report` への切り替え
今まで録画開始/終了のウェブフックはイベントウェブフックで送信していましたが、
新しい録画機能ではセッションウェブフックを利用します。
録画開始 `recording.started` と録画レポート `recording.report` ウェブフックの中身は以下が異なります。
- `session_id` を追加しています
- `session_metadata` を追加しています
- 録画メタデータが指定された場合、 `recording_metadata` を追加しています- `metadata` を `recording_metadata` に変更しています
- イベントウェブフック固有の `log_written` を削除しています
それ以外は同じです。
接続単位の録画ファイルに関してのイベントウェブフック `archive.*` については、変更はありません。
### `report-.json` ファイルの `metadata` を `recording_metadata` に変更
録画メタデータが指定された場合の項目を `metadata` から `recording_metadata` に変更しています。
### 接続単位の録画ブロック機能
今までの録画機能では接続単位での録画ブロックができませんでしたが、
新しい録画機能では認証成功時に `"recording_block": true` を払い出すことで、
その接続の録画をブロックし、録画ファイルを出力しなくなります。
この機能は新しい録画機能だけで利用できます。
## レガシー録画機能と新しい録画機能の同時利用
レガシー録画機能と新しい録画機能 (セッション単位) は、異なるチャネルであれば同時に利用できます。
例えば、channel_id a ではレガシー録画機能、channel_id b では新しい録画機能(セッション単位)といった利用が可能です。
# レガシーストリーム(非マルチストリーム)機能からマルチストリーム機能への移行
> **重要**
>
> レガシーストリーム機能は 2025 年 6 月リリースの Sora にて廃止します。
シグナリング接続時に `"multistream": false` を指定した機能をレガシーストリーム機能としました。
## なぜレガシーストリームを廃止するのか
レガシーストリーム機能は 10 年以上前の WebRTC の初期の仕様に基づいて開発されたため、
現在では時代遅れとなっています。
マルチストリーム機能は WebRTC の最新仕様に合わせて開発され、
より柔軟な配信や視聴ができます。
レガシーストリームでは実現困難な機能が増え、維持コストも高くなってきています。
また、レガシーストリームに似ている仕組みである WHIP/WHEP への対応を行いました。
レガシーストリームの役割は終了したと考え、
2025 年 6 月リリース予定の Sora にて廃止します。
## Sora 2024.1.0 からレガシーストリームをデフォルトで無効にし非推奨へ
2024 年 6 月リリースの Sora から、レガシーストリーム機能はデフォルトで無効になり、非推奨となります。
そのため `multistream: false` で接続した場合、シグナリングエラーになります。
もし、レガシーストリーム機能を引き続き利用したい場合は、
`legacy_stream` オプションを `true` に設定してください。
## 2025 年 6 月リリース予定の Sora でレガシーストリームが廃止に
2025 年 6 月リリース予定の Sora にて、レガシーストリーム機能を廃止します。
## レガシーストリーム機能ではできて、マルチストリーム機能ではできないこと
### 視聴側の SDP 再交換を発生させずに、同一メディアストリームでストリームを受信できる
マルチストリームでは配信者が切り替わるたびに SDP 再交換が必須となります。
このため、挙動が大きく異なりますので注意してください。
## 移行時の注意点
不明点などはサポートまでお問い合わせください。
### 参加/離脱の挙動
これまで視聴側は SDP を一度交換するだけでしたが、
マルチストリーム機能では配信者が切り替わるたびに SDP 交換が必要となります。
マルチストリームでは新しく配信者が参加したタイミングでストリームやトラックを追加する処理が必要になります。
同じように配信者が離脱したタイミングでストリームやトラックを削除する処理が必要になります。
### 複数配信のサポート
レガシーストリームでは配信者は常に 1 つでしたが、マルチストリームでは複数配信することができます。
# リリースノート
**CHANGE**
: 後方互換性のない変更
**UPDATE**
: 後方互換性がある変更
**ADD**
: 後方互換性がある追加
**FIX**
: バグ修正
## 2024.2.3
**バグフィックスアップデート**
**リリース**: 2025 年 5 月 19 日
### 変更履歴
- [ADD] 録画機能利用時に Safari 18.4 から Safari 18.5 で H.264/H.265 を利用している場合に発生するタイムスタンプの不具合に対するワークアラウンド機能を追加しました- デフォルトでは未指定です
- 指定する場合は `sora.conf` に `workaround_20250515 = 18.4,18.4.1,18.5` のように、ワークアラウンドに対応させる Safari のバージョンを `,` で区切って指定してください
- iOS 版 Chrome でもワークアラウンドが有効になります
- 詳細は [Safari タイムスタンプバグに対するワークアラウンド](WORKAROUND.html#e73b7a) をご確認ください。
- [FIX] 録画機能で Chrome 136 で特定のハードウェアエンコーダーと組み合わせた際、 H.265 の録画が正常に行えない問題を修正しました
## 2024.2.2
**バグフィックスアップデート**
**リリース**: 2025 年 4 月 9 日
### 変更履歴
- [FIX] 依存している OpenSSL を 3.4.1 にアップデートしました
- [FIX] ウェブフック機能、音声ストリーミング機能、統計エクスポーター機能で HTTPS を利用する際、証明書の鍵の使用法と拡張された鍵の使用法の互換性チェックが間違っていたため、サポートされていないサーバー証明書と判断して接続に失敗する場合がある問題を修正しました- これは Sora が利用している PKI ライブラリのバグにより発生していた問題で、ライブラリをアップデートすることで解消しました
## 2024.2.1
**バグフィックスアップデート**
**リリース**: 2025 年 1 月 8 日
### 変更履歴
- [FIX] AV1 コーデック利用時、主にハードウェアエンコーダーなど、 `libwebrtc` が採用している `libaom` 以外のエンコーダーを利用するとキーフレーム判定が失敗する場合がある問題を修正しました
- [FIX] クラスター構成で Sora 2024.1.x からのローリングアップデート中、録画が開始できない場合がある問題を修正しました
- [FIX] クラスター構成で Sora 2024.1.x からのローリングアップデート中、録画を開始すると `recording.report` ウェブフックが送信されない場合がある問題を修正しました
## 2024.2.0
**メジャーアップデート**
**リリース**: 2024 年 12 月 18 日
> **重要**
>
> Sora 2024.1.x から 2024.2.x への移行については [2024.1.x から 2024.2.x への移行](2024_1_TO_2024_2.html) をご確認ください。
### ハイライト
- 録画アーカイブファイルの MP4 形式による出力に対応しました
- 録画アーカイブファイルの H.265 コーデックによる出力に対応しました
- リアルタイムメッセージング機能で、メッセージのヘッダーに送信元の connection_id を付与する機能を追加しました
- 実験的機能として、転送フィルター機能で複数のフィルターを設定できる「マルチ転送フィルター機能」を追加しました
- 実験的機能として、 [session.created](SESSION_WEBHOOK.html#1d1984) の払い出しに、セッションの同時接続数を制限する [trial_max_connections](SESSION_WEBHOOK.html#48346d) を追加しました
- 指定したコネクションにキーフレームを要求する [RequestKeyFrame](API_CONNECTION.html#716b40) API を追加しました
### 正式版
今回のリリースで以下の機能が実験的機能から正式版になりました。
- [クラスター機能](CLUSTER.html)
- [センシティブデータ](SENSITIVE_DATA.html)
- [OBS (WHIP) 対応](WHIP.html)
- [メディア配信ワーカー機能](MEDIA_PUBLISH_WORKER.html)
- [セッションライフタイム機能](SESSION_WEBHOOK.html#36a751)
- [コネクションライフタイム機能](AUTH_WEBHOOK_RETURN.html#8b77ca)
- [TerminateSession](API_SESSION.html#ba022b) API
### 破壊的変更
- 既存のセッションの同時接続数が `0` の際に、このセッションと異なる `multistream` または `spotlight` 設定の新規接続が来た場合、エラーになるように変更しました- 詳細は [既存のセッションの同時接続数が 0 の際に、このセッションと異なる multistream または spotlight 設定の新規接続が来た場合の挙動の変更](2024_1_TO_2024_2.html#964549) をご確認ください
- クライアントに通知されるエラーメッセージを改善しました- 詳細は [シグナリングエラー時のエラーメッセージの改善](2024_1_TO_2024_2.html#7eb150) をご確認ください
- 転送フィルターの認証成功時の払い出しエラーが発生した場合、接続が失敗するようになりました
- 転送フィルターのセッション生成時の払い出しエラーが発生した場合、セッションが破棄されるようになりました- [session_created_response_validate_warning_as_error](SORA_CONF.html#9df65e) が `false` の場合でもエラーとなりセッションを破棄します
- 統計情報に含まれる `total_received_intra_frame` を `total_received_key_frame` に変更しました
- JSON Lines 形式のログ出力に対してエスケープ処理を行わないようにしました
### 廃止情報
- [JoinCluster](OBSOLETE_API.html#17f3f5) API を廃止しました- 今後は同じ機能を持つ [RegisterClusterNode](API_CLUSTER.html#09ed96) API をご利用ください
- E2EE 機能を廃止しました- 将来的に Message Layer Security (MLS) を利用した E2EE 機能を提供予定です
- ウェブフックに含まれる `e2ee` 項目は予約項目として常に `false` が含まれます
- `sora.conf` から `e2ee` 項目を廃止しました
- `sora.conf` の移行用の設定 `legacy_auth_webhook_log` 設定を廃止しました
- `sora.conf` の移行用の設定 `legacy_event_webhook_connection_destroyed_reason` 設定を廃止しました
### 非推奨情報
- 転送フィルターを認証成功時やセッション生成時の払い出しで指定できる `forwarding_filter` を非推奨にしました- `forwarding_filter` は 2025 年 12 月リリース予定の Sora で廃止します
- 代わりに複数の転送フィルターを指定できる `forwarding_filters` をご利用ください
- シグナリング接続時に転送フィルターを指定できる [signaling_forwarding_filter](SORA_CONF.html#d15a40) を非推奨にしました- [signaling_forwarding_filter](SORA_CONF.html#d15a40) は 2025 年 12 月リリース予定の Sora で廃止します
- 代わりに複数の転送フィルターを指定できる [signaling_forwarding_filters](SORA_CONF.html#bf0e30) をご利用ください
- [session.vanished](MODE.html#9f1b17) を非推奨にしました- [session.vanished](MODE.html#9f1b17) は 2025 年 6 月リリース予定の Sora にて廃止します
- 代わりに [GetStatsReport](EXPERIMENTAL_API_STATS.html#bbbfca) API の `total_ongoing_connections` をご利用ください。
- 値の監視については [Sora Exporter](SORA_EXPORTER.html) の利用をお勧めします
- [RTP ストリーム停止/再開 API](EXPERIMENTAL_API_RTP_STREAM_PAUSE_RESUME.html) を非推奨にしました- [RTP ストリーム停止/再開 API](EXPERIMENTAL_API_RTP_STREAM_PAUSE_RESUME.html) は 2025 年 12 月リリース予定の Sora にて廃止します
- 代わりに [転送フィルター](FORWARDING_FILTER.html) をご利用ください
### 変更履歴
- [CHANGE] JSON Lines 形式のログ出力に対してエスケープ処理を行わないようにしました
- [CHANGE] 統計情報に含まれる `total_received_intra_frame` を `total_received_key_frame` に変更しました- [RequestKeyFrame](API_CONNECTION.html#716b40) API に合わせた変更になります
- [CHANGE] `spotlight.focused` と `spotlight.unfocused` イベントウェブフックの送信を行わない場合はログを書き込まないよう変更しました
- [CHANGE] ウェブフックを送信を行わない (ignore) の設定した場合でも以下のウェブフックはログを出力するように変更しました- `recording.started` セッションウェブフック
- `session.updated` セッションウェブフック
- `session.vanished` セッションウェブフック
- `connection.failed` イベントウェブフック- [legacy_signaling_error](SORA_CONF.html#88aa33) が `true` かつ [ignore_connection_failed_webhook](SORA_CONF.html#45096a) が `true` の場合、ログを出力しません
- `archive.started` イベントウェブフック
- `recording.started` イベントウェブフック
- [CHANGE] `E2EE` 機能を廃止しました- `sora.conf` の `e2ee` を廃止しました
- ウェブフックに含まれる `e2ee` は常に `false` が含まれます
- [ADD] [copy_websocket_signaling_header_names](SORA_CONF.html#db39f3) で指定した WebSocket シグナリングの HTTP ヘッダーを `rtc_stats.jsonl` と `connection.jsonl` に `copy_headers` 項目で出力するようにしました
- [ADD] 特定環境向けに TURN 利用時に 5-TUPLE を無視する設定を追加しました- **この機能を利用する場合は事前にサポートまでご連絡ください**
- `sora.conf` の [ignore_turn_five_tuple](SORA_CONF.html#14e2aa) を `true` に設定することで、送られてくるパケットの 5-TUPLE を無視するようになります
- [ADD] `"type": "offer"` メッセージに `audio` と `video` 関連項目を追加しました- `audio` は必ず含まれます
- `audio_codec_type` はオプションで、 `audio` が `true` かつ `role` が `sendrecv` または `sendonly` の場合に含まれます
- `audio_bit_rate` はオプションで、 `audio` が `true` かつ `role` が `sendrecv` または `sendonly` で `audio_bit_rate` が指定された場合に含まれます
- `video` は必ず含まれます
- `video_codec_type` はオプションで、 `video` が `true` かつ `role` が `sendrecv` または `sendonly` の場合に含まれます
- `video_bit_rate` はオプションで、 `video` が `true` かつ `role` が `sendrecv` または `sendonly` の場合に含まれます
- [ADD] サイマルキャスト機能の設定項目に `scaleResolutionDownTo` を追加しました- `{"maxHeight": 1080, "maxWidth": 1920}` のように解像度を指定することができるようになります
- この機能は Chrome/Edge 131 以降で利用できます
- [ADD] `connection.jsonl` に `simulcast_encodings` と `simulcast_codecs` 項目を追加しました- `simulcast` のみ `true` の場合は `simulcast_encodings` を出力します
- `simulcast` と `simulcast_multicodec` が `true` の場合は `simulcast_codecs` も出力します
- [FIX] Safari や Chrome Canary で H.265 の配信ができない問題を修正しました
- [FIX] コネクションの切断が発生しない録画失敗のログレベルを `error` から `warning` に修正しました
- [FIX] 録画ファイル書き込みに失敗するとクラッシュログが出力されることがある問題を修正しました
- [FIX] サイマルキャスト機能利用時に `simulcast_encodings` に `active` を未指定だと接続が失敗する問題を修正しました
- [FIX] H.264 の RTP ペイロードヘッダーが不正な場合、サイレントディスカードするように修正しました
#### sora.conf
- [CHANGE] `sora.conf` の [legacy_recording](SORA_CONF.html#632f06) のデフォルトを `true` から `false` に変更しました
- [CHANGE] `sora.conf` の移行用の設定 `legacy_auth_webhook_log` 設定を廃止しました
- [CHANGE] `sora.conf` の移行用の設定 `legacy_event_webhook_connection_destroyed_reason` 設定を廃止しました
- [CHANGE] `sora.conf` の [default_h264_param_profile_level_id](SORA_CONF.html#1581db) のデフォルト値を `42e01f` から `42e02a` へ変更しました- Chrome / Edge がデフォルト値を変更した事への追従です
- [UPDATE] `sora.conf` の [connection_created_wait_timeout](SORA_CONF.html#0509af) の最小値を `1 s` から `0 s` へ変更しました- 挙動確認などで意図的にエラーを発生させられるように変更しました
- [FIX] ウェブフック送信時にボディを待つ時間に [webhook_response_timeout](SORA_CONF.html#e81d13) が反映されていない問題を修正しました
- [FIX] ウェブフック送信時に TCP コネクションの確立を待つ時間に [webhook_connect_timeout](SORA_CONF.html#7a0122) が反映されていない問題を修正しました
#### API
- [UPDATE] [ListConnections](API_SIGNALING.html#d3da2a) API の戻り値に `node_name` を追加しました
- [UPDATE] [ListChannelConnections](API_SIGNALING.html#d388f3) API の戻り値に `node_name` を追加しました
- [UPDATE] [GetStatsAllConnections](API_STATS.html#ef695a) API の戻り値に `session_id` を追加しました
- [UPDATE] [GetStatsConnection](API_STATS.html#e79b61) API の戻り値に `session_id` を追加しました
- [UPDATE] [GetStatsClient](API_STATS.html#ef69ae) API の戻り値に `session_id` を追加しました
- [ADD] 指定したクライアントにキーフレームを要求する [RequestKeyFrame](API_CONNECTION.html#716b40) API を追加しました- [レガシーストリーム](LEGACY_STREAM_TO_MULTISTREAM.html) では利用できません
- [FIX] [GetStatsReport](EXPERIMENTAL_API_STATS.html#bbbfca) API のウェブフック統計情報はウェブフックを送信したときのみカウントされるように修正しました
- [FIX] [GetStatsReport](EXPERIMENTAL_API_STATS.html#bbbfca) API のウェブフック統計情報が正しくカウントされない問題を修正しました- `total_ignored_session_webhook` が実際よりも少なくカウントされていた問題を修正しました
- [audio-streaming.started](SESSION_WEBHOOK.html#e7b17a) と [audio-streaming.stopped](SESSION_WEBHOOK.html#13e583) のウェブフック統計情報が `total_ignored_XXX_webhook` と `total_successful_XXX_webhook` の両方がカウントされていた問題を修正しました
#### セッション単位での同時接続数制限機能
**これは実験的機能です**
認証ウェブフックでの接続制限はウェブフックが並列で送信されるため、厳密な同時接続制限ができませんでした。
この機能ではセッション単位での同時接続数を制限することで、厳密に同時接続制限ができるようになります。
この機能を利用することで認証に成功した場合でも、セッションに接続できない場合があります。
その場合は、クライアントには `SERVICE-UNAVAILABLE` が通知されます。
この機能は実験的機能のトライアル中です。
将来的にロール単位やクライアント ID 単位での接続制限機能などを加えていく予定です。
正式版と明確に区別するため `trial_` を prefix として付与しています。
- [ADD] [session.created](SESSION_WEBHOOK.html#1d1984) の払い出しにセッションの同時接続数を制限する [trial_max_connections](SESSION_WEBHOOK.html#48346d) を追加しました- デフォルトは未指定で制限がない状態です
- 指定できる範囲は 0..10000 です
- `trial_max_connections` が `0` の場合は誰も接続することができなくなります
- セッションが同時接続数制限に達した場合はクライアントに `SERVICE-UNAVAILABLE` を通知します
#### 統計情報の追加
- [ADD] [GetStatsReport](EXPERIMENTAL_API_STATS.html#bbbfca) API に SRTP パケットの統計情報を追加しました- `total_received_srtp`- 受信した SRTP パケットの合計数
- `total_received_srtp_byte_size`- 受信した SRTP パケットの合計バイト数
- `total_sent_srtp`- 送信した SRTP パケットの合計数
- `total_sent_srtp_byte_size`- 送信した SRTP パケットの合計バイト数
- `total_decrypted_srtp`- 復号した SRTP パケットの合計数
- `total_decrypted_srtp_byte_size`- 復号した SRTP パケットの合計バイト数
- [ADD] [GetStatsReport](EXPERIMENTAL_API_STATS.html#bbbfca) API に DataChannel で利用している SCTP パケットの統計情報を追加しました- `total_received_sctp`- DataChannel で受信した SCTP パケットの合計数
- `total_received_sctp_byte_size`- DataChannel で受信した SCTP パケットの合計バイト数
- `total_sent_sctp`- DataChannel で送信した SCTP パケットの合計数
- `total_sent_sctp_byte_size`- DataChannel で送信した SCTP パケットの合計バイト数
- [ADD] [GetStatsReport](EXPERIMENTAL_API_STATS.html#bbbfca) API に無視されたウェブフックの統計情報を追加しました- `total_ignored_session_webhook`- 無視されたセッションウェブフックの合計数
- `total_ignored_event_webhook`- 無視されたイベントウェブフックの合計数
- `total_ignored_stats_webhook`- 無視された統計ウェブフックの合計数
#### Sora 側からのシグナリング切断時のクライアントへの通知改善
- [CHANGE] WebSocket シグナリング利用時にメッセージサイズが大きすぎる場合の `code` を `4490` から `1009` に変更しました- メッセージサイズの最大は 5 MiB です
- WebSocket の仕様に合わせました
- [CHANGE] WebSocket シグナリング利用時に Sora 側からのクライアントへの通知を改善しました- 正常切断- `code` は `1000` です
- `reason` には切断理由が含まれます- `TYPE-DISCONNECT`
- `DISCONNECTED-API`
- `LIFETIME-EXPIRED`
- `SESSION-DESTROYED`
- 異常切断- 異常が発生して Sora 側から切断した場合は `code` に `4490` が含まれます
- `reason` には切断理由が含まれます
- [ADD] `sora.conf` に [data_channel_signaling_close_message](SORA_CONF.html#058a1e) を追加しました- デフォルトは `false` です
- `true` の場合は Sora からコネクションを切断する際、 DataChannel シグナリングが有効かつ、`ignore_disconnect_websocket` が `true` な場合 `signaling` ラベルに `"type": "close"` メッセージを送信します
- `false` の場合は今まで通り、 DataChannel を閉じます
- `"type": "close"` メッセージには `code` と `reason` が含まれます
- 正常切断- 切断 API や期限切れで Sora 側から切断した場合は `code` に `1000` が含まれます
- `reason` には切断理由が含まれます- `LIFETIME-EXPIRED`
- `SESSION-DESTROYED`
- `DISCONNECTED-API`
- 異常切断- 異常が発生して Sora 側から切断した場合は `code` に `4490` が含まれます
- `reason` には切断理由が含まれます
- [ADD] `sora.conf` に [signaling_normal_close_reason](SORA_CONF.html#4486a4) を追加しました- デフォルトは `true` です
- `false` を指定した場合、正常切断時の `reason` が空文字になります
- `false` を指定した場合でも異常切断時は `reason` は含まれます
#### シグナリングエラーの改善
- [ADD] `sora.conf` にレガシーシグナリングエラーを有効にする設定を追加しました [legacy_signaling_error](SORA_CONF.html#88aa33) を追加しました- デフォルトは `false` です
- **この設定は移行用で 2025 年 6 月に廃止します**
- この設定は 2024.1.x までの Sora との後方互換性を維持するための機能です
- `false` の場合は `log/connection_created_wait_timeout` にログが出力されなくなりました
- `false` の場合は `log/signaling_error.jsonl` にシグナリングエラーログが出力されるようになりました
- `false` の場合は `connection.failed` ウェブフックは **認証成功時** かつ **connection.created** が送信されていない場合のみ送信されるようになりました
- `false` の場合は `sora.jsonl` に認証失敗ログが出力されなくなりました
- `false` の場合は `sora.jsonl` にシグナリング失敗ログが出力されなくなりました
- `true` の場合は今まで通り `ignore_connection_failed_webhook` が `true` の場合、 `event_webhook.jsonl` にシグナリングログが出力されません
- [CHANGE] クライアントに通知するエラーメッセージを変更しました- クライアントへ通知するエラーがあまりにもサーバーよりのメッセージが多く、混乱を招くため整理しました
- Sora の内部的なエラーは `INTERNAL-ERROR` を通知するよう変更しました- 以下のメッセージはクライアントへは通知されなくなりました
- `SIGNALING-INTERNAL-ERROR`
- `AUTH-WEBHOOK-RESPONSE-EMPTY-BODY`
- `AUTH-WEBHOOK-RESPONSE-UNEXPECTED-STATUS-CODE`
- `INVALID-AUTHZ-MEDIA`
- `WHEP-INCOMPATIBLE-UPSTREAM-TRACK`
- `DUPLICATED-CONNECTION-ID-ERROR`
- `INVALID-SPOTLIGHT-NUMBER`
- `DUPLICATED-CHANNEL-ID`
- `UNMATCH-CODEC-TYPE-ERROR`
- Sora が一時的に利用できない場合は `SERVICE-UNAVAILABLE` を通知するように変更しました- 以下のメッセージはクライアントへは通知されなくなりました
- `EXCEED-MAX-CONNECTIONS`
- `BLOCK-NEW-CONNECTION`
- `BLOCK-NEW-SESSION`
- `INVALID-MODE`
- Sora でタイムアウトが発生した場合は `TIMEOUT` を通知するように変更しました- 以下のメッセージはクライアントへは通知されなくなりました
- `CONNECTION-CREATED-WAIT-TIMEOUT-ERROR`
- `CONNECT-WAIT-TIMEOUT-ERROR`
- `ANSWER-TIMEOUT-ERROR`
- `PONG-TIMEOUT-ERROR`
- シグナリングメッセージが不正な場合は `INVALID-MESSAGE` を通知するように変更しました- 以下のメッセージはクライアントへは通知されなくなりました
- `INVALID-JSON`
- `INVALID-SIGNALING-TYPE`
- `INVALID-SIGNALING-PARAMS`
- `MISSING-TYPE`
- `BAD-FINGERPRINT`
- `TOO-LARGE-JSON`
- `TOO-MANY-CANDIDATE`
- `INVALID-VIDEO-FORMAT`
- `FAILURE-SDP-PARSE`
- `MISSING-ICE-SDP`
- `INVALID-VIDEO-FORMAT`
- `INVALID-AUDIO-FORMAT`
- `FAILURE-JSON-DECODE`
- `UNEXPECTED-SIGNALING-TYPE`
- `UNKNOWN-AUDIO-CODEC-TYPE`
- `INVALID-AUDIO-BIT-RATE`
- `UNKNOWN-VIDEO-CODEC-TYPE`
- `INVALID-VIDEO-BIT-RATE`
#### 録画機能
- [CHANGE] 録画ファイル処理の開始に失敗した場合のログレベルを `ERROR` から `WARNING` に変更しました
- [ADD] イベントウェブフック `archive.*` と `split-archive.*` に項目を追加しました- `split_only`- 指定していない場合、値は `false` になります
- `format`- `mp4` または `webm` が含まれます
- `expire_time`- 指定していない場合は項目が含まれません
- `expired_at`- 指定していない場合は項目が含まれません
- `split_duration`- 指定していない場合は項目が含まれません
- [FIX] AV1 サイマルキャスト使用時に録画が正常に行われない問題を修正しました
#### MP4 録画機能
**これは実験的機能です**
MP4 形式での録画ファイル出力に対応しました。
- [ADD] MP4 形式での録画に対応しました- **MP4 録画機能はレガシー録画機能では利用できません**
- OBS が提唱する Hybrid MP4 形式に対応しています
- [ADD] `sora.conf` に [default_recording_format](SORA_CONF.html#f9fa7d) を追加しました- デフォルトは `webm` です
- `webm` と `mp4` が指定できます
- MP4 録画機能はレガシー録画機能では利用できません
- [ADD] [StartRecording](API_RECORDING.html#c5b527) API に `format` (オプション) を追加しました- `format` には `webm` と `mp4` が指定できます
- `format` が未指定の場合は [default_recording_format](SORA_CONF.html#f9fa7d) の値が利用されます
- 映像コーデックが H.265 の場合 `format` に `mp4` を指定しない場合、録画が行われません
- [ADD] [session.created](SESSION_WEBHOOK.html#1d1984) の払い出しに `recording_format` を追加しました- `recording_format` には `webm` と `mp4` が指定できます
- `recording_format` が未指定の場合は [default_recording_format](SORA_CONF.html#f9fa7d) の値が利用されます
- 映像コーデックが H.265 の場合 `format` に `mp4` を指定しない場合、録画が行われません
- [ADD] [session.updated](SESSION_WEBHOOK.html#2a5b1b) の `recording` に `format` を追加しました- `"format": "webm"` または `"format": "mp4"` が含まれるようになりました
- [ADD] セッションウェブフック `recording.*` に `data.format` を追加しました- `"format": "webm"` または `"format": "mp4"` が含まれるようになりました
- [ADD] イベントウェブフック `archive.*` と `split-archive.*` に `data.format` を追加しました- `"format": "webm"` または `"format": "mp4"` が含まれるようになりました
- [ADD] `sora.conf` に録画機能(セッション単位) 利用時に MP4 形式を利用した場合、クライアントへ送るキーフレーム要求 (PLI) の間隔を指定できる [default_recording_mp4_pli_interval](SORA_CONF.html#874e5b) を追加しました- デフォルトは `20 s` です
- 最小は `1 s` で、最大は `240 s` です
- WebM 形式ではキーフレームの間隔が最大でも 31 秒までという制約がありましたが、 MP4 形式ではこの制約がなくなりました
#### H.265 録画機能
**これは実験的機能です**
H.265 コーデックでの録画機能に対応しました。
- [ADD] H.265 録画機能に対応しました- H.265 は `format` に `mp4` が設定されている場合のみ録画ができます
- WebM 形式を設定した場合 H.265 の録画は行われません
- H.265 録画機能はレガシー録画では利用できません
#### ICE コネクションステート変更のシグナリング通知
**これは実験的機能です**
ICE コネクションステートが変更した際、
同一チャネルに接続している自分を含むクライアント全員へ通知する仕組みを追加しました。
この機能を利用することで、
自分の ICE コネクションステートの変更を **同じセッションに参加している自分を含むクライアント全員** へシグナリング通知が送信されます。
また、接続時に **既にチャネルに参加しているクライアント全員の ICE コネクションステート** を取得できるようになります。
他のシグナリング通知機能とは異なり、この設定は有効にした場合、
自分を含むチャネル参加者全員へ通知を行いますので注意してください。
用途としては 4 人で双方向のビデオ通話をしている際、
特定のクライアントが不安定だという事を知ったり、
1:50 の片方配信の際に配信者の通信状態を視聴者側が知ったりすることができるようになります。
通知されるタイミングは 4 種類あります。
1. connected から checking になった時
2. checking から connected になった時
3. checking から disconnected になった時
4. disconnected から checking になった時
- [ADD] `sora_conf` に [signaling_notify_ice_connection_state](SORA_CONF.html#e65192) を追加しました- デフォルトは `false` です
- `true` に設定すると ICE コネクションステートが変更された際に、同一チャネルに接続しているクライアントへシグナリング通知 `ice-connection-state.changes` を送信します
- `true` にするとチャネル参加時のシグナリング通知 `connection.created` の既存参加者の `data` に `ice_connection_state` が含まれるようになります
- [ADD] 認証成功時の払い出しに `signaling_notify_ice_connection_state` を追加しました- デフォルトは [signaling_notify_ice_connection_state](SORA_CONF.html#e65192) の値が採用されます
- `false` を払い出すことで自身の ICE コネクションステートの状態を他のチャネルに参加しているクライアントへシグナリング通知が送信されなくなります
- [ADD] ICE コネクションステートを強制的に変更し維持する [LockIceConnectionState](TEST_API.html#8b5622) テスト API を追加しました
#### 転送フィルター機能
- [CHANGE] 認証成功時の転送フィルターの払い出しがエラーになった場合、接続が失敗するように変更しました- `INTERNAL-ERROR` エラーとなります
- [CHANGE] セッション生成時の転送フィルターの払い出しがエラーになった場合、セッションを破棄するように変更しました- `INTERNAL-ERROR` エラーとなります
- [session_created_response_validate_warning_as_error](SORA_CONF.html#9df65e) が `false` の場合でもエラーとなりセッションを破棄します
#### マルチ転送フィルター機能
**これは実験的機能です**
マルチ転送フィルター機能は 1 チャネルや 1 コネクションに対して 1 つしか指定できなかった転送フィルターを
名前と優先度を設定し、複数の転送フィルターを指定できるようにする機能です。
- [ADD] 認証成功時の払い出しに複数の転送フィルターを設定できる `forwarding_filters` を追加しました- 既存の `forwarding_filter` は 2025 年 12 月リリース予定の Sora にて廃止します
- [ADD] セッション生成時の払い出しに複数の転送フィルターを設定できる `forwarding_filters` を追加しました- `forwarding_filter` は 2025 年 12 月リリース予定の Sora にて廃止します
- [ADD] `sora.conf` にシグナリング時に複数の転送フィルターを設定できる `forwarding_filters` を設定できるようになる [signaling_forwarding_filters](SORA_CONF.html#bf0e30) を追加しました- [signaling_forwarding_filter](SORA_CONF.html#d15a40) は 2025 年 12 月リリースの Sora にて廃止します
- [ADD] 転送フィルター設定時に `name` と `priority` を指定できるようになりました
- [ADD] 転送フィルター API [ListForwardingFilters](API_FORWARDING_FILTER.html#a1dd75) にチャネルの転送フィルターをリストで表示する `channel_forwarding_filters` を追加しました- 既存の `channel_forwarding_filter` は 2025 年 12 月リリース予定の Sora にて廃止します
- [ADD] 転送フィルター API [CreateChannelForwardingFilter](API_FORWARDING_FILTER.html#fe98d1) と [CreateConnectionForwardingFilter](API_FORWARDING_FILTER.html#d80a51) に `name` と `priority` を追加しました
- [ADD] 転送フィルター API [UpdateChannelForwardingFilter](API_FORWARDING_FILTER.html#36fc45) と [UpdateConnectionForwardingFilter](API_FORWARDING_FILTER.html#23ed63) に `name` と `priority` を追加しました
- [ADD] 転送フィルター API [DeleteChannelForwardingFilter](API_FORWARDING_FILTER.html#9410fd) と [DeleteConnectionForwardingFilter](API_FORWARDING_FILTER.html#0d65da) に `name` を追加しました
詳細は [マルチ転送フィルター機能](MULTI_FORWARDING_FILTER.html) をご確認ください。
#### OBS WHIP
- [FIX] OBS WHIP で H.264 で一部のエンコーダーを利用した際、録画ファイルの映像が正常に記録されない問題を修正しました
- [FIX] OBS WHIP で AV1 で録画できない問題を修正しました
#### メッセージングヘッダー機能
リアルタイムメッセージング機能において、
メッセージに Sora 側でヘッダーを追加する機能です。
`sender_connection_id` を追加できます。
- [ADD] `data_channels` にメッセージングにヘッダーを追加する `header` 項目を新しく追加しました- **ヘッダーを付与するかどうかはメッセージを受信する側が指定します**- `{"label": "#spam", "direction": "recvonly", "header": [{"type": "sender_connection_id"}]`
- この設定を行ったクライアントは `#spam` ラベルのメッセージは常に先頭 26 バイトに `sender_connection_id` が含まれるようになります
- ヘッダーは Sora 側で付与します
- `header` はオプションです
- `header` には `[{"type": "sender_connection_id"}]` のように指定します
- `type` は `sender_connection_id` のみ指定可能です- `sender_connection_id` はメッセージングの送信元の connection_id です
- 先頭 26 バイトが `sender_connection_id` になります
- 将来的に指定できる `type` を増やして行く予定です
- `"type": "offer"` 時の `data_channels` に `header` が含まれる場合、 `length` 項目を追加します- `length` は `sender_connection_id` の長さです
- `length` の単位はバイトです
- `sender_connection_id` の場合 `length` は 26 固定です
#### 音声ストリーミングヘッダー機能
音声ストリーミング機能において、HTTP/2 経由で送信する音声パケットに Sora 側でヘッダーを追加する機能です。
- [ADD] 音声ストリーミング機能利用時に `sora.conf` に [audio_streaming_header](SORA_CONF.html#3edcef) を追加しました- デフォルトは `false` です
- `true` に設定すると音声パケットに Sora がヘッダーを追加します
- ヘッダーのフォーマットは `[Timestamp:64 bit, SequenceNumber:64 bit, Length:32 bit]` です
- `timestamp` は音声パケット送信時の UTC 時間マイクロ秒の整数です- RTP のタイムスタンプとは異なります
- `seq_num` は音声パケットのシーケンス番号で、 1 から始まります- RTP のシーケンス番号とは異なります
- `length` はヘッダーを除いた音声パケットの長さです
```mermaid
---
title: "音声ストリーミングヘッダーフォーマット"
---
packet-beta
0-63: "Timestamp"
64-127: "SeqNum"
128-159: "Length"
```
#### プレイアウト遅延機能
**実験的機能です**
プレイアウト遅延機能の仕様を変更しました。
今までは配信側に影響する設定でしたが、今回のリリースから視聴側に影響する設定に変更しました。
この変更により視聴側毎にプレイアウト遅延を指定できるようになりました。
- [ADD] sendrecv と recvonly のロールに影響するよう設定を変更しました- sendonly には影響しません
- [CHANGE] `sora.conf` の [default_playout_delay_min_delay](SORA_CONF.html#194218) は視聴側のプレイアウト遅延の最小値のデフォルトを指定するように変更しました- デフォルトは未指定です
- [CHANGE] `sora.conf` の [default_playout_delay_max_delay](SORA_CONF.html#c1b0ab) は視聴側のプレイアウト遅延の最大値のデフォルトを指定するように変更しました- デフォルトは未指定です
- [CHANGE] 認証成功時の払い出し `playout_delay_min_delay` は視聴側の最小値を指定するように変更しました- `playout_delay_max_delay` も一緒に指定する必要があります
- [CHANGE] 認証成功時の払い出し `playout_delay_max_delay` は視聴側の最大値を指定するように変更しました- `playout_delay_min_delay` も一緒に指定する必要があります
詳細は [プレイアウト遅延機能](PLAYOUT_DELAY.html) をご確認ください。
#### テスト API
- [UPDATE] テスト API がクラスターで利用できるようになりました
- [UPDATE] テスト向け API の録画失敗を意図的に起こす [FailArchive](TEST_API.html#80c0b0) API をクラスターに対応しました
- [UPDATE] テスト向け API のシグナリング通知を送信する [SendSignalingNotify](TEST_API.html#c9b5c5) API をクラスターに対応しました
# 用語集
## クライアント
クライアントは Sora と WebSocket や WebRTC で接続している個を指し、各接続にはユニークな ID が与えられます。
1. **1 接続 1 クライアントの原則**:- Sora における各接続はそれぞれ別個のクライアントとして扱われます。つまり、1 つの接続は 1 つのクライアントとして扱われます
2. **ユニークな ID であるコネクション ID の割り当て**:- クライアントが Sora に接続すると、その接続には固有の ID (コネクション ID) が割り当てられます
3. **複数クライアントのサポート**:- SDK を利用することで、ユーザーは複数のクライアントを使用し、複数の接続を確立することが可能です
4. **同一ユーザーによる接続の統合**:- 同じユーザーが複数の接続を行う場合、これらの接続に同じクライアント ID を指定することで、ユーザーを一意に識別できます
5. **クライアント ID の自動割り当て**:- クライアント ID を指定しない場合、 Sora はコネクション ID をクライアント ID として自動的に割り当てます
## チャネル
チャネルは Sora で使用される「ルーム」や「グループ」として機能する、独立したコミュニケーションのスペースです。
1. **コミュニケーションの制限**:- チャネルに接続したクライアントは、そのチャネル内でのみ音声、映像、データのやりとりが可能です。異なるチャネルのクライアント間での直接のコミュニケーションはできません
2. **複数チャネルへのアクセス**:- 一つのウェブブラウザを使用して、複数のクライアントが同時に複数のチャネルにアクセスすることが可能です
3. **チャネル ID**:- 利用者はチャネルに 255 バイトまでの値を ID として指定できます
## セッション
セッションは実際にチャネルに参加しているクライアントの集まりを指し、各セッションにはユニークな ID が与えられます。
1. **セッションの存在**:- チャネルに 1 つ以上のクライアントが接続している状態を「セッションが存在する」と言い、逆にクライアントが 1 人も接続していない場合は「セッションが存在しない」と言います
2. **セッションの生成**:- セッションは、セッションがまだ存在しないチャネルにクライアントが接続した時に生成されます。
3. **セッションの破棄**:- 全てのクライアントがチャネルから切断した後、一定期間が経過するとセッションは破棄されます。
4. **セッション ID**:- セッションには Sora が自動で生成する一意の ID が割り当てられます
## コネクション
コネクションはクライアントが接続している状態を指し、各コネクションにはユニークな ID が与えられます。
1. **コネクションの生成**:- クライアントが接続し、認証に成功した後、WebRTCが確立されるとコネクションが生成されます
2. **コネクションの破棄**:- クライアントが切断すると、そのコネクションは破棄されます
3. **コネクション ID の自動割り当て**:- コネクションには Sora が自動で生成する一意の ID が割り当てられます
## ロール
Sora のロールは、クライアントが音声や映像をどのように取り扱うかを決定する役割を果たします。
1. **sendrecv (送受信)**:- sendrecv ロールを選択したクライアントは、音声および映像の送受信が可能です。これは、クライアントが他のクライアントと音声や映像を交換する、双方向のコミュニケーションができる状態を意味します
2. **sendonly (送信のみ)**:- sendonly ロールを選択したクライアントは、音声および映像の送信のみが可能です。これは、自分の音声や映像を他のクライアントに送ることはできますが、他からの音声や映像を受け取ることはできない状態を意味します
3. **recvonly (受信のみ)**:- recvonly ロールを選択したクライアントは、音声および映像の受信のみが可能です。これは、他のクライアントからの音声や映像は受け取ることができますが、自分から送ることはできない状態を意味します
4. **ロールの選択タイミング**:- クライアントは接続時にのみロールを選択できます。一度選択されたロールは、その後の接続中に変更することはできません
5. **ロールとメッセージング機能の独立性**:- ロールの選択はSoraのメッセージング機能には影響しません。メッセージング機能の方向性(送信、受信、またはその両方)については、別の項目「direction」で管理されます
# 既知の問題
**既知の問題の詳細についてはサポートまでお問い合わせください**
## Chrome/Edge の不具合による録画機能利用時の音ズレ問題について
Chrome/Edge の不具合により、音声トラックを削除し、その後音声トラックを追加した際に、
音声パケットやそれに関連するタイムスタンプが正しく処理されない場合があり、
これにより録画機能を利用する際に音ズレが発生する問題があります。
この Chrome/Edge の問題は残念ながら解決の見込みはありませんが、録画機能への影響があまりにも大きいため、
Sora 2024.1.0 でこの問題の改善を行いました。
しかし、この改善のための変更が Chrome の別の不具合の影響を受けて新たな問題が発生することが判明したため、
本変更をデフォルトで無効にすることにしました。
この問題への改善は今後も継続していく予定です。
この問題に関して不明点がありましたら、サポートまでご連絡ください。
> **警告**
>
> Safari および Safari Technology Preview でも音ズレが発生する問題を確認しています。
### Sora 2024.1.3 での変更点
Sora 2024.1.0 で [rtp_hdrext_abs_capture_time](SORA_CONF.html#6cf562) のデフォルトを `true` へ変更し、
RTP ヘッダー拡張 `abs-capture-time` を利用することで録画機能利用時の音ズレを回避する仕組みを追加しました。
しかし、一部の端末では予期しない挙動が発生し、録画自体に問題が発生することが判明したため、
Sora 2024.1.3 で [rtp_hdrext_abs_capture_time](SORA_CONF.html#6cf562) の デフォルトを `false` へ変更しました。
この設定を `true` にする場合は、事前にサポートまでご連絡ください。
## 署名アルゴリズムに SHA-1 が利用されている中間証明書をご利用されているお客様へ
Sora 2023.2.x から、署名アルゴリズムが SHA-1 の中間証明書を利用した場合、
Bad Certificate エラーとして接続が拒否されます。
影響のある機能は下記の機能です。
- ウェブフック機能
- 音声ストリーミング機能
- 統計エクスポーター機能
もし、このエラーがログに出力された場合はサポートまでご連絡ください。
## サイマルキャスト録画機能
- Windows 版 Chrome で H.264 のサイマルキャストを録画した場合に画質が悪くなります
- AV1 サイマルキャスト時の録画を利用する場合 `scalabilityMode` が `L1T1` 以外では正常に再生できません
## マルチストリーム機能
- `"type": "sendrecv"` 利用時に音声のみや映像のみを指定した場合でも、音声と映像の両方が送られてきます- 転送フィルター機能を利用してください
- 将来的に改善予定です
## OBS WHIP/WHEP 機能
### スポットライト利用時に音声が自動で配信されない
- OBS 側の WHIP に利用している WebRTC スタック実装で音量レベルを音声パケットに載せてこないため判断ができません- [FocusSpotlightFixed](API_SPOTLIGHT.html#beaf88) API を利用して OBS の接続にフォーカスをあてることで音声を配信できます
- WHIP でのスポットライト有効時は音声を自動で配信する仕組みを導入するか、OBS 側の WHIP に利用している WebRTC スタックへ貢献することを検討しています
## 仕様としての制限
### マルチトラック
- 1 つのストリームに 1 オーディオトラック、1 ビデオトラックしか設定できません- マルチトラックへの対応は検討していますが未定です
# 実験的機能
> **重要**
>
> 実験的機能を本番環境で利用する場合は **必ず** サポートまでご連絡ください。
## 概要
実験的機能とは、正式リリースに向けて積極的に改善を行っている機能、および正式リリースを行うかについて決定を保留にしている機能であり、
今後、後方互換性のない仕様変更を行う可能性があります。
仕様の変更はあるものの、動作が不安定であることやバグを多く含んでいることを意味するものではなく、ご利用の場合はサポートの対象となります。
また、実験的機能に関するお客様からのお問い合わせやフィードバックを基に、今後の開発方針を決定することがあります。
ごく稀に、正式リリースを見合わせて削除する機能もありますので、具体的な機能については以下の一覧でご確認いただくとともに、
実際に本番環境でご利用いただく場合は事前にサポートまでご連絡いただきますようお願いします。
## トライアル一覧
### セッション単位での最大同時接続数制限機能
> **重要**
>
> この機能はトライアル中で、正式リリースに向けてサポートへのフィードバックをお願いしています。
> **注意**
>
> この機能を利用する場合は事前にサポートまでご連絡ください。
セッション生成時の払い出しで `trial_max_connections` を払い出すことで、セッション単位での同時接続数を厳密に制限することができます。
詳細は [trial_max_connections](SESSION_WEBHOOK.html#48346d) をご覧ください。
## 実験的機能一覧
### 正式リリースに向けて改善を進めている機能
- [リレー機能](CLUSTER.html#4b3bf1)- 2025 年 6 月リリースの Sora にて正式リリースの予定です
- [アフィニティ機能](CLUSTER.html#6f4bfb)- 2025 年 6 月リリースの Sora にて正式リリースの予定です
- [テンポラリーノード機能](CLUSTER.html#3cb6c8)- 2025 年 6 月リリースの Sora にて正式リリースの予定です
- [統計ウェブフック機能](STATS_WEBHOOK.html)- 2025 年 6 月リリースの Sora にて正式リリースの予定です
- [RTC 統計情報 API](EXPERIMENTAL_API_RTC_STATS.html)- 2025 年 6 月リリースの Sora にて正式リリースの予定です
- [シグナリング通知メタデータ拡張 API](EXPERIMENTAL_API_SIGNALING_NOTIFY_METADATA_EXT.html)- 2025 年 12 月リリースの Sora にて正式リリースの予定です
- [シグナリング通知 ICE コネクションステート](ICE_CONNECTION_STATE.html#149f7e)- 2025 年 12 月リリースの Sora にて正式リリースの予定です
- [マルチ転送フィルター機能](MULTI_FORWARDING_FILTER.html)- 2025 年 12 月リリースの Sora にて正式リリースの予定です
- [MP4 形式録画機能](RECORDING.html#65b0fb)- 2025 年 12 月リリースの Sora にて正式リリースの予定です
- [プレイアウト遅延機能](PLAYOUT_DELAY.html)- 2025 年 12 月リリースの Sora にて正式リリースの予定です
- [OBS (WHEP) 対応](WHEP.html)- OBS の WHEP 対応がリリースされた後、正式リリースの予定です
- [サイマルキャストマルチコーデック機能](SIMULCAST_MULTICODEC.html)- 2026 年 6 月リリースの Sora にて正式リリースの予定です
- H.265 対応- Chrome/Edge の H.265 対応がリリースされた後、正式リリースの予定です
### 正式リリースが未定の機能
- 映像コーデックパラメーター指定機能- [signaling_vp9_params](SORA_CONF.html#3261ea)
- [signaling_av1_params](SORA_CONF.html#91f3b8)
- [signaling_h264_params](SORA_CONF.html#b32e49)
- [signaling_h265_params](SORA_CONF.html#8ed4e9)
- [default_vp9_param_profile_id](SORA_CONF.html#ab0de9)
- [default_av1_param_profile](SORA_CONF.html#319e30)
- [default_h264_param_profile_level_id](SORA_CONF.html#1581db)
- [default_h265_param_level_id](SORA_CONF.html#d15808)
- [ビデオの VP9 設定指定](SIGNALING.html#b7556a)
- [ビデオの AV1 設定指定](SIGNALING.html#48f92d)
- [ビデオの H.264 設定指定](SIGNALING.html#ffc4cb)
- [ビデオの H.265 設定指定](SIGNALING.html#bfe45b)
- 音声コーデックパラメーター指定機能
- ウェブフック HTTP ヘッダー
- [統計 API](EXPERIMENTAL_API_STATS.html)
- [GetStatsReport](EXPERIMENTAL_API_STATS.html#bbbfca) API
- [session.vanished](MODE.html#9f1b17)
### 正式リリースを行うかについて検討を保留にしている機能
- H.264/H.265 B-frame 対応- [h264_b_frame](SORA_CONF.html#f546aa)
- [h265_b_frame](SORA_CONF.html#a9a8f8)
- [RTP 転送 API](EXPERIMENTAL_API_RTP_FORWARDING.html)
- [ネットワークのシグナリング通知](SIGNALING_NOTIFY.html#58a82d)
- [ListChannels](EXPERIMENTAL_API_SIGNALING.html#b27c42) API
- 片方向配信時の視聴側帯域推定を利用した配信ビットレートの自動変更機能
- 映像コーデックのビットレートを 15 Mbps より大きく指定した場合
### 廃止予定がある実験的機能
- [統計エクスポーター機能](STATS_EXPORTER.html)
- [RTP ストリーム停止/再開 API](EXPERIMENTAL_API_RTP_STREAM_PAUSE_RESUME.html)
# 非推奨機能
ここでは今後廃止される非推奨の機能について説明していきます。
不明点はサポートまでお問い合わせください。
## CentOS 7 対応
CentOS 7 は 2024 年 6 月末でサポートが終了となるのに合わせて、Sora の CentOS 7 版については以下のとおりとなります。
**パッケージの提供**: 2023 年 12 月にリリースの 2023.2.0、およびその後リリースされる可能性のある 2023.2.x の提供をもって終了
**サポートの終了**: 2023.2.0 およびおよびその後リリースされる可能性のある 2023.2.x に対しては 2024 年 12 月末で終了
- [EOL CentOS | End of Life (EOL) | Lifecycle](https://endoflife.software/operating-systems/linux/centos)
CentOS 7 版をご利用のお客様は、早めに OS の変更をご検討の上、移行先の OS をサポートまでご連絡下さい。
## Ubuntu 20.04 対応
Ubuntu 20.04 は 2025 年 4 月末でサポートが終了となるのにあわせて、Sora の Ubuntu 20.04 版については以下のとおりとなります。
**パッケージの提供**: 2024 年 6 月にリリースの 2024.1.0、およびその後リリースされる可能性のある 2024.1.x の提供をもって終了
**サポートの終了**: 2024.1.0 およびおよびその後リリースされる可能性のある 2024.1.x に対しては 2025 年 6 月末で終了
Ubuntu 20.04 版をご利用のお客様は、早めに OS の変更をご検討の上、移行先の OS をサポートまでご連絡下さい。
## レガシー録画機能の廃止
> **重要**
>
> **2025 年 12 月リリース予定の Sora にて廃止**
[レガシー録画機能](LEGACY_RECORDING.html) を廃止します。
今後は [録画機能 (セッション単位)](RECORDING.html) をご利用ください。
移行に関しては [レガシー録画機能から新しい録画機能 (セッション単位) への移行](LEGACY_RECORDING_TO_RECORDING.html) をご確認ください。
- 2024 年 12 月リリース予定の Sora にて [legacy_recording](SORA_CONF.html#632f06) のデフォルトを `false` に変更します
- 2025 年 12 月リリース予定の Sora にて [legacy_recording](SORA_CONF.html#632f06) の設定を廃止し、レガシーレコーディングを廃止します。
## レガシーストリーム(非マルチストリーム)機能の廃止
> **重要**
>
> **2025 年 6 月リリース予定の Sora にて廃止**
レガシーストリーム(非マルチストリーム)機能を廃止します。
今後はマルチストリームをご利用ください。
移行に関しては [レガシーストリーム(非マルチストリーム)機能からマルチストリームへの移行](LEGACY_STREAM_TO_MULTISTREAM.html) をご確認ください。
- 2024 年 6 月リリースの Sora にて [legacy_stream](SORA_CONF.html#3bb175) の設定をデフォルト `false` にて追加しました
- 2025 年 6 月リリース予定の Sora にて [legacy_stream](SORA_CONF.html#3bb175) の設定を廃止し、レガシーストリームを廃止します
## ListForwardingFilters API の `channel_forwarding_filter` の廃止
> **重要**
>
> **2025 年 12 月リリース予定の Sora にて廃止**
[ListForwardingFilters](API_FORWARDING_FILTER.html#a1dd75) API の戻り値 `channel_forwarding_filter` を廃止します。
今後は `channel_forwarding_filters` をご利用ください。
移行期間中は `channel_forwarding_filter` と `channel_forwarding_filters` の両方を API の戻り値として出力します
## 認証成功時とセッション生成時の `forwarding_filter` の廃止
> **重要**
>
> **2025 年 12 月リリース予定の Sora にて廃止**
認証成功時とセッション生成時の `forwarding_filter` を廃止します。
今後は `forwarding_filters` をご利用ください。
移行期間中は `forwarding_filter` と `forwarding_filters` の両方を払い出すことができます。
その場合は `forwarding_filters` の値を優先します。
## RTP ストリーム停止/再開 API の廃止
> **重要**
>
> **2025 年 12 月リリース予定の Sora にて廃止**
RTP 転送ストリーム停止/再開 API は [転送フィルター](FORWARDING_FILTER.html) により同等の機能が提供でき、
重複機能となるため廃止します。
今後は [転送フィルター](FORWARDING_FILTER.html) をご利用ください。
## 統計エクスポーター機能の廃止
> **重要**
>
> **2025 年 6 月リリース予定の Sora にて廃止**
実験的機能として提供している統計エクスポーター機能を廃止します。
今後は [統計ウェブフック](STATS_WEBHOOK.html) をご利用ください。
## ユーザーエージェント統計の廃止
> **重要**
>
> **2025 年 6 月リリース予定の Sora にて廃止**
統計エクスポーター機能廃止に伴い、ユーザーエージェント統計関連も廃止します。
今後は RTC 統計を利用してください。
- 認証ウェブフック成功時の払い出しで利用する `user_agent_stats` を廃止します- `rtc_stats` をご利用ください
- `sora.conf` の [user_agent_stats](SORA_CONF.html#b8b6ef) を廃止します- [default_rtc_stats](SORA_CONF.html#558c2b) をご利用ください
## [session.vanished](MODE.html#9f1b17) の廃止
> **重要**
>
> **2025 年 6 月リリース予定の Sora にて廃止**
[session.vanished](MODE.html#9f1b17) を廃止します。
代わりに [GetStatsReport](EXPERIMENTAL_API_STATS.html#bbbfca) API の `total_ongoing_connections` をご利用ください。
また [Sora Exporter](SORA_EXPORTER.html) をご利用いただくことで、Sora の統計情報を OpenMetrics 形式で取得できますので、
こちらもご利用ください。
## スポットライト機能 `spotlight_number` 項目の認証成功時の払い出しの非推奨化
> **重要**
>
> 現時点では廃止予定はありませんが、将来的に 1 年の移行期間をもうけて廃止する予定です。
セッションウェブフック [session.created](SESSION_WEBHOOK.html#1d1984) で `spotlight_number` の値を払い出すことができるようになりました。
そのためスポットライト機能の `spotlight_number` 項目を認証ウェブフック成功時の払い出しで利用するのは非推奨でになります。
現時点では廃止予定はありませんが、将来的に 1 年以上の移行期間を経て廃止される予定です。
## ウェブフックと統計エクスポーターの HTTP ヘッダー `x-sora` prefix の非推奨化
> **重要**
>
> 現時点では廃止予定はありませんが、将来的に 1 年の移行期間をもうけて廃止する予定です。
`x-sora` prefix とは別に `sora` prefix の HTTP ヘッダーを追加しました。
これは [RFC 6648](https://datatracker.ietf.org/doc/html/rfc6648) による `x-` prefix の非推奨化に準拠するためです。
`x-sora` prefix は非推奨になります。現時点では廃止予定はありませんが、将来的に 1 年以上の移行期間を経て廃止される予定です。
- セッションウェブフックの `x-sora-session-webhook-type` ヘッダーは非推奨です、 `sora-session-webhook-type` ヘッダーを利用してください
- イベントウェブフックの `x-sora-event-webhook-type` ヘッダーは非推奨です、 `sora-event-webhook-type` ヘッダーを利用してください
- 統計エクスポーターの `x-sora-stats-exporter-type` ヘッダーは非推奨です、 `sora-stats-exporter-type` ヘッダーを利用してください- 統計エクスポーターが 2024 年 12 月リリース予定の Sora にて廃止されるため、この項目は廃止される予定です
## API
[非推奨 API](DEPRECATED_API.html) をご確認ください
# 廃止機能
## 概要
廃止機能とはすでに廃止された機能です。
API の廃止については [廃止 API](OBSOLETE_API.html) をご確認ください。
## ListClusterNodes API の include_all_known_nodes の廃止
**2024 年 12 月リリースの Sora にて廃止**
[ListClusterNodes](API_CLUSTER.html#a70901) API の `include_all_known_nodes` は廃止しました。
今後はそのクラスターへ登録されている全てのノード情報が常に含まれるようになります。
もし一時的に離脱しているノードを含めない場合は API の結果を `"connected": true` でフィルタリングしてください。
## sora.conf の legacy_auth_webhook_log の廃止
**2024 年 12 月リリースの Sora にて廃止**
今まで認証ウェブフックが 200 番台を返さなかったり、 `"allowed"` 項目を含まなかったり、
`"allowed": false` なのに `"reason"` が含まれていなかったり、送信先から応答がなくタイムアウトしたなどで、
処理が正常に行えなかった場合は `auth_webhook.jsonl` に `res` 項目なしで出力していました。
この仕様を維持する `legacy_auth_webhook_log` 設定を廃止しました。
今後は `auth_webhook_error.jsonl` に `reason` 項目を追加して出力するように変更しました。
## sora.conf の legacy_event_webhook_connection_destroyed_reason の廃止
**2024 年 12 月リリースの Sora にて廃止**
Sora 2023.2.x まで `connection.destroyed` の `reason` には、
`disconnect_api_reason` と同じ値が含まれており、
コネクション切断系 API で `reason` が指定されていない場合は `null` が含めていました。
この仕様を維持する `legacy_event_webhook_connection_destroyed_reason` 設定を廃止しました。
今後は `connection.destroyed` の `reason` には以下のような値が入ります。
- `"normal"` は通常のコネクション破棄
- `"disconnected_api"` はコネクション切断系 API によるコネクション破棄
- `"session_destroyed"` はセッションライフタイム期限切れ、または API によるセッション破棄によるコネクション破棄
- `"lifetime_expired"` はライフタイム期限切れによるコネクション破棄
## 認証成功時の払い出し h264_profile_level_id の廃止
**2024 年 6 月リリースの Sora にて廃止**
認証成功時の払い出しで H264 のプロファイルレベルの値を指定する `h264_profile_level_id` を廃止しました。
`"video_h264_params": {"profile_level_id": ...}` をご利用ください。
## sora.conf の default_h264_profile_level_id の廃止
**2024 年 6 月リリースの Sora にて廃止**
H264 のプロファイルレベルのデフォルト値を指定する `default_h264_profile_level_id` を廃止しました。
[default_h264_param_profile_level_id](SORA_CONF.html#1581db) をご利用ください。
## Lyra コーデック対応の廃止
**2024 年 6 月リリースの Sora にて廃止**
Lyra コーデック対応を廃止しました。
Opus 1.5 で Lyra 同様の低ビットレートが利用可能になったこと、Lyra が 2 年間更新がないことが廃止の理由です。
## sora.conf の legacy_log_format の廃止
**2023 年 12 月リリースの Sora にて廃止**
sora ログや internal ログをレガシーフォーマットで出力する `sora.conf` の `legacy_log_format` 設定を廃止しました。
## sora.conf の legacy_log_extension の廃止
**2023 年 12 月リリースの Sora にて廃止**
JSONL 形式で出力するログの拡張子を `.log` でファイル出力する `sora.conf` の `legacy_log_extension` 設定を廃止しました。
## sora.conf の legacy_webhook_audio_video_json_structure の廃止
**2023 年 12 月リリースの Sora にて廃止**
ウェブフックで利用する audio と video の JSON 構造を `{"audio": {"codec_type": "OPUS"}}` といった入れ子構造にする
`sora.conf` の `legacy_webhook_audio_video_json_structure` 設定を廃止しました。
## DataChannel で利用している SCTP 関連の実験的な設定の廃止
**2023 年 6 月リリースの Sora にて廃止**
DataChannel で利用している SCTP 関連の実験的な設定である
`dcsctp_heartbeat_interval` と `dcsctp_slow_start_tcp_style` の設定を廃止しました。
## Ubuntu 18.04 サポートの終了
**サポート提供終了**: 2023 年 4 月末
[Ubuntu release cycle | Ubuntu](https://ubuntu.com/about/release-cycle)
Ubuntu 18.04 は 2023 年 6 月末で通常サポートが終了しました。
Ubuntu 側から 4 月末での通常サポート終了が 6 月末まで延長されましたが、
Sora は当初の予定のまま 2023 年 4 月末をもって Ubuntu 18.04 版のサポートとパッケージの提供を終了しました。
Ubuntu 20.04 または Ubuntu 22.04 版への移行をお願いいたします。
Ubuntu 18.04 を利用しているお客様は、サポートまで切り替え先の OS をご連絡ください。
## sora.conf の split_archive_legacy_prefix の廃止
**2023 年 6 月リリースの Sora にて廃止**
`sora.conf` の `split_archive_legacy_prefix` 設定を廃止しました。
- 分割録画ファイル名 `archive-_.(json|webm)` が利用できなくなりました- `split-archive-_.(json|webm)` を利用するように変更してください
- 分割録画時のイベントウェブフックタイプ `"type": "archive.split"` が利用できなくなりました- `"type": "split-archive.available"` を利用するように変更してください
- 分割録画時のイベントウェブフックタイプ `"type": "archive.end"` が利用できなくなりました- `"type": "split-archive.end"` を利用するように変更してください
## sora.conf の default_multistream の廃止
**2023 年 6 月リリース予定の Sora にて廃止**
`sora.conf` の `default_multistream` 設定を廃止しました。
今後は接続時に `multistream` を指定せずに接続した場合は常にマルチストリームが有効になります。
## redact_archive_metadata_sensitive_data と redact_api_sensitive_data の廃止
**2022 年 12 月リリースの Sora にて廃止**
録画メタデータと API のセンシティブデータを **"REDACTED"** という文字列に書き換えを廃止しました。
今後はこれらのデータは書き換えを行いません。
## recording.report の metadata_filename と metadata_file_path の廃止
**2022 年 12 月リリースの Sora にて廃止**
録画イベントウェブフックの `recording.report` に含まれる `metadata_filename` と `metadata_file_path` が `filename` と `file_path` に変更されます。
2021 年 12 月リリースの Sora にて `filename` と `file_path` が追加されていますので、そちらを利用するように変更してください。
## シグナリング通知メタデータ metadata_list の廃止
**2022 年 6 月リリースの Sora にて廃止**
`metadata_list` が `data` に変更されました。
## `"type": "update"` の廃止
**2022 年 6 月リリースの Sora にて廃止**
マルチストリーム機能利用時のシグナリングで利用する `"type": "update"` を廃止し、
`"type": "re-offer"` と `"type": "re-answer"` に変更しました。
## sora.conf の demo の廃止
**2022 年 6 月リリースの Sora にて廃止**
`sora.conf` の `demo` を廃止しました。今後は `devtools` を利用してください。
これは `デモ機能` が `開発者ツール` へと名前を変更したことによる影響です。
## sora.conf の remote_stats の廃止
**2022 年 6 月リリースの Sora にて廃止**
`sora.conf` の `remote_stats` を廃止しました。今後は `user_agent_stats` を利用してください。
これは `リモート統計情報` が `ユーザーエージェント統計情報` へと名前を変更したことによる影響です。
## StopRecording API の redirect の配信
**2022 年 6 月リリースの Sora にて廃止**
録画機能がクラスターで共有できるようになったことにより、 `redirect` 指定が不要になったため廃止しました。
## CentOS 8 対応
**サポート提供終了**: 2021 年 12 月
- [CentOS Project shifts focus to CentOS Stream – Blog.CentOS.org](https://blog.centos.org/2020/12/future-is-centos-stream/?utm_source=rss&utm_medium=rss&utm_campaign=future-is-centos-stream)
- [FAQ - CentOS Project shifts focus to CentOS Stream](https://centos.org/distro-faq/)
- [FAQ: CentOS Stream Updates](https://www.redhat.com/ja/blog/faq-centos-stream-updates)
CentOS 8 は 2021 年 12 月をもってサポートが終了しました。
それに伴い Sora は 2021 年 12 月末をもって CentOS 8 版のサポートとパッケージの提供を終了しました。
## extmap_allow_mixed 設定のデフォルト有効化と廃止
**2021 年 12 月リリースの Sora にて廃止**
Chrome M89 にて `a=extmap-allow-mixed` がデフォルトで設定されるようになり、 また Firefox 側でも動作に問題がなくなったことからこちらの設定が不要となりました。
2021 年 6 月リリースの Sora でデフォルト有効とし、2021 年 12 月リリースの Sora にて設定を廃止しました。
## スポットライトレガシー機能の廃止
**2021 年 12 月リリースの Sora にて廃止**
スポットライトレガシー機能は 2021 年 12 月リリースの Sora で廃止しました。
今後は [スポットライト機能](SPOTLIGHT.html) を利用してください。
## `rtp` にある RTCP 関連統計情報を廃止
**2021 年 12 月リリースの Sora にて廃止**
統計 API の `rtp` 項目に入っている RTCP 関連統計情報を `rtcp` 項目として独立させました。
これに伴い `rtp` にある RTCP 関連統計情報を廃止しました。
## `sora.conf` の `opus_param_clock_rate` を廃止
**2021 年 12 月リリースの Sora にて廃止**
実験的機能として提供していた `opus_param_clock_rate` を廃止しました。
## `sora.conf` の `dcsctp_association_max_retrans` を廃止
**2021 年 12 月リリースの Sora にて廃止**
実験的機能として提供していた `dcsctp_association_max_retrans` を廃止しました。
今後は [ICE コネクションステート機能](ICE_CONNECTION_STATE.html) を利用してください。
## role の upstream と downstream を廃止
**2021 年 6 月リリースの Sora にて廃止**
`upstream` と `downstream` は 2021 年の 6 月リリースの Sora で廃止しました。
- マルチストリームの `upstream` は `sendrecv` をお使い下さい
- マルチストリームの `downstream` は `recvonly` をお使い下さい
- スポットライトの `upstream` は `sendrecv` をお使い下さい
- スポットライトの `downstream` は `recvonly` をお使い下さい
- 片方配信の `upstream` は `sendonly` をお使い下さい
- 片方配信の `downstream` は `recvonly` をお使い下さい
### シグナリング接続
- シグナリング接続時に指定する `role` の `upstream` と `downstream` を廃止しました
### 認証ウェブフック
- 認証ウェブフックの `channel_upstream_connections` を廃止しました- 今後は `channel_sendrecv_connections` または `channel_sendonly_connections` をご利用ください
- 認証ウェブフックの `channel_downstream_connections` を廃止しました- 今後は `channel_recvonly_connections` をご利用ください
### イベントウェブフック
- イベントウェブフック `*.connection` の `channel_upstream_connections` を廃止しました- 今後は `channel_sendrecv_connections` または `channel_sendonly_connections` をご利用ください
- イベントウェブフック `*.connection` の `channel_downstream_connections` を廃止しました- 今後は `channel_recvonly_connections` をご利用ください
### シグナリング通知
- シグナリング通知 `*.connection` の `channel_upstream_connections` を廃止しました- 今後は `channel_sendrecv_connections` または `channel_sendonly_connections` をご利用ください
- シグナリング通知 `*.connection` の `channel_downstream_connections` を廃止しました- 今後は `channel_recvonly_connections` をご利用ください
### API
- `Sora_20151104.DisconnectChannelUpstream` API を廃止しました- 今後は [DisconnectChannelByRole](API_SIGNALING.html#39de6a) API をご利用ください
- `Sora_20151104.DisconnectChannelDownstream` API を廃止しました- 今後は [DisconnectChannelByRole](API_SIGNALING.html#39de6a) API をご利用ください
- `Sora_20160711.PushUpstream` API を廃止しました- 今後は [PushChannelByRole](API_PUSH.html#bc57a2) API をご利用ください
- `Sora_20160711.PushDownStream` API を廃止しました- 今後は [PushChannelByRole](API_PUSH.html#bc57a2) API をご利用ください
## client_id を指定する設定の廃止
**2021 年 6 月リリースの Sora にて廃止**
`sora.conf` の `allow_client_id_assignment` 設定を廃止し `client_id` はクライアント側で指定できるようにします。
### sora.conf
- `sora.conf` の `allow_client_id_assignment` を廃止しました
### API
- `Sora_20170529.GetStats` API を廃止しました- `allow_client_id_assignment` 廃止に伴う廃止のため代替はありません
- `Sora_20170814.StartForwardingRtp` API の `client_id` 指定を廃止しました- `allow_client_id_assignment` 廃止に伴う廃止のため代替はありません
- `Sora_20170814.StopForwardingRtp` API の `client_id` 指定を廃止しました- `allow_client_id_assignment` 廃止に伴う廃止のため代替はありません
- `Sora_20151104.ListConnections` API を廃止しました- 今後は [ListChannelConnections](API_SIGNALING.html#d388f3) API をご利用ください
- `Sora_20151104.Disconnect` API を廃止しました- 今後は [DisconnectClient](API_SIGNALING.html#e91c0b) API をご利用ください
## 旧サイマルキャスト画質変更 API の廃止
**2021 年 6 月リリースの Sora にて廃止しました**
- `Sora_20180820.ChangeSimulcastQuality`- 今後は [RequestRtpStream](API_SIMULCAST.html#6fe0b3) API をご利用ください
この API の廃止に伴い、シグナリング接続時や認証成功時に指定するサイマルキャストの `quality` での `low` / `middle` / `high` 指定を廃止しました。
今後は `rid` と `r0` / `r1` / `r2` を利用してください。
## bin/sora start の廃止
**2020 年 12 月リリースの Sora にて廃止しました**
`bin/sora start` は 2020 年 12 月リリースの Sora 2020.3 で廃止しました。 今後は `bin/sora daemon` を利用してください。
systemd を利用されている方は `bin/sora foreground` を利用されていると思いますが、こちらに変更はありません。
## Ubuntu 16.04 サポートの終了
**サポート提供終了**: 2021 年 4 月末
[Ubuntu release cycle | Ubuntu](https://ubuntu.com/about/release-cycle)
Ubuntu 16.04 は 2021 年 4 月を持って通常サポートが終了しました。
それに伴い Sora は 2021 年 4 月末をもって Ubuntu 16.04 版のサポートとパッケージの提供を終了しました。
Ubuntu 18.04 または Ubuntu 20.04 版への移行をお願いいたします。
Ubuntu 16.04 を利用しているお客様は、サポートまで切り替え先の OS をご連絡ください。
# FAQ
ここでは WebRTC SFU Sora に関するよくある質問についてまとめています。
## WebRTC 全般
### 双方向配信には対応していますか?
対応しています。WebRTC のマルチストリームという技術を利用して実現しています。
クライアント側の負荷を考慮し、 1 チャネルに参加するクライアントは 12 までを推奨としています。
1 チャネルで 12 より多いクライアントで双方向の配信を行いたい場合は [スポットライト機能](SPOTLIGHT.html) を検討するかサポートまでお問い合わせ下さい。
### 片方向配信には対応していますか?
対応しています。
### 片方向配信はどのくらいの接続数まで対応していますか?
Sora 1 で 1 チャネルに 1 万接続程度まで対応しています。
クラスターリレー機能を利用する事で 100 万接続以上への配信もできます。
### 音声検出による映像の切り替えには対応していますか?
対応しています。Sora 独自のスポットライト機能という名前で提供しています。
この機能は多人数で会議を行う場合に、クライアントやサーバーの負荷を減らせる技術です。
100 名以上が 1 チャネルに参加できます。
詳細は [スポットライト機能](SPOTLIGHT.html) をご確認ください
### スクリーンキャプチャ機能には対応していますか?
2024 年 12 月 の時点でスクリーンキャプチャ機能はブラウザでは Chrome と Firefox と Safari と Edge が対応しています。
getDisplayMedia を利用することで、実現できます。
[MediaDevices.getDisplayMedia() - Web APIs | MDN](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia)
### マルチストリームには対応していますか?
> **ヒント**
>
> Sora はデフォルトでマルチストリームを利用します。
対応しています。ブラウザでは Chrome と Firefox と Safari と Edge で対応しています。
また、すべての SDK が対応しています。
### マルチトラックには対応していますか?
対応していません。 Sora は 1 メディアストリームにつき 1 音声トラック、1 映像トラックまでしか対応していません。
マルチトラックへの対応は今のところ未定です。
### 複数の音声や複数の映像を 1 つのコネクションで配信することはできますか?
いいえ。 1 つのコネクションで複数ストリームを配信をすることはできません。
1 接続では 1 ストリーム (1 音声/1 映像) のみの配信ができます。
複数の配信を行いたい場合はマルチストリームの `sendonly` ロールを利用して複数接続してください。
### 1 ユーザーで送受信と送信のみを利用している場合、送受信側で送信のみの音声や映像を受信しないことはできますか?
はい、できます。接続時、または認証成功時に [bundle_id](SIGNALING.html#b23b22) で同じ値を指定してください。
> **注釈**
>
> シグナリング時に `bundle_id` を指定する場合は `sora.conf` の [signaling_bundle_id](SORA_CONF.html#279311) を `true` にする必要があります。
`bundle_id` が同じ接続では送信のみの音声と映像を送受信側で受信しなくなります。
### 映像コーデックは何がお勧めですか?
すべてのブラウザ、さらにほぼすべての端末で動作する VP9 か H.264 がお勧めです。
ただし、端末に VP9 のハードウェアアクセラレータが搭載されていることはほとんどないため、
H.264 を採用した方が電池消費量は減ります。
一方で、H.264 は一部の Android 端末で正常に動作しないことがあります。
すべての環境が Chrome に統一できる場合は AV1 をお勧めします。
### H.264 や VP9 での映像配信に対応していますか?
ブラウザがそれぞれのコーデックに対応していれば、 Sora は問題なく配信できます。
2024 年 12 月 の時点では ...
- Chrome 131 は VP8、 VP9、 AV1、 H.264 に対応しています- Field Trial として H.265 対応が追加されています
- Firefox 131 は VP8、 VP9、 H.264 に対応しています
- Edge 131 は VP8、 VP9、 AV1 、H.264 に対応しています
- Safari 18.1 は VP8、 VP9、 H.264, H265 に対応しています- 実験的機能として AV1 対応が追加されています
Sora は配信者がコーデックを選択できる仕組みを採用しています。
詳細は [シグナリング](SIGNALING.html) をご確認ください
### Safari は WebRTC に対応していますか?
はい。 Safari 12 で WebRTC に対応しました。
詳細は [Apple Safari の WebRTC について](SAFARI.html) をご確認ください。
### Chrome や Edge では HTTPS が必須ですか?
はい。ローカルホスト以外からのアクセスでブラウザで getUserMedia を使用する場合は HTTPS が必須になります。
もし、開発中に HTTP でアクセスしたい場合は、以下を参考にしてください。
[http でのアクセスでカメラの映像を取得する - Qiita](https://qiita.com/Hexa/items/a5e5c3e06ba2a3e6bb41)
### Safari では HTTPS が必須ですか?
はい。ただし、 開発者メニューから HTTP でも getUserMedia を使用できるようにするオプションが用意されています。
### Edge は WebRTC に対応していますか?
はい。 Chrome とほぼ同等のレベルで WebRTC が利用できます。
詳細は [Microsoft Edge の WebRTC について](EDGE.html) をご確認ください。
### サーバー側からクライアントごとにコーデックやビットレートを指定できますか?
できます。 Sora からクライアントへ送信する Offer に含める SDP を、クライアントごとに指定できます。
詳細については [認証ウェブフック成功時の払い出し](AUTH_WEBHOOK_RETURN.html) をご確認ください。
### コーデックが異なるクライアントでも同じチャネルでの双方向通信はできますか?
できます。マルチストリームを利用することで接続ごとにコーデックを指定できます。
例えば、iOS の Safari は H.264 、デスクトップの Chrome は VP8 という場合でも同じチャネルでの双方向通信が利用できます。
ただし、ブラウザが非対応の場合はもちろん送受信できませんのでご注意ください。
### Firefox で複数タブで音声デバイスを利用できますか?
いいえ。 Firefox 56 から複数タブで音声デバイスを利用できなくなりました。
### Safari で音声が有効な場合、自動で視聴を開始できますか?
いいえ。 Safari の仕様で、音声が含まれている映像を自動で再生することはできません。
### 高いビットレートで配信することはできますか?
できます。ただし、Sora では最大 50 Mbps での配信ができますが、
今のところは 15 Mbps より大きなビットレートでの配信はサポート対象外とさせていただいています。
配信自体はできますが、クライアント、サーバーともに不安定になることがあるためです。
今後、高いビットレートでの配信を安定して実現できるようにしていく予定です。
### 4K 30fps を実現したいのですができますか?
できます。ただしクライアント側の負荷がとても高くなるため、かなり条件は厳しいです。
クライアントの負荷が高い場合、
ブラウザは自動的に解像度やフレームレートを下げる仕組みが入っているため、
4K 30fps を配信するためにはソフトウェアエンコードでの配信はかなり厳しいです。
そのため 4K 30fps に対応したハードウェアエンコーダーが必要になります。
時雨堂が公開している SDK はハードウェアエンコーダーに対応していますので、
対応しているハードウェアを用意していただければと思います。
また、時雨堂では [WebRTC Native Client Momo](https://momo.shiguredo.jp/) という、
様々なハードウェアエンコーダーに対応したクライアントをオープンソースで公開していますので、是非試してみてください。
[shiguredo/momo: WebRTC Native Client Momo](https://github.com/shiguredo/momo)
### 映像をフレームレート 60 や 120 で配信することはできますか?
できます。ただし Sora は映像のフレームレートには関与しません。
そのため、フレームレートはカメラが対応していること、また、クライアントが対応していることが必要になります。
### カメラで指定した解像度より低い解像度で配信されるのですが?
カメラ映像の解像度と WebRTC でエンコードされて配信される解像度は一致しません。
カメラから入ってくる映像を WebRTC では圧縮して配信します。WebRTC は圧縮時に CPU 使用率が高い、ネットワーク帯域不足などの状況に応じ、自動で解像度やフレームレートを落として配信できる状態にして配信します。
### WebRTC DataChannel には対応していますか?
対応しています。
2024 年 12 月 の時点では、シグナリング機能と [リアルタイムメッセージング機能](MESSAGING.html) として DataChannel を利用できます。
詳細は [DataChannel 経由のシグナリング](DATA_CHANNEL_SIGNALING.html) や [リアルタイムメッセージング機能](MESSAGING.html) をご確認ください。
### 音声のステレオには対応していますか?
対応しています。
ただしステレオで音声をエンコード/デコードするかどうかはクライアント側に依存します。
例えばブラウザの場合はデフォルトでステレオに対応していますが、エコーキャンセルが有効な場合はステレオは利用できません。
エコーキャンセルを無効にすることでステレオが利用できるようになります。
エコーキャンセルの設定は以下を参考にしてください。
[Media Capture and Streams](https://www.w3.org/TR/mediacapture-streams/#dom-mediatracksupportedconstraints-echocancellation)
### MediaStreamTrack から connection_id は取得できますか?
できます。
Sora では自分以外の MediaStreamTrack の ID に `{connection_id}-{audio | video}` という形式が含まれるようになっています。
そのため、MediaStreamTrack の ID から connection_id を取得することができます。
MediaStreamTrack の id や label 、getCapabilities の deviceId や getSettings の deviceId がこの形式になります。
- `"id": "CQE8KR2MAN1B1DD149NA2EX4MM-video"`
- `"label": "CQE8KR2MAN1B1DD149NA2EX4MM-video"`
- `"getCapabilities": {"deviceId": "CQE8KR2MAN1B1DD149NA2EX4MM-video", ...`
- `"getSettings": {"deviceId": "CQE8KR2MAN1B1DD149NA2EX4MM-video", ...`
> **危険**
>
> Firefox には対応していません
### WebRTC 統計情報 inbound-rtp から connection_id は取得できますか?
できます。
Sora では WebRTC 統計情報 `inbound-rtp` の `trackIdentifier` に `{connection_id}-{audio | video}` という形式が含まれるようになっています。
そのため、 `trackIdentifier` から connection_id を取得することができます。
`"trackIdentifier": "CQE8KR2MAN1B1DD149NA2EX4MM-video"` の用に含まれます。
> **危険**
>
> Firefox には対応していません
## シグナリング
### シグナリングは独自仕様ですか?
独自仕様です。
WebRTC の規格ではシグナリング部分は定義されていないため、
WebRTC で利用されるシグナリングは独自仕様が前提になります。
Sora は `JSON over WebSocket` または `JSON over DataChannel` をシグナリングの仕様として採用しています。
Sora の SDK を利用すればシグナリングを意識する必要がありません。
Sora のシグナリングの詳細な仕様について確認したい場合は、[シグナリング](SIGNALING.html) をご確認ください。
> **注釈**
>
> OBS 向けのシグナリングは WHIP / WHEP という RFC で定義されているプロトコルに対応しています。
### シグナリングに WebSocket (WS) ではなく WebSocket over TLS (WSS) を使うことはできますか?
できます。
`getUserMedia` を使用する場合、 ローカルホスト以外のアクセスは WSS を必須としています。
ただし、Sora は WS のみに対応しています。
これは、実運用を考慮して、前段にリバースプロキシサーバーを立てていることを前提としており、
リバースプロキシサーバーで TLS を終端する構成を想定しているためです。
そのため、もし WSS を使う場合は、
nginx などのリバースプロキシサーバーを使用して TLS を終端してください。
> **注意**
>
> nginx の設定などについてはサポート対象外となりますので、お問い合わせはご遠慮ください
弊社では、TLS を終端するリバースプロキシサーバーには nginx の使用を推奨しています。
詳細については [nginx](NGINX.html) をご確認ください。
### OBS などで利用できる WHIP / WHEP 形式のシグナリングに対応していますか?
対応しています。
WHIP / WHEP は OBS のみの対応となります [WHIP](https://datatracker.ietf.org/doc/html/draft-ietf-wish-whip) と [WHEP](https://datatracker.ietf.org/doc/html/draft-ietf-wish-whep) に対応しています。
詳細については [OBS Studio WHIP 対応機能](WHIP.html) や [OBS Studio WHEP 対応機能](WHEP.html) をご確認ください。
### 接続単位で接続時間を知ることはできますか?
できます。Sora は接続ごとにタイマーを保持しており、
接続後 1 分ごとに外部のアプリケーションサーバーに HTTP 経由で接続の状態を報告します。
この報告はクライアントごとに独立しており、報告にはクライアント ID やチャネル ID やアプリケーションサーバーが認証時に指定した event_metadata が含まれています。
これらの情報を使用して、例えば、ユーザーごとに接続から 10 分経過したら切断する等の処理が簡単に行えます。
### シグナリングで利用している WebSocket や DataChannel を使ってクライアントにメッセージ送ることはできますか?
できます。 [プッシュ API](API_PUSH.html) を利用することでシグナリングで利用している WebSocket や DataChannel 経由でクライアントにメッセージを送ることができます。
または [リアルタイムメッセージング機能](MESSAGING.html) を利用してクライアント間でメッセージがやりとりできます。
### クライアントがシグナリング経由で他の人の接続を通知で受け取ることはできますか?
できます、ただし同一チャネルのみに限ります。
[シグナリング通知](SIGNALING_NOTIFY.html) をご確認ください。
### シグナリングに DataChannel を使うことはできますか?
できます。ただし、WebRTC 接続確立までは WebSocket を利用する必要があります。
詳細は [DataChannel 経由のシグナリング](DATA_CHANNEL_SIGNALING.html) をご確認ください。
## 認証
### シグナリング時の認証はできますか?
できます。ただし、Sora は認証機能を持っていますが、認証の判断をする仕組みを持っていません。
認証は外部のアプリケーションサーバーへウェブフックを送信し、その戻り値で判断を行います。
認証の判断材料として、
Sora のシグナリング開始時に任意の情報をクライアントに送ることができる `metadata` を指定できます。
これは外部のアプリケーションサーバー側で払い出して使用できます。
認証のフローを以下に簡単に書き出しておきます。
1. 外部のアプリケーションサーバーでアクセストークンをクライアントに払い出す
2. そのアクセストークンを `metadata` に入れて Sora に接続する
3. Sora はそのアクセストークンやコネクション ID を外部のアプリケーションサーバーに HTTP 経由で問い合わせる
4. 外部のアプリケーションサーバーはそのアクセストークンが正しいことを確認し、 `{"allowed": true}` を HTTP ステータスコード 200 番台で Sora に返す
5. Sora は Offer をクライアントに送る
```mermaid
sequenceDiagram
participant C as クライアント
participant S as Sora
participant A as アプリケーションサーバー
C->>+S: "type": "connect"
S->>+A: 認証ウェブフック
A-->>-S: 200 OK
"allowed": true
S-)-C: "type": "offer"
C-)S: "type": "answer"
note over C,S: WebRTC 確立
```
外部の HTTP サーバーに対してウェブフックを送信し、
`{"allowed": true}` と HTTP ステータスコード 200 番台 が返ってきたら認証を許可します。
詳細は [認証ウェブフック](AUTH_WEBHOOK.html) をご確認ください
### シグナリングの認証失敗時に失敗の理由をクライアントに返せますか?
できます。外部のアプリケーションサーバーで Sora への認証ウェブフックの戻り値を返す場合、
`{"allowed": false, "reason": "最大 100 バイトまでの文字列"}` という値を返す必要があります。
この `reason` 部分はクライアントに通知されます。
詳細は [認証ウェブフック](AUTH_WEBHOOK.html) をご確認ください
## 通知
### チャネルに参加中のクライアントが、別のクライアントの参加や離脱を知ることはできますか?
できます。シグナリング通知機能を利用することにより、接続や切断のタイミングで、
シグナリングで利用している WebSocket または DataChannel 経由で通知されます。
詳細は [シグナリング通知](SIGNALING_NOTIFY.html) をご確認ください。
### チャネルに参加中のクライアントが、自分の録画開始/終了を知ることはできますか?
できます。シグナリング通知機能を利用することにより、録画の開始や終了のタイミングで、
シグナリングで利用している WebSocket または DataChannel 経由で通知されます。
詳細は [シグナリング通知](SIGNALING_NOTIFY.html) をご確認ください。
### 参加者に Sora 側で変更できるメタデータをもたせることはできますか?
できます。シグナリング通知メタデータ拡張機能を利用することで、
接続や切断のタイミングで API 経由で変更したメタデータを通知できます。
さらにメタデータの変更時に参加者全員にプッシュで通知することもできます。
詳細は [シグナリング通知メタデータ拡張](SIGNALING_NOTIFY_METADATA_EXT.html) をご確認ください。
## API
### 指定したコネクションのみを切断することはできますか?
できます。 Sora はチャネル ID とコネクション ID を指定して接続を切断できます。
詳細は [DisconnectConnection](API_SIGNALING.html#2ec3a0) をご確認ください。
### 指定したコネクションを切断した際に切断理由を含めることはできますか?
できます。 `reason` を指定することで、イベントウェブフック `connection.destroyed` の `disconnect_api_reason` として指定した値が入ってきます。
詳細は [DisconnectConnection](API_SIGNALING.html#2ec3a0) をご確認ください。
### 指定したクライアントのみを切断することはできますか?
できます。 Sora はチャネル ID とクライアント ID を指定して接続を切断できます。
詳細は [DisconnectClient](API_SIGNALING.html#e91c0b) をご確認ください。
### 指定したチャネルの配信者や視聴者のみを切断することはできますか?
できます。 Sora はチャネル ID を指定して配信者や視聴者のみを接続を切断できます。
詳細は [DisconnectChannelByRole](API_SIGNALING.html#39de6a) をご確認ください。
### 指定した配信者の映像を、指定した視聴者が受信しないことはできますか?
できます。Sora は配信者、視聴者のコネクション ID を指定して映像を Sora で一時的に止めることができます。
詳細は [PauseRtpStream](EXPERIMENTAL_API_RTP_STREAM_PAUSE_RESUME.html#de7a52) をご確認ください。
## 録画
### Sora で録画した場合に出力されるファイルの形式は何ですか?
WebM 形式です。
- [The WebM Project | Welcome to the WebM Project](https://www.webmproject.org/)
- [WebM - Wikipedia](https://ja.wikipedia.org/wiki/WebM)
### Sora で録画した複数の WebM 形式のファイルを一つのファイルに出力することはできますか?
できますが、サポートの範囲外になります。 録画ファイル合成ツールをオープンソースとして公開しています。
[Recording Composition Tool Hisui](https://github.com/shiguredo/hisui)
### 録画した WebM 形式のファイルはブラウザで閲覧できますか?
できます。Chrome と Firefox、Edge で閲覧できます。
Safari では WebM 形式のファイルの閲覧に対応はしていますが VP9/Opus のファイルのみに対応しています。
> **警告**
>
> iOS 15.1 の Safari では WebM 形式を正常に読み込むことができません。
> これは Safari 側のバグのようで、対応待ちです。
### 録画できるコーデックは何ですか?
音声コーデックは Opus に対応しています、また映像コーデックは VP8 と VP9 と AV1 と H.264 と H.265 に対応しています。
録画ファイルは MP4 形式、または WebM 形式で保存されます。
> **注意**
>
> H.265 は MP4 形式でのみ録画できます。
### 音声のみを録音できますか?
できます。Opus コーデックで音声のみの録音が可能になります。
- MP4 形式の場合 `m4a` ファイルではなく `mp4` ファイルで出力されますので、ご注意ください
- WebM 形式の場合 `webma` ファイルではなく `webm` ファイルで出力されますので、ご注意ください
### 録画した WebM のサイズの例を教えてください
基本的には指定したビットレートで決まります。
例として、VP8 と Opus の組み合わせの WebM で、
VP8 の解像度が 640x480 でビットレートが 300kbps 程度、音声ありの場合、 1 分の映像で約 2.5 M バイトです。
### 録画が終了するタイミングを教えて下さい
録画終了するタイミングは 3 つあります。
1. [StopRecording](DEPRECATED_API_LEGACY_RECORDING.html#fd0de5) API が呼ばれた場合
2. 接続が切断した場合
3. 録画開始時に指定した期限が来た場合
### 録画の開始と終了をクライアントへ通知することはできますか?
できます。
シグナリング通知で `recording.started` と `recording.stopped` が送られます。
### サイマルキャスト機能を利用した場合に録画はできますか?
できます。映像の優先度が一番低い映像を録画します。
映像の優先度については [映像の優先度](SIMULCAST.html#36c708) をご確認下さい。
### スポットライト機能を利用した場合に録画はできますか?
できます。映像の優先度が一番低い映像を録画します。
映像の優先度については [映像の優先度](SIMULCAST.html#36c708) をご確認下さい。
### 録画関連ファイルをアップロードする仕組みはありますか?
できますが、サポートの範囲外になります。
Sora が出力した録画関連ファイルを、
Amazon S3 や S3 互換オブジェクトストレージにアップロードするツールをオープンソースとしてとして公開しています。
[Sora Archive Uploader](https://github.com/shiguredo/sora-archive-uploader)
### replaceTrack(null) を使うと、再生時に音声と映像がずれてしまいます
Chrome には、特定の条件で RTP タイムスタンプが正しく進まないという問題があり、
そのため Sora が生成する WebM ファイルの再生時に音声と映像がずれてしまうことがあります。
発生条件は、音声ストリームに対して RTCRtpSender.replaceTrack(null)
を実行した後に RTCRtpSender.replaceTrack(audioTrack) した場合です。
この問題は Chrome/WebRTC のバグトラッカー で
管理されています。
### 録画時のキーフレーム要求間隔は何秒ですか?
録画機能利用時の Sora からのキーフレーム要求間隔は 20 秒です。
## TURN
### TURN サーバーを立てる必要はありますか?
Sora は TURN 機能を組み込んでありますので TURN サーバーを立てる必要はありません。
また、Sora とは別に TURN サーバーを立てることは推奨していません。
### Sora の組み込み TURN サーバーは TURN-TCP や TURN-TLS に対応していますか?
対応しています。ただし、TURN-TLS 機能を使用するためには nginx が必要となります。
- TURN-UDP- ポート変動
- TURN-TCP- ポート固定
- TURN-TLS- ポート固定
- nginx 必須
詳細は [TURN 機能](TURN.html) をご確認ください
### HTTPS で利用される 443 番のポートを TURN 機能で利用することはできますか?
できますが、nginx の利用が必須です。
詳細は [TURN-TLS、TURN-TCP、シグナリングで 443 番ポートを使用する](PRODUCTION.html#14258d) をご確認ください。
> **注意**
>
> nginx の設定などについてはサポート対象外となりますので、お問い合わせはご遠慮ください
### Sora を使った場合、TURN サーバーで使用するユーザー名やクレデンシャルはどう払い出せば良いですか?
いくつか方法がありますが、ここでは Sora の認証機能と合わせて使用する方法をご紹介します。
Sora は認証を外部のアプリケーションサーバーに問い合わせます。この問い合わせの戻り値の JSON に metadata を含むことができます。
その戻された JSON の metadata はそのままクライアントまで払い出されます。
これを利用して、認証に成功した場合にのみ TURN の認証に使用するユーザー名とクレデンシャルを払い出すことができます。
認証時のクライアントへの metadata の払い出しについての詳細は [metadata の払い出し](AUTH_WEBHOOK_RETURN.html#57f62c) をご確認ください。
### TURN で UDP と TCP、TLS でどの経路が選択されるかはどう決められますか?
クライアント側の実装に依存します。Sora はクライアントがどの経路を選択するかには関与しません。
### TURN IPv6 に対応していますか?
対応しています。
### TURN の FQDN 設定はどのようなときに設定が必要ですか?
NAT64/DNS64 ネットワーク環境に対しては TURN の FQDN を設定する必要があります。
## ウェブフック
### ウェブフックのリクエスト送信先は複数登録できますか?
できません。
もし、送信先を複数にしたい場合は、登録した送信先のアプリケーションサーバーなどで対応をお願いします。
### ウェブフックにベーシック認証は利用できますか?
できます。
`sora.conf` にて [webhook_basic_authn](SORA_CONF.html#081a9f) の設定を有効にして下さい。
詳細については [ウェブフックリクエスト送信先のサーバーがベーシック認証を利用している場合](WEBHOOK.html#2a13ea) をご確認ください。
### ウェブフックのタイムアウト値を設定できますか?
できます。
`sora.conf` にて [webhook_response_timeout](SORA_CONF.html#e81d13) を設定することで、ウェブフックのレスポンスのタイムアウトが変更できます。
### イベントウェブフックの session.updated の送信間隔を 1 分から変更できますか?
できます。 `sora.conf` にて [session_updated_webhook_interval](SORA_CONF.html#4612dc) に `3 min` と設定することで、
session.updated のイベントウェブフックリクエストの送信間隔を 3 分に変更できます。
### イベントウェブフックの session.updated を送らない設定はできますか?
できます。 `sora.conf` にて [ignore_session_updated_webhook](SORA_CONF.html#0901a0) を `true` を設定することで、
session.updated のイベントウェブフックリクエストが送信されなくなります。
### イベントウェブフックの connection.updated の戻り値を使用して切断などはできますか?
できません。切断をする場合は Sora が持つ切断 API を使用してください。
### イベントウェブフックの connection.updated の送信間隔を 1 分から変更できますか?
できます。 `sora.conf` にて [connection_updated_webhook_interval](SORA_CONF.html#e67c3b) に `3 min` と設定することで、
connection.updated のイベントウェブフックリクエストの送信間隔を 3 分に変更できます。
### イベントウェブフックの connection.updated を送らない設定はできますか?
できます。 `sora.conf` にて [ignore_connection_updated_webhook](SORA_CONF.html#f3f12a) を `true` を設定することで、
connection.updated のイベントウェブフックリクエストが送信されなくなります。
### イベントウェブフックのワーカー数を変更することはできますか?
できます。同時接続数が増えた場合や、ウェブフックリクエスト送信先のサーバーの応答速度が遅い場合は、
`sora.conf` にて [event_webhook_worker_number](SORA_CONF.html#58523d) の値を変更してください。
イベントウェブフックのワーカー割り当てに利用している値は `channel_id` となります。
ワーカーが 10 の場合、 `channel_id` が 100 利用している場合、1 ワーカーに 10 の `channel_id` が割り当てられます。
### イベントウェブフックの処理が遅くなった場合の挙動はどうなりますか?
イベントウェブフックワーカーがキューを持っており、もしそのワーカーがリクエストを処理中の場合、キューに追加されます。
そのリクエストの処理が終わりったらキューから取り出され処理されます。
### 認証ウェブフックの同時接続数の項目を利用してセッション単位の接続数制限をかけることはできますか?
ウェブフック送信先で接続制限をかけることはできますが、厳密な制限をすることはできません。
厳密な接続制限をする場合は [trial_max_connections](SESSION_WEBHOOK.html#48346d) を利用してください。
ただし、この機能は **実験的機能のトライアル中** であり、正式リリース時には変更が入る予定があります。
## DataChannel
### DataChannel でメッセージを送ることはできますか?
できます。 Sora のメッセージング機能は DataChannel を利用しています。
詳細については [リアルタイムメッセージング機能](MESSAGING.html) をご確認ください。
### role が recvonly で受信のみでもメッセージング機能を利用してメッセージを送ることはできますか?
できます。メッセージングが送ることができるかどうかは `direction` にのみ影響を受けます。
### 送られてきたメッセージをどのクライアントが送ってきたかを判断することはできますか?
できます。 メッセージング機能のヘッダー付与を利用してください。
詳細については [header](MESSAGING.html#717481) をご確認ください。
### DataChannel でクライアントが `RTCPeerConnection.createDataChannel()` を利用することはできますか?
できません。Sora 側で用意された DataChannel を利用してください。
## クラスター機能
### クラスターには対応していますか?
対応しています。現在 1 クラスター最大 100 ノードまで対応しています。
詳細については [クラスター機能](CLUSTER.html) をご確認ください。
### クラスター構築時に同一のライセンスを使う方法はありますか?
あります。通常は同一のライセンスを複数のノードで利用することはできませんが [最大ノード数ライセンス](LICENSE.html#aee259) を利用することでできるようになります。
### ロードバランスには対応していますか?
対応しています。
クラスター機能の一つとして、新規チャネルの接続は接続割合が少ない Sora ノードに割り振ります。
### クラスターへの自動登録には対応していますか?
対応していません。
[RegisterClusterNode](API_CLUSTER.html#09ed96) API を利用してクラスターにノードを登録する必要があります。
### クラスターの自動復旧には対応していますか?
対応しています。
ネットワーク障害やノード障害により、クラスターから離脱した場合 Sora は再度クラスターへの参加を自動で試みます。
### ノード間通信は暗号化されていますか?
されていません。そのためプライベートネットワークまたは暗号化されたネットワークを利用してください。
### 2 ノードでもクラスターを構築できますか?
できます。ただし推奨していません。
2 ノードの場合、どちらかのノードに障害が発生するとクラスター全体が止まってしまうため、
可用性は 1 ノードの場合よりも低くなります。
そのため 3 ノード以上でクラスターを組むことをお勧めします。
### クラスターからノードを離脱させたい場合はどうすれば良いですか?
Sora を終了することで離脱を行います。丁寧に離脱したい場合はモード切替で [新規コネクションブロックモード](MODE.html#0b67d3) を指定し、
すべての接続を切断してから終了してください。
もしそのノードが今後もクラスターに参加しない場合、
[PurgeClusterNode](API_CLUSTER.html#13b35a) API を利用してクラスターからそのノードの情報を完全消去してください。
なおノード情報を完全消去せずに、一度に過半数のノードを離脱させてしまうと、
残ったノードも接続を処理できなくなってしまうので注意が必要です。
詳細については [全ノードが半数以下のグループに所属した場合の挙動](CLUSTER_OPS.html#c1120e) をご確認ください。
### クラスターのディザスタリカバリーには対応していますか?
対応していません。今後対応予定はありますが、リリース時期は未定です。
### クラスターのリレーには対応していますか?
対応しています。
### クラスターの最大ノード数はいくつですか?
クラスターを構築するノードの最大数は 100 を想定しています。
これ以上のノード数でのクラスター構築を検討されている場合はサポートまでご連絡ください。
## その他
### IP アドレスは複数指定できますか?
できますが、運用が複雑になるため、現時点ではドキュメントには記載していません。
もし、IP アドレスの複数指定を利用したい場合は、サポートまでお問い合わせください。
基本的には、クライアントごとに IP アドレスを変更したい場合は、認証時の戻り値を使用してください。
### 配信者は音声と映像を配信し、視聴者は音声のみを受信することはできますか?
できます。視聴者は配信者からの映像や音声のどちらかだけを受け取るよう指定できます。
詳細は [配信または視聴メディアの選択](SIGNALING.html#7cd3d2) をご確認ください。
### 複数のユーザーの中で、発言していないユーザーは低画質な映像のみを配信し、発言しているユーザーは音声と高画質な映像を配信することはできますか?
スポットライト機能を利用すればできます。
詳細は [スポットライト機能](SPOTLIGHT.html) をご確認ください
### サイマルキャストに対応していますか?
対応しています。ブラウザは Chrome と Edge と Safari の最新バージョンに対応しています。
それ以外のブラウザでは配信はできませんが、視聴はできます。
映像コーデックは VP8、VP9、AV1、H.264、H.265 に対応しています。
- VP8 サイマルキャストは Chrome と Edge と Safari が対応しています
- VP9 サイマルキャストは Chrome と Edge が対応しています
- AV1 サイマルキャストは Chrome と Edge が対応しています
- H.264 サイマルキャストは Chrome と Edge と Safari が対応しています
- H.265 サイマルキャストは Safari 実験的機能のみが対応しています
### 映像や音声を WebRTC 以外で出力する仕組みはありますか?
[StartForwardingRtp](EXPERIMENTAL_API_RTP_FORWARDING.html#c734b8) API と [StopForwardingRtp](EXPERIMENTAL_API_RTP_FORWARDING.html#729828) API を利用することで、
外部のサーバーに対して WebRTC の DTLS (暗号部分) を除いた RTP パケットを送ることができます。
FFmpeg などを使用することで、 RTP から HLS や MPEG-DASH などに変換することもできます。
### 映像の配信を一時的に止める仕組みはありますか?
[PauseRtpStream](EXPERIMENTAL_API_RTP_STREAM_PAUSE_RESUME.html#de7a52) API と [ResumeRtpStream](EXPERIMENTAL_API_RTP_STREAM_PAUSE_RESUME.html#43002a) API を利用することで、
指定した接続からの映像の配信を一時的に停止できます。
### HLS 配信はできますか?
Sora 単体ではできません。ただし、Sora の [RTP 転送 API](EXPERIMENTAL_API_RTP_FORWARDING.html) を利用して FFmpeg などに転送することで、HLS での配信ができます。
**こちらのドキュメントは古いため参考程度にお願いします**
[HLS 配信](HLS.html) をご確認ください。
### 追いかけ再生はできますか?
Sora 単体ではできません。
ただし、Sora の [RTP 転送 API](EXPERIMENTAL_API_RTP_FORWARDING.html) を利用して FFmpeg などに転送することで、HLS での配信ができます。
そのため、この HLS での配信を利用することで追いかけ再生を実現できます。
**こちらのドキュメントは古いため参考程度にお願いします**
[HLS 配信](HLS.html) をご確認ください。
### WebRTC 確立するまでにかかる時間は知ることができますか?
[GetStatsReport](EXPERIMENTAL_API_STATS.html#bbbfca) API の `average_setup_time_msec` でシグナリング接続開始から WebRTC 接続が確立するまでにかかった平均時間が取得できます。
## 性能
### 負荷試験はどう行えばよいですか?
サポートの範囲外になりますが、Sora 専用の負荷試験ツールをオープンソースとして公開しています。
[WebRTC Load Testing Tool Zakuro](https://github.com/shiguredo/zakuro)
### Sora は CPU をどの程度使用しますか?
> **重要**
>
> WebRTC ではすべての通信が暗号化されているため、暗号化/復号処理で最も CPU リソースを消費します
通信環境やビットレートに影響するため一概には言えませんが、参考値を紹介します。
環境は AWS の C5n.4xlarge を利用しています。
以下の CPU の % は 1 コアを 100% とした場合です。
解像度が QVGA / 20fps / 1000kbps の映像と音声の送受信で 1 チャネル 8 クライアントを 12 ルーム (96 接続) で CPU 使用率を 200 % 程度利用します。
### Sora はメモリをどの程度使用しますか?
Sora は再送のキャッシュ用途にメモリを使用します。 100 接続であれば 4 GB 以上あれば十分です。
また、録画利用時にはフレーム組み立てのため一時的にメモリを使用します。こちらはビットレートに依存します。
### Sora はディスクをどの程度使用しますか?
主に録画したファイルとログによりディスクが使用されます。
録画する映像の容量はコーデックやビットレートに依存するため一概には言えません。
### マルチストリームは 1 チャネルで最大何クライアントまで対応していますか?
2024.2.2 時点で最大 12 クライアントまで対応しています。それ以上を接続することもできますが、お勧めはできません。
もし、大規模での会議を行いたい場合は、現在実験的機能として提供中の [スポットライト機能](SPOTLIGHT.html) の利用を検討してください。
## 運用
### Sora を利用する場合、インターネット接続が必要ですか?
いいえ、必要ありません。
Sora はデフォルトでは外部アクセスをいっさい行わず、ライセンス確認も Sora 単体で行っています。
外部アクセスが発生するのは、ユーザーが sora.conf に明示的に設定を追加して、ウェブフック機能などを有効化した場合のみです。
その為、閉域網などのパブリックなネットワークへのアクセスができない環境でも利用頂けます。
### WebSocket が通らないプロキシ環境がある場合はどうしたらよいですか?
WebSocket は TLS を利用しているため、おそらくプロキシは TLS を一度終端するタイプかと思われます。
接続に対して中身の解析を行うプロキシであれば、
WebSocket だけでなく、TURN-UDP や TURN-TCP、TURN-TLS も通らない可能性が高いです。
結果として WebSocket が通らないプロキシを利用している場合は WebRTC 自体が利用できない可能性が高いため、プロキシの設定を変更してもらう以外の方法はありません。
### Sora は Prometheus 形式に対応した監視情報を出力しますか?
Sora 自体は Prometheus 形式の監視情報は出力しません。
その代わりにオープンソースとして Sora exporter を公開しています。
[Prometheus exporter for WebRTC SFU Sora metrics.](https://github.com/shiguredo/sora_exporter)
### Sora をデーモン化せずに起動することはできますか?
できます。 Sora を起動する際、 `bin/sora foreground` で起動してください。
### Sora を systemd で利用することはできますか?
できます。 詳細は [systemd](SYSTEMD.html) をご確認ください。
### Sora クラスターを利用せず、ロードバランサーを利用することはできますか?
できません。
Sora ではかならず同一チャネルの接続を同一 Sora に集約する必要があるためです。
もしロードバランサーを利用したい場合はクラスターを構築する必要があります。
### Sora クラスターを利用して、ロードバランサーを利用することはできますか?
できます。
ロードバランサーは WebSocket に対応している必要があります。
さらにロードバランサー側では 30 秒以上のタイムアウトを設定する必要があります。
これは Sora は WebSocket と DataChannel をシグナリングに併用した場合 30 秒間隔で Ping を Sora から送るためです。
また、ロードバランサーを経由しないシグナリング接続もできるようにする必要があります。
これは Sora 側でシグナリングのリダイレクトを行い別の Sora に直接接続させる仕組みがあるためです。
### Sora はコンテナ上で利用できますか?
Sora をコンテナで運用するのは推奨していませんが、利用できます。
サポートへ問い合わせする場合はコンテナに関係する問題を切り分けをして頂く必要があります。
### Sora の WebSocket を利用したシグナリングのキープアライブの切断条件は何ですか?
Sora は デフォルトの設定では WebSocket 経由で 5 秒間隔で `"type": "ping"` を送信し、
60 秒間で 1 回も `"type": "pong"` が返って来こなかった場合、
Sora はシグナリング接続を切断します。
これらの時間について `sora.conf` の設定 [websocket_signaling_ping_interval](SORA_CONF.html#27aae2) と [websocket_signaling_pong_timeout](SORA_CONF.html#140464) で変更できます。
### Sora の DataChannel を利用したシグナリングの Sora 側からの切断条件は何ですか?
Sora は定期的に接続状態を確認する仕組みを持っており、その仕組みで切断かどうかを判断しています。
詳細は [ICE コネクションステート](ICE_CONNECTION_STATE.html) をご確認ください。
### Sora 1 台のサーバーでは最大同時接続数はいくつですか?
現状 1 台では 5000 接続までを推奨しています。
多くの接続を 1 台で行いたい場合、まずはサポートまでご相談ください。
### Sora が対応している OS は何ですか?
2024.2.2 の時点では以下の OS に対応しています。
- Ubuntu 24.04 LTS x86_64
- Ubuntu 24.04 LTS arm64
- Ubuntu 22.04 LTS x86_64
- Ubuntu 22.04 LTS arm64
- Ubuntu 20.04 LTS x86_64
- Ubuntu 20.04 LTS arm64
- Red Hat Enterprise Linux 9 x86_64- マイナーバージョンアップ版は全てサポート対象です
- 可能な限り最新のバージョンをご利用ください
- Red Hat Enterprise Linux 8 x86_64- マイナーバージョンアップ版は全てサポート対象です
- 可能な限り最新のバージョンをご利用ください
### Sora は Amazon Linux に対応していますか?
対応していません。
Sora が対応していると明記している OS 以外で動作させている場合は Sora はサポート対象外となります。
### Sora のプロセス名は何になりますか?
`bin/sora daemon` で起動した場合、Sora 本体は run_erl というプロセスになります。こちらの死活監視をお願いします。
### Sora を終了しても epmd というプロセスが残りますが問題ありませんか?
問題ありません。 Sora と関係するプロセスですが独立しており、起動し続けていて構いません。
### カーネルパラメーターの設定は何をすれば良いですか?
まずはファイルディスクリプタ数をご確認ください。値は 65535 に設定しておくことをお勧めします。
その他のチューニング項目については [Linux カーネルチューニング](LINUX_KERNEL_TUNING.html) をご確認ください。
### ログローテーションはどうすれば良いですか?
sora.jsonl と connection.jsonl はローテションされませんので必要な部分で mv コマンドなどで移動してください。
ファイルが無い場合、新しく作られます。
erlang.log については自動でログローテーションを行いますので気にする必要はありません。
ログの詳細については [ログファイル](LOG.html) をご確認ください。
### ログのタイムゾーンを教えてください
UTC です。
### Sora が使用する UDP のポート範囲を教えてください
Sora が使用する UDP ポートは Linux のエフェメラルポートを使用しています。
エフェメラルポートの範囲は sysctl などで確認してください。
実行例:
```
$ sysctl -n net.ipv4.ip_local_port_range
32768 60999
```
### Sora が使用する UDP のポート範囲を制限できますか?
できます。Sora が使用する UDP ポートの範囲はエフェメラルポートの範囲です。
Linux 側でエフェメラルポートの範囲を設定してください。
sysctl にて net.ipv4.ip_local_port_range の範囲を指定してください。
### ブラウザで WebRTC の詳細情報を取得することはできますか?
できます。
- Chrome であれば URL に `chrome://webrtc-internals` を入力してみてください
- Firefox であれば URL に `about:webrtc` を入力してみてください
- Edge であれば URL に `edge://webrtc-internals` を入力してみてください
- Safari であれば JavaScript コンソールの設定の一般から WebRTC を設定できます

### SELinux を利用する際の注意点はありますか?
Sora の log ディレクトリ以下にログを書き込めるようにする必要があります。
以下を参考にしてみてください。
- [logging - logrotate cron job not rotating certain logs - Stack Overflow](https://stackoverflow.com/questions/15652654/logrotate-cron-job-not-rotating-certain-logs)
- [linux - Configuring SELINUX to allow logging to a file that's outside /var/log - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/79311/configuring-selinux-to-allow-logging-to-a-file-thats-outside-var-log)
### 映像が乱れたり止まったりする場合は何を確認するのが良いですか?
映像が乱れたり止まったりする場合はネットワーク回線が不安定なことがほとんどです。
この場合は切断時に生成される `connection.jsonl` を確認してみてください。
このログで映像の送信側と受信側の統計情報が確認できますので、
映像が乱れたり止まったりした接続の `connection_id` を記録しておいて下さい。
- total_received_rtcp_rtpfb_generic_nack
- total_sent_rtcp_rtpfb_generic_nack
この値が多ければ多いほど「再送要求」の回数が多く、回線が不安定だったことが把握できます。
`connection.jsonl` の詳細については [connection ログ](LOG.html#f2e264) をご確認ください。
### Sora が突然終了しました
Sora は何か問題があり Sora が終了した場合 `erl_crash.dump` というログを出力します。
このログが出力された場合はサポート問い合わせの手順に従ってサポートまでご連絡ください。
もし `erl_crash.dump` が出力されずに Sora が終了した場合はカーネル側から停止された可能性があります。
まずは OOM Killer で殺されていないかどうかを確認してみてください。
### Sora で利用している Erlang VM のフラグを指定することはできますか?
> **重要**
>
> この設定を利用する場合はサポートまでお問い合わせください
できます。環境変数 `SORA_ADDITIONAL_ERL_ARGS` を利用してください。
### クライアント毎に Sora への経路を変更することはできますか?
できます。認証成功時にクライアントに ipv4_address または ipv6_address を払い出すことで、
クライアントはその IP アドレスを利用して Sora へ接続を試みるようになります。
例えばインターネット経由とプライベートネットワーク経由で接続先を変えることができます。
- パブリックネットワーク経由の場合は `ipv4_address` または `ipv6_address` に Sora が利用しているサーバーのパブリック IP アドレスを設定してください
- プライベートネットワーク経由の場合は `ipv4_address` または `ipv6_address` に Sora が利用しているサーバーのプライベート IP アドレスを設定してください
## SDK
Sora の SDK は基本的にシグナリング処理のための SDK です。
WebRTC 部分は webrtc.org が提供しているライブラリを利用しています。
### Sora の SDK へのサポートはありますか?
Sora の SDK サポートは提供していません。また有償のサポートも提供していません。
もしアドバイスが必要だったり、問題が起きたりした場合は Discord へお願いします。バグ対応は最優先で行います。
### Discord サーバーの招待 URL
SDK の質問や相談については `sora-sdk-faq` を利用してください。
- Sora JavaScript SDK- 投稿時に `sora-js-sdk` タグを指定してください
- Sora iOS SDK- 投稿時に `sora-ios-sdk` タグを指定してください
- Sora Android SDK- 投稿時に `sora-android-sdk` タグを指定してください
- Sora Unity SDK- 投稿時に `sora-unity-sdk` タグを指定してください
- Sora C++ SDK- 投稿時に `sora-cpp-sdk` タグを指定してください
- Sora Python SDK- 投稿時に `sora-python-sdk` タグを指定してください
- Sora C SDK- 投稿時に `sora-c-sdk` タグを指定してください
### JavaScript SDK はありますか?
Sora の JavaScript SDK に関しては以下をご確認ください。
- [Sora JavaScript SDK ドキュメント — Sora JavaScript SDK](https://sora-js-sdk.shiguredo.jp/)
- [WebRTC SFU Sora JavaScript SDK](https://github.com/shiguredo/sora-js-sdk)
### iOS SDK はありますか?
Sora の iOS SDK に関しては以下をご確認ください。 Swift で書かれています。
- [Sora iOS SDK ドキュメント — Sora iOS SDK](https://sora-ios-sdk.shiguredo.jp/)
- [WebRTC SFU Sora iOS SDK](https://github.com/shiguredo/sora-ios-sdk)
- [WebRTC SFU Sora iOS SDK クイックスタート](https://github.com/shiguredo/sora-ios-sdk-quickstart)
- [WebRTC SFU Sora iOS SDK サンプル集](https://github.com/shiguredo/sora-ios-sdk-samples)
### Android SDK はありますか?
Sora の Android SDK に関しては以下をご確認ください。 Kotlin で書かれています。
- [Sora Android SDK ドキュメント — Sora Android SDK](https://sora-android-sdk.shiguredo.jp/)
- [WebRTC SFU Sora Android SDK](https://github.com/shiguredo/sora-android-sdk)
- [WebRTC SFU Sora Android SDK クイックスタート](https://github.com/shiguredo/sora-android-sdk-quickstart)
- [WebRTC SFU Sora Android SDK サンプルアプリケーション](https://github.com/shiguredo/sora-android-sdk-samples)
### C++ SDK はありますか?
Sora の C++ SDK に関しては以下をご確認ください。 C++ で書かれています。
- [WebRTC SFU Sora C++ SDK](https://github.com/shiguredo/sora-cpp-sdk)
### Unity SDK はありますか?
Sora の Unity SDK に関しては以下をご確認ください。 C++ SDK をベースにしています。
- [Sora Unity SDK ドキュメント — ora Unity SDK ドキュメント](https://sora-unity-sdk.shiguredo.jp/)
- [WebRTC SFU Sora Unity SDK](https://github.com/shiguredo/sora-unity-sdk)
- [WebRTC SFU Sora Unity SDK サンプル集](https://github.com/shiguredo/sora-unity-sdk-samples)
### Python SDK はありますか?
Sora の Python SDK に関しては以下をご確認ください。 C++ SDK をベースにしています。
- [Sora Python SDK ドキュメント — Sora Python SDK](https://sora-python-sdk.shiguredo.jp/)
- [WebRTC SFU Sora Python SDK](https://github.com/shiguredo/sora-python-sdk)
### JavaScript SDK は認証付き HTTP Proxy に対応していますか?
JavaScript SDK はブラウザで動作するため、ブラウザが WebRTC での HTTP Proxy に対応している必要があります。
主要なブラウザは HTTP Proxy に対応済みです。利用する場合はブラウザで HTTP Proxy の設定をしてください。
### iOS / Android / Unity / C++ SDK / Python SDK は認証付き HTTP Proxy に対応していますか?
対応しています。ただし Basic 認証のみの対応で、 **OS の設定や PAC ファイルへの対応は未定です** 。
- iOS SDK- 最新版で対応済みです
- Android SDK- 最新版で対応済みです
- C++ SDK- 最新版で対応済みです
- Unity SDK- 最新版で対応済みです
- Python SDK- 最新版で対応済みです
- C SDK- 対応していません
### ブラウザレスな WebRTC クライアントアプリケーションはありますか?
OSS として WebRTC Native Client Momo を公開しています。
- [WebRTC Native Client Momo](https://momo.shiguredo.jp/)
- [shiguredo/momo: WebRTC Native Client Momo](https://github.com/shiguredo/momo)
## ライセンス
### 同時接続とは具体的に何を指していますか?
シグナリングの同時接続数を指しています。1 シグナリング接続で 1 同時接続です。
### ライセンスの同時接続数を超えた時はどうなりますか?
もし、最大同時 100 接続のライセンスファイルを利用している場合で 101 本目の接続がきた場合、 Sora は 101 本目の接続を拒否します。
その際、クライアントには `SERVICE-UNAVAILABLE` というエラーメッセージを通知します。
Sora 側では `sora.jsonl` ログに `EXCEED-MAX-CONNECTIONS` というエラーログを出力します。
### ライセンスの同時接続数の最小の値はいくつですか?
ライセンスの同時接続数の最小は 100 となります。
10 や 50 といったライセンスは提供しておりません。
### ライセンスの同時接続数は 100 単位ですか?
はい、その通りです。100 の次は 200 となり、100 同時接続単位となります。
110 や 150 といったライセンスは提供おりません。
### ライセンスの期限を過ぎた場合はどうなりますか?
動作上、既存の接続に対しては特に何もありませんが、新規の接続を受け付けなくなります。
### Sora の現在の同時接続数を確認する方法はありますか?
[GetStatsReport](EXPERIMENTAL_API_STATS.html#bbbfca) API の `total_ongoing_connections` で現在 Sora に接続している同時接続数が確認できます。
また、 [Sora Exporter](SORA_EXPORTER.html) を利用することで、現在の同時接続数を監視することができます。
### ライセンス期限のタイムゾーンを教えてください
UTC です。
### クラスター利用時に同一のライセンスを利用する方法はありますか?
あります。 `最大ノード数ライセンス` を契約することで、 1 つのクラスター構築時に同一のライセンスを利用できるようになります。
`最大ノード数ライセンス` では、 1 クラスターで同一のライセンスを最大いくつのノードに適用できるかがあらかじめ定義されています。
クラスターを構築する際に、その最大ノード数までは同一ライセンスを利用できます。
詳細は [最大ノード数ライセンス](LICENSE.html#aee259) をご確認ください。
### 最大ノード数ライセンスで契約できる最大ノード数はいくつですか?
最大ノード数は 100 を想定しています。
## アップデート
### アップデートは有償ですか?
ライセンスをご契約いただいている期間は、無償でアップデートを提供させていただきます。
### アップデートのタイミングは決まっていますか?
原則として毎年 6 月と 12 月に、機能の追加や改善、削除を目的としたアップデートを行います。
その他、必要に合わせて不定期に修正のアップデートを行うことがあります。
詳細は [サポートライフサイクル](SUPPORT_LIFECYCLE.html) をご確認ください。
### Sora のバージョン表記
バージョン表記:
```
YYYY.MAJOR.FIX
```
- `YYYY` はリリースした年を示します
- `MAJOR` はその年のメジャーアップデートのリリース回数を示します
- `FIX` はバグフィックスアップデートおよびホットフィックスアップデートのリリース回数を示します
詳細は [サポートライフサイクル](SUPPORT_LIFECYCLE.html) をご確認ください。
## サポート
### 古いバージョンの Sora のサポートは提供していますか?
以前は最新バージョンの利用に対してのみサポートを提供していましたが、Sora 2023.1.0 以降はサポート提供期間を約 12 ヶ月間に変更しました。
詳細は [サポートライフサイクル](SUPPORT_LIFECYCLE.html) をご確認ください。
### Sora のサポートは電話で受け付けていますか?
いいえ。サポートはサポート専用のメールでのみ、受け付けています。
### Sora のサポートは 24 時間 365 日ですか?
いいえ。サポートは弊社営業日の 10:00-17:00 のみ、対応しています。
### SDK の有償サポートは受け付けていますか?
いいえ。Sora SDK の有償サポートは行っていません。
ただし GitHub 上ですべてのコードを公開しています。
もし何か問題が起きた場合は時雨堂コミュニティの Discord にてご相談ください。
バグ対応は最優先で行います。
### Zakuro や Hisui など関連ツールの有償サポートは受け付けていますか?
いいえ。関連ツールの有償サポートは行っていません。
ただし GitHub 上ですべてのコードを公開しています。
もし何か問題が起きた場合は時雨堂コミュニティの Discord にてご相談ください。
バグ対応は最優先で行います。
# トラブルシューティング
## 突然切断された
### sora ログに `PONG-TIMEOUT-ERROR | reason=<<"WebSocket">>` が出力されている場合
Sora からデフォルトの設定で 5 秒間隔で送っている `{"type": "ping"}` に対して、
クライアントが `{"type": "pong"}` を 60 秒間返してこない場合に発生します。
また、これらの時間設定は `sora.conf` の設定 [websocket_signaling_ping_interval](SORA_CONF.html#27aae2) と [websocket_signaling_pong_timeout](SORA_CONF.html#140464) で変更できます。
これは Sora がクライアントが疎通不能だと判断して切断した、正常な終了です。
まずはクライアントのネットワーク状況を確認してみてください。
WebSocket が詰まることを回避する方法としては、 [DataChannel 経由のシグナリング](DATA_CHANNEL_SIGNALING.html) の利用を検討してください。
### sora ログに `tcp_closed` という文字列が含まれている場合
この場合、通信に TURN-TCP が採用されており、OS 側で TCP の切断を検知し、接続を終了しています。
connection ログの `turn_transport_type` で `tcp` になっているかどうかを確認してみてください。
OS による TCP の切断に関しては Sora 側で対処できる事は基本的にはありません。
## VP9 の映像が乱れる
Windows で Intel の GPU を利用している場合に、VP9 のハードウェアアクセラレーターが正常に動作しないことがあります。
この場合は VP9 を利用せずに、他のコーデックを利用する事で回避してください。
ハードウェアアクセラレーターを明示的に無効にすることで回避することもできますが、
こちらはあまり現実的ではありません。
`chrome://flags/#disable-accelerated-video-decode` を `Disabled` にする事で、
ハードウェアアクセラレーターを利用しなくなります。

### 問題が発生した場合の確認方法
`chrome://webrtc-internals` の `inbound-rtp` を見ていただき、
`[codec]` と `decoderImplementation` を確認してみてください。
ここで VP9 と `ExternalDecoder` となっている場合、
VP9 のデコードにハードウェアアクセラレーターが利用されていることが確認できます。

# ワークアラウンド
## 概要
Sora 以外の要因で発生している問題に対するワークアラウンドを提供しています。
## Safari タイムスタンプバグに対するワークアラウンド
*バージョン 2024.2.3 で追加。*
Safari の問題により、Safari 18.4 から 2025 年 5 月 15 日 時点での最新版である 18.5 において、
H.264 または H.265 の録画が正常に行えない問題が発生することに対するワークアラウンド機能です。
> **重要**
>
> H.264 や H.265 を利用せず VP8 や VP9 を利用する事でこのワークアラウンドは不要になります。
> このワークアラウンドは H.264 や H.265 で録画を必ず利用しなければいけない場合にのみ有効にしてください。
> **危険**
>
> ワークアラウンドを有効にすることで、今まで正常に録画できていた H.264 や H.265 を利用した録画が正常に行えなくなるリスクもあります。
> それを踏まえた上で有効にしてください。
この問題は macOS / iOS / iPadOS 全てのプラットフォームで発生することを確認しています。
また、iOS 版 Chrome や Firefox でも同様の問題が発生することを確認しています。
> **警告**
>
> この問題の修正が確認されている Safari Technology Preview 219 でもこのワークアラウンドが有効になってしまう問題があります。これは Safari Technology Preview のバージョンが 18.4 となっており、Safari 18.4 との区別ができないためです。
弊社ではこの問題が確認できているバージョンの Safari は以下になります。
- Safari 18.4
- Safari 18.4.1
- Safari 18.5
### 設定
このワークアラウンドを有効にする場合 `sora.conf` に `workaround_20250515 = 18.4,18.4.1,18.5` のように、ワークアラウンドに対応させる Safari のバージョンを `,` で区切って指定してください
デフォルトは **未指定** で、指定しなければワークアラウンドは有効になりません。
```ini
workaround_20250515 = 18.4,18.4.1,18.5
```
### Safari 18.5.1
Safari 18.5.1 で修正された際、Sora 側で Safari 18.5.1 と Safari 18.5 のバージョンを区別できない可能性があります。
その場合は、もし修正されていたとしてもワークアラウンドが有効になってしまい、録画が正常に行えない場合があります。
その場合はワークアラウンドを無効にしていただき、Safari 18.5.1 へアップデートして利用していただくようお願いします。
### iOS/iPadOS Safari 18.3.2
Safari 18.3.1 では問題が発生しないことを確認していますが、
Safari 18.3.2 で問題が発生するかどうかを確認できていません。
ただし、iOS / iPadOS 向けの Safari 18.3.2 は iOS 18.3.1 同様、セキュリティフィックスのための更新となっているため、18.3.1 同様に問題が発生しないと考えられます。
[iOS 18.3.2およびiPadOS 18.3.2のセキュリティコンテンツについて - Apple サポート (日本)](https://support.apple.com/ja-jp/122281)
### ワークアラウンド適用の判定について
HTTP ヘッダーに含まれる User-Agent 値のチェックと、映像コーデックが H.264 または H.265 であるかどうかで判定しています。
- `Version/18.5 Safari`
- `iPhone; CPU iPhone OS 18_5_0 like Mac OS X`
- `iPad; CPU OS 18_5_0 like Mac OS X`
> **注釈**
>
> - 18_4_1 は 18.4.1 として扱われます
> - 18_5_0 は 18.5 として扱われます
> - 18_5 は 18.5 として扱われます
Safari や iOS 版 Chrome 以外でも `User-Agent` に `iPhone` や `iPad` で OS のバージョンが指定した Safari のバージョンに含まれる場合はワークアラウンドが有効になります。
例えばワークアラウンドの設定に 18.5 を含んでいた場合、 iOS 版の Chrome では `iPhone; CPU iPhone OS 18_5_0 like Mac OS X` という文字列が含まれるため、ワークアラウンドが有効になります。
### 問題の詳細
Safari が依存している WebRTC ライブラリ である libwebrtc を M128 から M132 へとアップデートする際、
廃止になった `VideoFrame::timestamp()` の代わりに、本来利用すべき `VideoFrame::rtp_timestamp()` ではなく、
`VideoFrame::timestamp_us()` を利用してしまったことで発生した問題になります。
`VideoFrame::timestamp()` が非推奨になったコミット
`VideoFrame::timestamp()` が削除されたコミット
Safari のベースである WebKit の libwebrtc を m132 に更新した際に、
`VideoFrame::rtp_timestamp` ではなく `VideoFrame::timestamp_us` を利用してしまったコード
この間違った修正により、ハードウェアアクセラレーターを利用するコーデック H.264 と H.265 は、
送信するパケットのタイムスタンプがおかしくなってしまい、Sora の録画機能が正しく機能しなくなっています。
この問題については WebKit では既に解決済みになっており、
修正コミットがマージされています。
問題のバグ
修正されたコミット
Safari Technology Preview 219 ではこの問題が修正されていることを確認済みのため、
この修正コミットは含まれているようです。
2025 年 5 月 14 日にリリースされた Safari 開発版の Safari Technology Preview 219 にて本問題が修正されていることを確認しており、ワークアラウンドは不要です。
# Sora が期待どおりに動かない場合、または、動作に問題がある場合
Sora が期待どおりに動かない場合、
または動作に問題がある場合の問い合わせ時の事前確認と注意事項をまとめています。
## 事前確認
問い合わせの前に、まずは以下の項目について事前に確認をお願いします。
### サポートしている Sora のバージョン
- Sora 2023.2.x- 2024 年 12 月 31 日までサポート
- Sora 2024.1.x- 2025 年 6 月 30 日までサポート
- Sora 2024.2.X- 2025 年 12 月 31 日までサポート
### 利用している Sora のバージョンがサポート期限内かどうかを確認してください
もし、サポートしているバージョンを利用していない場合は、
サポートしているバージョンへのアップデート後に問題が再現するかの確認をお願いします。
### Sora の SDK サポートについては Sora サポート範囲外のため Discord サーバーの各チャンネルをご利用ください
**時雨堂コミュニティサーバー**:
SDK の質問や相談については `sora-sdk-faq` を利用してください。
- Sora JavaScript SDK- 投稿時に `sora-js-sdk` タグを指定してください
- Sora iOS SDK- 投稿時に `sora-ios-sdk` タグを指定してください
- Sora Android SDK- 投稿時に `sora-android-sdk` タグを指定してください
- Sora Unity SDK- 投稿時に `sora-unity-sdk` タグを指定してください
- Sora C++ SDK- 投稿時に `sora-cpp-sdk` タグを指定してください
- Sora Python SDK- 投稿時に `sora-python-sdk` タグを指定してください
- Sora C SDK- 投稿時に `sora-c-sdk` タグを指定してください
### 利用しているブラウザが安定版の最新版か確認してください
ブラウザが古い場合、うまく接続できない可能性があります。
もし、ブラウザが古い場合は、最新版で再度問題が発生するかどうか確認をお願いします。
### 開発ツールを有効にして開発ツールで問題が再現するか確認してください
クライアント側の実装の問題もあるため、必ず確認をお願いしています。
もし、クライアント側の問題の場合は、 Sora のサポートでは対応することができません。ご了承下さい。
### クライアントのシグナリング接続が WebSocket over TLS で接続しているかどうかを確認してください
WebSocket over TLS ではない場合は、まずは WebSocket over TLS で接続するようにお願いいたします。
### Sora のサポート範囲外の質問はご遠慮ください
Sora の挙動や使い方以外はサポートの範囲外です。
- Sora を利用したサービスの設計や開発
- **nginx 全般**
- **WebRTC 全般**
- Sora SDK 全般
- WebRTC Native Client Momo
- WebRTC Load Testing Tool Zakuro
- Recording Composition Tool Hisui
- WebRTC Stats Collector Kohaku
- Audio Streaming Gateway Suzu
- Sora Archive Uploader
- 各種クラウドサービス
上記はすべて Sora のサポート範囲外となります。
## 問い合わせの場合、お送り頂く情報
> **重要**
>
> 前述の事前の確認後、以下の情報を **必ず** お送り下さい。
情報をお送り頂くときは `テキストファイル` でお送りください。
- サーバーやクライアントのスペック- わかれば機種名
- CPU
- メモリ
- ディスク
- Linux Kernel のバージョン- `uname -a` の出力
- OS の種類、バージョン- Ubuntu と Red Hat Enterprise Linux のどちらを利用しているか
- 利用している OS のバージョン
- x86_64 または arm64 のどちらのアーキテクチャを利用しているのか
- Sora のバージョン- 2022.1.2 など
- クラスターを利用している場合はクラスターの構成
- Sora の **sora.conf 設定ファイル**
- Sora の log ディレクトリ以下すべてのログファイル- クラスターを利用している場合は全ノードのログ
- tar.gz または zip などで圧縮し、パッケージ提供時にお送りしているログアップローダーを利用してお送りください
- 評価中の場合は tar.gz または zip などで圧縮し、メールにてお送り下さい
- 問題発生時の前後 1 週間分をめどにお送りください
### 詳細な問題発生状況
**何をどうすると問題が発生したのかの状況を可能な限り詳細にお教え下さい**
> **重要**
>
> 以下の情報については **必ず** お送り下さい。
- 問題が発生したコネクションのシグナリング情報- チャネル ID
- セッション ID
- コネクション ID
- 音声の有無- コーデック
- ビットレート
- 映像の有無- コーデック
- ビットレート
- 解像度
- サイマルキャスト機能の有無
- マルチストリーム機能の有無
- スポットライト機能の有無
- 問題が発生したブラウザバージョン- Chrome 119.0.6045.159 や Safari 17.1 など
- SDK の種類とバージョン- Sora JavaScript SDK 2020.2.5 や Sora iOS SDK 2020.4.1 など
- 問題が発生したブラウザまたは SDK を利用している OS の種類とバージョン- iOS 14.4 や macOS 11.2.3 や Windows 10 1903 など
- 問題の発生状況- 発生時刻 (何度か発生している場合は複数)
- 発生したタイミング (接続した直後、配信が10分以上継続した後、など)
- 発生頻度
- 発生時の配信者数、視聴者数
- 発生の確率 (ある手順を踏むと必ず発生する、同じ手順でも5回に1回程度のみ発生する、など)
### 再現方法
**Sora 内蔵の開発ツールでの再現方法をお送りください**
- 再現の手順- 開発ツールで問題が発生する場合、その手順をお送り下さい- 接続する開発ツールの URL- 開発ツールの copy URL を押すと現在の設定を反映した URL がコピーされます
- 複数クライアントを接続したときに発生する場合は、その順序と接続間隔 (ほぼ同時、数分おいて接続、など)
- 開発ツールでは発生しない場合、開発ツールに準じた情報をお送り下さい- シグナリングのパラメーター
- 複数クライアントの接続の場合、その順序と接続間隔 (ほぼ同時、数分おいて接続、など)
- 問題を再現するための独立したアプリケーションが作成できるようであれば、そちらをご用意いただくと解決までの距離が短くなります
## 録画関連の問い合わせについて
**録画については以下の点をご注意ください**
### 録画ファイルの取り扱いについて
> **重要**
>
> もし、何か録画に問題があった場合でも、録画ファイルを送ることは **絶対** にしないでください。
> 録画したファイルの代わりに録画したファイルの情報を取得して送ってください。
録画ファイルの情報は mkvinfo と mediainfo コマンドを録画ファイルに対して実行した結果を、テキストファイルでお送りください。
mkvinfo は macOS で Homebrew を利用していれば `brew install mkvtoolnix` でインストールできます。
それ以外は以下からダウンロードしてください。
[MKVToolNix news – Matroska tools for Linux/Unix and Windows](https://mkvtoolnix.download/)
mediainfo は macOS で Homebrew を利用していれば `brew install media-info` でインストールできます。
それ以外は以下からダウンロードしてください。
[MediaInfo - Download](https://mediaarea.net/en/MediaInfo/Download)
mkvinfo コマンド例:
```
$ mkvinfo -t -z -v -v -v archive-K3FZ5EZJWS7HXBAJFR37ZYT4GR.webm
```
mediainfo コマンド例:
```
$ mediainfo --Details=2 archive-K3FZ5EZJWS7HXBAJFR37ZYT4GR.webm
```
### 問題が起きた状況について
- ブラウザで再生して問題が起きた場合は、ブラウザの種類とバージョン、プラットフォームをお教えください
- VLC で再生して問題が起きた場合は、VLC のバージョンとプラットフォームをお教えください
### HLS や MPEG-DASH の問い合わせについて
HLS や MEPG-DASH といった Sora が録画したファイルを変換した状態で発生した問題についてはサポート対象外です。
# Sora の仕様や使い方に関して質問がある場合
ドキュメントに記載されている Sora の仕様や使い方に関して不明点がある場合は Sora のバージョンとドキュメントの URL を添えてお送りください。
# サポートライフサイクル
## 概要
Sora 2023.1.0 より、サポートの提供期間を変更しています。
## 変更内容
これまでは Sora の最新バージョンの利用に対してのみサポートを提供していましたが、Sora 2023.1.0 以降はサポートの提供期間をより長く変更します。
また、合わせて Sora のアップデートを以下のとおりに区別します。
### メジャーアップデート
**サポート提供期間**: **メジャーアップデートがリリースされた日から 12 ヶ月後の月末最終日まで**
- 原則として毎年 6 月と 12 月に、機能の追加や改善、廃止を目的として行うアップデートをメジャーアップデートといいます
- このアップデートでは、以前のバージョンと後方互換性のない新機能が含まれたり、以前のバージョンの機能が廃止されたりする場合があります
> **重要**
>
> - 2024 年 12 月 18 日にリリースされた Sora 2024.2.0 は、2025 年 12 月 31 日までサポートを提供します
> - 2024 年 6 月 26 日にリリースされた Sora 2024.1.0 は、2025 年 6 月 30 日までサポートを提供します
### バグフィックスアップデート
**サポート提供期間**: **修正の対象となるメジャーアップデートがリリースされた日から 12 ヶ月後の月末最終日まで**
- メジャーアップデートをリリースして以降、次のメジャーアップデートまでの約 6 ヶ月の間に、問題の修正を目的として不定期に行うアップデートをバグフィックスアップデートといいます
### ホットフィックスアップデート
**サポート提供期間**: **修正の対象となるメジャーアップデートがリリースされた日から 12 ヶ月後の月末最終日まで**
- メジャーアップデート、バグフィックスアップデート以外に、ごく稀に緊急のアップデートが必要と判断する場合に行うアップデートをホットフィックスアップデートといいます
- 最新バージョン以外にも、アップデートの必要があると判断する以前のバージョン、およびその両方に対してリリースを行う可能性があります
### Sora のバージョン表記
**YYYY.MAJOR.FIX**
- `YYYY` はリリースした年を示します
- `MAJOR` はその年のメジャーアップデートのリリース回数を示します- Sora 2024.1.0 は、2024 年の 1 回目のメジャーアップデートであることを示します
- `FIX` は バグフィックスアップデートおよびホットフィックスアップデートのリリース回数を示します- Sora 2024.2.1 は、Sora 2024.2.0 に対する 1 回目のバグフィックスアップデートもしくはホットフィックスアップデートであることを示します
- `FIX` のリリース回数は社内のみのリリースも含むことがあるため、公開時のリリース回数は飛ぶ可能性があります
## サポートライフサイクル例

## 対応 OS のサポートライフサイクル
### Ubuntu 24.04 LTS
**スタンダードサポートまで対応**
2029 年 4 月 30 日にメンテナンスサポートが終了するため、
2028 年 6 月リリース予定の Sora までがサポート対象となります。
### Ubuntu 22.04 LTS
**スタンダードサポートまで対応**
2027 年 4 月 30 日にスタンダードサポートが終了するため、
2026 年 6 月リリース予定の Sora までがサポート対象となります。
### Ubuntu 20.04 LTS
**スタンダードサポートまで対応**
2025 年 4 月 30 日にスタンダードサポートが終了するため、
2024 年 6 月リリースの Sora までがサポート対象となります。
### Red Hat Enterprise Linux 9
**メンテナンスサポートまで対応**
2032 年 5 月 31 日にメンテナンスサポートが終了するため、
2031 年 6 月リリース予定の Sora までがサポート対象となります.
### Red Hat Enterprise Linux 8
**メンテナンスサポートまで対応**
2029 年 5 月 31 日にメンテナンスサポートが終了するため、
2028 年 6 月リリース予定の Sora までがサポート対象となります。
# チュートリアル
## 概要
このチュートリアルでは、Sora に組み込まれている開発者ツールを動かして、ひととおり使ってみるところまでを説明します。
## チュートリアルの注意点
> **注意**
>
> 繋がらないという問い合わせのほとんどは UDP のポート開放忘れです。必ずポートを開放してください。
- このチュートリアルでは、リバースプロキシとしての nginx や HTTPS の知識を必要とします
- Sora は TCP と UDP の両方を利用します- TCP はデフォルトであれば 3000 番と 5000 番を利用します
- UDP はデフォルトであればエフェメラルポートの範囲を利用します
- Sora の開発者ツールは Sora に組み込まれているものを利用して下さい
- Sora の開発者ツールは HTTPS 非対応のため、nginx をリバースプロキシとして利用して、TLS 終端を行ってから Sora に繋ぐ必要があります
- Sora のシグナリングは WebSocket over TLS 非対応のため、nginx をリバースプロキシとして利用して、 TLS 終端を行い Sora のシグナリングへ繋ぐ必要があります
## Sora の展開
tar.gz で圧縮されていますので、展開して下さい。
```console
$ tar xfz sora---.tar.gz
```
## 設定ファイル
設定ファイルは Sora を展開した `sora-/etc/sora.conf` にあります。まずは開発者ツールを動作させるまでの最低限の設定を行います。
`#` はコメントになっている部分ですので、設定する項目がコメントになっている場合は `#` を削除して設定項目を有効にしてください。
1. ライセンスファイルの指定- ライセンスファイルを etc/ において、cp コマンドを利用して `license.json` に変更して下さい。
2. 開発者ツールの有効化- Sora には簡単に検証してもらうための開発者ツールを組み込んでいます。 `devtools` 項目の `#` を削除して設定を有効にし、加えて、設定値に true を指定して Sora に組み込まれている開発者ツールを有効化してください。
```ini
## ライセンスファイルを指定してください
## この設定はオプションで、デフォルトは "etc/license.json" です
# license_file = etc/license.json
## 開発者ツールを有効にするかどうかを指定してください
## オプションでデフォルト false です
devtools = true
```
他の設定はここでは不要です。
## 起動
設定が終わったらサーバーを起動します。
```
$ sora-/bin/sora daemon
```
### 停止
以下で停止できます。
```
$ sora-/bin/sora stop
```
## シグナリングへの HTTPS の適用
**HTTPS (WebSocket over TLS を含む) の適用は必ず行ってください。HTTPS への接続以外はサポート対象外となります**
ブラウザで WebRTC の機能の一つである getUserMedia を利用する場合は HTTPS が必須となります。
ただし、Sora 自体は HTTPS 非対応のため、Sora の前段にリバースプロキシとして nginx を設置して TLS 終端を行ってください。
nginx の location ディレクティブの設定については [nginx](NGINX.html) を参考にして設定をお願いします。
> **注意**
>
> nginx の設定に関する質問については Sora のサポート範囲外となりますのでご了承下さい。
証明書については [Let's Encrypt - Free SSL/TLS Certificates](https://letsencrypt.org/) の利用をおすすめします。
> **注意**
>
> Let's Encrypt に関する質問については Sora のサポート範囲外となりますのでご了承下さい。
リバースプロキシとしての nginx の役割:
```
// 開発者ツールの静的ファイルの場合
クライアント -> -> nginx -> -> Sora
// シグナリングの場合
クライアント -> -> nginx -> -> Sora
```
## 開発者ツールを利用してみる
Sora に組み込まれている開発者ツールの使い方を説明します。
開発者ツールでは Sora の持っている一通りの配信機能を試すことができます。
ブラウザで `https://<設定したドメイン>/` にアクセスして以下のような画面が表示されれば成功です。

### 開発者ツールが動作するブラウザ一覧
以下の最新のブラウザで動作します。
- Google Chrome
- Mozilla Firefox
- Apple Safari
- Microsoft Edge
ただし一部の機能は特定のブラウザでのみ動作します。
### 動作確認
> **警告**
>
> ハウリングする可能性があります。
ビデオ会議システムなどで利用されるような双方向での配信機能です。
受信だけ、送信だけでの利用もできます。
`マルチストリーム送受信` を開き `connect` を押して、
その後、別のブラウザやタブで同じ URL を開いて、 `connect` を押して下さい。

追加でタブを開いて `connect` していけば参加者を増やせます。
開発ツールでは気軽にいろいろな設定を試せるようになっています。触ってみてください。
## 次のステップ
[本番稼働に向けて](PRODUCTION.html) で Sora の本番稼働向けの設定を行ってください。
Sora はいろいろな機能を持っていますので、一通りドキュメントをご確認下さい。
ドキュメントで不明な点がありましたら、お気軽にお問い合わせください。
> **注釈**
>
> [アプリケーション連携チュートリアル](APP_INTEGRATE_TUTORIAL.html) は Sora を利用したアプリケーション連携用のチュートリアルを Python にて説明しています。
## トラブルシューティング
### タイムアウトが起きてつながらない場合
> **重要**
>
> OS の設定やファイアウォールで UDP の通信ができない場合は接続に失敗します。
Sora が利用する UDP のポートの範囲は通常 32768 から 60999 です。この範囲の通信を許可にしてみてください。
### それでもうまく繫がらない場合
サーバーの IPv4 アドレスを `ipv4_address` に指定して、 `ipv6` を `false` にしてみてください。
```ini
## ライセンスファイルを指定してください
## この設定はオプションで、デフォルトは "etc/license.json" です
# license_file = etc/license.json
## サーバーで利用する IPv4 アドレスを指定してください
## 指定が無い場合は、自動で見つけたアドレスを利用します
ipv4_address = 192.0.2.10
## 開発者ツールを有効にするかどうかを指定してください
## オプションでデフォルト false です
devtools = true
```
> **注釈**
>
> Amazon EC2 インスタンス等のようなパブリック IP アドレスとプライベート IP アドレスが異なる環境では
> ブラウザからアクセスできる IP アドレス(パブリック IP アドレス)を ipv4_address に設定してください。
### よくある問題
ここでは利用しているドメインを仮に `example.com` としています。
- `https://example.com/` にアクセスできない- nginx の設定が間違っている可能性があります。nginx の設定を見直して下さい
- `https://example.com/` にアクセスしても 404 になる- Sora の組み込みの開発者ツールが有効になっていない可能性があります- `sora.conf` の設定で開発者ツールが有効になっているか確認して下さい
- `http://example.com:5000/` にアクセスして開発者ツールが有効になっているかを確認して下さい
- Sora が利用するポートを他のプロセスが利用していないかを確認してください- Sora が利用したいポートを他のプロセスが既に利用しているために、Sora が起動していない可能性があります
### それでも繋がらない場合
**お問い合わせ前に以下を確認してください**
- チュートリアル以外のことはやっていないかどうかを確認して下さい
- **ファイアウォールの設定をすべて無効にして確認してください**
- IPv6 アドレスを無効にして確認してください
- Sora では基本的にロードバランサーを利用することはできませんので、ロードバランサーなしで確認してください
すべてを確認しても繋がらない場合はお問い合わせください。
その際に以下の情報を **必ず** お送りください。
- どんな環境でチュートリアルを実行しているか
- Sora のバージョン
- Sora の設定ファイルである `sora.conf`
- log ディレクトリ以下すべてを tar.gz にて圧縮してお送りください- 容量が 1 メガバイトを超える場合は事前にご連絡ください。アップローダーをご提供します
- 繋がらなかった開発者ツール- たとえば `sendonly` など
- 繋がらなかったブラウザを利用している OS とバージョン- たとえば `macOS Sonoma 14.5` や `Windows 10 2004` など
- 繋がらなかったブラウザの種類とバージョン- たとえば `Chrome 125.0.6422.142` など
それ以外にも可能な限り、こちらがサポートをするために必要そうな情報をお送りください。
# 本番稼働に向けて
この資料はチュートリアルで Sora をなんとなく体験したあとに、
本番環境に向けてどのような準備が必要なのか、どの機能を使っていけばいいのかをまとめたものです。
> **重要**
>
> 不明点などはサポートまでお問い合わせください。
## 優先順位
Sora で外部から指定する値には優先順位があります。
上から順に優先度が高く、同じ優先度の場合は後から指定した値が優先されます。
1. セッション生成時の払い出しで指定した値
2. 認証成功時の払い出しで指定した値
3. シグナリング接続時に指定した値
4. sora.conf で設定した値
- sora.conf で設定した値は、シグナリング接続時の値で上書きできます
- シグナリング接続時の値は、認証成功時の払い出しで上書きできます
- 認証成功時の払い出しは、セッション生成時の払い出しで上書きできます
本番環境ではシグナリング接続時の値を利用するのは避けて、
認証成功時やセッション生成時の値を利用するようにしてください。
## IPv4 アドレスの固定
`sora.conf` の [ipv4_address](SORA_CONF.html#04becc) にサーバーの IP アドレスを指定してください。
```ini
ipv4_address = 192.0.2.10
```
## IPv6 アドレスの利用について
Safari は IPv6 環境での動作が不安定なため、
Safari をターゲットデバイスに含んでいる場合は `sora.conf` の IPv6 設定を無効にする `ipv6 = false` を推奨しています。
ファイアーウォールを利用される場合は IPv6 向け設定もご確認ください。
## sora.conf の turn_fqdn を設定する
iOS の場合は TURN は FQDN を利用しないと接続ができない場合があるため、
TURN-UDP / TURN-TCP で利用するドメインを指定してください。
`sora.conf` の `ipv4_address` に指定した IP アドレスを設定してある FQDN を指定してください。
```ini
turn_fqdn = sora-turn.example.com
```
## ウェブフックなどで利用する CA 証明書のインストール
もしウェブフックなどで HTTPS サーバへのアクセスを行う場合に、
自前で CA 証明書を設定しない場合、信頼された CA 証明書のインストールを行ってください。
- Ubuntu は `apt install ca-certificates` でインストールされる証明書を利用します
- RHEL (または CentOS) は `dnf install ca-certificates` でインストールされる証明書を利用します
### 影響を受ける機能
- 認証ウェブフック
- セッションウェブフック
- イベントウェブフック
- 音声ストリーミング機能
- 統計エクスポーター機能
ただし、以下の設定で自前で CA 証明書を指定している場合は、この影響を受けません。
- [webhook_tls_verify_cacert_file](SORA_CONF.html#7036dc)
- [audio_streaming_tls_verify_cacert_file](SORA_CONF.html#feef99)
- [stats_exporter_tls_verify_cacert_file](SORA_CONF.html#bcd961)
## HTTP API のループバックアドレスからのみのアクセス
> **重要**
>
> この設定を導入することを強く推奨します
Sora の HTTP API は TLS を利用したセキュアな通信機能や認証機能を持ち合わせていません。
そのため、本番環境では `sora.conf` の [api_loopback_address_only](SORA_CONF.html#9d6140) の値を `true` にしてください。
こうすることでループバックアドレスからのみ HTTP API が叩けるようになります。
アプリケーションからの HTTP API へのアクセスは Nginx などのリバースプロキシ経由で利用してください。
## シグナリングのループバックアドレスからのみのアクセス
> **重要**
>
> この設定を導入することを強く推奨します
Sora の WebSocket は TLS を利用したセキュアな通信機能を持ち合わせていません。
そのため、本番環境では `sora.conf` の [signaling_loopback_address_only](SORA_CONF.html#e22105) の値を `true` にしてください。
こうすることでループバックアドレスからのみシグナリングが叩けるようになります。
WebRTC クライアントからシグナリングへのアクセスは Nginx などのリバースプロキシ経由で利用してください。
## ファイルディスクリプタ数の設定
Sora は 1 接続で少なくとも 2 つ以上のファイルディスクリプタを利用します。
また、ウェブフックやログの書き込みでも追加でファイルディスクリプタを利用します。
同時接続数が 100 の場合は Linux のデフォルト値である 1024 でも足りるとは思いますが、
ある程度大きめのファイルディスクリプタ数に変更してください。
## systemd の適用
> **重要**
>
> この仕組みを導入することを強く推奨します
Sora の起動/停止に `bin/sora daemon` を利用するのではなく systemd を適用してください。
デーモン化せずに Sora を動かすには `bin/sora foreground` を利用します。
詳細は [systemd](SYSTEMD.html) をご確認ください。
## TURN-TLS、TURN-TCP、シグナリングで 443 番ポートを使用する
> **重要**
>
> この仕組みを導入することを強く推奨します。
> この設定は Sora 2021.1 以降に最適化されています。
> **注意**
>
> nginx および systemd の設定に関する質問については Sora のサポート範囲外となります。
**この設定はある程度の nginx や証明書の知識が必要になります**
nginx のバージョンは 1.11.5 以降が必須です。
TURN-TLS、TURN-TCP、シグナリング(HTTPS)を 443 番ポートのみで受信する場合は次の設定を追加してください。
> **注意**
>
> nginx の停止に QUIT シグナルを使用している場合は、nginx 起動時に作成された UNIX domain socket のソケットファイルは削除されないため、nginx の再起動に失敗します。
> そのため、サービス停止を QUIT シグナルではなく TERM シグナルを使用するように変更するか、または、daemon off で起動することをお勧めします。
> systemd を使用している場合も、ドロップインファイル等を作成して、nginx 停止時のシグナルを QUIT シグナルから TERM シグナルへ変更するか、daemon off による管理へ変更することをお勧めします。
### nginx のストリーム機能と ssl_preread 機能を利用する
> **ヒント**
>
> Ubuntu 24.04 では nginx のストリーム機能は `apt install libnginx-mod-stream` で明示的にインストールする必要があります。
nginx の機能を利用して、同一ポートの待受で複数のプロトコルを扱えるようにします。
その機能を利用した nginx の参考設定です。証明書には Let's Encrypt を利用している想定です。
利用する証明書はマルチドメイン (SANs) またはワイルドカード証明書が前提となります。
- sora.example.com- シグナリングの WebSocket over TLS で利用するドメイン
- sora-turn.example.com- TURN-TLS で利用するドメイン
```nginx
stream {
# SNI のサーバー名が取得できない場合、または、該当するサーバー名が指定されていない場合は TURN-TCP へ
# 該当するサーバー名が指定されている場合は TURN-TLS または シグナリングへ
map $ssl_preread_server_name $upstream {
default sora-turn.example.com;
"sora-turn.example.com" unix:/tmp/tls.sock;
"sora.example.com" unix:/tmp/https.sock;
}
# Sora の TURN-TCP へ転送
upstream sora-turn.example.com {
# Sora の TURN-TCP へ
# ここの IP アドレスは Sora の ipv4_address に指定した値を指定してください
# ここを 127.0.0.1 にすると Firefox で繋がらなくなることを確認しています
server 192.0.2.1:3478;
}
# TURN-TCP, TURN-TLS, シグナリングを TCP で待ち受け
server {
listen 443;
# IPv6 を利用している場合は下記を有効にしてください
# listen [::]:443;
proxy_pass $upstream;
proxy_protocol on;
ssl_preread on;
}
# TURN-TLS, シグナリングの TLS 終端し TURN-TCP へ転送
server {
listen unix:/tmp/tls.sock ssl proxy_protocol;
# SNI を見て TURN-TLS の場合は TURN-TCP へ転送
# シグナリング(HTTPS)の場合は HTTP へ転送
proxy_pass $ssl_server_name;
proxy_protocol on;
ssl_certificate /etc/letsencrypt/live/sora.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sora.example.com/privkey.pem;
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_handshake_timeout 10s;
ssl_session_cache off;
ssl_session_tickets off;
}
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
# $proxy_protocol_addr を利用することでクライアントの IP が保持できるようになる
log_format proxy '$proxy_protocol_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
# 定義した proxy を利用する
access_log /var/log/nginx/access.log proxy;
server {
listen unix:/tmp/https.sock ssl proxy_protocol;
root /var/www/html;
index index.html index.htm;
ssl_certificate /etc/letsencrypt/live/sora.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sora.example.com/privkey.pem;
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache off;
ssl_session_tickets off;
real_ip_header proxy_protocol;
server_name sora.example.com;
# シグナリングを Sora に Proxy します
location = /signaling {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1:5000/signaling;
proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Forwarded-For $proxy_protocol_addr;
}
# Sora の HTTP API に Proxy します
# 本番環境では認証などの機能を利用してください
location /api {
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:3000/;
}
# OBS (WHIP/WHEP) 向けのシグナリングを Sora に Proxy します
location ~ ^/(whip|whip-resource|whep|whep-resource)/ {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Authorization $http_authorization;
}
# Sora のヘルスチェックに Proxy します
# 公開するかどうかは検討してください
location /.ok {
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:5000;
}
# Sora の開発ツールに Proxy します
# 本番環境では不要です
location / {
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:5000;
}
}
}
```
TURN-TCP、 TURN-TLS、シグナリングを 443 番で使用する場合の sora.conf の設定は以下になります。
turn_tcp_port, turn_tls_port を 443 に変更します。
```ini
## TURN 機能を有効にするかどうかを指定してください
turn = true
## TURN 機能で利用するレルムを指定してください
turn_realm = sora-turn.example.com
## TURN 機能で TURN URL 払い出し機能で利用する FQDN (最後の . なし)を指定してください
turn_fqdn = sora-turn.example.com
## TURN 機能で TURN-TCP を有効にするかどうかを指定してください
turn_tcp = true
## TURN 機能で TURN-TCP を有効にした際に利用するポート番号を指定してください
turn_tcp_listen_port = 3478
## TURN 機能で TURN-TCP URL 払い出し時のポート番号を指定してください
turn_tcp_port = 443
## TURN 機能で TURN-TLS URL 払い出し機能を有効にするかどうかを指定してください
## オプションでデフォルトは false です
turn_tls = true
## TURN 機能で TURN-TLS URL 払い出し機能で利用する FQDN (最後の . なし)を指定してください
## turn_tls_fqdn は turn_fqdn の値を上書きします
turn_tls_fqdn = sora-turn.example.com
## TURN 機能で TURN-TLS URL 払い出し機能を有効にした際に利用するポート番号を指定してください
turn_tls_port = 443
```
### Ubuntu の Nginx で Unix Domain Socket を利用する際の注意点
- SIGTERM を利用するようにしないと、リスタートすることができません
- セキュリティアップデートで強制的に apt upgrade が行われた際、 Unix Domain Socket ファイルが残って Nginx が再起動でき無くなる場合があります
```console
$ sudo vim /lib/systemd/system/nginx.service
```
```ini
# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# 起動前に /tmp/tls.sock を削除する設定を追加
ExecStartPre=/bin/rm -f /tmp/tls.sock
# 起動前に /tmp/https.sock を削除する設定を追加
ExecStartPre=/bin/rm -f /tmp/https.sock
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
# 変更前の設定
# ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
# 変更後の設定
ExecStop=-/sbin/start-stop-daemon --quiet --stop --signal TERM --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
```
- `ExecStartPre=/bin/rm -f /tmp/tls.sock` を追加してください
- `ExecStartPre=/bin/rm -f /tmp/https.sock` を追加してください
- `ExecStop=-/sbin/start-stop-daemon --quiet --stop --signal TERM --pidfile /run/nginx.pid` に変更してください。
その後、以下のコマンドを実行してください。
```console
$ sudo systemctl daemon-reload
$ sudo systemctl restart nginx
```
## カーネルパラメーターの適用
Sora は UDP を利用します。音声や映像の配信では大量の UDP を処理するため Linux のデフォルトの設定だと厳しい場合があります。
そのため、パラメーターの変更を推奨しています。
詳細は [Linux カーネルチューニング](LINUX_KERNEL_TUNING.html) をご確認ください。
## コンテナ環境での利用する場合
### 認識するコア数と利用できるコア数に矛盾がないかの確認
Sora をコンテナ環境で利用する場合、
コンテナが認識するコア数と実際にコンテナが利用できるなコア数が異なる環境があります。
Sora は **コンテナが認識するコア数を想定した挙動** をするため、
Sora の性能劣化が発生する場合があります。
コンテナが認識するコア数とコンテナが利用できるコア数が異なる場合は **必ずサポートまでご連絡ください** 。
コンテナが認識するコア数は以下のコマンドで確認できます。
```bash
$ grep processor /proc/cpuinfo | wc -l
```
- AWS ECS on EC2 利用時にコンテナが認識するコア数と利用できるコア数が異なる事を確認しています
## SDK の利用
Sora へ接続をする場合は弊社がオープンソースとして公開している SDK を利用してください。
これらのライブラリは弊社によって最新版の Sora で動作するようにメンテナンスされています。
導入もとても簡単になっているので、是非利用してください。
> **重要**
>
> SDK に関する質問・要望・バグなどの報告は Discord の利用をお願いします。
> Sora のライセンス契約の有無に関わらず、
> 応答時間と問題の解決を保証しませんのでご了承ください。
>
> ただし、明らかなバグについては優先的に対応しますので、ご安心ください。
SDK の質問や相談については `sora-sdk-faq` を利用してください。
- Sora JavaScript SDK- 投稿時に `sora-js-sdk` タグを指定してください
- Sora iOS SDK- 投稿時に `sora-ios-sdk` タグを指定してください
- Sora Android SDK- 投稿時に `sora-android-sdk` タグを指定してください
- Sora Unity SDK- 投稿時に `sora-unity-sdk` タグを指定してください
- Sora C++ SDK- 投稿時に `sora-cpp-sdk` タグを指定してください
- Sora Python SDK- 投稿時に `sora-python-sdk` タグを指定してください
- Sora C SDK- 投稿時に `sora-c-sdk` タグを指定してください
## やりたいことが 1:1 の双方向配信の場合
配信が 1:1 の双方向の場合はマルチストリーム機能を利用してください。
詳細は [マルチストリーム機能](MULTISTREAM.html) をご確認ください。
## やりたいことが複数人での双方向配信の場合
複数人で双方向の配信を行いたい場合はスポットライト機能を検討してください。
スポットライト機能を利用することで、クライアントとサーバー側の負荷をかなり抑えられるようになります。
詳細は [スポットライト機能](SPOTLIGHT.html) をご確認ください。
## やりたいことが 1:多 の双方向配信の場合
配信が 1:多 の片方向の場合でもマルチストリーム機能を利用してください。
`role` に `sendonly` と `recvonly` を利用してください。
詳細は [マルチストリーム機能](MULTISTREAM.html) をご確認ください。
## やりたいことが 1:多 の片方向配信で、大規模の場合
配信が 1:多 の片方向で大規模な場合は、クラスターリレー機能を利用してください。
クラスターリレー機能を利用することで、1 チャネルで大規模な配信を行うことができます。
詳細は [リレー機能](CLUSTER.html#4b3bf1) をご確認ください。
## やりたいことが OBS からの配信の場合
OBS からの配信を行いたい場合は OBS (WHIP) 対応機能を利用してください。
詳細は [OBS (WHIP) 対応機能](WHIP.html) をご確認ください。
## やりたいことが OBS での取り込みの場合
OBS へ取り込みを行いたい場合は OBS (WHEP) 対応機能を利用してください。
詳細は [OBS (WHEP) 対応機能](WHEP.html) をご確認ください。
## Edge が機能要件に含まれている場合
最新の Edge であれば、ほとんど Chrome と同じ動きをしますので安心してお使いください。
## Firefox が機能要件に含まれている場合
Firefox の WebRTC 実装はかなり中途半端なため、
できるだけ Firefox は機能要件から外すことをお勧めします。
## 認証を外部の指定した HTTP サーバーで判断したい場合
認証ウェブフック機能を利用してください。この機能は外部の指定した HTTP サーバーで認証を判断できるようになります。
外部の HTTP サーバーの URL 指定は `sora.conf` の [auth_webhook_url](SORA_CONF.html#36a99a) に設定してください。
そうすることで、外部に認証を移譲できます。
詳細は [認証ウェブフック](AUTH_WEBHOOK.html) をご確認ください。
## 接続、切断の検知を外部の指定した HTTP サーバーで利用したい場合
イベントウェブフック機能を利用してください。この機能は外部の指定した HTTP サーバーでクライアント単位での接続、切断を検知できるようになります。
外部の HTTP サーバーの URL 指定は `sora.conf` の [event_webhook_url](SORA_CONF.html#e1a4d2) に設定してください。
そうすることで、外部にイベントをリクエスト送信できます。
詳細は [イベントウェブフック](EVENT_WEBHOOK.html) をご確認ください。
## 配信されている音声や映像を記録したい場合
Sora には録画機能があります。もし利用を検討されている場合はいくつか注意事項があります。
- 録画を終了させる、またはクライアントが切断するまで、録画ファイルは生成されない
- 複数人数が参加する会議の録画ファイルはクライアントごとに生成される- 5 人が会議に参加していれば 5 個ファイルが生成されます
これらを踏まえて録画機能の利用を検討してください。
録画機能の詳細は [録画機能](RECORDING.html) をご確認ください。
## クライアント側で参加してきたユーザーの情報を通知したい場合
Sora では「〜さんが会議に参加しました」や「〜さんが会議から退席しました」というメッセージをクライアント側で流すことができます。
これにはシグナリング通知を利用します。
シグナリング通知機能はシグナリングで利用している WebSocket もしくは DataChannel を経由して、
参加しているチャネルに新しく参加、または退席した状態を通知する機能です。自分が参加したときも自身に参加通知は飛びます。
ただシグナリング通知に含まれる標準の情報はあくまでコネクション ID のみになるため、
そのコネクション ID が誰なのかはどこからか取得する必要があります。
そのコネクション ID が誰なのかを問い合わせる処理が毎回走ってしまうのは無駄なため、
認証ウェブフックの戻り値で、 `signaling_notify_metadata` (シグナリング通知メタデータ)にそのコネクション ID の値のユーザー名を含めてください。
そうすることで、Sora がその参加者のユーザー名を `signaling_notify_metadata` に含めて返すようになります。
この `signaling_notify_metadata` は新しく参加した人には `data` として、
既存の参加している人の `signaling_notify_metadata` が含まれたリストが参加時に通知されるようになっています。
さらに、新しく参加者がいた場合はその参加者の `metadata` が通知されます。もちろん退席者の場合でもその退席者の `metadata` が含まれて通知されます。
`metadata` にユーザー名が含まれるため、サーバーへ問い合わせをしなくても参加者や退席者のユーザー名を取得できます。
シグナリング通知の詳細は [シグナリング通知](SIGNALING_NOTIFY.html) をご確認ください。
シグナリング通知メタデータの詳細は [シグナリング通知メタデータ](SIGNALING_NOTIFY_METADATA.html) をご確認ください。
# ライセンス
Sora はライセンスファイルを読み込ませることで起動します。
## ライセンスファイルのパス設定と配置
ライセンスファイルのパスは `sora.conf` の [license_file](SORA_CONF.html#77d4d5) で設定できます。
Sora を起動する前に設定し、ライセンスファイルを配置してください。
デフォルト設定のまま使う場合は、ライセンスファイルを
sora ディレクトリ以下の etc/license.json にコピーしてください。
```console
$ cp 123ABC-SRA-E001-202301-100.json sora/etc/license.json
```
## ライセンスの更新
ライセンスを更新する場合は `sora.conf` の [license_file](SORA_CONF.html#77d4d5) で指定しているファイルを
cp コマンドで上書きしてください。
デフォルト設定では sora ディレクトリ以下にある `etc/license.json` です。
```console
$ cp 123ABC-SRA-E002-201901-100.json sora/etc/license.json
```
その後、ライセンス更新 API である [UpdateLicense](API_LICENSE.html#9e2217) API を実行することで更新されます。
Sora の再起動は不要です。
192.0.2.1 の部分には実際に利用している IP アドレスかドメインを指定してください
```console
$ http POST 192.0.2.1:3000/ x-sora-target:Sora_20171218.UpdateLicense -vvv
```
正常に反映されているかを [GetLicense](API_LICENSE.html#be3ee8) API を実行して `serial_code` を確認してください。
```console
$ http POST 192.0.2.1:3000/ x-sora-target:Sora_20171218.GetLicense -vvv
```
### ライセンスの更新に失敗した場合
もし、誤って壊れているライセンスファイル等を使用して更新に失敗しても、既存のライセンス情報は上書きされません。
### ライセンスの更新時のライセンス適用について
ライセンスが更新される際に新しい接続が発生したとしても、
更新前または更新後のいずれかのライセンスが適用され、最大同時接続数の確認が行われます。
ライセンスの状態が一時的に空白になることはありません。
## 同時接続数制限を超えて接続しようとした場合
> **重要**
>
> 最大同時接続数を超過したとしても既に接続しているクライアントには影響がありません。
ライセンスファイルには最大同時接続数が定義してあり、その最大同時接続数を超えて接続することはできません。
### sora.jsonl への出力
既存の接続は継続されますが、新規接続ができなくなります。
`sora.jsonl` に `EXCEED-MAX-CONNECTIONS` というエラーログが出力します。
### クライアントへの通知
最大同時接続数を超えて接続ができなかったクライアントには、
`SERVICE-UNAVAILABLE` というエラーメッセージが通知されます。
### 同時接続数が +1 されるタイミング
認証が成功し、セッションへ参加し、その後 WebRTC での接続が確立したタイミングで初めて同時接続数が +1 されます。
認証が成功しただけでは同時接続数は増えません。
### 同時接続数が -1 されるタイミング
コネクションが切断したタイミングで同時接続数から -1 カウントします。
### エラーメッセージを通知するタイミング
シグナリング開始で WebSocket で `"type": "connect"` 送信後に、
最大同時接続数を超えた場合にエラーメッセージが通知され、シグナリングの WebSocket が切断されます。
## ライセンス期限が過ぎている場合
> **重要**
>
> ライセンスの期限が過ぎていても Sora を起動する事はできます。
### sora.jsonl への出力
既存の接続は継続されますが、新規接続ができなくなります。
`sora.jsonl` に `EXPIRED-LICENSE` というエラーログが出力します。
### ライセンスの期限時刻
ライセンスの期限が `2022-01` の場合は UTC で 2022 年 2 月 1 日の 0 時から新規接続ができなくなります。
### クライアントへ通知するエラーメッセージについて
ライセンス期限が過ぎているため接続ができなかったクライアントには、
`SERVICE-UNAVAILABLE` というエラメッセージが通知されます。
## ライセンスファイルのパスの更新
ライセンスファイルのパスの更新は、一度 Sora を停止し、 `sora.conf` の [license_file](SORA_CONF.html#77d4d5) のパスを変更して Sora を起動する必要があります。
## 最大ノード数ライセンス
2022 年 6 月から `最大ノード数ライセンス` という形式のライセンスを提供しています。
通常の Sora のライセンスは Sora 1 起動 1 ライセンスと固定されており、
同一のライセンスを複数の Sora で利用することはできません。
`最大ノード数ライセンス` は、クラスター構築時に、あらかじめライセンスに定義されている最大ノード数までは同一のライセンスを利用できます。
> **危険**
>
> 最大ノード数に対応していないライセンスで複数の Sora を起動することはできません。
最大ノード数に対応したライセンスファイルの中身の例
```javascript
{
"expired_at": "2013-03",
"max_connections": 100,
"max_nodes": 3,
"product_name": "Sora",
"serial_code": "DOC123-SRA-E002-201303-N3-100",
"signature": "****",
"type": "Experimental"
}
```
ファイルの中身に `"max_nodes": 3` と書かれているライセンスでは、クラスターを組む際に最大 3 ノードまで同一のライセンスが利用できます。
> **注釈**
>
> max_nodes 1 につき 1 ライセンス分の料金が必要になります。例えば max_nodes が 3 の場合は 3 ライセンス分の料金となります。
> **危険**
>
> 最大ノード数に対応しているライセンスを利用した場合に構築できるクラスターは 1 つのみです。複数のクラスターを構築することはできません。
`最大ノード数ライセンス` について不明な部分がある場合はサポートにお問い合わせください。
### 最大ノード数ライセンスの非クラスター利用について
> **注意**
>
> 契約済みの最大ノード数ライセンスを非クラスターで利用したい場合はサポートまでご連絡ください。
最大ノード数ライセンスはクラスターを利用しない場合は通常のライセンスと同じように利用できます。
ただし、 その場合は 1 ライセンスとして扱うため、1 ノードでしか利用できません。
もし `"max_nodes": 3` と記載されていても、クラスターを利用しない場合は 1 ノードでしか利用できません。
### 最大ノード数ライセンスへの切り替えについて
通常のライセンスから最大ノード数ライセンスへの切り替えができます。詳細はサポートまでご連絡ください。
### 最大ノード数ライセンスと通常ライセンスの混在について
最大ノード数ライセンスと通常ライセンスを混在して利用することはできません。
### 最大ノード数ライセンスでのみ利用できる機能
- [クラスターリレー機能](CLUSTER.html#4b3bf1)
- [クラスターリレー利用時のアフィニティ機能](CLUSTER.html#6f4bfb)
- [クラスター利用時のテンポラリーノード機能](CLUSTER.html#3cb6c8)
- [クラスター利用時のライセンスで決められた最大同時接続数の合計を維持する機能](CLUSTER.html#7bc873)
### 最大ノード数ライセンス利用時のノード数超過について
#### InitCluster API で新規に登録する場合のノード数超過
[InitCluster](API_CLUSTER.html#621990) API で新規に登録する場合、
`node_name_list` に指定したノード数が `"max_nodes"` で指定された最大ノード数を超える場合、
`EXCEED-MAX-NODES` というエラーメッセージが通知され、クラスターの初期化に失敗します。
#### RegisterClusterNode API で新規に登録する場合のノード数超過
[RegisterClusterNode](API_CLUSTER.html#09ed96) API で新規に登録する場合、
既にクラスターが最大ノード数ライセンスの `"max_nodes"` で指定された最大ノード数に達している場合、
`EXCEED-MAX-NODES` というエラーメッセージが通知され、ノードの登録に失敗します。
## ライセンスエラー時の動作確認用ライセンスの提供について
ライセンス期限が過ぎたり、最大同時接続数を超過した際の動作確認を行うためのライセンスを提供しています。
動作確認用ライセンスが必要なお客様はサポートまでご連絡ください。
ライセンスエラー時の動作確認用ライセンスはクラスターでも確認できるよう、最大ノード数ライセンスでの提供となります。
最大ノード数ライセンスはクラスターを利用しない場合は通常のライセンスと同じように利用できます。
### ライセンス期限が古く、最大同時接続数が 1 のライセンス
ライセンス期限が過ぎたテストにご利用ください。
### ライセンス期限が新しく、最大同時接続数が 0 のライセンス
同時接続数が超過したテストにご利用ください。
# ログファイル
**サポート問い合わせの場合は log/ ディレクトリ以下をすべて圧縮して送ってください**
## log/ 以下のログファイル
Sora は log/ ディレクトリ以下にログファイルを出力します。
### Sora の運用に関係するログ
- sora.jsonl- Sora の開始、終了や問題があった場合に出力されますので、まずはこの監視をお願いします
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- cluster.jsonl- Sora クラスターに関するログが出力されます
- **Sora クラスターを利用していない場合も出力されます**
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- auth_webhook.jsonl- 認証ウェブフックの送信が **正常に動作した** 処理を書き込みます
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- auth_webhook_error.jsonl- 認証ウェブフックの送信が失敗した処理を書き込みます- レスポンスがステータスコードが 200 番台以外であった場合
- レスポンスの JSON に `"allowed"` 項目が含まれていない場合
- レスポンスの JSON が `"allowed": false` にもかかわらず `"reason"` 項目が含まれていない場合
- 送信先からの応答がなく、タイムアウトした場合
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- session_webhook.jsonl- セッションウェブフックの送信が **正常に動作した** 処理を書き込みます
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- session_webhook_error.jsonl- セッションウェブフックの送信が失敗した処理を書き込みます- レスポンスがステータスコードが 200 番台以外であった場合
- 送信先からの応答がなく、タイムアウトした場合
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- event_webhook.jsonl- イベントウェブフックで送信した **すべて** の処理を書き込みます
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- event_webhook_error.jsonl- イベントウェブフックの送信が失敗した処理を書き込みます- レスポンスがステータスコードが 200 番台以外であった場合
- 送信先からの応答がなく、タイムアウトした場合
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- stats_webhook.jsonl- このログは [stats_webhook_log](SORA_CONF.html#2fa540) を `true` に設定した場合に出力されます
- 統計ウェブフックで送信した **すべて** の処理を書き込みます
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- stats_webhook_error.jsonl- このログは [stats_webhook_log](SORA_CONF.html#2fa540) を `true` に設定した場合に出力されます
- 統計ウェブフックの送信が失敗した処理を書き込みます- レスポンスがステータスコードが 200 番台以外であった場合
- 送信先からの応答がなく、タイムアウトした場合
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- rtc_stats.jsonl- このログは [rtc_stats_log](SORA_CONF.html#2fc848) を `true` に設定した場合に出力されます
- クライアントの RTC 統計情報を出力します
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
### Sora のサポートに関係するログ
- connection.jsonl- 接続が切断した際にクライアントとサーバーの統計情報を出力するログです
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- signaling.jsonl- シグナリングでやりとりされている offer / answer / candidate / re-offer / re-answer と接続終了 (close) を記録したログです
- OBS WHIP/WHEP 用の whip-offer / whip-answer / whep-offer / whep-answer も出力します
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- signaling_error.jsonl- [legacy_signaling_error](SORA_CONF.html#88aa33) を `false` に設定している場合にのみ出力されます- デフォルトは `false` です
- シグナリングでエラーが発生した際にエラー情報を出力します
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- api.jsonl- 一部の API 操作に関するログを出力します
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- internal.jsonl- Sora が予定外の動作をしたときに出力されるログです。問題解決に必須のログです
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- crash.log- Sora が予定外の動作をしたときに出力されるログです。問題解決に必須のログです
- ログローテーションされませんので、ログローテーションをお願いします
- 週次ログローテーションを推奨します
- erlang.log.<1..5>- サポート時に必要となるログですので、気にする必要はありません
- 自動でログローテーションされますので、ログローテーションは不要です
- `bin/sora foreground` コマンドで起動する場合には出力されません
- sysctl.log- 起動時に取得するログで、毎回上書きされます
- sysctl -a の実行結果を記録します
- ログローテーションは不要です
- ulimit.log- 起動時に取得するログで、毎回上書きされます
- ulimit -n の実行結果を記録します
- ログローテーションは不要です
- run_erl.log- 起動時に出力されるログのため、ほとんどログが出力されることはありません
- ログローテーションは不要です
- `bin/sora foreground` コマンドで起動する場合には出力されません
- connection_created_wait_timeout_error/_.jsonl- sora ログに `CONNECTION-CREATED-WAIT-TIMEOUT-ERROR` が出力された際の接続情報を出力します
- クライアントと Sora との間で WebRTC が確立できなかった場合の情報です
- ファイル名は時刻とコネクション ID の組み合わせです
## 特別なログ
Sora が異常終了した際 `erl_crash.dump` というファイルが log/ ディレクトリに生成されます。
こちらは **必ず** 保存し、送っていただけるようお願いいたします。
### 監視用確認目的で erl_crash.dump ログを強制的に出力させる方法
監視を行う際に実際に `erl_crash.dump` を生成したい場合には、 `bin/sora daemon` で起動した上で、
`kill -SIGUSR1` を使用して `run_erl` プロセスを落としてください。
```
$ kill -SIGUSR1 <プロセス ID>
```
この方法で log/ ディレクトリに `erl_crash.dump` が生成されます。
## JSONL (JSON Lines) 形式
Sora は一部のログを除いて JSONL 形式でログを出力します。
JSONL の仕様は [JSON Lines](https://jsonlines.org/) に記載されているものに準拠します。
- UTF-8 エンコード
- 改行は `\n`
- 各行は JSON 値
- ファイル拡張子は `jsonl`
### JSONL 形式で出力されるログ
- sora ログ
- cluster ログ
- internal ログ
- api ログ
- signaling ログ
- connection ログ
- auth_webhook ログ
- auth_webhook_error ログ
- session_webhook ログ
- session_webhook_error ログ
- event_webhook ログ
- event_webhook_error ログ
- stats_webhook ログ
- stats_webhook_error ログ
- connection_created_wait_timeout_error ログ
### id
Sora が出力する全ての JSONL 形式のログには UUIDv4 を Base32 でエンコードした `"id"` が含まれます。
`"id": "JKBYVZA3KN6QH249B6QTKDCX8M"`
## auth_webhook ログ
**出力ファイル名**: auth_webhook.jsonl
```javascript
{
"timestamp": "2024-01-19T02:44:22.799941Z",
"id": "7N7RTNSEVN43ZB7NVXGAYPETJ4",
"req": {
"timestamp": "2024-01-19T02:44:22.793747Z",
"id": "1EYTQSFVZ56MZ2BRZC12GQYQKW",
"x_forwarded_for": "49.97.11.19",
"version": "2024.1.0",
"label": "WebRTC SFU Sora",
"node_name": "sora@127.0.0.1",
"role": "sendrecv",
"channel_id": "sora",
"connection_id": "9SRMRSDWA959XFN74DCV3Z6XA0",
"multistream": true,
"simulcast": false,
"spotlight": false,
"audio": true,
"audio_codec_type": "OPUS",
"video": true,
"video_codec_type": "VP9",
"video_bit_rate": 500,
"video_vp9_params": {
"profile_id": 0
},
"data_channel_signaling": true,
"ignore_disconnect_websocket": false,
"channel_connections": 0,
"channel_sendrecv_connections": 0,
"channel_sendonly_connections": 0,
"channel_recvonly_connections": 0,
"sora_client": {
"raw": "Sora JavaScript SDK 2024.1.0",
"type": "Sora JavaScript SDK",
"version": "2024.1.0",
"environment": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
},
"e2ee": false
},
"res": {
"allowed": true,
"client_id": "client-01"
},
"url": "http://192.0.2.1:9000/webhook/auth"
}
```
## auth_webhook_error ログ
**出力ファイル名**: auth_webhook_error.jsonl
認証ウェブフックが正常に動作しなかった場合に出力します。
`auth_webhook` ログとは異なり `res` ではなく `reason` が出力されます。
## session_webhook ログ
**出力ファイル名**: session_webhook.jsonl
レスポンスが返却されない場合、 `res` は出力されません。
```javascript
{
"id": "XJ227VDDFH60BAB833C1R2HDBW",
"timestamp": "2024-04-19T05:32:25.583312Z",
"req": {
"id": "D5PAF0ZHDX00B4VAWMZAR866MR",
"label": "WebRTC SFU Sora",
"timestamp": "2024-04-19T05:32:24.280641Z",
"type": "session.created",
"version": "2024.1.0",
"node_name": "sora@127.0.0.1",
"session_id": "NAA3DGPJQH2J7FDV698RZ9X6R0",
"channel_id": "sora",
"multistream": true,
"spotlight": false,
"created_time": 1713504744,
"created_timestamp": "2024-04-19T05:32:24.277809Z"
},
"url": "http://192.0.2.1/webhook/session",
"res": {
"recording": true
}
}
```
## connection ログ
**出力ファイル名**: connection.jsonl
Sora は接続単位で統計情報を保持しています。クライアント側の統計情報とサーバー側の統計情報の両方をログとして出力します。
クライアント側の統計情報はユーザーエージェント統計情報機能を利用しているため、
SDK 側がユーザーエージェント統計機能に対応している必要があります。
こちらのログはログローテーションしないため、ローテーションが必要となります。
## sora ログ
**出力ファイル名**: sora.jsonl
sora ログは主にサポートで利用するためのログを出力します。そのためエラーメッセージがかなり技術的な表現になっています。
- sora ログは何かあって大量のログが出たとしてもうまい具合にスキップする機能が入っています
### UTC に固定
sora ログのタイムスタンプは RFC 3339 UTC (マイクロ秒) 形式に固定されています。
`timestamp` という項目でタイムスタンプが出力されます。
```javascript
{
"id": "QGJMC1AF3552V448N8F53CZBJ4",
"level": "debug",
"channel_id": "sora",
"multistream": true,
"role": "sendonly",
"simulcast": false,
"spotlight": false,
"node_name": "sora@127.0.0.1",
"connection_id": "NXHKH46FP93571ZM4PZBSFD4Z4",
"timestamp": "2022-08-02T04:43:02.828358Z"
}
```
### クラスター利用時
```javascript
{
"id": "QR6YX8VW8H76N6S3B7HBCXJ4PM",
"level": "debug",
"channel_id": "sora",
"multistream": true,
"role": "sendonly",
"simulcast": false,
"spotlight": false,
"node_name": "sora@127.0.0.1",
"connection_id": "NXHKH46FP93571ZM4PZBSFD4Z4",
"timestamp": "2022-08-02T04:43:02.828358Z"
}
```
### オプション情報
```javascript
{
"level": "debug",
"channel_id": "sora",
"multistream": true,
"role": "sendonly",
"simulcast": false,
"spotlight": false,
"node_name": "sora@127.0.0.1",
"connection_id": "NXHKH46FP93571ZM4PZBSFD4Z4",
"timestamp": "2022-08-02T04:43:02.828358Z"
}
```
### 出力例
シグナリング接続時に認証サーバーがステータスコード 400 を返してきた際に出力される `AUTH-WEBHOOK-RESPONSE-UNEXPECTED-STATUS-CODE` の出力例は次の通りです。
```javascript
{
"channel_id": "sora",
"connection_id": "J9RQEB074S2EB9SFBCN9AH7ASM",
"domain": [
"sora",
"signaling"
],
"level": "error",
"msg": "AUTH-WEBHOOK-RESPONSE-UNEXPECTED-STATUS-CODE | reason={auth_webhook_response_unexpected_status_code,#{status_code => 400}}",
"multistream": true,
"node": "sora@127.0.0.1",
"role": "recvonly",
"simulcast": false,
"sora_version": "2022.2.0",
"spotlight": false,
"timestamp": "2022-08-03T03:43:13.588364Z"
}
```
シグナリング接続時の `"type": "connect"` で指定する JSON が間違っており、Sora 側から切断した際に出力される `INVALID-JSON` の出力例は次のとおりです。
```javascript
{
"msg": "INVALID-JSON | reason=...",
"node": "sora@127.0.0.1",
"level": "error",
"domain": [
"sora",
"signaling"
],
"channel_id": "sora",
"timestamp": "2023-11-02T02:12:35.854402Z",
"sora_version": "2022.2.0"
}
```
シグナリングに WebSocket を利用している場合に、指定時間に一度も `"type": "pong"` が返ってこない場合Sora 側から切断した際に出力される `PONG-TIMEOUT-ERROR` の出力例は次の通りです。
指定時間のデフォルト値は 60 秒です。 `sora.conf` の設定 [websocket_signaling_pong_timeout](SORA_CONF.html#140464) で変更できます。
```javascript
{
"msg": "PONG-TIMEOUT-ERROR | reason=<<\"WebSocket\">>",
"node": "sora@127.0.0.1",
"role": "sendrecv",
"level": "error",
"domain": [
"sora",
"signaling"
],
"simulcast": false,
"spotlight": false,
"timestamp": "2023-11-02T02:12:35.854402Z",
"channel_id": "sora",
"multistream": true,
"sora_version": "2023.1.0",
"connection_id": "174QEZP34D45B6S7665Y32MSQ0"
}
```
### warning
ログレベル `warning` は「接続自体は維持できる問題」の際に出力します。
このログが出力された場合でも Sora 側から切断は行いません。
- 一般- WEBSOCKET-TERMINATE- DataChannel シグナリングで ignore_disconnect_websocket: true の際に WebSocket が想定外の終了をした場合に出力します
- MULTISTREAM-RE-ANSWER-NO-ICE-UFRAG- マルチストリーム利用時 `type: re-answer` を受信した際に ICE に必要な SDP が含まれていない場合に出力します
- MULTISTREAM-INTERNAL-ERROR
- ウェブフック- INVALID-AUTHZ-VALUE- 認証ウェブフック成功時に認証サーバーからの払い出した値がおかしい場合に出力します
- TERMINATE-EVENT-WORKER- イベントウェブフックのワーカーが何らかの理由で終了した場合に出力します
- MISSING-WEBHOOK-BASIC-AUTH-USER-ID- ウェブフック利用時にベーシック認証のユーザー ID が見つからない場合に出力します
- MISSING-WEBHOOK-BASIC-AUTH-PASSWORD- ウェブフック利用時にベーシック認証のパスワードが見つからない場合に出力します
- MISSING-WEBHOOK-PROXY-AUTH-PASSWORD- ウェブフック利用時にプロキシのパスワードが見つからない場合に出力します
- 録画- ARCHIVE-FINAL-SPLIT-ERROR- 録画ファイルの分割がエラーになった場合に出力します、ただし全体出力に向けて処理は継続します
- MISSING-RECORDING-WORKER-PID- 録画処理が完了したワーカーが見つからず正常終了できない場合に出力します
- プロトコル- DTLS-ALERT- DTLS でレベルが WARNING のアラートメッセージがクライアントから送られてきた場合に出力します
- TURN-SEND-INDICATION-BINDING-ERROR- TURN 利用時に STUN-Binding-Error over STUN-Send-Indication を受信した場合に出力します
- TURN-CHANNEL-DATA-BINDING-ERROR- TURN 利用時に STUN-Binding-Error over TURN-Channel-Data を受信した場合に出力します
- SIMULCAST-DUPLICATED-RID- クライアントから複数の SSRC から同一の RID が送られてきた場合に出力します
- UNKNOWN-RTP- `role: recvonly` にもかかわらず RTP パケットが送られてきた場合に出力します
- Sora の内部エラーでも出力される場合があります
- UNKNOWN-RTCP- 見知らぬ RTCP を受信した場合に出力します
- ULPFEC-RECOVER-ERROR- ULPFEC を利用している場合にリカバーを試みて失敗した場合に出力します
- RTP-PACKET-LOSS-SIMULATOR-INCOMING-ENABLED- 受信パケロスシュミレーターを有効にしている場合に出力します
- RTP-PACKET-LOSS-SIMULATOR-OUTGOING-ENABLED- 送信パケロスシュミレーターを有効にしている場合に出力します
### error
ログレベル `error` は「接続自体を維持できない問題」の際に出力します。
このログが出力された場合、Sora 側から切断を行います。
- 一般- UNEXPECTED-EXIT
- シグナリング- INVALID-JSON- 無効な JSON を受け取った場合に出力します
- FAILURE-JSON-DECODE- JSON のデコードに失敗した場合に出力します
- AUTHENTICATION-FAILURE- 認証ウェブフックで認証が失敗した場合に出力します
- AUTHENTICATION-INTERNAL-ERROR- 認証ウェブフックで 200 番台以外が返ってきた場合に出力します
- INTERNAL-ERROR- Sora の内部エラーです
- MISSING-SDP-FINGERPRINT- SDP に DTLS の証明書検証に利用するフィンガープリントが見つからなかった場合に出力します
- MISSING-ICE-SDP- SDP に ICE で利用する情報が見つからなかった場合に出力します
- FAILURE-SDP-PARSE- SDP のパースに失敗した場合に出力します
- INVALID-SIGNALING-TYPE- 送られてきたシグナリングメッセージの type が無効な場合に出力します
- UNEXPECTED-SIGNALING-TYPE- 送られてきたシグナリングメッセージの type が見知らぬ場合に出力します
- MISSING-TYPE- 送られてきたシグナリングメッセージに type が見つからない場合に出力します
- TOO-LARGE-JSON- 送られてきた JSON が巨大な場合に出力されます
- TOO-MANY-CANDIDATE- あまりにも多い `"type": "candidate"` を送ってきた場合に出力します
- SIGNALING-INTERNAL-ERROR- シグナリングでの内部エラーが発生した場合に出力します
- TRANSPORT-INTERNAL-ERROR- 通信での内部エラーが発生した場合に出力します
- BAD-FINGERPRINT- DTLS の証明書の検証に失敗した場合に出力します
- PONG-TIMEOUT-ERROR- 指定時間間隔 (デフォルト 5 秒) で type: ping を送信し、指定時間内に (デフォルト 60 秒間) 1 度も `type: pong` が返ってこない場合に出力します
- これらの時間は `sora.conf` の設定 [websocket_signaling_ping_interval](SORA_CONF.html#27aae2) と [websocket_signaling_pong_timeout](SORA_CONF.html#140464) で変更できます。
- CONNECT-WAIT-TIMEOUT-ERROR- WebSocket を確立して一定時間以内に `"type": "connect"` を送ってこない場合に出力します
- CONNECTION-CREATED-WAIT-TIMEOUT-ERROR- 一定時間以内に WebRTC が確立しない場合に出力します
- ANSWER-TIMEOUT-ERROR- 一定時間以内に `"type": "answer"` を送ってこない場合に出力します
- ライセンス- EXPIRED-LICENSE- ライセンスが切れている場合に出力されます
- EXCEED-MAX-CONNECTIONS- ライセンスの同時接続数を超えて接続をしようとしたクライアントがいた場合に出力されます
- 認証ウェブフック- AUTH-WEBHOOK-INTERNAL-ERROR- 認証ウェブフックで内部エラーが発生した場合出力します
- AUTH-WEBHOOK-AUTHZ-INTERNAL-ERROR- 認証ウェブフックの戻り値で内部エラーが発生した場合出力します
- セッションウェブフック- SESSION-WEBHOOK-INTERNAL-ERROR- セッションウェブフックが正常に送信できなかった、または内部エラーが発生した場合出力します
- イベントウェブフック- EVENT-WEBHOOK-ERROR- イベントウェブフックリクエストが正常に送信できなかった場合に出力します
- DataChannel- INVALID-DATA-CHANNEL-USER-DATA- 片方向でしか利用していない DataChannel にメッセージが送られてきた場合に出力します
- 録画- ARCHIVE-FAILED- 録画ファイルの生成に失敗した際に出力します
- RECORDING-INTERNAL-ERROR- 録画で内部エラーが発生した際に出力します
- プロトコル- TURN-UDP-INTERNAL-ERROR- TURN UDP で内部エラーが発生した場合に出力します
- DTLS-ALERT- DTLS でレベルが FATAL のアラートメッセージが送られてきたとき出力します
### emergency
ログレベル `emergency` は「Sora の起動を維持できない問題」の際に出力します。
このログが出力された場合、Sora を終了します。
- SORA-NODE-DUPLICATED- 同一ノード名の Sora が既に起動している場合に出力します
- BOOT-FAILED- Sora が正常に起動できない場合に出力します
- 設定- SORA-CONF-ERROR- sora.conf が正常に読み込めない場合に出力します
- クラスター- CLUSTER-INTERNAL-FAILURE- クラスター内部で問題が発生した際に出力します
# sora.conf リファレンス
Sora の設定ファイルは `key = value` 形式です。
文字列であっても `""` で囲わないでください。
## 単位指定
`sora.conf` では一部の設定に単位の指定が必須です。
- 利用できる単位- ミリ秒 `ms`
- 秒 `s`
- 分 `min`
- 時 `h`
- 数値と単位の間にはスペースを入れてください
```ini
webhook_response_timeout = 30 s
```
> **注釈**
>
> 利用できる単位が制限されている設定項目も存在します。
## 範囲表記
- `2..10` と書いてある場合 2 以上、10 以下の値を指定できることを表しています
- `2..10 s` と書いてある場合は 2 秒以上、10 秒以下の値を指定できることを表しています
## workaround_20250515
**デフォルト**: 未指定
この設定項目については [Safari タイムスタンプバグに対するワークアラウンド](WORKAROUND.html#e73b7a) をご確認ください。
```ini
workaround_20250515 = 18.4,18.4.1,18.5
```
## license_file
**デフォルト**: "etc/license.json"
ライセンスファイルのパスを指定してください、可能な限り **絶対パス** を指定してください。
```ini
license_file = etc/license.json
```
## label
**デフォルト**: "WebRTC SFU Sora"
認証やイベントウェブフックリクエスト送信時に送られる、サーバー固有の値を指定してください。
```ini
label = sora-node-001.example.com
```
## ipv4_address
**デフォルト**: 設定無し
この値を有効にしなくても自動で IPv4 アドレスを収集しますが、
固定された IPv4 アドレスがサーバーに割り当てられている場合は指定することを推奨しています。
IPv4 アドレスを指定してください。 `192.0.2.10` のように指定してください。
```ini
ipv4_address = 192.0.2.10
```
## ipv6
**デフォルト**: false
IPv6 機能を有効にするかどうか指定してください。デフォルトでは無効になっています。
この機能を有効にすると以下の機能が有効になります
- ipv6_address が指定されていない場合は自動で IPv6 アドレスが収集される
- ipv6_address で指定された値が使用される
- IPv6 アドレスが使用できる場合、 TURN サーバーの URL が IPv6 でも払い出される
この機能はシグナリングや API を IPv6 有効にする機能ではありません。シグナリングや API は IPv6 非対応です。
```ini
ipv6 = false
```
## ipv6_address
**デフォルト**: 設定無し
この値を有効にしなくても ipv6 が true の場合は、自動で IPv6 アドレスを収集しますが、
固定された IPv6 アドレスがサーバーに割り当てられている場合は指定することを推奨しています。
IPv6 アドレスを指定してください。 `2001:0DB8::10` のように指定してください。
```ini
ipv6_address = 2001:0DB8::10
```
## ipv6_only
**デフォルト**: false
IPv6 アドレスのみを利用するようになります。この設定はシグナリングや API には影響しません。
```ini
ipv6_only = true
```
## devtools
**デフォルト**: false
Sora には機能をすぐに試してもらえるように開発ツールが含まれています。
開発ツールを有効にする場合は、 `true` を指定し、有効にしてください。
詳細は [開発者ツール](DEVTOOLS.html) をご確認ください。
```ini
devtools = true
```
## media_publish_worker_number
**デフォルト**: 1
音声や映像の 1 配信に利用する配信ワーカー数を指定してください。
```ini
media_publish_worker_number = 1
```
## auth_webhook_url
**デフォルト**: 指定なし
認証機能を有効にしたときに、問い合わせに行く HTTP URL を指定してください。その戻り値に含まれる値によって認証の可否を判定します。
```ini
auth_webhook_url = https://example.com/sora/webhook/auth
```
## auth_webhook_log
**デフォルト**: true
認証ウェブフックをすべてログファイルに出力します。詳細は [認証ウェブフックログ](AUTH_WEBHOOK.html#d4693f) をご確認ください。
```ini
auth_webhook_log = true
```
## session_webhook_url
**デフォルト**: 指定なし
セッションに関連するウェブフックリクエスト送信先の HTTP URL を指定してください。
```ini
session_webhook_url = https://example.com/sora/webhook/session
```
## session_webhook_worker_number
**デフォルト**: 5
**範囲**: 5..5000
セッションウェブフックのワーカー数を指定してください。
```ini
session_webhook_worker_number = 5
```
## session_created_timeout
**デフォルト**: 5 s
**範囲**: 0..300 s
セッションが存在しない状態で、新規接続が来た際にセッション生成に利用できる時間を指定してください。
この時間はセッションウェブフックにかかる時間も含まれます。
```ini
session_created_timeout = 5 s
```
## session_destroyed_timeout
**デフォルト**: 15 s
**範囲**: 0..300 s
セッションに同時接続数が 0 になった場合、セッション破棄する時間を指定してください。
```ini
session_destroyed_timeout = 15 s
```
## session_updated_webhook_interval
**デフォルト**: 1 min
**範囲**: 1..10 min
**単位**: min のみ
セッション更新時のセッションウェブフック `session.updated` の間隔を指定してください。
時間単位には 分 `min` のみ指定できます。
```ini
session_updated_webhook_interval = 1 min
```
## session_created_response_validate_warning_as_error
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: false
セッションウェブフック [session.created](SESSION_WEBHOOK.html#1d1984) の戻り値が正常でない場合にエラーとし、セッションを破棄するかどうかを指定してください。
> **注釈**
>
> この設定が false の場合、戻り値が正常でない場合は sora ログに警告が出力され、デフォルトの戻り値が設定されます。
> セッションも破棄されません。
```ini
session_created_response_validate_warning_as_error = true
```
## event_webhook_url
**デフォルト**: 指定なし
クライアントの接続や切断、録画ファイル生成の終了などのイベントを通知する HTTP URL を指定してください。
```ini
event_webhook_url = https://example.com/sora/webhook/event
```
## event_webhook_worker_number
**デフォルト**: 5
**範囲**: 5..5000
イベントウェブフックのワーカー数を指定してください。
イベントウェブフックのワーカー割り当てに利用する値は `channel_id` です。
```ini
event_webhook_worker_number = 5
```
## stats_webhook_url
**デフォルト**: 指定なし
統計情報を通知する HTTP URL を指定してください。
```ini
stats_webhook_url = https://example.com/sora/webhook/stats
```
## stats_webhook_log
**デフォルト**: false
統計ウェブフックのログをファイルに出力します。
```ini
stats_webhook_log = true
```
## stats_webhook_worker_number
**デフォルト**: 5
**範囲**: 5..5000
統計ウェブフックのワーカー数を指定してください。
統計ウェブフックのワーカー割り当てに利用する値は `channel_id` です。
```ini
stats_webhook_worker_number = 5
```
## webhook_ipv6
**デフォルト**: false
ウェブフックで IPv6 を利用するかどうかを指定してください。
この設定を `true` にしない限り、ウェブフックでは IPv4 が利用されます。
```ini
webhook_ipv6 = true
```
## webhook_connect_timeout
**デフォルト**: 30 s
**範囲**: 1..600 s
ウェブフックの接続確立までのタイムアウト時間を指定してください。
```ini
webhook_connect_timeout = 120 s
```
## webhook_response_timeout
**デフォルト**: 5 s
**範囲**: 1..600 s
ウェブフックのレスポンス受信までのタイムアウト時間を指定してください。
```ini
webhook_response_timeout = 5 s
```
## connection_updated_webhook_interval
**デフォルト**: 1 min
**範囲**: 1..10 min
**単位**: min のみ
接続更新時のイベントウェブフック `connection.updated` の間隔を指定してください。
時間単位には 分 `min` のみ指定できます。
```ini
connection_updated_webhook_interval = 1 min
```
## webhook_insecure
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: false
ウェブフックで HTTPS を利用する際に証明書のチェックを行わない場合はこの設定を有効にしてください。
```ini
webhook_insecure = true
```
## webhook_basic_authn
**デフォルト**: false
ウェブフックで HTTP ベーシック認証を利用するかどうかを指定してください。
```ini
webhook_basic_authn = true
```
## webhook_basic_authn_user_id
**デフォルト**: 指定なし
ウェブフックで HTTP ベーシック認証を利用する際のユーザー ID を指定してください。 `basic-authn-user-id` の用に文字列で指定してください。
```ini
webhook_basic_authn_user_id = basic-authn-user-id
```
## webhook_basic_authn_password
**デフォルト**: 指定なし
ウェブフックで HTTP ベーシック認証を利用する際のパスワードを指定してください。 `basic-authn-password` の用に文字列で指定してください。
```ini
webhook_basic_authn_password = basic-authn-password
```
## webhook_proxy_url
**指定しない場合はコメントアウトしたままにしてください**
**デフォルト**: 指定なし
ウェブフックで利用する HTTP Proxy の URL を指定してください。 `http://proxy.example.com:8080` の用に URL を指定してください。
```ini
webhook_proxy_url = http://proxy.example.com:8080
```
## webhook_proxy_auth_user
**指定しない場合はコメントアウトしたままにしてください**
**デフォルト**: 指定なし
ウェブフックで利用する HTTP Proxy の認証ユーザーを指定してください。 `proxy-auth-user` の用に文字列で指定してください。
```ini
webhook_proxy_auth_user = proxy-auth-user
```
## webhook_proxy_auth_password
**指定しない場合はコメントアウトしたままにしてください**
**デフォルト**: 指定なし
ウェブフックで利用する HTTP Proxy の認証パスワードを指定してください。 `proxy-auth-password` の用に文字列で指定してください。
```ini
webhook_proxy_auth_password = proxy-auth-password
```
## webhook_tls_fullchain_file
**指定しない場合はコメントアウトしたままにしてください**
**デフォルト**: 指定なし
ウェブフックリクエスト送信先との通信に HTTPS で mTLS を利用するための設定で、
中間証明書を含むクライアント証明書を PEM 形式で設定してください。
```ini
webhook_tls_fullchain_file = /path/to/fullchain.pem
```
## webhook_tls_privkey_file
**指定しない場合はコメントアウトしたままにしてください**
**デフォルト**: 指定なし
ウェブフックリクエスト送信先との通信に HTTPS で mTLS を利用するための設定で、
クライアント証明書の秘密鍵を PEM 形式で設定してください。
> **重要**
>
> 秘密鍵にはパスフレーズが設定されている場合エラーとなります
```ini
webhook_tls_privkey_file = /path/to/privkey.pem
```
## webhook_tls_verify_cacert_file
**指定しない場合はコメントアウトしたままにしてください**
**デフォルト**: 指定なし
ウェブフックリクエスト送信先との通信に HTTPS を利用した際、サーバー証明書のチェックを行う CA ファイルを PEM 形式で設定してください。
```ini
webhook_tls_verify_cacert_file = /path/to/server_cacert.pem
```
> **重要**
>
> この設定がない場合、 OS 組み込みのルート CA 証明書を利用してサーバー証明書をチェックします。
> OS 組み込みのルート CA 証明書については [ウェブフックリクエストなどの送信先サーバー証明書の検証に利用する OS 組み込みのルート CA 証明書について](WEBHOOK.html#e8a845) をご確認ください。
## ignore_connection_updated_webhook
**デフォルト**: false
イベントウェブフックの接続の更新時に `event_webhook_url` に指定された URL へ `connection.updated` を送るかどうかを指定してください。
デフォルトではリクエストの送信を行います。
この設定が `true` の場合でも、 `event_webhook.jsonl` には `connection.updated` のログが出力されます。
```ini
ignore_connection_updated_webhook = false
```
## ignore_connection_failed_webhook
**デフォルト**: true
接続が失敗時に `event_webhook_url` に指定された URL へ `connection.failed` リクエストを送るかどうかを指定してください。
デフォルトではリクエストの送信を行いません。
この設定が `true` の場合でも、 `event_webhook.jsonl` には `connection.failed` のログが出力されます。
ただし、 [legacy_signaling_error](SORA_CONF.html#88aa33) を `true` に設定した場合は、 `connection.failed` のログは出力されません。
```ini
ignore_connection_failed_webhook = false
```
## ignore_session_updated_webhook
**デフォルト**: false
セッションウェブフックのセッションの更新時に `session_webhook_url` に指定された URL へ `session.updated` を送るかどうかを指定してください。
デフォルトではリクエストの送信を行います。
この設定が `true` の場合でも、 `session_webhook.jsonl` には `session.updated` のログが出力されます。
```ini
ignore_session_updated_webhook = false
```
## ignore_session_vanished_webhook
**デフォルト**: true
モードが `block_new_session` または `block_new_connection` の際に、
`session_webhook_url` に指定された URL に `session.vanished` リクエストを送るかどうか指定してください。
デフォルトではリクエストの送信を行いません。
この設定が `true` の場合でも、 `session_webhook.jsonl` には `session.vanished` のログが出力されます。
```ini
ignore_session_vanished_webhook = false
```
## ignore_audio_streaming_webhook
**デフォルト**: true
音声ストリーミング機能で音声が送信された場合に、
`session_webhook_url` に登録された URL に
`audio_streaming.started` と `audio_streaming.stopped` リクエストを送るかどうかを指定してください。
デフォルトではリクエストの送信を行いません。
この設定が `true` の場合でも、 `session_webhook.jsonl` には `audio_streaming.started` と `audio_streaming.stopped` のログが出力されます。
```ini
ignore_audio_streaming_webhook = false
```
## ignore_audio_streaming_failed_webhook
**デフォルト**: true
音声ストリーミング機能利用時に、音声ストリーミング送り先から `"type": "error"` が送られてきたなどで、
正常に処理が行えなくなった場合に、 `event_webhook_url` に指定された URL に `audio_streaming.failed` リクエストを送るかどうかを指定してください。
この設定が `true` の場合でも、 `event_webhook.jsonl` には `audio_streaming.failed` のログが出力されます。
```ini
ignore_audio_streaming_failed_webhook = false
```
## ignore_spotlight_changed_webhook
**デフォルト**: true
スポットライト機能で発言者が切り替わった場合に、
`event_webhook_url` に登録された URL に `spotlight.focused` と `spotlight.unfocused` リクエストを送るかどうかを指定してください。
デフォルトではリクエストの送信を行いません。
この設定が `true` の場合でも、 `event_webhook.jsonl` には `spotlight.focused` と `spotlight.unfocused` のログが **出力されません** 。
```ini
ignore_spotlight_changed_webhook = true
```
## ignore_recording_started_webhook
**デフォルト**: false
録画機能で、録画を開始した場合に、
`event_webhook_url` または `session_webhook_url` に登録された URL に `recording.started` リクエストを送るかどうかを指定してください。
デフォルトではリクエストの送信を行います。
この設定が `true` の場合でも、 `event_webhook.jsonl` または `` session_webhook.jsonl``には ``recording.started `` のログが出力されます。
```ini
ignore_recording_started_webhook = true
```
## ignore_archive_started_webhook
**デフォルト**: false
録画機能で、コネクションのアーカイブを開始した場合に、
イベントウェブフック `event_webhook_url` に登録された URL に `archive.started` リクエストを送信するかどうかを指定してください。
デフォルトではリクエストの送信を行います。
この設定が `true` の場合でも、 `event_webhook.jsonl` には `archive.started` のログが出力されます。
```ini
ignore_archive_started_webhook = true
```
## ignore_split_archive_available_webhook
**デフォルト**: false
録画機能で、分割録画を含む場合に分割した録画ファイルが利用可能になった際、
イベントウェブフック `split-archive.available` リクエストを送信するかどうかを指定してください。
デフォルトではリクエストの送信を行います。
この設定が `true` の場合でも、 `event_webhook.jsonl` には `split-archive.available` のログが出力されます。
```ini
ignore_split_archive_available_webhook = true
```
## ignore_connection_rtc_webhook
**デフォルト**: false
クライアントから RTC 統計情報が送られてきた際、
統計ウェブフック `connection.rtc` リクエストを `stats_webhook_url` に登録された URL に送信するかどうか指定してください。
デフォルトではリクエストの送信を行います。
ログの出力は [stats_webhook_url](SORA_CONF.html#1f750f) をご確認ください。
```ini
ignore_connection_rtc_webhook = true
```
## archive_dir
**デフォルト**: archive
録画ファイルが保存されるディレクトリを指定してください。可能な限り **絶対パス** で指定してください。
```ini
archive_dir = /path/to/archive
```
> **注意**
>
> `archive_dir` と `archive_tmp_dir` は違うディレクトリを指定してください
## archive_tmp_dir
**デフォルト**: tmp/archive
録画に使用する一時ファイルを保存するディレクトリを指定してください。可能な限り **絶対パス** で指定してください。
> **重要**
>
> 録画が失敗した場合には、このディレクトリに保存されたファイルは自動的に削除されません。
> そのため録画失敗時には一時ファイルが残り続けます。
```ini
archive_tmp_dir = /path/to/tmp/archive
```
> **注意**
>
> `archive_dir` と `archive_tmp_dir` は違うディレクトリを指定してください
## default_recording_format
**デフォルト**: webm
録画ファイルのデフォルトのフォーマットを指定してください。 `webm` と `mp4` が指定できます。
```ini
default_recording_format = mp4
```
## default_recording_mp4_pli_interval
**デフォルト**: 20 s
**範囲**: 1..240 s
録画機能(セッション単位) 利用時に MP4 形式を利用した場合、クライアントへ送るキーフレーム要求 (PLI) の間隔を指定してください。
```ini
default_recording_mp4_pli_interval = 100 s
```
## recording_max_expire_time
**デフォルト**: 86400 s
**範囲**: 1..86400 s
録画時に指定する `expire_time` の最大値を指定してください。
```ini
recording_max_expire_time = 10 min
```
## recording_max_split_duration
**デフォルト**: 86400 s
**範囲**: 1..86400 s
録画で分割または一括&分割録画時に `split_duration` の最大値を指定してください。
```ini
recording_max_split_duration = 10 min
```
## recording_expire_time_required
**デフォルト**: false
> **重要**
>
> この設定は一括録画時に録画ファイルが大きくなりすぎるのを防ぐための設定です。
録画で一括または一括&分割録画時に `expire_time` の指定を必須にするかどうかを指定してください。
```ini
recording_expire_time_required = true
```
## recording_dual_output
**デフォルト**: true
録画で一括&分割録画を利用できるようにするかどうかを指定してください。
> **重要**
>
> この設定が false になっている際に一括&分割録画をしようとするとエラーになります
```ini
recording_dual_output = false
```
## signaling_port
**デフォルト**: 5000
シグナリングに使用するポート番号を指定してください。
```ini
signaling_port = 5000
```
## signaling_loopback_address_only
**デフォルト**: false
シグナリングへのアクセスをループバックアドレスからのみに制限します。可能な限り有効にしてください。
```ini
signaling_loopback_address_only = true
```
## signaling_normal_close_reason
**デフォルト**: true
正常切断時の `reason` に切断理由を含むかどうかを指定してください。 `false` を指定した場合は空文字 `""` が含まれるようになります。
```ini
signaling_normal_close_reason = false
```
## signaling_notify
**デフォルト**: true
シグナリング経由で接続や切断、更新の通知を受け取るかどうか指定してください。この設定はすべての設定に影響します。
個別の設定の場合は認証ウェブフックのレスポンス時で指定してください。
シグナリング経由での通知機能の詳細は [シグナリング通知機能](SIGNALING_NOTIFY.html) をご確認ください
認証の戻り値に関しては [認証ウェブフックの戻り値での指定](SIGNALING_NOTIFY.html#28d39f) を確認してください。
```ini
signaling_notify = true
```
## signaling_notify_session_id
**デフォルト**: true
シグナリング通知機能が有効な際、通知にセッション ID を含むかどうかを指定してください。
```ini
signaling_notify_session_id = true
```
## signaling_notify_client_id
**デフォルト**: true
シグナリング通知機能が有効な際、通知にクライアント ID を含むかどうかを指定してください。
```ini
signaling_notify_client_id = true
```
## signaling_notify_bundle_id
**デフォルト**: true
シグナリング通知機能が有効な際、通知にバンドル ID を含むかどうかを指定してください。
```ini
signaling_notify_bundle_id = true
```
## signaling_notify_connection_id
**デフォルト**: true
シグナリング通知機能が有効な際、通知にコネクション ID を含むかどうかを指定してください。
```ini
signaling_notify_connection_id = true
```
## signaling_notify_connection_created_timestamp
**デフォルト**: true
シグナリング通知機能が有効な際、`"event_type": "connection.created"` に `timestamp` を含むかどうかを指定してください。
```ini
signaling_notify_connection_created_timestamp = true
```
## signaling_notify_media
**デフォルト**: true
シグナリング通知機能が有効な際、通知に音声や映像が有効かどうかを含むかどうかを指定してください。
```ini
signaling_notify_media = true
```
## signaling_notify_metadata
**デフォルト**: true
シグナリング通知機能が有効な際、 `"type": "connect"` の `signaling_notify_metadata` で指定した値、
または認証ウェブフックの戻り値の `signaling_notify_metadata` で指定した値を通知するかどうかを指定してください。
```ini
signaling_notify_metadata = true
```
## signaling_notify_metadata_ext
**デフォルト**: false
シグナリング通知メタデータ拡張機能を有効にするかどうかを指定してください。
シグナリング通知機能が無効でも通知されないだけで API は利用できます。
詳細は [シグナリング通知メタデータ拡張機能](SIGNALING_NOTIFY_METADATA_EXT.html) をご確認ください。
```ini
signaling_notify_metadata_ext = true
```
## signaling_notify_authn_metadata_max_size
**デフォルト**: 64512
**範囲**: 0..1048576
> **注釈**
>
> この設定を 0 にすることでクライアントからシグナリング通知メタデータを指定できなくなります。
クライアントから接続時に送られてくるシグナリング通知メタデータの最大サイズをバイト単位で指定してください。
```ini
signaling_notify_authn_metadata_max_size = 64512
```
## signaling_notify_network
**デフォルト**: true
シグナリング通知機能が有効な際、ネットワークの状態を通知するかどうかを指定してください。
```ini
signaling_notify_network = true
```
## signaling_notify_rtp_stream
**デフォルト**: true
シグナリング通知機能が有効な際、 RTP ストリームの停止と再開の状態を通知するかどうかを指定してください。
```ini
signaling_notify_rtp_stream = true
```
## signaling_notify_recording
**デフォルト**: true
シグナリング通知機能が有効な際、 録画の開始と停止の状態を通知するかどうかを指定してください。
```ini
signaling_notify_recording = true
```
## signaling_notify_forwarding_filter
**デフォルト**: true
シグナリング通知機能が有効な際、 転送フィルターのブロック開始とブロック解除の通知をするかどうかを指定してください。
```ini
signaling_notify_forwarding_filter = true
```
## signaling_notify_audio_streaming_failed
**デフォルト**: false
シグナリング通知機能が有効な際、音声ストリーミングサーバーへの接続が失敗した際にチャネル参加者全員に通知をするかどうかを指定してください。
```ini
signaling_notify_audio_streaming_failed = true
```
## signaling_notify_ice_connection_state
**デフォルト**: false
シグナリング通知機能が有効な際、 ICE 接続の状態を自分を含む同一セッションに参加しているクライアント全員に通知するかどうかを指定してください。
```ini
signaling_notify_ice_connection_state = true
```
## signaling_vp9_params
**デフォルト**: false
シグナリングで VP9 のパラメーターを指定できるようにするかを指定してください。
```ini
signaling_vp9_params = true
```
## signaling_av1_params
**デフォルト**: false
シグナリングで AV1 のパラメーターを指定できるようにするかを指定してください。
```ini
signaling_av1_params = true
```
## signaling_h264_params
**デフォルト**: false
シグナリングで H.264 のパラメーターを指定できるようにするかを指定してください。
```ini
signaling_h264_params = true
```
## signaling_h265_params
**デフォルト**: false
シグナリングで H.265 のパラメーターを指定できるようにするかを指定してください。
```ini
signaling_h265_params = true
```
## signaling_bundle_id
**デフォルト**: false
シグナリングでバンドル ID を指定できるようにするかを指定してください。
```ini
signaling_bundle_id = true
```
## copy_websocket_signaling_header_names
**デフォルト**: 未指定
ウェブフックやログにコピーしたい WebSocket シグナリングの HTTP ヘッダー名を指定してください。
ヘッダー名は複数指定することができます。ヘッダー名はカンマ区切りで指定してください。
ウェブフックの場合は **HTTP ヘッダー** にコピーされます。ログの場合は **copy_headers** 項目にコピーされます。
```ini
copy_websocket_signaling_header_names = X-Forwarded-For, X-Real-IP, Tracestate
```
### ヘッダーがコピーされるウェブフック
- 認証ウェブフック
### copy_headers が出力されるログ
- `auth_webhook.jsonl`
- `auth_webhook_error.jsonl`
- `rtc_stats.jsonl`
- `connection.jsonl`
## websocket_signaling_ping_interval
**単位指定必須**
**デフォルト**: 5 s
**範囲**: 5..300 s
WebSocket 経由のシグナリングの場合に、サーバーからクライアントへネットワーク死活監視のために `"type": "ping"` を送信する間隔を指定してください。
> **重要**
>
> ここで指定する値は [websocket_signaling_pong_timeout](SORA_CONF.html#140464) より短くしてください。
```ini
websocket_signaling_ping_interval = 5 s
```
## websocket_signaling_pong_timeout
**単位指定必須**
**デフォルト**: 60 s
**範囲**: 60..600 s
WebSocket 経由のシグナリングの場合に、クライアントから返却される `"type": "pong"` のタイムアウト時間を指定してください。
この時間内に `"type": "pong"` が返却されない場合はサーバーから接続を切断します。
> **重要**
>
> ここで指定する値は [websocket_signaling_ping_interval](SORA_CONF.html#27aae2) より長くしてください。
```ini
websocket_signaling_pong_timeout = 60 s
```
## websocket_stats_timer_interval
**単位指定必須**
**デフォルト**: 60 s
**範囲**: 5..600 s
WebSocket 経由のシグナリングの場合に、サーバーからクライアントに統計情報の送信を要求する `"stats": true` を設定する間隔を指定してください。
```ini
websocket_stats_timer_interval = 60 s
```
## default_data_channel_signaling
**デフォルト**: false
シグナリング経路を WebSocket から DataChannel に切り替えるかどうかを指定してください。
```ini
default_data_channel_signaling = false
```
## data_channel_signaling_close_message
**デフォルト**: false
Sora から DataChannel シグナリングを切断する際に `"type": "close"` メッセージを送信するかどうかを指定してください。
```ini
data_channel_signaling_close_message = true
```
## default_ignore_disconnect_websocket
**デフォルト**: false
シグナリング経路を DataChannel に切り替えた際に WebSocket が切断されても接続の切断と判断しないかどうかを指定してください。
```ini
default_ignore_disconnect_websocket = false
```
## data_channel_messaging
**デフォルト**: false
DataChannel を使用したメッセージング機能を利用するかどうかを指定してください。
```ini
data_channel_messaging = false
```
## data_channel_messaging_only
**デフォルト**: false
DataChannel メッセージングの利用時に、音声と映像を `false` にした場合でも接続できるようにするかどうかを指定してください。
```ini
data_channel_messaging_only = false
```
## data_channel_stats_timer_interval
**単位指定必須**
**デフォルト**: 60 s
**範囲**: 5..600 s
シグナリング経路を DataChannel に切り替えた際にクライアントへの統計情報を要求する間隔を指定してください。
```ini
data_channel_stats_timer_interval = 60 s
```
## data_channel_stats_max_retransmits
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 指定なし
**範囲**: 0..8
シグナリング経路を DataChannel に切り替えた際にクライアントが統計情報を送信するときのメッセージの再送回数を指定してください。
```ini
data_channel_stats_max_retransmits = 1
```
## whip
**デフォルト**: false
OBS の WHIP 形式のシグナリングを有効にするかどうか指定してください。
```ini
whip = true
```
## whip_bearer_token_metadata_key
**デフォルト**: 指定なし
OBS の WHIP 形式のシグナリング時の Authentication ヘッダーに含まれるトークンを、メタデータとして送信する際のキーを指定してください。
```ini
whip_bearer_token_metadata_key = access_token
```
## whip_turn
> **重要**
>
> この設定は 2025 年 6 月リリース予定の Sora にてデフォルト true になり、 2025 年 12 月リリース予定の Sora にて廃止します。
**デフォルト**: false
OBS の WHIP/WebRTC で TURN 経由で配信するかどうかを指定してください。
```ini
whip_turn = true
```
## whep
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: false
OBS の WHEP 形式のシグナリングを有効にするかどうか指定してください。
```ini
whep = true
```
## whep_bearer_token_metadata_key
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 指定なし
OBS の WHEP 形式のシグナリング時の Authentication ヘッダーに含まれるトークンを、メタデータとして送信する際のキーを指定してください。
```ini
whep_bearer_token_metadata_key = access_token
```
## whep_turn
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: false
OBS の WHEP/WebRTC で TURN 経由で配信するかどうかを指定してください。
```ini
whep_turn = true
```
## api_port
**デフォルト**: 3000
API に使用するポート番号を指定してください。
```ini
api_port = 3000
```
## api_loopback_address_only
**デフォルト**: false
API へのアクセスをループバックアドレスからのみに制限します。可能な限り有効にしてください。
```ini
api_loopback_address_only = true
```
## api_cors_origin
**デフォルト**: 指定なし
API の戻りのヘッダーに CORS (Cross-Origin Resource Sharing) を含める際のドメインを指定してください。
http から始めて、パスの / は含まないでください。
```ini
api_cors_origin = http://127.0.0.1:5000
```
## turn
**デフォルト**: true
> **注意**
>
> この機能を false にする場合は事前にサポートまでご連絡ください
### 使用しない場合の設定
```ini
turn = false
```
## turn_realm
**デフォルト**: "sora-turn.example.com"
TURN 機能で使用するレルムを指定してください。
文字列であれば何でも良いのですが、会社のドメインなどを指定することをおすすめします。
```ini
turn_realm = sora-turn.example.com
```
## turn_fqdn
**デフォルト**: なし
TURN 機能の URL で使用する FQDN (最後の . なし) を指定してください。
指定した場合は TURN-UDP, TURN-TCP, TURN-TLS に共通で採用されます。
TURN-TLS の FQDN は `turn_tls_fqdn` 設定で上書きできます。
### ドメイン名が sora-turn.example.com の場合
```ini
turn_fqdn = sora-turn.example.com
```
## turn_tls_fqdn
TURN 機能で TURN-TLS の URL で使用する FQDN (最後の . なし) を指定してください。
指定しない場合は `turn_fqdn` の値が採用されます。
どちらも設定されていない場合 TURN-TLS を利用することはできません。
### ドメイン名が sora.example.com の場合
```ini
turn_tls_fqdn = sora-turn.example.com
```
## turn_tcp
**デフォルト**: true
TURN 機能で TURN-TCP を使用するかどうかを指定してください。使用しない場合は false を指定してください。
### 使用しない場合の設定
```ini
turn_tcp = false
```
## turn_tcp_allocate_success_delay_time
**デフォルト**: 100 ms
**範囲**: 0..1 s
TURN 機能で TURN-TCP 時の Allocate-Success を返す時間を遅らせます。
```ini
turn_tcp_allocate_success_delay_time = 100 ms
```
## turn_tcp_listen_port
**デフォルト**: 3478
TURN 機能で TURN-TCP を有効にした際に使用するポート番号を指定してください。デフォルトでは 3478 番ポートが使用されます。
```ini
turn_tcp_listen_port = 3478
```
## turn_tcp_port
**デフォルト**: turn_tcp_listen_port の値を利用
TURN 機能で TURN-TCP URL 払い出し時のポート番号を指定してください。デフォルトでは turn_tcp_listen_port の値が利用されます。
```ini
turn_tcp_port = 3478
```
## turn_tcp_only
**デフォルト**: false
> **危険**
>
> この機能はあくまで検証時のみ有効にしてください
TURN-TCP を強制的に利用するようになります。この機能を有効にした場合 warning ログが出力されます。
### 検証する場合
```ini
turn_tcp_only = true
```
## turn_tls
**デフォルト**: false
TURN 機能で TURN-TLS の URL 払い出し機能を使用するかどうかを指定してください。使用しない場合は false を指定してください。
```ini
turn_tls = true
```
## turn_tls_port
**デフォルト**: 5349
TURN 機能で TURN-TLS の URL 払い出し機能を有効にした際に使用するポート番号を指定してください。デフォルトでは 5349 番ポートが使用されます。
```ini
turn_tls_port = 443
```
## turn_tls_only
**デフォルト**: false
> **危険**
>
> この機能はあくまで検証時のみ有効にしてください
TURN-TLS を強制的に利用するようになります。この機能を有効にした場合 warning ログが出力されます。
### 検証する場合
```ini
turn_tls_only = true
```
## rtx
> **注意**
>
> この設定を無効にする場合は事前にサポートまでご連絡ください
**デフォルト**: true
RTX を有効にするかどうかを指定してください。デフォルトでは true で有効になっています。
現時点では Chrome / Safari / Edge / Firefox が使用できます。 iOS / Android / Unity は libwebrtc の最新版を利用している場合は対応しています。
```ini
rtx = false
```
## ulpfec
> **注意**
>
> この設定を有効にする場合は事前にサポートまでご連絡ください
**デフォルト**: false
ULPFEC を有効にするかどうかを指定してください。デフォルトでは無効になっています。
現時点では Chrome と Safari が使用でき、 Firefox は対応しておりません。
iOS/Android は libwebrtc を使用した場合は対応しています。
```ini
ulpfec = false
```
## audio_red
> **注意**
>
> この設定を有効にする場合は事前にサポートまでご連絡ください
**デフォルト**: false
音声冗長化を有効にするかどうかを指定してください。デフォルトでは無効になっています。
現時点では Chrome M95 以降で使用できます。非対応ブラウザが混在していても利用できます。
```ini
audio_red = true
```
## generic_nack
> **注意**
>
> この設定を無効にする場合は事前にサポートまでご連絡ください
**デフォルト**: true
Generic NACK を有効にするかどうかを指定してください。一つのチャネルに対して、
視聴者がかなり多い場合などはこの設定を無効にすることで、サーバー側の負荷を抑えることができるようになります。
```ini
generic_nack = true
```
## default_audio_bit_rate
**設定しないことをおすすめします**
**単位**: k(キロ)bps
**範囲**: 6..510
**デフォルト**: 指定なし
音声が使用できるビットレートを指定してください。デフォルトの場合はブラウザ側の判断に依存します。
```ini
default_audio_bit_rate = 32
```
## default_video_bit_rate
**デフォルト**: 500
**単位**: k(キロ)bps
**範囲**: 1..50000
映像が使用できるビットレートを指定してください。デフォルトでは 500kbps です。この値を少なく指定すると解像度が不安定になります。
基本は 500 で余裕があるのであれば 800 などに設定することをお勧めします。
15000 より大きい値はまだ十分に検証ができていないため、現時点ではサポート外となります。ご了承ください。
```ini
default_video_bit_rate = 500
```
## default_vp9_param_profile_id
**デフォルト**: 0
**範囲**: 0..3
VP9 で利用するプロファイル ID のデフォルト値を指定してください。
```ini
default_vp9_param_profile_id = 0
```
## default_av1_param_profile
**デフォルト**: 0
**範囲**: 0..2
AV1 で利用するプロファイルのデフォルト値を指定してください。
```ini
default_av1_param_profile = 0
```
## default_h264_param_profile_level_id
**デフォルト**: 42e02a
H.264 で利用するプロファイルレベル ID のデフォルト値を文字列で指定してください。
```ini
default_h264_param_profile_level_id = 42e02a
```
## default_h265_param_level_id
> **重要**
>
> 2024 年 12 月 現在、このプロファイルを利用できる WebRTC クライアントが存在しません。
**デフォルト**: 93
**範囲**: 0..255
H.265 で利用するレベル ID のデフォルト値を数値で指定してください。
```ini
default_h265_param_level_id = 93
```
## default_simulcast_rid
**デフォルト**: r0
サイマルキャスト利用時に、視聴する rid を指定せずに接続した場合に採用される rid の値を指定してください。
デフォルトでは r0 になっています。
`r1` または `r2` にすることもできます。
```ini
default_simulcast_rid = r0
```
## simulcast_encodings_file
**デフォルト**: なし
サイマルキャストで利用するエンコーディングパラメーターのカスタマイズを JSON 形式のファイルで指定してください。
詳細は [映像のエンコーディングパラメーターのカスタマイズ](SIMULCAST.html#6c680e) をご確認ください。
```ini
simulcast_encodings_file = etc/simulcast_encodings.json
```
## simulcast_multicodec
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: false
サイマルキャストマルチコーデックを有効にするかどうかを指定してください。
```ini
simulcast_multicodec = true
```
## simulcast_codecs_file
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: なし
サイマルキャストマルチコーデックで利用するコーデックパラメーターのカスタマイズを JSON 形式のファイルで指定してください。
詳細は [サイマルキャストマルチコーデックのデフォルト値を変更する](SIMULCAST_MULTICODEC.html#48a6a7) をご確認ください。
```ini
simulcast_codecs_file = etc/simulcast_codecs.json
```
## default_forwarding_pli_interval
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**単位指定必須**
**デフォルト**: 10 s
**範囲**: 1..90 s
RTP 転送 API 利用時に、クライアントに対して PLI を送る間隔を指定してください。
```ini
default_forwarding_pli_interval = 10 s
```
録画機能併用時には、
`20 s` より大きな値を指定したとしても、録画機能の PLI 送信間隔 `20 s` が適用されます。
もし `default_forwarding_pli_interval` に `20 s` より小さな値を指定した場合は、
PLI 送信間隔には `default_forwarding_pli_interval` の値が適用されます。
録画機能の利用を継続し、RTP 転送機能を停止したタイミングで、
録画機能の PLI 送信間隔 `20 s` が適用されます。
## forwarding_simulcast
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**単位指定必須**
**デフォルト**: single
RTP 転送 API 利用時にサイマルキャストの転送オプションを指定してください。
- `single` は最も優先度の低いストリームのみを転送します
- `all` はすべてのストリームを転送します
```ini
forwarding_simulcast = all
```
## signaling_forwarding_filters
**デフォルト**: false
転送フィルターをシグナリング接続時に設定できるかどうかを指定してください。
```ini
signaling_forwarding_filters = true
```
## signaling_forwarding_filter
> **注意**
>
> この設定は 2025 年 12 月に廃止します。
> [signaling_forwarding_filters](SORA_CONF.html#bf0e30) を利用してください
**デフォルト**: false
転送フィルターをシグナリング接続時に設定できるかどうかを指定してください。
```ini
signaling_forwarding_filter = true
```
## audio_streaming_url
**デフォルト**: 指定なし
統計コレクターの URL を指定してください。
http を指定した場合は HTTP/2 (h2c) で送られます。 https の場合は HTTP/2 (h2) で送られます。
統計コレクターは HTTP/2 に対応している必要があります。
```ini
audio_streaming_url = http://192.0.2.10:48080/speech
```
```ini
audio_streaming_url = https://suzu.example.com/speech
```
## audio_streaming_header
**デフォルト**: false
音声ストリーミングヘッダーを有効にするかどうかを指定してください。
```ini
audio_streaming_header = true
```
## default_audio_streaming_result_push
**デフォルト**: true
音声ストリーミングゲートウェイからのレスポンスをシグナリングプッシュ通知で送ることをデフォルトで行うかを指定してください。
```ini
default_audio_streaming_result_push = true
```
## default_audio_streaming_language_code
**デフォルト**: 指定なし
音声ストリーミングゲートウェイ接続時に HTTP ヘッダー `sora-audio-streaming-language-code` にデフォルトで含める文字列を指定してください。
この設定がない場合、接続時に `audio_streaming_language_code` で文字列が指定されていない場合、
音声ストリーミングが有効になっても Sora は接続の音声ストリーミングを開始しません。
```ini
default_audio_streaming_language_code = ja-JP
```
## audio_streaming_max_retries
**デフォルト**: 0
音声ストリーミングゲートウェイへの接続が失敗した場合の最大リトライ回数を指定してください。
リトライが発生するのは、 この値と [audio_streaming_retry_interval](SORA_CONF.html#15f73d) が `0` 以外が指定されており、
音声ストリーミングゲートウェイへの接続確立が失敗、または音声ストリーミングゲートウェイが 5xx 系でエラーを返した場合です。
```ini
audio_streaming_max_retries = 3
```
## audio_streaming_retry_interval
**デフォルト**: 5 s
音声ストリーミングゲートウェイへの接続が失敗した場合のリトライ間隔を指定してください。
```ini
audio_streaming_retry_interval = 10 s
```
## audio_streaming_tls_fullchain_file
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 指定なし
音声ストリーミングゲートウェイとの通信に HTTPS で mTLS を利用するための設定で、
中間証明書を含むクライアント証明書を PEM 形式で設定してください。
```ini
audio_streaming_tls_fullchain_file = /path/to/fullchain.pem
```
## audio_streaming_tls_privkey_file
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 指定なし
音声ストリーミングゲートウェイとの通信に HTTPS で mTLS を利用するための設定で、
クライアント証明書の秘密鍵を PEM 形式で設定してください。
> **重要**
>
> 秘密鍵にはパスフレーズが設定されている場合エラーとなります
```ini
audio_streaming_tls_privkey_file = /path/to/privkey.pem
```
## audio_streaming_tls_verify_cacert_file
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 指定なし
音声ストリーミングゲートウェイとの通信に HTTPS を利用した際、サーバー証明書のチェックを行う CA ファイルを PEM 形式で設定してください。
```ini
audio_streaming_tls_verify_cacert_file = /path/to/server_cacert.pem
```
> **重要**
>
> この設定がない場合、 OS 組み込みのルート CA 証明書を利用してサーバー証明書をチェックします。
> OS 組み込みのルート CA 証明書については [ウェブフックリクエストなどの送信先サーバー証明書の検証に利用する OS 組み込みのルート CA 証明書について](WEBHOOK.html#e8a845) をご確認ください。
## recycle_media_section
**デフォルト**: true
SDP でアクティブではなくなったメディアセクション (m=) を再利用する機能を有効化するかどうかを指定してください。
```ini
recycle_media_section = false
```
## hide_origin_username
**デフォルト**: false
有効にした場合は SDP の Offer 時に送られる o= の username の部分を `shiguredo...SORA-` から `_` に変更します。
```ini
hide_origin_username = false
```
## connection_created_wait_timeout
**単位指定必須**
**デフォルト**: 30 s
**範囲**: 0..600 s
WebRTC SFU と WebRTC の接続が確立するまでの許容時間を指定してください。
基本的に WebRTC SFU との接続確立は数百ミリ秒で終わります。
ただし iOS などでカメラの使用などを許可するといった設定が入る場合を考慮しデフォルトは 30 秒としています。
```ini
connection_created_wait_timeout = 30 s
```
> **注釈**
>
> 値を 0 s にすることで、意図的に connection_created_wait_timeout のエラーを発生させることができます。
## default_spotlight_focus_rid
**デフォルト**: r1
**指定できる rid**: none / r0 / r1 / r2
スポットライト機能利用時に、フォーカスした際に利用する rid を指定してください。
none は映像自体を配信しません。
```ini
default_spotlight_focus_rid = r1
```
## default_spotlight_unfocus_rid
**デフォルト**: r0
**範囲**: none, r0, r1, r2
スポットライト機能利用時に、フォーカスなしで利用する rid を指定してください。
none は映像自体を配信しません。
```ini
default_spotlight_unfocus_rid = none
```
## default_spotlight_unfocus_audio
**デフォルト**: true
スポットライト機能利用時に、フォーカスなしでの音声配信を指定してください。
```ini
default_spotlight_unfocus_audio = false
```
## default_spotlight_unfocus_audio_rate_limit
**デフォルト**: 2
**範囲**: 0..5
スポットライト機能利用時に、フォーカスなしの音声転送の上限レートを指定してください。
単位は 1 音声ストリーム = 50 packets / s となります。
```ini
default_spotlight_unfocus_audio_rate_limit = 2
```
## default_spotlight_delayed_focus
**デフォルト**: true
スポットライト機能利用時に、遅延フォーカスの有無を指定してください。
遅延フォーカスは音声が有効になってもすぐにフォーカスせず、一定時間音声が有効な際に初めてフォーカスする仕組みです。
```ini
default_spotlight_delayed_focus = true
```
## default_spotlight_delayed_focus_interval
**デフォルト**: 2000 ms
**範囲**: 1..60000 ms
スポットライト機能利用時に、遅延フォーカスが有効な際に、どの程度遅延をさせるか指定してください。
```ini
default_spotlight_delayed_focus_interval = 2000 ms
```
## default_spotlight_auto_unfocus
**デフォルト**: true
スポットライト機能利用時の自動アンフォーカスの有無を指定してください。
```ini
default_spotlight_auto_unfocus = true
```
## default_spotlight_auto_unfocus_interval
**デフォルト**: 10 s
**範囲**: 1 ms 以上 30 s 以下
スポットライト機能の自動アンフォーカスの時間間隔を指定してください。
```ini
default_spotlight_auto_unfocus_interval = 10 s
```
## default_spotlight_focus_min_interval
**デフォルト**: 2000 ms
**範囲**: 0 ms 以上 60 s 以下
スポットライト機能でフォーカスしてからアンフォーカスされるまでの最低時間間隔を指定してください。
```ini
default_spotlight_focus_min_interval = 2000 ms
```
## default_spotlight_number
**デフォルト**: 1
**範囲**: 1..8
スポットライトで同時にフォーカスされるデフォルトの数を指定してください。
```ini
default_spotlight_number = 2
```
## spotlight_encodings_file
**デフォルト**: なし
スポットライトで利用するエンコーディングパラメーターのカスタマイズを JSON 形式のファイルで指定してください。
詳細は [スポットライト利用時の映像のエンコーディングパラメーターのカスタマイズ](SPOTLIGHT.html#bd05eb) をご確認ください。
```ini
spotlight_encodings_file = etc/spotlight_encodings.json
```
## multistream_auto_sharing_video_bit_rate
**デフォルト**: true
マルチストリームで配信者が利用する映像ビットレートを自動で共有する機能です。
映像のビットレートに 1000kbps を指定した場合 4 人の配信者がいる場合はそれぞれの配信者のビットレートは 250kbps になります。
```ini
multistream_auto_sharing_video_bit_rate = true
```
## default_rtc_stats
**デフォルト**: true
Sora から SDK やクライアントへ RTC 統計情報を要求するかどうかを指定してください。
SDK やクライアント側がシグナリングの `"type": "stats"` に対応している必要があります。
```ini
default_rtc_stats = true
```
## rtc_stats_log
**デフォルト**: false
SDK やクライアントから送られてきた RTC 統計情報をログとして保存するかどうかを指定してください。
デフォルトではログは保存されません。
> **警告**
>
> ログはかなりの量になるため、利用する際は注意してください
```ini
rtc_stats_log = true
```
## user_agent_stats
> **注意**
>
> この設定は 2025 年 6 月に廃止します。
> [default_rtc_stats](SORA_CONF.html#558c2b) を利用してください。
**デフォルト**: true
Sora から SDK やクライアントへ RTC 統計情報を要求するかどうかを指定してください。
SDK やクライアント側がシグナリングの `"type": "stats"` に対応している必要があります。
```ini
user_agent_stats = true
```
## ice_connection_state_disconnected_timeout
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 5 s
**範囲**: 1..300 s
ICE コネクションステートが `checking` から `disconnected` の状態に移行するまでの時間を指定してください。
```ini
ice_connection_state_disconnected_timeout = 5 s
```
## ice_connection_state_failed_timeout
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 10 s
**範囲**: 1..300 s
ICE コネクションステートが `disconnected` から `failed` の状態に移行するまでの時間を指定してください。
```ini
ice_connection_state_failed_timeout = 10 s
```
## skip_redact_sensitive_data
**デフォルト**: false
ログファイル中のセンシティブなデータを **"REDACTED"** という文字列に書き換えて出力する処理をスキップします。
```ini
skip_redact_sensitive_data = true
```
センシティブなデータを書き換える対象は以下のとおりです。
- `auth_webhook.jsonl` の `event_metadata` を **"REDACTED"** に書き換えます
- `session_webhook.jsonl` の `session_metadata` と `event_metadata` を **"REDACTED"** に書き換えます
- `event_webhook.jsonl` の `event_metadata` を **"REDACTED"** に書き換えます
## stats_collector_url
> **注意**
>
> この設定は 2025 年 6 月に廃止します。
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 指定なし
統計コレクターの URL を指定してください。
http を指定した場合は HTTP/2 (h2c) で送られます。 https の場合は HTTP/2 (h2) で送られます。
統計コレクターは HTTP/2 に対応している必要があります。
```ini
stats_collector_url = http://192.0.2.10:5890/collector
```
```ini
stats_collector_url = https://kohaku.example.com/collector
```
## default_stats_exporter
> **注意**
>
> この設定は 2025 年 6 月に廃止します。
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: true
[stats_collector_url](SORA_CONF.html#98b67f) に URL が指定されている場合に、
統計エクスポーターをデフォルトで有効にするかどうかを指定してください。
この設定を `false` にした場合に、統計エクスポーターを有効にするには、
認証成功時の払い出しで `"stats_exporter": true` を払い出す必要があります。
```ini
default_stats_exporter = true
```
## stats_exporter_number
> **注意**
>
> この設定は 2025 年 6 月に廃止します。
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 5
統計エクスポーターの数を指定してください。同時接続数が多くなった場合増やすことを検討してください。
```ini
stats_exporter_number = 10
```
## stats_exporter_tls_fullchain_file
> **注意**
>
> この設定は 2025 年 6 月に廃止します。
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 指定なし
統計コレクターサーバーとの通信に HTTPS で mTLS を利用するための設定で、
中間証明書を含むクライアント証明書を PEM 形式で設定してください。
```ini
stats_exporter_tls_fullchain_file = /path/to/fullchain.pem
```
## stats_exporter_tls_privkey_file
> **注意**
>
> この設定は 2025 年 6 月に廃止します。
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 指定なし
統計コレクターサーバーとの通信に HTTPS で mTLS を利用するための設定で、
クライアント証明書の秘密鍵を PEM 形式で設定してください。
> **重要**
>
> 秘密鍵にはパスフレーズが設定されている場合エラーとなります
```ini
stats_exporter_tls_privkey_file = /path/to/privkey.pem
```
## stats_exporter_tls_verify_cacert_file
> **注意**
>
> この設定は 2025 年 6 月に廃止します。
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 指定なし
統計コレクターサーバーとの通信に HTTPS を利用した際、サーバー証明書のチェックを行う CA ファイルを PEM 形式で設定してください。
```ini
stats_exporter_tls_verify_cacert_file = /path/to/server_cacert.pem
```
> **重要**
>
> この設定がない場合、 OS 組み込みのルート CA 証明書を利用してサーバー証明書をチェックします。
> OS 組み込みのルート CA 証明書については [ウェブフックリクエストなどの送信先サーバー証明書の検証に利用する OS 組み込みのルート CA 証明書について](WEBHOOK.html#e8a845) をご確認ください。
## node_name
**デフォルト**: 指定なし
クラスター機能で利用するノード名を指定してください。
ノード名の @ の前には、正規表現 `[0-9A-Za-z_\\-]+` にマッチする文字列を指定してください。
また @ の後ろには、サーバーのドメイン名(FQDN)や、IP アドレスを指定してください。
```ini
node_name = sora@192.0.2.10
```
## cluster
**デフォルト**: false
クラスター機能を利用するかどうかを指定してください。
```ini
cluster = true
```
## cluster_temporary_node
**デフォルト**: false
テンポラリーノードとして利用するかどうかを指定してください。
```ini
cluster_temporary_node = true
```
## cluster_relay
> **注意**
>
> この機能を利用するには [最大ノード数ライセンス](LICENSE.html#aee259) が必要です。
**デフォルト**: true
クラスターリレー機能を利用するかどうかを指定してください。
```ini
cluster_relay = true
```
## default_cluster_affinity
> **注意**
>
> この機能を利用するには [最大ノード数ライセンス](LICENSE.html#aee259) が必要です。
**デフォルト**: true
クラスターリレー機能利用時にアフィニティ機能を利用するかどうかのデフォルト値を指定してください。
```ini
default_cluster_affinity = true
```
## cluster_affinity_threshold
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 10
**範囲**: 1..10000
クラスターのリレー機能とアフィニティ機能が有効な場合、
別ノードにセッションを作成するノード単位の同一セッションに対する同時接続数の基準値を指定してください。
```ini
cluster_affinity_threshold = 50
```
## external_signaling_url
**デフォルト**: 指定なし
ノードに対するシグナリング URL を指定してください。クラスター機能のリダイレクト時に用います。
```ini
external_signaling_url = ws://127.0.0.1:5000/signaling
```
## external_api_url
**デフォルト**: 指定なし
ノードに対する Sora API の URL を指定してください。クラスター機能のリダイレクト時に用います。
```ini
external_api_url = http://127.0.0.1:3000/
```
## cluster_listen_min_port
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 49010
`sora.conf` にクラスター利用時のノード間通信に使用するポート番号範囲の最小値を指定してください。
```ini
cluster_listen_min_port = 49010
```
## cluster_listen_max_port
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 49020
`sora.conf` にクラスター利用時のノード間通信に使用するポート番号範囲の最大値を指定してください。
```ini
cluster_listen_max_port = 49020
```
## data_dir
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: data
Sora 内部で利用する情報を書き出すディレクトリを指定してください。可能な限り **絶対パス** で指定してください。
```ini
data_dir = /path/to/data
```
## av1
**デフォルト**: true
AV1 が利用できるようになります。
```ini
av1 = true
```
## h265
**デフォルト**: true
H.265 が利用できるようになります。
```ini
h265 = true
```
## h264_b_frame
> **重要**
>
> 2024 年 12 月 時点で Sora SDK では B-frame を利用する事はできません。
**デフォルト**: false
H.264 で B-frame が利用できるようになります。
```ini
h264_b_frame = true
```
## h265_b_frame
> **重要**
>
> 2024 年 12 月 時点で Sora SDK では B-frame を利用する事はできません。
**デフォルト**: false
H.265 で B-frame が利用できるようになります。
```ini
h265_b_frame = true
```
## legacy_recording
**デフォルト**: false
> **危険**
>
> この設定は 2025 年 12 月リリースの Sora にて廃止します
レガシー録画を利用するかどうかを指定してください。 `false` にすることでレガシー録画の API が利用できなくなります。
```ini
legacy_recording = false
```
### `legacy_recording` を `false` にする際の注意点
クラスター機能利用時にレガシー録画の録画予約が存在する状態で、
`legacy_recording` を `false` にした場合でも、レガシー録画の録画予約は停止されません。
そのため、 `legacy_recording` を `false` にする際は、レガシー録画の録画予約を全て停止してください。
## legacy_signaling_error
**デフォルト**: false
> **危険**
>
> この設定は 2025 年 6 月リリースの Sora にて廃止します
Sora 2024.1.x までのシグナリングエラーログの出力方式を維持する設定です。
- `false` の場合は `log/connection_created_wait_timeout` にログが出力されなくなりました
- `false` の場合は `log/signaling_error.jsonl` にシグナリングエラーログが出力されるようになりました
- `false` の場合は `connection.failed` ウェブフックは 認証成功時 かつ `connection.created` が送信されていない場合のみ送信されるようになりました
- `false` の場合は `sora.jsonl` に認証失敗ログが出力されなくなりました
- `false` の場合は `sora.jsonl` にシグナリング失敗ログが出力されなくなりました
```ini
legacy_signaling_error = true
```
## legacy_stream
**デフォルト**: false
> **危険**
>
> この設定は 2025 年 6 月リリースの Sora にて廃止します
レガシーストリームを利用するかどうかを指定してください。 `true` にすることでレガシーストリームが利用できるようになります。
```ini
legacy_stream = true
```
## rtp_hdrext_video_orientation
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: false
RTP ヘッダー拡張 `urn:3gpp:video-orientation` を利用するかどうかを指定してください。
```ini
rtp_hdrext_video_orientation = true
```
## rtp_hdrext_video_content_type
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: false
RTP ヘッダー拡張 [http://www.webrtc.org/experiments/rtp-hdrext/video-content-type](https://webrtc.googlesource.com/src/+/refs/heads/main/docs/native-code/rtp-hdrext/video-content-type) を利用するかどうかを指定してください。
```ini
rtp_hdrext_video_content_type = true
```
## rtp_hdrext_video_timing
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: false
RTP ヘッダー拡張 [http://www.webrtc.org/experiments/rtp-hdrext/video-timing](https://webrtc.googlesource.com/src/+/refs/heads/main/docs/native-code/rtp-hdrext/video-timing) を利用するかどうかを指定してください。
```ini
rtp_hdrext_video_timing = true
```
## rtp_hdrext_playout_delay
**デフォルト**: true
RTP ヘッダー拡張 [http://www.webrtc.org/experiments/rtp-hdrext/playout-delay](https://webrtc.googlesource.com/src/+/refs/heads/main/docs/native-code/rtp-hdrext/playout-delay) を利用するかどうかを指定してください。
```ini
rtp_hdrext_playout_delay = false
```
## default_playout_delay_min_delay
**デフォルト**: 未指定
**単位**: ms のみ
**範囲**: 0..40950
プレイアウト遅延機能を利用する際の最小値(ミリ秒)を指定してください。
```ini
default_playout_delay_min_delay = 0 ms
default_playout_delay_max_delay = 100 ms
```
## default_playout_delay_max_delay
**デフォルト**: 未指定
**単位**: ms のみ
**範囲**: 0..40950
プレイアウト遅延機能を利用する際の最大値(ミリ秒)を指定してください。
```ini
default_playout_delay_min_delay = 0 ms
default_playout_delay_max_delay = 100 ms
```
## rtp_hdrext_color_space
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: false
RTP ヘッダー拡張 [http://www.webrtc.org/experiments/rtp-hdrext/color-space](https://webrtc.googlesource.com/src/+/refs/heads/main/docs/native-code/rtp-hdrext/color-space) を利用するかどうかを指定してください。
```ini
rtp_hdrext_color_space = true
```
## rtp_hdrext_sdes_mid
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: false
RTP ヘッダー拡張 [urn:ietf:params:rtp-hdrext:sdes:mid](https://www.rfc-editor.org/rfc/rfc9143.html) を利用するかどうかを指定してください。
```ini
rtp_hdrext_sdes_mid = true
```
## rtp_hdrext_abs_capture_time
**デフォルト**: false
RTP ヘッダー拡張 [http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time](https://webrtc.googlesource.com/src/+/refs/heads/main/docs/native-code/rtp-hdrext/abs-capture-time) を利用するかどうかを指定してください。
```ini
rtp_hdrext_abs_capture_time = true
```
## rtp_hdrext_dependency_descriptor_vp9
> **警告**
>
> この設定を `true` にした場合、 Firefox で VP9 が利用できなくなります。
**デフォルト**: false
RTP ヘッダー拡張 [https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension](https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension) を VP9 で利用するかどうかを指定してください。
```ini
rtp_hdrext_dependency_descriptor_vp9 = true
```
## rtp_packet_loss_simulator_incoming
> **危険**
>
> この機能はあくまで検証時のみ有効にしてください
**デフォルト**: 0
**範囲**: 0..100
Sora が受信する RTP パケットを指定したパーセント分ドロップさせます。
値を 0 より大きくした場合、クライアントが接続するたびに warning が発生します。
### Sora が受信する RTP パケットを 10 % パケロスさせる場合
```ini
rtp_packet_loss_simulator_incoming = 10
```
## rtp_packet_loss_simulator_outgoing
> **危険**
>
> この機能はあくまで検証時のみ有効にしてください
**デフォルト**: 0
**範囲**: 0..100
Sora が送信する RTP パケットを指定したパーセント分ドロップさせます。
値を 0 より大きくした場合、クライアントが接続するたびに warning が発生します。
### Sora が送信する RTP パケットを 10 % パケロスさせる場合
```ini
rtp_packet_loss_simulator_outgoing = 10
```
## data_channel_packet_loss_simulator_incoming
> **危険**
>
> この機能はあくまで検証時のみ有効にしてください
**デフォルト**: 0
**範囲**: 0..100
Sora が受信する DataChannel パケットを指定したパーセント分ドロップさせます。
値を 0 より大きくした場合、クライアントが接続するたびに warning が発生します。
### Sora が受信する DataChannel パケットを 10 % パケロスさせる場合
```ini
data_channel_packet_loss_simulator_incoming = 10
```
## data_channel_packet_loss_simulator_outgoing
> **危険**
>
> この機能はあくまで検証時のみ有効にしてください
**デフォルト**: 0
**範囲**: 0..100
Sora が送信する DataChannel パケットを指定したパーセント分ドロップさせます。
値を 0 より大きくした場合、クライアントが接続するたびに warning が発生します。
### Sora が送信する DataChannel パケットを 10 % パケロスさせる場合
```ini
data_channel_packet_loss_simulator_outgoing = 10
```
## ignore_turn_five_tuple
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: false
TURN 利用時に送られてくるパケットの 5-TUPLE を無視するかどうかを指定してください。
```ini
ignore_turn_five_tuple = true
```
## opus_param_channels
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 2
**範囲**: 1..8
## opus_param_maxplaybackrate
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 48000
**範囲**: 8000..48000
## opus_param_stereo
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: true
## opus_param_sprop_stereo
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: true
## opus_param_ptime
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 20
**範囲**: 3..120
## opus_param_minptime
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: 10
**範囲**: 3..120
## opus_param_useinbandfec
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: true
## opus_param_usedtx
> **注意**
>
> この設定を利用する場合は事前にサポートまでご連絡ください
**デフォルト**: false
# systemd
`bin/sora foreground` はデーモン化せずに Sora を起動するコマンドです。
## 設定
### ユニットファイル
`/etc/systemd/system/` に `sora.service` のユニットファイルを作成します。
ユニットファイルの例:
```
[Unit]
Description=WebRTC SFU Sora Service
After=network.target
[Service]
Environment="HOME=/home/shiguredo"
ExecStart=/home/shiguredo/sora/bin/sora foreground
Type=simple
Restart=always
RestartSec=60s
User=shiguredo
KillMode=process
[Install]
WantedBy=multi-user.target
```
`[Service]` セクションの `Environment`、 `User` はそれぞれ、実際に Sora サービスを開始するユーザーの `$HOME`、 `$USER` に置き換えてください。
また、 `ExecStart` は Sora のインストール先による実行コマンドのパスに置き換えてください。
### Sora サービスの有効化と開始
sora.service の有効化:
```
$ sudo systemctl enable sora.service
```
sora.service の開始:
```
$ sudo systemctl start sora.service
```
### Sora サービスの停止
sora.service の停止:
```
$ sudo systemctl stop sora.service
```
# Linux カーネルチューニング
Sora は UDP に対して大きな負荷がかかるシステムです。そのためカーネルをチューニングする必要があります。
## 確認方法
netstat コマンドで Errors が出ていた場合はバッファが足りない可能性が高いです。
```console
$ netstat -su
```
## Ubuntu
### sysctl
sysctl にて、以下の値を設定することを推奨します。
このあたりの値はサーバースペックによりますので、こちらは推奨値となります。
```
sudo sysctl -w net.core.rmem_default=33554432
sudo sysctl -w net.core.rmem_max=33554432
sudo sysctl -w net.core.wmem_default=33554432
sudo sysctl -w net.core.wmem_max=33554432
sudo sysctl -w net.core.somaxconn=65535
sudo sysctl -w net.core.optmem_max=25165824
sudo sysctl -w net.core.netdev_max_backlog=65536
sudo sysctl -w net.ipv4.tcp_mem='786432 1048576 26777216'
sudo sysctl -w net.ipv4.tcp_rmem='8192 87380 33554432'
sudo sysctl -w net.ipv4.tcp_wmem='8192 65536 33554432'
sudo sysctl -w net.ipv4.udp_mem='65536 131072 262144'
sudo sysctl -w net.ipv4.udp_rmem_min=16384
sudo sysctl -w net.ipv4.udp_wmem_min=16384
```
# IPv6 での動作について
## 概要
Sora は WebRTC とウェブフックが IPv6 での動作に対応しています。ただし、ブラウザ側やサーバー側が非対応な場合があります。
特に、IPv6 での TURN 機能にクライアントが対応していない場合は接続できないことがあります。
## お問い合わせの際の情報について
IPv6 環境は様々な組み合わせがあるため、問題を解析するには多くの情報が必要になります。
お問い合わせの際は以下の情報をお送りください。
- クライアント側の IPv6 の有無について
- Sora 側の IPv6 の設定の有無について
- Sora が動作しているサーバーの A または AAAA レコードの有無について
- クライアントが IPv4 または IPv6 または IPv4 と IPv6 どの環境かについて
他にも何か気づいた点などがありましたらそちらも合わせてお問い合わせください。
## IPv6 のみ
Sora の WebRTC を IPv6 のみの通信のみでの動作させます。
`sora.conf` にて [ipv6_only](SORA_CONF.html#5e9e68) を `true` にすることで、
WebRTC の接続を IPv6 のみに制限することができます。
シグナリングや API 部分を IPv6 のみにしたい場合は Nginx 側の設定を変更してください。
## ウェブフックの IPv6 対応
Sora のウェブフックは IPv6 での動作に対応しています。
`sora.conf` にて [webhook_ipv6](SORA_CONF.html#6c895b) を `true` にすることで、
ウェブフックの接続で IPv6 を利用する事ができます。
# メタデータ
## 概要
Sora では様々なメタデータを扱っているため、それぞれのメタデータの説明をしています。
## 接続時の認証メタデータ指定
クライアントが Sora へ接続する際に、認証に利用する `metadata` を指定できます。
これは認証ウェブフックに `metadata` として含まれます。
```javascript
{
"type": "connect",
"role": "sendrecv",
"channel_id": "sora",
"metadata": {"spam": "egg"}
}
```
この値はクライアントと Sora だけで共有される値です。他のクライアントには一切共有されません。
## 認証ウェブフック成功時のメタデータ払い出し
認証ウェブフック成功時に `metadata` を払い出すことができます。
この値は Sora が `"type": "offer"` をクライアントへ送る際に `metadata` として送られます。
```javascript
{
"allowed": true,
"metadata": {"spam": "egg"}
}
```
```javascript
{
"type": "offer",
"sdp": "...",
"metadata": {"spam": "egg"}
}
```
この値は Sora とクライアントだけで共有される値です。他のクライアントには一切共有されません。
## 認証ウェブフック成功時のイベントメタデータ払い出し
認証ウェブフック成功時に `event_metadata` を払い出すことができます。
この値は Sora がイベントウェブフックリクエストを送信する際に `event_metadata` として含まれます。
```javascript
{
"allowed": true,
"event_metadata": {"spam": "egg"}
}
```
```javascript
{
"type": "connection.created",
"event_metadata": {"spam": "egg"}
}
```
この値は Sora と認証ウェブフックとイベントウェブフック先のサーバーとのみで共有されます。
クライアントには通知されません。
## 接続時のシグナリング通知メタデータ指定
シグナリング接続時の `"type": "connect"` で `signaling_notify_metadata` が指定できます。
ここで指定した値は同じチャネルに参加しているクライアントと新しく参加するクライアントに通知されます。
```javascript
{
"type": "connect",
"signaling_notify_metadata": {"spam": "egg"}
}
```
```javascript
{
"type": "connection.created",
"authn_metadata": {"spam": "egg"}
"metadata": {"spam": "egg"}
}
```
### シグナリング通知メタデータ拡張が有効な場合
シグナリング通知メタデータ拡張有効になっている場合は以下のように `authn_metadata` のみに値が含まれます。
```javascript
{
"type": "connection.created",
"authn_metadata": {"spam": "egg"}
"metadata": {}
}
```
もしこのシグナリング通知メタデータを接続時にしていさせたくない場合、
[signaling_notify_authn_metadata_max_size](SORA_CONF.html#a8c147) を `0` に設定してください。
## 認証ウェブフック成功時のシグナリング通知メタデータ払い出し
認証ウェブフック成功時に `signaling_notify_metadata` を払い出すことができます。
この値は同じチャネルに参加しているクライアントと新しく参加するクライアントに通知されます。
もし接続時に `signaling_notify_metadata` が指定されていた場合は、
認証成功時のシグナリング通知メタデータ払い出しで **上書き** されます。
```javascript
{
"allowed": true,
"signaling_notify_metadata": {"spam": "egg"}
}
```
```javascript
{
"type": "connection.created",
"authz_metadata": {"spam": "egg"}
"metadata": {"spam": "egg"}
}
```
### シグナリング通知メタデータ拡張が有効な場合
シグナリング通知メタデータ拡張が有効になっている場合は以下のように `authz_metadata` のみに値が含まれます。
```javascript
{
"type": "connection.created",
"authz_metadata": {"spam": "egg"}
"metadata": {}
}
```
## シグナリング通知メタデータ拡張
**[シグナリング通知メタデータ拡張](SIGNALING_NOTIFY_METADATA_EXT.html) を利用すると接続ごとに状態を持てるようになり、**
: API でそのメタデータを変更し、通知することができるようになります。
本来、シグナリング通知メタデータは接続時か認証成功払い出し時にしか指定できず一度指定したら変更できません。
シグナリング通知メタデータ拡張を利用した場合は HTTP API を利用して途中でメタデータの値を変更できます。
この機能を有効にするとシグナリング時の通知メタデータに指定した値は `metadata` に含まれなくなります。
## セッション生成時のセッションメタデータ払い出し
セッション生成時に送信される [session.created](SESSION_WEBHOOK.html#1d1984) の戻り値に指定することで `session_metadata` を払い出すことができます。
この値は一定間隔で送られる [session.updated](SESSION_WEBHOOK.html#2a5b1b) と、
このセッションが破棄された時に送られる [session.destroyed](SESSION_WEBHOOK.html#ccb165) に含まれます。
```javascript
{
"session_metadata": ""
}
```
## 一括録画ファイルメタデータ archive-.json
録画機能で一括録画を指定した際に `archive//` 以下に生成されるファイルです。
かならず `archive-.webm` ファイルとペアになります。
## 分割録画ファイルメタデータ split-archive-_.json
録画機能で分割録画を指定した際に `archive//` 以下に生成されるファイルです。
かならず `split-archive-_.webm` ファイルとペアになります。
## 録画(セッション単位) の StartRecording API で指定するメタデータ
[StartRecording](API_RECORDING.html#c5b527) API では `metadata` を指定できます。
この値は以下のセッションウェブフックに `recording_metadata` として含まれます。
- [recording.started](SESSION_WEBHOOK.html#9b5c58)
- [recording.report](SESSION_WEBHOOK.html#920a02)
- [session.updated](SESSION_WEBHOOK.html#2a5b1b)
また、 `report-.json` ファイルにも記録されます。
## 録画(セッション単位) のセッションウェブフック `session.created` で指定するメタデータ
録画(セッション単位) ではセッションウェブフック `session.created` の戻り値として、
`recording_metadata` を払い出すことができます。
```
{
"recording": true,
"recording_metadata": ""
}
```
この値は以下のセッションウェブフックに `recording_metadata` として含まれます。
- [recording.started](SESSION_WEBHOOK.html#9b5c58)
- [recording.report](SESSION_WEBHOOK.html#920a02)
- [session.updated](SESSION_WEBHOOK.html#2a5b1b)
また、 `report-.json` ファイルにも記録されます。
## レガシー録画の StartRecording API で指定するメタデータ
[StartRecording](DEPRECATED_API_LEGACY_RECORDING.html#c5b527) API では `metadata` を指定できます。
この値は、以下のイベントウェブフックに `metadata` として含まれます。
- [recording.started](EVENT_WEBHOOK.html#9b5c58)
- [recording.report](EVENT_WEBHOOK.html#920a02)
また、 `report-.json` ファイルにも記録されます。
# センシティブデータ
## 概要
Sora ではログと API で出力されるセンシティブデータを **"REDACTED"** という文字列に書き換えます。
## 対象ログと項目
Sora のログは以下の内容のセンシティブデータを **"REDACTED"** に書き換えて出力します。
- `auth_webhook.jsonl` の `event_metadata` を **"REDACTED"** に書き換えて出力します。
- `session_webhook.jsonl` の `session_metadata` と `event_metadata` を **"REDACTED"** に書き換えて出力します。
- `event_webhook.jsonl` の `event_metadata` を **"REDACTED"** に書き換えて出力します。
### event_webhook_error ログ
> **重要**
>
> `event_webhook_error.jsonl` の `event_metadata` については **"REDACTED"** の書き換えは行いません
### session_webhook_error ログ
> **重要**
>
> `session_webhook_error.jsonl` の `session_metadata` と `event_metadata` については **"REDACTED"** の書き換えは行いません
## 書き換えをスキップする
> **重要**
>
> この書き換えを無効にすることは推奨していません。
センシティブなデータを利用している場合は、 **"REDACTED"** への書き換えをスキップする設定を提供しています。
`sora.conf` の [skip_redact_sensitive_data](SORA_CONF.html#00d209) を `true` にすることでセンシティブなデータの **"REDACTED"** への書き換えをスキップします。
## 録画メタデータの扱いについて
StartRecording API やセッションウェブフックの戻り値で指定できる録画メタデータについてはセンシティブなデータとして扱っていません。
これは録画ファイル出力時の録画メタデータファイルに含まれ、映像合成時に利用する事を想定しているためです。
# アプリケーション連携チュートリアル
> **重要**
>
> このドキュメントについては Sora サポートの対象外です。
このドキュメントは Sora のウェブフックと API を利用したアプリケーションサーバー開発者向けです。
## 概要
Sora はウェブフックと API を利用して、アプリケーションサーバーと連携することができます。
### ウェブフック
ウェブフックは認証と払い出し、そしてコネクションやセッション、録画などの状況の取得です。
Sora から一定間隔で送られてくるウェブフックを利用する事で定期的な状態を取得することができます。
どのコネクションが何分繫いでいたかの把握や、そのセッションは何分で終了させるといったことも実現できます。
ウェブフックは Sora からアプリケーションサーバーへ `HTTP/1.1` でリクエストで送信します。
### API
ウェブフックはコネクションの切断、セッションの破棄、統計情報の取得などアプリケーションサーバーが必要とするタイミングで送信することができます。
API はアプリケーションサーバーから Sora へ `HTTP/1.1` でリクエストを送信する必要があります。
## JSON
Sora がアプリケーションに送信するウェブフックの JSON は `snake_case` を採用しています。
`camelCase` ではないことに注意してください。
`snake_case` の JSON はシグナリング、ウェブフック、 API で利用します。
## ウェブフックのローカル開発
Sora をサーバーに立て、ウェブフックの送信先をローカルにしたい場合には [ngrok](https://ngrok.com/) がお勧めです。
### ngrok の利用方法
**URL**:
ngrok は無料プランでも、静的ドメインを一つ利用する事ができるため、
この静的ドメインを Sora 側に指定することにより、ローカルのウェブフックを利用することができます。
ngrok は Windows / Linux / macOS で利用可能です。
また ngrok が HTTPS を終端し、HTTP でアプリケーションサーバーにリクエストを送信するため、
アプリケーションサーバー側を HTTPS にする必要はありません。
### シーケンス図
ngrok を利用した場合のシーケンス図です。
`--domain` には example ではなく ngrok のダッシュボードに表示されているドメインを指定してください。
```mermaid
sequenceDiagram
participant C as クライアント
participant S as Sora
participant NS as Ngrok Server
https://example.ngrok-free.app
box ローカル環境
participant NC as Ngrok Client
$ ngrok http --domain=example.ngrok-free.app 8080
participant A as ローカルアプリケーション
http://localhost:8080
end
C ->>+ S: "type": "connect"
S ->>+ NS: 認証ウェブフック
NS ->>+ NC: 認証ウェブフック
NC ->>+ A: 認証ウェブフック
A -->>- NC: 200 OK
"allowed": true
NC -->>- NS: 200 OK
"allowed": true
NS -->>- S: 200 OK
"allowed": true
S ->>- C: "type": "offer"
```
## サンプルコードについて
アプリケーションサーバーのサンプルコードを Python を利用しています。
あくまで例であり、実際のアプリケーションでの利用は想定しておりません。
現在は [OpenAI ChatGPT](https://openai.com/chatgpt/) や [GitHub Copilot](https://github.com/features/copilot/) を利用する事で、
他の言語への変換がとても簡単に行えるようになったこともあり、
サンプルコードに利用するプログラミング言語を Python に統一しています。
Python 3.12 以降で動作確認をしています。
## aiohttp
サンプルコードでは Python の非同期 HTTP ライブラリである `aiohttp` を利用しています。
`$ pip install aiohttp` でインストールして利用してください。
### Django 風
ウェブフックの処理を行うコードです。
このドキュメントではこちらの書き方を利用します。
```python
from aiohttp import web
async def auth_webhook(request: web.Request) -> web.Response:
return web.json_response({"allowed": True})
app = web.Application()
app.router.add_routes(
[
web.post("/auth", auth_webhook),
]
)
if __name__ == "__main__":
web.run_app(app, port=8000)
```
### Flask 風
デコレーターを利用して、ウェブフックの処理を行うコードです。
Django 風と Flask 風、どちらを利用するかは好みの問題ですので、
好きな方を利用してください。
```python
from aiohttp import web
routes = web.RouteTableDef()
@routes.post("/auth")
async def auth_webhook(request: web.Request) -> web.Response:
return web.json_response({"allowed": True})
app = web.Application()
app.router.add_routes(routes)
if __name__ == "__main__":
web.run_app(app, port=8000)
```
## ウェブフック HTTP 実装
ウェブフックを処理するコードです。
`sora.conf` の以下の設定に URL を指定してください。
- [auth_webhook_url](SORA_CONF.html#36a99a)
- [session_webhook_url](SORA_CONF.html#76fa79)
- [event_webhook_url](SORA_CONF.html#e1a4d2)
例として ngrok を利用している URL を指定しています。
```ini
auth_webhook_url = https://example.ngrok-free.app/auth
session_webhook_url = https://example.ngrok-free.app/session
event_webhook_url = https://example.ngrok-free.app/event
```
認証が常に成功するようなコードになっています。
```python
from aiohttp import web
async def auth_webhook(request: web.Request) -> web.Response:
return web.json_response({"allowed": True})
async def session_webhook(request: web.Request) -> web.Response:
return web.Response(status=204)
async def event_webhook(request: web.Request) -> web.Response:
return web.Response(status=204)
app = web.Application()
app.router.add_routes(
[
web.post("/auth", auth_webhook),
web.post("/session", session_webhook),
web.post("/event", event_webhook),
]
)
if __name__ == "__main__":
web.run_app(app, port=8000)
```
## ウェブフック HTTPS 対応
Sora のウェブフックは HTTPS にも対応しています。
Sora の HTTPS はサーバ証明書のチェックをデフォルトで OS に組み込まれた証明書を利用して行います。
自前で用意した証明書などを利用したい場合は [webhook_tls_verify_cacert_file](SORA_CONF.html#7036dc) を利用してください。
詳細は [ウェブフックリクエストなどの送信先サーバー証明書の検証に利用する OS 組み込みのルート CA 証明書について](WEBHOOK.html#e8a845) をご確認ください。
```python
import ssl
from aiohttp import web
async def auth_webhook(request: web.Request) -> web.Response:
return web.json_response({"allowed": True})
async def session_webhook(request: web.Request) -> web.Response:
return web.Response(status=204)
async def event_webhook(request: web.Request) -> web.Response:
return web.Response(status=204)
app = web.Application()
app.router.add_routes(
[
web.post("/auth", auth_webhook),
web.post("/session", session_webhook),
web.post("/event", event_webhook),
]
)
# サーバー証明書
certfile: str = "192.0.2.1.pem"
# サーバー証明書のプライベートキー
keyfile: str = "192.0.2.1-key.pem"
if __name__ == "__main__":
# SSL コンテキストの作成
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_context.load_cert_chain(certfile, keyfile)
# HTTPS サーバーとして起動
web.run_app(app, port=4433, ssl_context=ssl_context)
```
## ウェブフック mTLS (mutual-TLS またはクライアント認証) 対応
Sora のウェブフックは mTLS にも対応しています。
その場合、アプリケーションサーバー側に、Sora に設定した証明書の CA 証明書を指定する必要があります。
```python
import ssl
from aiohttp import web
async def auth_webhook(request: web.Request) -> web.Response:
return web.json_response({"allowed": True})
async def session_webhook(request: web.Request) -> web.Response:
return web.Response(status=204)
async def event_webhook(request: web.Request) -> web.Response:
return web.Response(status=204)
app = web.Application()
app.router.add_routes(
[
web.post("/auth", auth_webhook),
web.post("/session", session_webhook),
web.post("/event", event_webhook),
]
)
# サーバー証明書
certfile: str = "192.0.2.1.pem"
# サーバー証明書のプライベートキー
keyfile: str = "192.0.2.1-key.pem"
# クライアント証明書のCA証明書
cafile: str = "ca.pem"
if __name__ == "__main__":
# SSL コンテキストの作成
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_context.load_cert_chain(certfile, keyfile)
ssl_context.load_verify_locations(cafile)
# クライアント証明書の検証を要求
ssl_context.verify_mode = ssl.CERT_REQUIRED
# HTTPS サーバーとして起動
web.run_app(app, port=4433, ssl_context=ssl_context)
```
## ウェブフック IPv6 対応
Sora は昨今の IPv4 事情を考慮して IPv6 にも対応しています。
`sora.conf` の `webhook_ipv6` を `true` にすることで、
IPv6 のみのウェブフックエンドポイントと通信をすることができます。
## 認証ウェブフック
Sora 自体は認証処理を持っていません。
そのため、アプリケーションサーバー側で認証の仕組みを開発する必要があります。
Sora は [auth_webhook_url](SORA_CONF.html#36a99a) に指定した URL にクライアントから送られてきた情報などを、
アプリケーションサーバに対して HTTP (または HTTPS) リクエストとして送信します。
### 認証メタデータ
認証ウェブフックにはクライアントが送ってくる `metadata` が含まれます。
これはクライアントが自由に値を含められる場所で、ここの値を使って認証を行うことを推奨しています。
```python
from aiohttp import web
async def auth_webhook(request: web.Request) -> web.Response:
data = await request.json()
# metadata がない場合は None が返る
metadata = data.get("metadata")
if not metadata:
# metadata がない場合は認証を許可しない
# 認証を拒否する場合は 'allowed': False と 'reason': '認証失敗理由' を返す
# この認証失敗理由はクライアントまで通知されるので注意すること
return web.json_response({"allowed": False, "reason": "metadata not found"})
# 認証を許可する JSON を返す
return web.json_response({"allowed": True})
```
### 認証メタデータに JWT
認証メタデータの中に `access_token` として JWT が入ってきた場合の処理です。
[PyJWT](https://github.com/jpadilla/pyjwt) を利用して、JWT をデコードして認証を行います。
```python
import os
import jwt
from aiohttp import web
async def auth_webhook(request: web.Request) -> web.Response:
data = await request.json()
metadata = data.get("metadata")
if not metadata:
return web.json_response({"allowed": False, "reason": "metadata not found"})
access_token = metadata.get("access_token")
if not access_token:
return web.json_response({"allowed": False, "reason": "access_token not found"})
# 環境変数からシークレットキーを取得
secret = os.environ.get("JWT_SECRET_KEY")
if not secret:
return web.json_response({"allowed": False, "reason": "secret key not found"})
try:
# PyJWT を利用して JWT をデコードし、署名を検証する
jwt.decode(access_token, secret, algorithms=["HS256"])
except jwt.InvalidTokenError:
# トークンが無効の場合は認証を拒否
return web.json_response({"allowed": False, "reason": "invalid token"})
# 認証を許可する JSON を返す
return web.json_response({"allowed": True})
```
### イベントメタデータ
認証ウェブフックで、認証成功時にイベントメタデータを払い出すことができます。
イベントメタデータはイベントウェブフックの `connection.{created, updated, destroyed}` に含まれます。
このイベントメタデータは Sora とアプリケーションサーバー間だけでやり取りされ、クライアントには送られません。
そのためデータベースの `Primary Key` などを入れておいたりすることができます。
```python
from aiohttp import web
async def auth_webhook(request: web.Request) -> web.Response:
# ここでデータベースなどの値を引っ張る
account_pk = 1
# イベントメタデータ
event_metadata = {
"account_pk": account_pk,
}
# 認証を許可する JSON を返す
return web.json_response({"allowed": True, "event_metadata": event_metadata})
return web.json_response({"allowed": True, "event_metadata": event_metadata})
```
イベントメタデータはウェブフックログには `REDACTED` として記録されます。
これはセンシティブデータを含んでいる可能性があるためです。
`REDACTED` については [センシティブデータ](SENSITIVE_DATA.html) をご確認ください。
```mermaid
sequenceDiagram
participant C as クライアント
participant S as Sora
participant A as アプリケーション
C ->>+ S: "type": "connect"
S ->>+ A: 認証ウェブフック
A -->>- S: 200 OK
"allowed": true
"event_metadata": {"account_pk": 1}
S ->>+ A: セッションウェブフック
session.created
A -->>- S: 200 OK
S ->>- C: "type": "offer"
note over C,S: WebRTC 確立
S ->>+ A: イベントウェブフック
connection.created
"event_metadata": {"account_pk": 1}
A -->>- S: 200 OK
S ->>+ A: イベントウェブフック
connection.updated
"event_metadata": {"account_pk": 1}
A -->>- S: 200 OK
note over S,A: connection.updated は一定間隔で送信
C -) S: "type": "disconnect"
S -) C: "Close"
note over C,S: WebRTC 切断
S ->>+ A: イベントウェブフック
connection.destroyed
"event_metadata": {"account_pk": 1}
A -->>- S: 200 OK
```
## セッションウェブフック
セッションウェブフックはセッション単位の変化を通知するためのウェブフックです。
Sora は `session_webhook_url` に指定した URL にセッションの変化を HTTP リクエストとして送信します。
### セッション
セッションはチャネルで少なくとも 1 つのクライアントが接続しているチャネルの状態を指します。
### セッションメタデータ
```python
from aiohttp import web
async def session_webhook(request: web.Request) -> web.Response:
# ここでデータベースなどの値を引っ張る
room_pk = 2
return web.json_response({"session_metadata": {"room_pk": room_pk}})
```
### セッション録画開始
セッションウェブフックの `session.created` の戻り値に `recording: true` を含める事で、
そのセッションが開始したタイミングから録画を開始することができます。
```python
from aiohttp import web
async def session_webhook(request: web.Request) -> web.Response:
# このセッションで録画を有効にする
return web.json_response({"recording": True})
```
## イベントウェブフック
イベントウェブフックはコネクション単位での変化を通知するためのウェブフックです。
- コネクションが接続したら、コネクション接続のイベントが送信されます
- コネクションが接続している間は、コネクション更新のイベントが一定間隔で送信されます- デフォルトでは 1 分間隔で送信されますが、 [connection_updated_webhook_interval](SORA_CONF.html#e67c3b) で変更可能です
- コネクションが切断したら、コネクション切断のイベントが送信されます
### connection.{created,updated,destroyed}
```python
from aiohttp import web
async def event_webhook(request: web.Request) -> web.Response:
data = await request.json()
match data.get("type"):
case "connection.created":
# connection.created イベントの処理
# データベースに保存したりする
pass
case "connection.updated":
# connection.updated イベントの処理
# データベースに保存したりする
pass
case "connection.destroyed":
# connection.destroyed イベントの処理
# データベースに保存したりする
pass
case _:
# 未対応のイベントの処理
pass
return web.Response(status=204)
```
## API
Sora の API は、パスを利用せず、ヘッダーを利用して判定する方式を採用しています。
- **メソッドは常に POST を利用します**
- **パスは常に / を利用します**
- `x-sora-target` ヘッダーを利用して、どの API にアクセスするかを判定します
## 指定したチャネルのコネクションを切断する
```python
import asyncio
import aiohttp
async def main():
url = "https://sora.example.com"
headers = {
"X-Sora-Target": "Sora_20151104.DisconnectConnection",
}
data = {
"channel_id": "sora",
"connection_id": "T34CDBMRJS1B5BVPF17RTBQA3C",
}
async with aiohttp.ClientSession() as session:
# Nginx で api の prefix を /api に設定している場合は以下のように変更
# response = await session.post(f"{url}/api", json=data, headers=headers)
response = await session.post(url, json=data, headers=headers)
print(response.status)
response_data = await response.text()
print(response_data)
if __name__ == "__main__":
asyncio.run(main())
```
## 接続してから 3 分経過したコネクションを切断する
イベントウェブフック [connection.updated](EVENT_WEBHOOK.html#5430cd) と、
コネクション切断 [DisconnectConnection](API_SIGNALING.html#2ec3a0) API を利用して、
接続してから 3 分経過したコネクションを切断します。
```python
import aiohttp
from aiohttp import web
async def auth_webhook(request: web.Request) -> web.Response:
return web.json_response({"allowed": True})
async def session_webhook(request: web.Request) -> web.Response:
return web.Response(status=204)
async def event_webhook(request: web.Request) -> web.Response:
data = await request.json()
match data.get("type"):
case "connection.updated":
if data.get("minutes", 0) >= 3:
channel_id = data.get("channel_id")
connection_id = data.get("connection_id")
url = "https://sora.example.com/api"
headers = {
"X-Sora-Target": "Sora_20151104.DisconnectConnection",
}
data = {
"channel_id": channel_id,
"connection_id": connection_id,
}
async with aiohttp.ClientSession() as session:
async with session.post(
url,
headers=headers,
json=data,
) as response:
if response.status != 200:
# エラー処理
pass
case _:
# 見知らぬイベントの処理
pass
return web.Response(status=204)
app = web.Application()
app.router.add_routes(
[
web.post("/auth", auth_webhook),
web.post("/session", session_webhook),
web.post("/event", event_webhook),
]
)
if __name__ == "__main__":
web.run_app(app, port=8000)
```
### シーケンス図
```mermaid
sequenceDiagram
participant C as クライアント
participant S as Sora
participant A as アプリケーション
C ->>+ S: "type": "connect"
S ->>+ A: 認証ウェブフック
A -->>- S: 200 OK
"allowed": true
S ->>+ A: セッションウェブフック
session.created
A -->>- S: 200 OK
S ->>- C: "type": "offer"
note over C,S: WebRTC 確立
S ->>+ A: イベントウェブフック
connection.created
"minutes": 0
A -->>- S: 200 OK
S ->>+ A: イベントウェブフック
connection.updated
"minutes": 1
A -->>- S: 200 OK
S ->>+ A: イベントウェブフック
connection.updated
"minutes": 2
A -->>- S: 200 OK
note over C,A: WebRTC 確立してから 10 分経過
S ->>+ A: イベントウェブフック
connection.updated
"minutes": 10
A -->>- S: 200 OK
A ->>+ S: DisconnectConnection API
S -->>- A: 200 OK
S -) C: "Close"
note over C,S: WebRTC 切断
S ->>+ A: イベントウェブフック
connection.destroyed
"minutes": 10
A -->>- S: 200 OK
```
# WebSocket 経由のシグナリング
## 概要
> **重要**
>
> Sora の SDK を利用する場合は、ここに書かれているシグナリングの細かい仕様を把握する必要は基本的にありません。
Sora のシグナリングにはデフォルトでは WebSocket を使用します。
## 用語
### channel_id
接続のグルーピングに利用する ID です。
接続時に任意の文字列、最大 255 バイトまでを自由に指定できます。
### session_id
channel_id への接続が 0 から 1 に切り替わったタイミングで生成される id です。
1 から 0 になり、一定期間が経過したタイミングでセッションは破棄されます。
セッションが破棄された後、
再度同一 channel_id で接続が 0 から 1 になった場合、新しい session_id が生成されます。
セッションごとのユニークな値です。
UUIDv4 で生成した値を Base32 でエンコードした値で、Sora が払い出します。指定はできません。
### client_id
接続時やサーバー認証成功時に任意の文字列を最大 255 バイトまで指定できる値です。
指定しない場合は connection_id が入ります。自由に指定できます。重複が可能な ID です。
### bundle_id
`bundle_id` を指定した場合、マルチストリーム利用時に `bundle_id` が等しい接続からの音声や映像、メッセージング、シグナリング通知を受信しなくなります。
接続時やサーバー認証成功時に任意の文字列を最大 255 バイトまで指定できる値です。指定しない場合は connection_id が入ります。
シグナリングでの bundle_id の指定はデフォルトでは無効になっているため、有効にする場合には `sora.conf` にて `signaling_bundle_id` を `true` にする必要があります。
### connection_id
接続ごとのユニークな値です。
UUIDv4 で生成した値を Base32 でエンコードした値で、Sora が払い出します。指定はできません。
**connection_id の例**
: "FW0CJSHETX0RXAGX8WWEXNBQN8"
## 仕組み
Sora のシグナリングは、Sora からクライアントへ Offer (SDP) を送ります。
シグナリングの処理の流れは、[認証ウェブフックなし](SIGNALING.html#cea9ce) のシーケンス図を参照してください。
シグナリングの型の正確な仕様は [シグナリングの型定義](SIGNALING_TYPE.html) を参照してください。
### URL
デフォルトの設定では、シグナリングは `0.0.0.0:5000` でリッスンするため、
シグナリング URL は `http://<サーバーのアドレス>:5000/signaling` となります。
**パス部分は /signaling 固定で変更できません** 。
### DataChannel 経由への切り替え
> **注意**
>
> 実験的機能として、シグナリングを WebSocket 経由から DataChannel 経由へ変更する機能を提供中です
詳細は [DataChannel 経由のシグナリング](DATA_CHANNEL_SIGNALING.html) をご確認ください。
## 注意
シグナリングが完了しても WebSocket の接続は切断しないでください。WebSocket の接続が切れると Sora は WebRTC 接続を終了します。
## 設定
### signaling_loopback_address_only
`sora.conf` にて [signaling_loopback_address_only](SORA_CONF.html#e22105) を `true` にすることで、
ループバックアドレスからのみアクセスできるようにします。
nginx などを前段に利用している場合は可能な限り有効にしてください。
## シグナリングのタイプ
Sora のシグナリングは、タイプごとの JSON でクライアントとメッセージをやりとりします。
### "type": "connect"
クライアントは Sora に接続の意思を伝える JSON を送ります。以下は最小の JSON です。
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam"
}
```
#### role
そのクライアントの役割を指定します。この設定は必須です。
`role` には `sendrecv` / `sendonly` / `recvonly` のどれかを指定してください。
- sendrecv- マルチストリーム、スポットライトで利用できます。送信及び受信を行います
- sendonly- すべてで利用できます。送信のみを行い、受信を行いません
- recvonly- すべてで利用できます。受信のみを行い、送信を行いません
#### channel_id
`channel_id` は 1-255 バイトまでの文字列であればどのような文字列でも指定できます。
#### 配信または視聴メディアの選択
**この項目はオプションです**
`audio` と `video` を指定することにより配信、または視聴するメディアを選択することができます。 `role` に `sendrecv` または `sendonly` を指定した場合は配信するメディア、 `recvonly` を指定したときは視聴するメディアについての指定となります。
この設定が未指定の場合は、 `true` がデフォルトで指定され、映像と音声両方の配信、または映像と音声両方の受信が行われます。
以下の例では `role` に `sendrecv` が指定されており、音声のみが配信されます。
```javascript
{
"type": "connect",
"role": "sendrecv",
"channel_id": "Spam",
"video": false
}
```
> **注釈**
>
> `role` に `sendrecv` が指定された場合は常に映像と音声両方を受信します。
以下の例では `role` に `sendonly` が指定されており、映像のみが配信されます。
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam",
"audio": false
}
```
以下の例では `role` に `recvonly` が指定されており、音声のみが受信されます。
```javascript
{
"type": "connect",
"role": "recvonly",
"channel_id": "Spam",
"video": false
}
```
#### オーディオコーデック指定
**この項目はオプションです**
配信者や視聴者はオーディオコーデックを指定できます。
この設定はオプションです。
この設定が指定されない場合は、 `OPUS` がデフォルトで設定されます。
- Opus- "OPUS"
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam",
"audio": {
"codec_type":"OPUS"
}
}
```
#### オーディオビットレート指定
**この項目はオプションです**
> **重要**
>
> オーディオビットレートは指定しないことをおすすめします。指定しないことで最適なビットレートが採用されます。
配信者はオーディオビットレートの最大値を指定できます。
このビットレート指定は Opus にのみ有効です。
- bit_rate- 6-510
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam",
"audio": {
"codec_type": "OPUS",
"bit_rate": 64
}
}
```
指定できる値は 6 から 510 です。32 を指定した場合は、32kbps がビットレートの最大値です。
指定しない場合は `sora.conf` の `default_audio_bit_rate` に指定した値が採用されます。
`default_audio_bit_rate` も指定していない場合、ビットレートはクライアント側に依存します。
#### オーディオの Opus 設定指定
> **注意**
>
> この機能は実験的機能です。この機能を利用される場合は必ず事前にサポートまでご連絡ください
配信者は Opus の設定を指定できます。
- opus_params- channels- 1-8
- maxplaybackrate- 8000-48000
- stereo- boolean
- sprop_stereo- boolean
- minptime- integer 3-120
- useinbandfec- boolean
- usedtx- boolean
- **この機能を有効にした場合は録画がおかしくなります**
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam",
"audio": {
"codec_type": "OPUS",
"opus_params": {
"stereo": false,
"useinbandfec": false
}
}
}
```
#### ビデオコーデック指定
**この項目はオプションです**
配信者や視聴者はビデオコーデックを指定できます。
この設定はオプションです。
この設定が指定されない場合は、VP9 がデフォルトで設定されます。
- VP8- `"VP8"`
- VP9- "`VP9"`
- AV1- `"AV1"`
- Chrome M96 以降で利用できます
- Sora SDK で利用できます
- H.264- `"H264"`
- H.265- `"H265"`
- Sora iOS/Android SDK で利用できます
- Safari では実験的機能を有効にすることで利用できます
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam",
"video": {
"codec_type":"VP9"
}
}
```
#### ビデオビットレート指定
**この項目はオプションです**
配信者はビデオビットレートの最大値を指定できます。単位は **kbps** です。
- bit_rate- 1-50000
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam",
"video": {
"codec_type": "VP9",
"bit_rate": 500
}
}
```
指定できる値は 1 から 50000 です。500 を指定した場合は、500 kbps がビットレートの最大値です。
10 Mbps を最大値としたい場合は 10000 を指定してください。ただし 15 Mbps より大きい値は現時点ではサポート外となります。
指定しない場合は `sora.conf` の `default_video_bit_rate` に指定した値が採用されます。
#### ビデオの VP9 設定指定
配信者は VP9 のプロファイル ID を指定できます。
VP9 のプロファイル ID を指定をする場合は、あわせて `codec_type` に `VP9` を指定する必要があります。
- vp9_params- profile_id- integer
- 0-3
この値を指定するには `sora.conf` にて [signaling_vp9_params](SORA_CONF.html#3261ea) を `true` に設定する必要があります。
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam",
"video": {
"codec_type": "VP9",
"vp9_params": {
"profile_id": 2
}
}
}
```
#### ビデオの AV1 設定指定
配信者は AV1 のプロファイル を指定できます。
AV1 のプロファイル を指定をする場合は、あわせて `codec_type` に `AV1` を指定する必要があります。
- av1_params- profile- integer
- 0-2
この値を指定するには `sora.conf` にて [signaling_av1_params](SORA_CONF.html#91f3b8) を `true` に設定する必要があります。
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam",
"video": {
"codec_type": "AV1",
"av1_params": {
"profile": 0
}
}
}
```
#### ビデオの H.264 設定指定
配信者は H.264 のプロファイルレベル ID を指定できます。
H.264 のプロファイルレベル ID を指定をする場合は、あわせて `codec_type` に `H264` を指定する必要があります。
- h264_params- profile_level_id- string
- "42e02a" など
- b_frame- boolean
- `sora.conf` にて [h264_b_frame](SORA_CONF.html#f546aa) が `true` に指定されているときに指定できます
この値を指定するには `sora.conf` にて [signaling_h264_params](SORA_CONF.html#b32e49) を `true` に設定する必要があります。
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam",
"video": {
"codec_type": "H264",
"h264_params": {
"profile_level_id": "42e02a"
}
}
}
```
#### ビデオの H.265 設定指定
> **注意**
>
> この機能は実験的機能です。この機能を本番環境で利用される場合は必ず事前にサポートまでご連絡ください
> **警告**
>
> この機能はまだ対応しているライブラリが存在しません。
配信者は H.265 のプロファイルレベル ID を指定できます。
H.265 のプロファイルレベル ID を指定をする場合は、あわせて `codec_type` に `H265` を指定する必要があります。
- h265_params- level_id- integer
- 93 など
- b_frame- boolean
- `sora.conf` にて [h265_b_frame](SORA_CONF.html#a9a8f8) が `true` に指定されているときに指定できます
この値を指定するには `sora.conf` にて [signaling_h265_params](SORA_CONF.html#8ed4e9) を `true` に設定する必要があります。
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam",
"video": {
"codec_type": "H265",
"h265_params": {
"level_id": 93
}
}
```
#### 認証メタデータ
**この項目はオプションです**
認証するための判断材料としてメタデータを使用できます。
認証メタデータは必須ではありません。
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam",
"metadata": "1234abcd"
}
```
認証メタデータは、そのまま認証サーバーに送られます。詳細は [認証ウェブフック](AUTH_WEBHOOK.html) をご確認ください。
#### client_id の指定
**この項目はオプションです**
> **重要**
>
> `client_id` の値は重複することができます。
1-255 バイトまでの文字列であれば、どのような文字列でも指定できます。
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam",
"client_id": "egg-ham"
}
```
#### bundle_id の指定
**この項目はオプションです**
> **重要**
>
> `bundle_id` の値は重複することができます。
1-255 バイトまでの文字列であれば、どのような文字列でも指定できます。
マルチストリーム利用時に `bundle_id` が同じ接続からの音声や映像、メッセージングを受信しなくなります。
この値を指定するには `sora.conf` にて [signaling_bundle_id](SORA_CONF.html#279311) を `true` に設定する必要があります。
```javascript
{
"type": "connect",
"role": "sendonly",
"channel_id": "Spam",
"bundle_id": "spam_egg"
}
```
#### サイマルキャスト
**この項目はオプションです**
自分が配信する映像のストリームを複数本にすることで、
受信側にどのストリームを受信するかを選択させることができるようになります。
```javascript
{
"type": "connect",
"role": "sendrecv",
"channel_id": "spam",
"simulcast": true
}
```
詳細は [サイマルキャスト機能](SIMULCAST.html) をご確認ください。
#### サイマルキャストマルチコーデック
**この項目はオプションです**
自分が配信する映像のストリームを複数本かつ、複数コーデックにすることができます。
サイマルキャストマルチコーデック機能を利用する場合、
`sora.conf` にて [simulcast_multicodec](SORA_CONF.html#a8cf0f) を `true` に設定する必要があります。
```javascript
{
"type": "connect",
"role": "sendrecv",
"channel_id": "spam",
"simulcast": true,
"simulcast_multicodec": true
}
```
詳細は [サイマルキャストマルチコーデック機能](SIMULCAST_MULTICODEC.html) をご確認ください。
#### スポットライト
**この項目はオプションです**
話をした人にフォーカスを当てて、フォーカスが当たっている人は高画質な映像と音声で配信、
フォーカスが当たっていない人は低画質な映像で配信するという、クライアントの負荷を下げる仕組みです。
```javascript
{
"type": "connect",
"role": "sendrecv",
"channel_id": "spam",
"simulcast": true,
"spotlight": true
}
```
詳細は [スポットライト機能](SPOTLIGHT.html) をご確認ください。
#### 転送フィルター
**この項目はオプションです**
接続時に転送フィルターを指定することで、条件に該当する他のチャネル参加者の音声や映像の受信をブロックする仕組みです。
- forwarding_filters- 受信をブロックする条件をリストで指定します
- 接続後は [転送フィルター API](API_FORWARDING_FILTER.html) を利用してフィルターの変更、削除ができます
- この機能を利用するには [signaling_forwarding_filters](SORA_CONF.html#bf0e30) を `true` に設定する必要があります
- forwarding_filter- **2025 年 12 月リリースの Sora にて廃止予定です**
- 受信をブロックする条件を指定します
- 接続後は [転送フィルター API](API_FORWARDING_FILTER.html) を利用してフィルターの変更、削除ができます
- この機能を利用するには [signaling_forwarding_filter](SORA_CONF.html#d15a40) を `true` に設定する必要があります
```javascript
{
"type": "connect",
"role": "sendrecv",
"channel_id": "spam",
"forwarding_filters": [
{
"action": "block",
"rules": [
[
{"field": "kind", "operator": "is_in", "values": ["audio"]}
]
]
}
]
}
```
```javascript
{
"type": "connect",
"role": "sendrecv",
"channel_id": "spam",
"forwarding_filter": {
"action": "block",
"rules": [
[
{"field": "kind", "operator": "is_in", "values": ["audio"]}
]
]
}
}
```
詳細は [転送フィルター機能](FORWARDING_FILTER.html) をご確認ください。
#### sdp
**この項目はオプションです**
Sora SDK や Sora クライアントで生成した offer SDP を Sora のログに記録します。
この項目は、ログの記録にのみ利用します。
```javascript
{
"type": "connect",
"role": "sendrecv",
"channel_id": "spam",
"sdp": "..."
}
```
#### sora_client
**この項目はオプションです**
Sora SDK や Sora クライアントの情報を文字列で送ることができます。
これはログに記録されたり、認証ウェブフックリクエストで送信されたりします。
```javascript
{
"type": "connect",
"role": "sendrecv",
"channel_id": "sora",
"sora_client": "Sora JavaScript SDK 2021.1.0"
}
```
#### environment
**この項目はオプションです**
Sora SDK や Sora クライアントの利用環境を文字列で送ることができます。
これはログに記録されたり、認証ウェブフックリクエストで送信されたりします。
Sora JavaScript SDK では userAgent の情報が入ります。
```javascript
{
"type": "connect",
"role": "sendrecv",
"channel_id": "sora",
"environment": "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/93.0.4522.0 Safari\/537.36"
}
```
#### libwebrtc
**この項目はオプションです**
Sora SDK や Sora クライアントの libwebrtc のバージョンを文字列で送ることができます。
これはログに記録されたり、認証ウェブフックリクエストで送信されたりします。
```javascript
{
"type": "connect",
"role": "sendrecv",
"channel_id": "sora",
"libwebrtc": "Shiguredo-Build M90.4430@{#3} (90.4430.3.1 dee77cf2)"
}
```
#### redirect
クラスター利用時に、接続先の Sora から `"type": "redirect"` を受け取って、
再度 Sora へ接続する際に、この値に `true` を指定する必要があります。
### "type": "offer"
認証ウェブフックが認証成功を返すと、Sora は以下のような JSON をクライアントに送ります。
SDK を利用している場合は、この仕様を意識する必要はありません。
```javascript
{
"type": "offer",
"sdp": "",
"channel_id": "sora",
"session_id": "05JTBDGM1H3GB7FK0B1CJ45JE0",
"connection_id": "ECF3W1RGMD02DETH30CDZTHNRW",
"client_id": "ECF3W1RGMD02DETH30CDZTHNRW",
"bundle_id": "ECF3W1RGMD02DETH30CDZTHNRW",
"multistream": true,
"simulcast": false,
"spotlight": false,
"version": "2024.2.0",
"metadata": "1234abcd",
"audio": true,
"audio_codec_type": "OPUS",
"video": true,
"video_codec_type": "VP9",
"video_bit_rate": 500,
"config": {
"iceServers": [
{
"credential": "ClDTPB4DjgFLrclpSBxjTiXg7K8kYsGf",
"urls": [
"turn:192.0.2.1:443?transport=tcp"
],
"username": "sYL5WdMt"
}
],
"iceTransportPolicy": "relay"
},
"mid": {
"audio": "audio_aDScYe",
"video": "video_i2sNRq"
},
"data_channels": [
{
"compress": true,
"label": "stats"
},
{
"compress": true,
"label": "push"
},
{
"compress": true,
"label": "notify"
},
{
"compress": true,
"label": "signaling"
}
]
}
```
- channel_id- `"type": "connect"` の `channel_id` で指定した値が入ります
- session_id- UUIDv4 を Base32 でエンコードしたユニークな ID が入ります
- connection_id- UUIDv4 を Base32 でエンコードしたユニークな ID が入ります
- client_id- クライアントや認証サーバーが指定した値、または、Sora が生成した connection_id が入ります
- bundle_id- クライアントや認証サーバーが指定した値、または、Sora が生成した connection_id が入ります
- config- RTCPeerConnection に渡す設定が入ります
- 主に TURN の情報です
- mid- audio と video の MediaStream Id が入ります
- audio- 音声の配信を行うかどうかが入ります
- audio_codec_type- これはオプションです
- `audio` が `true` かつ `role` が `sendrecv` または `sendonly` の場合に含まれます
- 音声のコーデックが入ります
- audio_bit_rate- これはオプションです
- `audio` が `true` かつ `role` が `sendrecv` または `sendonly` で `audio_bit_rate` が指定された場合に含まれます
- 音声のビットレートが入ります
- video- 映像の配信を行うかどうかが入ります
- video_codec_type- これはオプションです
- `video` が `true` かつ `role` が `sendrecv` または `sendonly` の場合に含まれます
- 映像のコーデックが入ります
- video_bit_rate- これはオプションです
- `video` が `true` かつ `role` が `sendrecv` または `sendonly` の場合に含まれます
- 映像のビットレートが入ります
- version- Sora のバージョンが入ります
- metadata- これはオプションです
- 認証サーバーから払い出された metadata が入ります
- data_channels- これは DataChannel 経由のシグナリングを有効にしている場合にのみ利用されます
- 詳細は [DataChannel への切り替え要否の判断](DATA_CHANNEL_SIGNALING.html#1abf7f) をご確認ください
### "type": "answer"
クライアントは offer を受け取りしだい、answer 用の SDP を生成します。
```javascript
{
"type": "answer",
"sdp": ""
}
```
その後、必要があればクライアントは取得した candidate を送ります。
```javascript
{
"type": "candidate",
"candidate": "candidate:3179889176 1 tcp 1518214911 192.168.1.10 0 typ host tcptype active generation 0"
}
```
### "type": "disconnect"
クライアントからこのメッセージを送ると、Sora は WebSocket を切断します。また、WebRTC 側も終了します。
クライアントから切断する際には、このメッセージを送るようにしてください。
```javascript
{
"type": "disconnect"
}
```
オプションとして `reason` を指定することもできます。
この値は [connection.destroyed](EVENT_WEBHOOK.html#6c02d0) の `type_disconnect_reason` として含まれます。
`reason` は最大 128 バイトまで指定する事ができます。
```javascript
{
"type": "disconnect",
"reason": "NO-ERROR"
}
```
### "type": "ping"
サーバーからクライアント側に定期的に送られる通知です。この値をクライアントが受け取った場合は、すぐに以下の JSON を Sora に送信してください。
```javascript
{
"type": "pong"
}
```
`"type": "ping"` を送ってから指定時間の間に一度も `"type": "pong"` が返ってこない場合、
Sora は正常な通信が行えていないと判断して、Sora からシグナリングの接続を切断します。
指定時間はデフォルトでは 60 秒に設定されており、この値は `sora.conf` の設定 [websocket_signaling_pong_timeout](SORA_CONF.html#140464) で変更できます。
#### stats
> **注意**
>
> この機能は WebSocket 経由でのシグナリングの時のみ有効です
`sora.conf` にて `user_agent_stats` または `rtc_stats` を `true` にしている場合は、 `"type": "ping"` 時に `"stats": true` が送られてきます。
```javascript
{
"type": "ping",
"stats": true
}
```
この値を受け取った場合は、WebRTC の統計情報を取得して `"type": "pong"` 送信時に `stats` をキーにして値を含んで応答してください。
```javascript
{
"type": "pong",
"stats": [{"type": "..."}, {"type": "..."}]
}
```
### "type": "notify"
サーバーからクライアントに対して、参加しているチャネルの情報が通知されるようになります。
詳細は [シグナリング通知機能](SIGNALING_NOTIFY.html) をご確認ください。
### "type": "push"
Sora の [プッシュ API](API_PUSH.html) や [シグナリング通知メタデータ拡張機能](SIGNALING_NOTIFY_METADATA_EXT.html) 、 [音声ストリーミング機能](AUDIO_STREAMING.html) 利用時にクライアントに送信されるプッシュ通知です。
`data` 内に各機能に応じた情報が設定されます。
```javascript
{
"type": "push",
"data": {
: