概要 LiveKitのEgressサービスを利用してルームの録画やライブストリームを実行する方法について説明します。
導入 LiveKit Egressは、セッションからルームまたは個別のトラックを出力するための統一されたAPIを提供します。MP4ファイルへの録画やHLSセグメントの出力、YouTube LiveやTwitchなどのRTMP配信にも対応しています。Cloudユーザーは追加構成なしで利用可能ですが、自社ホスト環境では別途コンポーネントのデプロイが必要です。
出力タイプ
- ルームコンポジット出力 ブラウザレンダリングによるレイアウトを使用して全員の動画/音声を出力。例:会議録画の後日視聴
- トラックコンポジット出力 最大1つの音声と1つの動画トラックを同期・出力。エンコードとマルチプレックスが自動化されます。
- 単一トラック出力 個別トラックを直接出力。動画トラックはエンコードされません。
出力ファイルはS3互換ストレージやAzure、GCP、阿里OSSにアップロード可能です。ただし、長時間実行中の出力には制限時間が設定されています。
マルチプレックス出力 Egressは1回のエンコードで複数の出力先にデータを送信できます。以下のような同時出力が可能です:
- 複数RTMPエンドポイントへのストリーム
- HLSでの録画
- MP4での録画
- スクリーンショット(サムネイル)生成
コード例 JavaScript版(S3アップロード)
const outputConfig = {
type: 'video/mp4',
path: 'meetings/2023-09-15-recording.mp4',
storage: {
provider: 's3',
accessKey: 'AWS_ACCESS_KEY_ID',
secretKey: 'AWS_SECRET_ACCESS_KEY',
bucketName: 'livekit-recordings',
region: 'us-west-2'
}
};
await apiClient.startCompositeRecording('conference-room', outputConfig);
Java版(GCPアップロード)
StorageSettings gcpSettings = new StorageSettings()
.setProvider("gcp")
.setCredentialsJson(loadCredentialsFile())
.setBucket("cloud-recordings");
OutputConfiguration config = new OutputConfiguration()
.setFormat("mp4")
.setPath("webinar/2023-09-15.mp4")
.setStorage(gcpSettings);
EgressResponse response = egressService.startRoomEgress("webinar-room", config);
ファイル名のフォーマットルール
| リクエスト | 出力結果 |
|---|---|
| "" | meeting-2023-09-15T14-30-00.mp4 |
| "archive/2023-09-15/" | archive/2023-09-15/meeting.mp4 |
| "{room_id}-video-{time}.mp4" | RM_12345-video-2023-09-15T14-30-00.mp4 |
ストリーム接続の最適化
- RTMPストリームは距離に敏感です。地域ごとのエンドポイントを選択してください。
- Cloud環境では、最適なサーバーを選択して自動ルーティングされます。
- ストリームの追加/削除はUpdateStream APIで実行可能です。
WebSocketストリームの注意点 Egressサービスは30秒ごとにpingを送信します。クライアント側でも同様のping処理を実装し、接続切断を防ぎましょう。
エンコーディングオプション
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
| ビットレート | 4500kbps | 動画品質の調整 |
| フレームレート | 30fps | 再生の滑らかさ |
| キーインターバル | 4秒 | キーフレームの頻度 |
APIエンドポイント
curl -X POST https://api.livekit.io/v1/egress/start \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{
"room_name": "training-room",
"outputs": {
"rtmp": ["rtmp://live.twitch.tv/app/streamkey"],
"hls": {
"segment_duration": 4,
"playlist_name": "training.m3u8"
}
}
}'
主要なデータ構造
| コンポーネント | 説明 |
|---|---|
| EncodedFileOutput | エンコード済みファイルの出力設定 |
| StreamOutput | ストリーム配信先の設定 |
| ImageOutput | スクリーンショットの取得設定 |