録画機能

概要

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

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

プレビュー機能

  • PCMU 録音機能

制限

コーデック

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

PCMU

プレビュー版として提供中です

PCMU は音声のみの録音を行う場合のみに対応しています。

解像度

現在 Chrome や Firefox では回線の品質が悪化した場合、解像度を動的に変更しています。 そのため録画したデータの途中が解像度が低くなる可能性があります。

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

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

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

無変換録画

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

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

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

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

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

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

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

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

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

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

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

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

  • start_time
    • この録画が開始された時間を UNIX 秒で表しています
  • stop_time
    • この録画が終了した時間を UNIX 秒で表しています
{
  "audio": false,
  "channel_id": "sora",
  "client_id": "b9d852cc-a683-4ecf-8cdb-aada84152f3f",
  "created_at": 1494215777,
  "file_path": "/path/to/sora/archive/9b32e425-05cb-463b-897c-d13f52b35f21.webm",
  "filename": "9b32e425-05cb-463b-897c-d13f52b35f21.webm",
  "metadata_file_path": "/path/to/sora/archive/9b32e425-05cb-463b-897c-d13f52b35f21.json",
  "metadata_filename": "9b32e425-05cb-463b-897c-d13f52b35f21.json",
  "size": 19842,
  "start_time": 1494215776,
  "stop_time": 1494215777,
  "video": {
    "bit_rate": 800,
    "codec_type": "VP8",
    "height": 480,
    "width": 640
  }
}

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

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

  • start_time_offset
    • StartRecording API を叩いてから何秒経過した後にこの録画が開始したかを表しています
  • stop_time_offset
    • StartRecording API を叩いてから何秒経過した後にこの録画が終了したかを表しています
{
  "archives": [
    {
      "client_id": "b9d852cc-a683-4ecf-8cdb-aada84152f3f",
      "file_path": "/path/to/sora/archive/9b32e425-05cb-463b-897c-d13f52b35f21.webm",
      "filename": "9b32e425-05cb-463b-897c-d13f52b35f21.webm",
      "metadata_file_path": "/path/to/sora/archive/9b32e425-05cb-463b-897c-d13f52b35f21.json",
      "metadata_filename": "9b32e425-05cb-463b-897c-d13f52b35f21.json",
      "size": 19842,
      "start_time_offset": 17,
      "stop_time_offset": 18
    },
    {
      "client_id": "85851802-766f-41db-902e-176165dbaed0",
      "file_path": "/path/to/sora/archive/159cb8bf-843a-4258-9c2e-4570f0cf09f8.webm",
      "filename": "159cb8bf-843a-4258-9c2e-4570f0cf09f8.webm",
      "metadata_file_path": "/path/to/sora/archive/159cb8bf-843a-4258-9c2e-4570f0cf09f8.json",
      "metadata_filename": "159cb8bf-843a-4258-9c2e-4570f0cf09f8.json",
      "size": 34449,
      "start_time_offset": 11,
      "stop_time_offset": 12
    },
    {
      "client_id": "27aa6c8e-5bd1-4102-9e10-f1bf83a21551",
      "file_path": "/path/to/sora/archive/a154865b-abe4-45b9-9aca-261de4a21259.webm",
      "filename": "a154865b-abe4-45b9-9aca-261de4a21259.webm",
      "metadata_file_path": "/path/to/sora/archive/a154865b-abe4-45b9-9aca-261de4a21259.json",
      "metadata_filename": "a154865b-abe4-45b9-9aca-261de4a21259.json",
      "size": 32249,
      "start_time_offset": 0,
      "stop_time_offset": 1
    }
  ],
  "channel_id": "sora",
  "created_at": 1494215759,
  "id": "67013db5-a9d8-4b3d-8187-422965487a62",
  "metadata_file_path": "/path/to/sora/archive/67013db5-a9d8-4b3d-8187-422965487a62.json",
  "metadata_filename": "67013db5-a9d8-4b3d-8187-422965487a62.json"
}

試してみる

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

注意

Firefox でご確認ください。Chrome では getUserMedia を使用する場合は HTTPS が必須となっているため、ここでは簡単に試してもらうという前提で Firefox でご確認ください。実際に動かす場合は Sora の前段に Nginx などを立てて HTTPS にしてください。

チャネルの録画開始

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

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

その後 http://192.0.2.1:5000/pub.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 にドラッグアンドドロップして、動作を確認しましょう。