LiveKit Egressサービスの録画と合成機能

概要 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 スクリーンショットの取得設定

タグ: LiveKit ストリーミング配信 録画処理 RTMP HLS

6月7日 23:32 投稿