録画機能

概要

Sora では、配信している映像や音声を録画して保存することが可能です。 配信されている映像をできるかぎりそのまま保存するため、CPU リソースを最小限に抑えることができます。 生成される録画ファイルは WebM 形式です。映像のみの録画、音声のみの録音にも対応しています。

録画時には一切トランスコードを行っておりません。配信された映像をそのままに記録します。

制限

コーデック

録画 (録音) は、映像コーデックに VP8 と VP9 と H.264 、また音声コーデックに Opus を選択した場合のみ可能です。

解像度

WebRTC では配信側の CPU リソースが不足した場合や、回線の品質が悪化した場合に解像度を動的に変更します。 そのため録画したデータの途中が解像度が低くなる可能性があります。

音声や映像のクライアント側でのトラック削除

クライアント側でシグナリング接続時に音声や映像を有効にした状態で、 クライアント側で音声トラック、または映像トラックのどちらかを削除した場合でも録画は行われます。さらに追加して戻した形であれば録画側も戻ります。

ただし、音声と映像両方のトラックを削除した場合は正常に録画が行われません。

サイマルキャストやスポットライトでの録画

サイマルキャストやスポットライトを有効にした場合の録画には対応していません。

無変換録画

WebRTC 経由で流れてきている映像や音声を変換せず、そのまま録画するファイルの形式に組み立て直してファイルを保存します。 そのため、CPU リソースを最小限に抑えられます。ブラウザでの録画など、通常の録画は変換が入るため CPU に多くの負荷がかかります。

変換を行わないため、録画を終了したタイミングですぐに録画したファイルを取得することができます。

解像度は送られてきた映像の最大値を録画ファイルの解像度として使用します。

録画の開始と終了について

Sora の録画機能は 明示的にチャネルの録画を停止するか、チャネルの録画開始から指定した期限が過ぎるまでは、そのチャネルでの配信を自動で録画する といった機能になります。

録画関連イベントのウェブフックについて

録画した配信がファイルに変換され使用可能になったタイミングで archive.available という通知が送られます

詳しくは 録画・録音保存イベント をご確認ください。

録画終了時に生成されるファイルについて

録画が完了したファイルは sora.confarchive_dir に指定したフォルダに置かれます。

録画ファイル単体でのファイル

この際ファイルは JSON 形式のファイルと WebM 形式のファイルの二つが生成されます。 JSON 形式のファイルは WebM 形式のファイルのメタデータファイルです。 WebM ファイルがいつ生成され、どんな形式なのか、開始時刻や終了時刻などの情報が含まれています。

  • start_timestamp

    • この録画が開始された時刻を UTC で表しています

  • stop_timestamp

    • この録画が終了した時刻を UTC で表しています

  • start_time

    • この録画が開始された時刻を UNIX 秒で表しています

  • stop_time

    • この録画が終了した時刻を UNIX 秒で表しています

{
  "audio": {
    "codec_type": "OPUS"
  },
  "channel_id": "sora",
  "client_id": "EJNYER94254BS0MZ9A4YM8VFAC",
  "connection_id": "EJNYER94254BS0MZ9A4YM8VFAC",
  "created_at": 1591679810,
  "file_path": "/path/to/sora/archive/N6SQA8CWSH2Y94EXKDZBBFRJTG.webm",
  "filename": "N6SQA8CWSH2Y94EXKDZBBFRJTG.webm",
  "metadata_file_path": "/path/to/sora/archive/N6SQA8CWSH2Y94EXKDZBBFRJTG.json",
  "metadata_filename": "N6SQA8CWSH2Y94EXKDZBBFRJTG.json",
  "size": 784056,
  "start_time": 1591679791,
  "start_timestamp": "2020-06-09T05:16:31.845946Z",
  "stats": "<省略>",
  "stop_time": 1591679810,
  "stop_timestamp": "2020-06-09T05:16:50.753373Z",
  "video": {
    "bit_rate": 1000,
    "codec_type": "VP9",
    "height": 480,
    "width": 640
  }
}

録画に対する全体のファイル

StopRecording API を使用して指定したチャネルに対する録画を停止した場合、それまでにそのチャネルで録画した ファイル一覧の JSON ファイルが生成されます。 このファイルは主にマルチストリームや途中で切れてしまった場合などを考慮しております。 録画ファイルのグルーピングを目的としたファイルです。

  • start_time_offset

    • StartRecording API を叩いてから何秒経過した後にこの録画が開始したかを表しています

  • stop_time_offset

    • StartRecording API を叩いてから何秒経過した後にこの録画が終了したかを表しています

{
  "archives": [
    {
      "client_id": "JZV2ZTZ4H1BH44QHA9JJS1GKG",
      "connection_id": "JZV2ZTZ4H1BH44QHA9JJS1GKG",
      "file_path": "/path/to/sora/archive/6TP0C3WP697N9AY5WG9CBQGYZG.webm",
      "filename": "6TP0C3WP697N9AY5WG9CBQGYZG.webm",
      "metadata_file_path": "/path/to/sora/archive/6TP0C3WP697N9AY5WG9CBQGYZG.json",
      "metadata_filename": "6TP0C3WP697N9AY5WG9CBQGYZG.json",
      "size": 746029,
      "start_time_offset": 0,
      "start_timestamp": "2020-06-09T05:16:31.851234Z",
      "stop_time_offset": 19,
      "stop_timestamp": "2020-06-09T05:16:50.759631Z"
    },
    {
      "client_id": "EJNYER94254BS0MZ9A4YM8VFAC",
      "connection_id": "EJNYER94254BS0MZ9A4YM8VFAC",
      "file_path": "/path/to/sora/archive/N6SQA8CWSH2Y94EXKDZBBFRJTG.webm",
      "filename": "N6SQA8CWSH2Y94EXKDZBBFRJTG.webm",
      "metadata_file_path": "/path/to/sora/archive/N6SQA8CWSH2Y94EXKDZBBFRJTG.json",
      "metadata_filename": "N6SQA8CWSH2Y94EXKDZBBFRJTG.json",
      "size": 784056,
      "start_time_offset": 0,
      "start_timestamp": "2020-06-09T05:16:31.845946Z",
      "stop_time_offset": 19,
      "stop_timestamp": "2020-06-09T05:16:50.753373Z"
    }
  ],
  "channel_id": "sora",
  "created_at": 1591679791,
  "expire_time": 3600,
  "expired_at": 1591683391,
  "id": "2MR3MK0GDH6BV0JXBSN1ZX7VH4",
  "metadata_file_path": "/path/to/sora/archive/2MR3MK0GDH6BV0JXBSN1ZX7VH4.json",
  "metadata_filename": "2MR3MK0GDH6BV0JXBSN1ZX7VH4.json"
}

試してみる

Sora では録画機能を試すためのデモ機能を提供しています。 デモ機能 を参照の上、デモ機能を有効にしてください。

チャネルの録画開始

ここでは Sora が立っているサーバの IP アドレスを 192.0.2.1 で HTTPS を利用していることを仮定しています。

API を叩いて録画を開始してください。

httpie:

$ http POST 192.0.2.1:3000/ \
    x-sora-target:Sora_20161101.StartRecording \
    channel_id=sora \
    expire_time:=3600 -vvv

curl:

$ curl -X POST 192.0.2.1:3000/ \
    -H "x-sora-target: Sora_20161101.StartRecording" \
    -d '{"channel_id": "sora", "expire_time": 3600}' -vvv

その後 https://example.com/sendonly.html を開き、 connect ボタンを押して配信を開始します。

切断またはチャネルの録画終了、もしくはチャネルの録画期限が来たタイミングでクライアントの録画は終了します。

チャネルの録画終了

チャネルの録画を終了するには API を叩く必要があります。

httpie:

$ http POST 192.0.2.1:3000/ \
    x-sora-target:Sora_20161101.StopRecording \
    channel_id=sora -vvv

curl:

$ curl -X POST 192.0.2.1:3000/ \
    -H "x-sora-target: Sora_20161101.StopRecording" \
    -d '{"channel_id": "sora"}' -vvv

その後 archive/ ディレクトリに webm 形式のファイルが生成されているはずです。 Chrome または Firefox にドラッグアンドドロップして、動作を確認しましょう。