LiveKit / WebRTC 調べ


以下は、LiveKit公式ドキュメント「Intro to LiveKit」の日本語訳(目次付き)です。
LiveKit 入門
LiveKit エコシステムの概要
📑 目次
LiveKitとは?
LiveKitは、リアルタイムメディアアプリケーションを構築する開発者向けのオープンソースプラットフォームです。
音声・映像・テキスト・データ・AIモデルの統合を簡単に行えるうえに、WebRTCベースのスケーラブルなリアルタイムインフラを提供します。
LiveKitを選ぶ理由
LiveKitはリアルタイムアプリケーション構築のための完全なソリューションを提供しており、以下のような強みがあります:
- 開発者フレンドリー:プラットフォーム間で一貫性のあるAPI、充実したドキュメントとSDK
- オープンソース:ベンダーロックインなし、透明性と柔軟性あり
- AIネイティブ:AIモデルのリアルタイム体験への統合を第一級でサポート
- スケーラブル:数人〜数千人以上の同時接続をサポート
- 柔軟なデプロイ:マネージドクラウドとセルフホストの選択肢
- プライバシーとセキュリティ:エンドツーエンド暗号化、HIPAA準拠など
- WebRTCベース:あらゆるネットワーク状況で高パフォーマンスを実現
WebRTCとは
WebRTCは、WebSocketなど他のリアルタイム通信手段と比較して、多くの利点があります:
- メディアに最適化:音声・映像専用に設計され、先進的なコーデックと圧縮アルゴリズムを使用
- ネットワークに強い:UDPやアダプティブビットレートにより、不安定なネットワークでも高い信頼性
- 幅広い互換性:すべての主要ブラウザでネイティブサポート
LiveKitは、本番環境で利用可能なWebRTCインフラの複雑さをすべて引き受け、モバイルアプリやバックエンド、電話連携にも対応しています。
LiveKitエコシステムの構成要素
LiveKitプラットフォームは以下の中核コンポーネントで構成されています:
- LiveKit Server:参加者間のリアルタイム通信を可能にするオープンソースのメディアサーバー。マネージドクラウド利用または自前でホスティング可能。
- LiveKit SDK:Web・ネイティブ・バックエンド向けのフル機能SDK。ルームへの参加やメディア・データの送受信が容易。
- LiveKit Agents:マルチモーダルなリアルタイムAIエージェントを構築するためのフレームワーク。主要なAIプロバイダー向けの豊富なプラグイン群を提供。
- テレフォニー(Telephony):LiveKitルームやエージェントセッションへ電話の入出力を行う柔軟なSIP連携。
- Egress:LiveKitルームからのリアルタイムメディアの録画・出力。
- Ingress:外部ストリーム(RTMP、WHIPなど)のLiveKitルームへの取り込み。
- Server APIs:ルーム管理などを行うREST API。SDKやCLIも提供。
デプロイ方法
LiveKit Serverの導入方法は2種類:
- LiveKit Cloud:マネージド型のグローバルサービス。自動スケーリング、高信頼性を備え、スタートアップから大企業まで導入。
- セルフホスト:LiveKitのオープンソースサーバーを自社インフラに導入。最大限の制御とカスタマイズが可能。
どちらの方法でも同じSDK・コア機能が利用できます。
LiveKitで何が作れるか
LiveKitを使うことで、次のようなアプリケーションを構築できます:
- AIアシスタント:音声・映像を使った、任意のAIモデルとの対話エージェント
- ビデオ会議:セキュアでプライベートなチーム会議
- インタラクティブライブ配信:視聴者とのリアルタイムな双方向配信
- ロボティクス:リアルタイム映像と強力なAIモデルを組み込んだ実機デバイス制御
- 医療分野:AIと人間が連携した、HIPAA準拠の遠隔診療
- カスタマーサポート:Web・モバイル・電話による柔軟かつ観測可能なサポート体験
どのユースケースでも、LiveKitを使えばスケーラブルなメディアインフラを気にせず、革新的で知的なリアルタイムアプリを簡単に構築できます。
原文更新日時: 2025年7月22日
最新版はこちら: Intro to LiveKit – LiveKit Docs
もし、このあと他のページ(例:Agents, SDK, Egressなど)も翻訳してほしければ教えてね!


Getting Started: 認証
了解!以下は、LiveKit公式ドキュメント「Authentication」セクションの日本語訳(2025年7月24日時点)です:
認証(Authentication)
LiveKit セッションにユーザーを認証する方法を解説します。
概要
LiveKit SDK がサーバへ接続するには、アクセストークンをリクエストに含める必要があります。
このトークンは以下の情報を含みます:
- 参加者の識別子(identity)
- ルーム名
- 権限(roomJoin, canPublish など)
- 有効期限
トークンは JWT 形式で、APIシークレットで署名されており、改ざんを防止します。
なお、有効期限は初回接続にのみ影響し、再接続時には考慮されません。
アクセストークンの作成
🔧 LiveKit CLI:
lk token create \
--api-key <KEY> \
--api-secret <SECRET> \
--identity <名前> \
--room <ルーム名> \
--join \
--valid-for 1h
💻 各言語でのトークン生成例
以下はすべて「Roomへ参加するためのVideoトークン」作成例です:
Node.js
import { AccessToken, VideoGrant } from 'livekit-server-sdk';
const at = new AccessToken('API_KEY', 'API_SECRET', { identity: 'ユーザー名' });
at.addGrant({
room: 'ルーム名',
roomJoin: true,
canPublish: true,
canSubscribe: true,
});
const token = await at.toJwt();
console.log('access token', token);
(他言語版は省略可能。要望があれば全訳対応)
トークンの中身(例)
以下はJWTトークンをデコードした例です:
{
"exp": 1621657263,
"iss": "APIキー",
"sub": "ユーザーID",
"video": {
"room": "myroom",
"roomJoin": true
},
"metadata": ""
}
フィールド名 | 内容 |
---|---|
exp |
有効期限(UNIX時間) |
iss |
発行者(APIキー) |
sub |
参加者ID |
video |
ビデオ関連の権限(下記参照) |
metadata |
任意の参加者メタデータ |
🎥 Video Grant の権限一覧
"video": {
"room": "room-name",
"roomJoin": true,
"canPublish": true,
"canSubscribe": true,
"canPublishData": true,
"canPublishSources": ["camera", "microphone"],
"canUpdateOwnMetadata": true,
"hidden": false
}
フィールド名 | 説明 |
---|---|
roomJoin |
ルームに参加可能 |
canPublish |
音声・映像トラックを送信可能 |
canPublishData |
データ送信可能 |
canSubscribe |
他参加者のトラック購読可能 |
canPublishSources |
特定のメディアソースのみ許可(例:カメラのみ) |
hidden |
他の参加者から見えないようにする |
kind |
参加者の種類(agent, egress, sip など) |
🔐 SIP Grant(電話関連の権限)
電話(SIP)サービスと連携するには、sip
フィールドを付与します:
"sip": {
"admin": true,
"call": true
}
権限名 | 内容 |
---|---|
admin |
SIPトランク・ルール管理権限 |
call |
SIP通話発信権限(SIPParticipantの作成) |
🏗️ Room Configuration(ルーム設定付きトークン)
トークンに roomConfig
を含めると、ルーム作成時に設定が反映されます。
例:エージェントを指定して招待する
at.roomConfig = new RoomConfiguration ({
agents: [
new RoomAgentDispatch({
agentName: "ai-bot",
metadata: "greeting-bot"
})
]
})
この仕組みで「特定のBotを起動してユーザーを迎える」といった動作が可能になります。
🔁 トークンの自動更新
LiveKitでは、接続中の参加者に対して自動的に新しいトークンを発行します(有効期限:10分)。
また、以下の情報が変わると即時再発行されます:
- 名前
- 権限
- メタデータ
🔄 権限の動的変更
参加者がRoomに接続した後でも、UpdateParticipant API を使って以下が可能:
-
canPublish: false → true
に変更 - 視聴者から登壇者への昇格など
📎 補足リンク
- 最新ドキュメント: https://docs.livekit.io/home/get-started/authentication.md
- CLI: https://github.com/livekit/livekit-cli
- Node.jsトークン生成コード: AccessToken.ts
次に翻訳したいセクションがあれば教えてね!(例:Server API, Agent Dispatch, Room Lifecycle など)
Rust版のトークン生成などを深掘りしてもOK!

スタータープロジェクトの紹介
アプリケーションの初期化(Bootstrapping an application)
用意されたテンプレートからアプリを作成・初期化します。
ℹ️ 補足
開始する前に、以下を済ませておいてください:
- LiveKit Cloud アカウントの作成
- LiveKit CLI のインストール
- 任意の LiveKit プロジェクトへの認証または手動設定
アプリのブートストラップ
LiveKit CLI を使えば、便利なテンプレート群からアプリケーションをブートストラップできます。
CLI はプロジェクトの認証情報を使って、必要な環境変数や設定を自動でセットアップしてくれます。
アプリをテンプレートから作成するには以下を実行:
lk app create --template <テンプレート名> my-app
その後、CLIの案内に従ってセットアップを完了してください。
--template
を省略すると利用可能なテンプレート一覧が表示されます。
🎨 利用可能なテンプレート
テンプレート名 | 言語・フレームワーク | 説明 |
---|---|---|
agent-starter-python | Python | 音声エージェントの基本的な実装を含むPythonスタータープロジェクト |
voice-assistant-frontend | TypeScript / Next.js | 柔軟な音声AIフロントエンドを備えたNext.jsのスターターアプリ |
agent-starter-android | Kotlin / Android | 音声AIフロントを備えたAndroid向けスタータープロジェクト |
agent-starter-swift | Swift | 音声AIフロントを備えたSwift向けスタータープロジェクト |
agent-starter-flutter | Flutter | 音声AIフロントを備えたFlutter向けスタータープロジェクト |
agent-starter-react-native | React Native / Expo | 音声AIフロントを備えたReact Native/Expo向けスターター |
agent-starter-embed | TypeScript / Next.js | 任意のWebサイトに埋め込める柔軟な音声AIスターター |
token-server | Node.js / TypeScript | モバイルアプリ向けのプロトタイプに便利なトークンサーバー |
meet | TypeScript / Next.js | LiveKit Componentsで構築されたOSSビデオ会議アプリ |
multi-agent-python | Python | 複数のライティングコーチエージェントによるワークフロー例 |
outbound-caller-python | Python | SIPを使ったアウトバウンドコールエージェント |
💡 ヒント
LiveKitの Agents フレームワーク を試したり、事前構築済みのフロントエンドやトークンサーバーでプロトタイピングしたい場合は、Sandbox環境 をチェックしてみてください。
🔗 関連リンク
- テンプレートの一覧: LiveKit Template Index
- 最新版のこのドキュメント: templates.md

STT, VAD の設定

4o に雑投げ
LiveKit における Signaling, STUN, TURN
LiveKit は WebRTC アプリの構築に必要な signaling / STUN / TURN の仕組みを内包しており、開発者はほぼ意識せずに使えるようになってるよ。ただし、少し細かく見てみよう:
✅ 1. Signaling サーバ
- LiveKit に完全に内包されている
- クライアント(ブラウザなど)と SFU 間の通信の確立、トラックの publish/subscribe、参加者の入退室、ICE candidate 交換などを処理
- WebSocket 経由で通信する(例:
wss://yourdomain.livekit.cloud
)
→ Signaling サーバの独立運用は 不要
✅ 2. STUN サーバ
- LiveKit Cloud では自動で提供
-
Self-hosted LiveKit Server でも、デフォルトで Google の STUN(
stun:stun.l.google.com:19302
)を利用 - STUN は「自分のグローバルIPを知るための軽い仕組み」なので LiveKit に特化した処理は不要
→ もし必要なら自前の STUN サーバを指定することも可能(config で設定)
✅ 3. TURN サーバ
- LiveKit Cloud では TURN サーバ込み(商用グレード)
- 自前で構築する場合は、coturn などの TURN サーバと連携する必要がある
なぜ必要かというと:
NAT やファイアウォールの影響で P2P や UDP での通信ができないときに、TURN がリレー通信を補う
→ LiveKit 自体は TURN サーバ機能を直接提供しないけど、TURN サーバとの統合設定は公式にサポートされてる
🛠 自前で構築する場合の構成例(Self-Hosted)
Client (browser)
│
├── WebSocket
│ ↓
└─▶ LiveKit Signaling Server (内包)
Media:
├── UDP, TCP
│ ↓
├─▶ LiveKit SFU
│
└──(接続できない場合)
↓
TURN Server (coturnなど) ← 指定可能
✅ まとめ表
コンポーネント | LiveKit Cloud | Self-Hosted LiveKit |
---|---|---|
Signaling | ✔ 内包 | ✔ 内包 |
STUN | ✔ 提供 | ❌(デフォルトで Google STUN) |
TURN | ✔ 提供 | ❌(別途構築・連携が必要) |
必要なら、Self-hosted 構成で TURN を組み込む config.yaml
の例も出せるよ!興味ある?

SFU とは
以下は、LiveKit の SFU に関するドキュメントの日本語訳と、添付のアーキテクチャ図の説明です。
🔧 LiveKit SFU(Selective Forwarding Unit)とは
LiveKit は WebRTC の中でも「SFU」方式を採用した、水平スケーリングが可能なメディアサーバです。
💬 P2P / MCU / SFU の違い
🔹 P2P(ピア・ツー・ピア)方式
- 基本の WebRTC の形。
- 各参加者が他の参加者に直接音声や映像を送信。
- 2~3人程度なら機能するが、それ以上になるとアップロード帯域が厳しい(例:720p 映像を5人に送るのは困難)。
🔹 MCU(Multipoint Control Unit)方式
-
全員のメディアをサーバに集め、合成して一つの映像として各参加者に配信。
-
特徴:
- 送信者(Publisher)は1つだけ送ればOK。
- 受信者(Subscriber)も1つの合成された映像を受け取るだけ。
-
欠点:
- 柔軟性が低い(音量個別調整不可、UI自由度が低い)。
- 高スペックサーバが必要。スケールが難しい。
🔹 SFU(Selective Forwarding Unit)方式(LiveKit が採用)
-
サーバは受信したストリームを加工せずそのまま複数の受信者へ中継。
-
特徴:
- 送信者は1つだけ送ればOK(アップロード負荷軽減)。
- 受信者は複数の個別ストリームを受信(ダウンロード帯域は多く使う)。
- 柔軟性が非常に高く、個々の映像や音声の制御が可能。
- スケーラビリティが高く、大規模セッションも分散処理可能。
🧠 LiveKit のスマートさ
- クライアント SDK と SFU サーバが協調し、受信者のネットワーク帯域を自動で測定。
- 解像度やビットレートなどを動的に調整(開発者が意識しなくてもOK)。
🏗️ アーキテクチャ図の説明(添付画像)
CLIENT
│
├── websocket TLS(シグナリング通信)
│
▼
LOAD BALANCER(ロードバランサ)
│
├─→ 複数の LIVEKIT SERVER へ振り分け
└─ Redis によるルーム参加者の P2P ルーティング制御
│
└── 各クライアントとの WebRTC UDP/TCP 通信を中継
各コンポーネントの役割
コンポーネント | 役割 |
---|---|
Client | WebRTC クライアント。映像・音声の送受信。 |
Load Balancer | シグナリング接続(WebSocket)を各 LiveKit Server に振り分ける。 |
LiveKit Server | WebRTC SFU の本体。ストリームを受け取り、他の参加者に転送。 |
Redis | ルーム情報の管理や、複数ノード間の通信を行う Pub/Sub データストア。 |
💡補足:LiveKit の特徴
- 言語: Go で実装
- WebRTC ライブラリ: Pion 使用
- 単一ノードでも動作可能(Redis 不要)
- 複数ノードで動かす場合は Redis が必須
もしこのアーキテクチャに応じたアプリの構築方法、例えば「自分の音声AIアプリをこの LiveKit 上に構築するには?」のような観点で解説が欲しければ、続けて教えてください。

WebRTC on LiveKit での Signaling
以下は、LiveKit における シグナリング(Signaling)プロトコル の日本語訳および解説です。
🎯 シグナリングとは?
WebRTC で音声・映像をやりとりする前に、「誰が誰と、どのように接続するか」 を調整する通信が必要です。これが シグナリング です。
LiveKit では、WebSocket を使ってクライアントとサーバ間でシグナリング を行います。通信の中身は Protocol Buffers(protobuf) で定義されています。
🔌 通信の基本構造
-
通信は WebSocket + protobuf
-
通常、クライアントは 最大2つの WebRTC PeerConnection を作成:
- 送信用 PeerConnection(映像や音声を送る)
- 受信用 PeerConnection(他の参加者の映像や音声を受け取る)
-
最初に接続されるのは「受信用 PeerConnection」(=自動購読)
-
送信する場合にだけ、送信用の接続を追加で確立
🚪 ルーム参加の流れ(Join)
-
クライアントが
/rtc
に WebSocket 接続 -
サーバが
JoinResponse
を送信(ルーム・参加者情報を含む) -
サーバが 受信用 PeerConnection を初期化し、
offer
を送る- ここで既存のトラック情報も含まれる(
auto_subscribe = true
の場合) - データチャンネルも2つ自動的に作成
- ここで既存のトラック情報も含まれる(
-
trickle ICE
による ICE Candidate の交換 -
クライアントが
answer
を送信し、接続完了 -
ICE 接続が確立
-
サーバが他の参加者に「新しい参加者が来た」と通知
/rtc
のパラメータ
🌐 WebSocket パラメータ名 | 説明 |
---|---|
access_token |
JWT 形式の認証トークン |
reconnect |
再接続フラグ(ICE Restart あり) |
auto_subscribe |
デフォルト true 。すべてのトラックに自動購読するか |
sdk |
利用中の SDK(js, ios, android など) |
protocol |
プロトコルバージョン(例: 9) |
version |
クライアントSDKのバージョン |
📤 トラックの送信(Publishing)
- クライアントが
AddTrackRequest
を送信(メタ情報付き) - サーバが
TrackPublishedResponse
を返す - クライアントが PeerConnection に transceiver + media track を追加
- クライアントが
offer
を送信 - サーバが
answer
を返して接続確立 - 他の参加者にもそのトラックが配信される
📥 トラックの受信(Receiving)
- トラックが公開されると、すぐにそのメタデータが全参加者に送られる
- それぞれのクライアントの「受信用 PeerConnection」に追加される
📡 サーバからのイベント通知
サーバは以下のイベントをクライアントに通知:
イベント | 内容 |
---|---|
ParticipantUpdate |
他の参加者の参加・退出・トラック変更など |
LeaveRequest |
強制切断の指示 |
SpeakersChanged |
発話者の変化(アクティブスピーカー情報) |
これらは 冪等(べきとう)性 を持って処理する必要あり(重複送信もあり得る)
🎛️ クライアントからの操作(制御系)
🔇 トラックのミュート
-
WebRTC の
MediaStreamTrack.enabled = false
に加えて、 -
MuteTrackRequest
を送信して、明示的にサーバへ通知- 空パケット送信を抑制でき、ネットワーク負荷軽減
📉 質の変更(UpdateTrackSettings)
- 一部トラックの画質を落とす、一時停止する、などを指示可能
- 例: UI 外のユーザーの映像は一時停止 → 帯域節約
📡 購読の制御(UpdateSubscription)
- 必要なトラックだけ購読し、他は購読解除できる
✨まとめ:LiveKit の Signaling の特徴
特徴 | 説明 |
---|---|
非同期通信 | WebSocket + protobuf により非同期メッセージ送受信 |
分離された PeerConnection | publish/subscribe を分離し交渉を単純化 |
柔軟な制御 | トラックの購読、画質、ミュートなど細かく制御可能 |
SDK 利用者には非公開 | LiveKit を使うだけなら理解不要(SDKで抽象化済) |
さらに具体的に SDK 実装や、UI 側の挙動についても知りたい場合は教えてください。必要ならメッセージフォーマット(protobuf の構造)も掘り下げられます。

📡 WebRTC の仕組み on LiveKit
LiveKit は WebRTC に基づく音声・映像通信インフラであり、水平スケーリング可能な SFU(Selective Forwarding Unit)アーキテクチャを採用しています。このドキュメントでは、LiveKit 上で WebRTC がどのように動作しているかを解説します。
🧑🤝🧑 登場人物
名称 | 説明 |
---|---|
Local Client (ブラウザ) | WebRTC を使って通話に参加するユーザー。LiveKit SDK を使用して /rtc に接続。 |
Remote Client (ブラウザ) | 別のユーザー。同様に LiveKit 経由でルームに参加。 |
LiveKit Server (SFU) | WebRTC のメディアを中継する SFU サーバ。トラックをそのまま転送。 |
Redis | 複数ノード構成時にルーム情報や参加者情報を管理。 |
Load Balancer | クライアントからの WebSocket 接続(シグナリング)を各 LiveKit Server に振り分ける。 |
🔁 処理の流れ
1. ルーム参加(Signaling)
- クライアントが WebSocket 経由で
/rtc
に接続し、JWT トークン等の情報を送信 - サーバが
JoinResponse
を返却、部屋・参加者・既存トラック情報を含む - サーバが受信用
PeerConnection
を初期化しoffer
を送信 - クライアントが
answer
を返す(ICE candidate も交換)
2. メディア送信(Publishing)
- クライアントが
AddTrackRequest
を送信 - サーバが
TrackPublishedResponse
を返却 - クライアントが
PeerConnection
に映像/音声を追加しoffer
を送信 - サーバが
answer
を返し、送信ストリームの受信開始
3. メディア受信(Subscribing)
- 新しいトラックが公開されると、サーバが全参加者に通知
- 各参加者の
PeerConnection
にトラックが追加され、映像/音声を受信
4. 状態変化の通知
-
ParticipantUpdate
,SpeakersChanged
,LeaveRequest
などがサーバから随時通知される
5. クライアント制御(任意)
-
MuteTrackRequest
によるミュート -
UpdateSubscription
によるトラック購読制御 -
UpdateTrackSettings
による画質制御など
🧭 シーケンス図(mermaid)
補足
特徴 | 説明 |
---|---|
非同期通信 | WebSocket + protobuf により非同期メッセージ送受信 |
分離された PeerConnection | publish/subscribe を分離し交渉を単純化 |
柔軟な制御 | トラックの購読、画質、ミュートなど細かく制御可能 |
SDK 利用者には非公開 | LiveKit を使うだけなら理解不要(SDKで抽象化済) |

以下に、WebRTC の概念 / LiveKit の概念 / 両者の関係性を整理してまとめます。
🧩 WebRTC の概念
WebRTC(Web Real-Time Communication)は、ブラウザ間でのリアルタイム通信を実現するためのオープン標準です。クライアント(例:ブラウザ)が直接 P2P 接続するための仕組みだけを提供しています。
概念名 | 説明 |
---|---|
MediaStream / Track
|
マイク・カメラから取得した音声/映像データ。 |
RTCPeerConnection |
P2P 接続を管理するオブジェクト。ICE を用いた接続処理やメディア送受信を担う。 |
RTCDataChannel |
テキスト・バイナリデータの送受信(チャットなどに使用可能)。 |
ICE Candidate |
NAT 越え接続のための IP 候補情報。 |
STUN / TURN
|
ネットワーク越えのためのサーバ(P2P でつながらないときに使う)。 |
シグナリング | WebRTC では仕様外。接続確立に必要な offer / answer / ICE candidate 交換のために別途自分で実装する必要がある。 |
❗ WebRTC には「ルーム」や「参加者」などの概念は存在しません。
🏗️ LiveKit の概念
LiveKit は WebRTC を使って マルチユーザー向けの音声・映像通話を提供する SFU(Selective Forwarding Unit)ベースのシステムです。
概念名 | 説明 |
---|---|
Room |
アプリケーションが管理する通話空間。参加者のグループ。 |
Participant |
ルーム内のユーザー。publish / subscribe の状態を持つ。 |
Track |
映像・音声・データなどの媒体。Publisher が発行、Subscriber が受信。 |
SFU |
Selective Forwarding Unit。トラックを中継するだけで変換しない。 |
Signaling |
WebSocket + Protobuf によって offer/answer/ICE などの交換を抽象化。 |
AutoSubscribe / TrackSubscription
|
各参加者がどのトラックを受信するかを制御する機能。 |
Server-Side Events |
ParticipantUpdate , SpeakersChanged など、状態変化通知。 |
Redis |
分散構成時のルーム情報・参加者管理に使用。 |
🔗 WebRTC と LiveKit の関係性
LiveKit は WebRTC を「より大規模・実用的に」扱うための 抽象化レイヤーと インフラを提供しています。
WebRTC の概念 | LiveKit での拡張・利用 |
---|---|
RTCPeerConnection |
クライアント ↔ LiveKit Server 間に確立される(送信用と受信用に分離) |
MediaStreamTrack |
LiveKit では Track として管理され、Participant に紐づく |
シグナリング | WebRTC 本来は実装不要。LiveKit は WebSocket + Protobuf で提供し、SDK に抽象化済み |
STUN / TURN
|
LiveKit Server 側に組み込み or 自分で構成可能(SFU 経由通信の補助) |
DataChannel |
Track 情報以外のデータ送信にも利用(イベントやチャットなど) |
なし(room の概念) | LiveKit が独自に定義。参加者管理、Track のルーティング単位として機能 |
なし(participant の概念) | LiveKit が独自に定義。ユーザーの属性・トラックの制御単位 |
✅ まとめ表
分類 | WebRTC | LiveKit |
---|---|---|
通信方式 | P2P | SFU(中央中継型) |
接続制御 | 自分でシグナリング実装 | WebSocket + Protobuf(SDK に内包) |
トラック管理 | Track を PeerConnection に追加 | Track に SID を持たせて管理 |
ルーム/参加者 | 概念なし | Room / Participant として実装済 |
スケーラビリティ | 難しい(P2P 限界) | 容易(水平スケール可能) |
質問が多いポイントとしては:
- 「なぜ SFU が必要なの?」(→ MCU との比較をすると理解しやすい)
- 「シグナリングって何?」(→ WebRTC には定義されてないが LiveKit が隠蔽してくれてる)
などがあります。もっと掘り下げたい観点があれば遠慮なくどうぞ!

概念整理
了解です!ここでは WebRTC の構成要素をより詳しく・明確に説明します。特に STUN と TURN を分けて、略語の意味・役割・動作も記載します。
🧩 WebRTC の概念(詳細解説)
WebRTC(Web Real-Time Communication)は、ブラウザやネイティブアプリ間で直接、音声・映像・データをリアルタイムにやり取りできる技術です。
以下のような複数の技術要素で構成されています:
🎥 MediaStream / MediaStreamTrack
- MediaStream は音声・映像などのストリーム全体(例:カメラ + マイク)。
- MediaStreamTrack はその中の1つのトラック(音声 or 映像)。
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
const [videoTrack] = stream.getVideoTracks();
🔗 RTCPeerConnection(リアルタイム通信接続)
- P2P 接続を管理する中核クラス。
- 音声・映像などのトラックを相手に送るためのコネクション。
- 複数のネットワーク候補(ICE candidate)を検討して接続を最適化。
const pc = new RTCPeerConnection();
💬 RTCDataChannel(データチャンネル)
- テキスト・バイナリの任意データを P2P で送受信できる WebRTC の機能。
- チャット、ファイル共有などに利用可能。
const channel = pc.createDataChannel("chat");
🧭 シグナリング(Signaling)
-
WebRTC には含まれていないが、必要不可欠な通信手順。
-
以下の情報を相手とやり取りするための仕組み:
-
offer
/answer
(接続交渉の提案と応答) -
ICE candidate
(接続候補情報)
-
-
方法は自由(例:WebSocket、HTTP、Socket.io など)
❄️ ICE(Interactive Connectivity Establishment)
- ネットワーク越え(NAT越え)接続のためのプロセス全体の名前。
- 接続候補(candidate)を複数用意し、ベストなものを選ぶ。
🌐 STUN(Session Traversal Utilities for NAT)
- NAT越えのために、自分のグローバル IP / ポートを知るための仕組み。
- UDP で問い合わせを送り、「外部から見える自分のIP:Port」を返してもらう。
- 中継しない。あくまで問い合わせるだけ。
特徴 | 内容 |
---|---|
略称 | Session Traversal Utilities for NAT |
目的 | 自分の外部 IP アドレスとポート番号を知る |
中継 | ❌ しない |
通信方向 | クライアント → STUN サーバ(1回だけ) |
使用例 | 一般的な NAT 環境での直接接続時 |
🔁 TURN(Traversal Using Relays around NAT)
- どうしても P2P でつながらない時、通信を中継してくれるサーバ。
- 実質的に リレーサーバ。
- 帯域消費も多く、コストも高いが、確実な接続性を提供。
特徴 | 内容 |
---|---|
略称 | Traversal Using Relays around NAT |
目的 | P2P 接続できないときに中継役として機能 |
中継 | ✅ する(映像・音声が TURN サーバを経由) |
通信方向 | クライアント ↔ TURN ↔ 相手 |
使用例 | 対称NATや企業ファイアウォール内で接続できない場合 |
🔁 WebRTC の流れ(簡易)
- クライアント A がメディア取得(MediaStream)
- クライアント A/B が RTCPeerConnection を生成
- A が
offer
を作ってシグナリング経由で B に送る - B が
answer
を返す - 双方が
ICE candidate
を交換(STUN 経由) - P2P 接続が確立 or TURN 経由にフォールバック
- メディア or データをやりとり
✅ 補足まとめ
概念 | WebRTC に含まれる? | 主な役割 |
---|---|---|
MediaStream / Track | ✅ | 音声・映像の扱い |
RTCPeerConnection | ✅ | P2P 通信管理 |
RTCDataChannel | ✅ | 任意データ通信 |
Signaling | ❌ | 必須だが外部実装(LiveKit は WebSocket + Protobuf) |
STUN | ❌(外部依存) | IP:Port 発見(接続確立前) |
TURN | ❌(外部依存) | 中継役(最後の手段) |
ICE | ✅ | 接続候補の選定プロセス |
LiveKit や Zoom、Google Meet、Slack Huddles などのサービスは、上記の WebRTC の仕組みを隠蔽・制御・拡張することで高機能な通話体験を提供しています。
さらに掘り下げて知りたい要素(セキュリティ、QoS、再接続処理など)があれば教えてください!

LiveKit を Docker で動かす
以下が参考になった