Cloudflare StreamでSRTプロトコルを使ったライブストリームをやってみた

Cloudflare Streamではライブストリーミングの際の映像打ち上げプロトコルに次世代の映像伝送プロトコルであるSRTもサポートしています。サポートにいたった背景や、Stream Connectでの利用もあわせて確認してみます。
2022.04.30

はじめに

清水です。Cloudflareの動画配信プラットフォームのサービスCloudflare Streamでは、ライブストリーミングの際のIngestのプロトコルにRTMP(S)のほか、SRTプロトコルも利用可能です!本エントリではSRTプロトコルを使ったCloudflare Streamでのライブストリーミングの試してみたのでまとめてみます。SRTプロトコルでの映像の打ち上げにはOBS Studioを使用し、またStream Connectを使ったSRTからRTMPへの転送も確認しています。

RTMPとSRT ~ 映像打ち上げ時のプロトコルについて

Streaming Softwareからインターネット上のストリーミングサービスやストリーミングサーバへ映像の打ち上げ、Ingestとかファーストマイルなどと呼ばれています。このファーストマイルで使われるプロトコルとして最も有名なものの1つがRTMPかと思います。ストリーミングサービスとして有名なYouTube Live、Facebook Live、Twitchなど多くの動画配信プラットフォームでRTMPが利用可能です。

さてこのRTMP、開発元はAdobeです。(もともとの開発元は今はなきMacromedia。)Adobe Flashで利用されるプロトコルが広がり、Adobe FlashならびにラストマイルでのRTMPの利用が勇退したあとも、ファーストマイルではいまだに利用され続けているという実情となります。これらの詳細は以下エントリも参照ください。

ファーストマイル、ライブストリーミング映像の打ち上げについて、そろそろ他のプロトコルに移行したいんだけど実際RTMPが使えるStreaming Softwareが多く、動画配信プラットフォームでもほとんどがRTMPをサポートすることでいまだにRTMPの利用から抜け出せないでいる、というような状況下と感じています。

さて、Cloudflare Streamの話です。Cloudflare Streamでライブストリーミングをサポートしたのは2021年の出来事だったようです。このとき動画配信プラットフォームとしてファーストマイル、Ingestのプロトコルとしてそのメリットの多さから昨今利用が広がっているSRT (Secure Reliable Transport)を利用するのか、利用者や利用できるStreaming Softwareが多いRTMPを利用するのかがやはり議論となっていたようで、ライブストリーミング機能のリリース当時はけっきょくRTMPのみがサポートされるようになりました。しかし、その後の機能アップデートにより2022年3月(わりと最近ですね)にSRTプロトコルのサポートもはじまりました。この詳細は以下のCloudflare公式ブログにまとまっています。

TCPベースのRTMPに対して、UDPベースでありながらパケロスからのリカバリ対策など信頼性も高いというSRTのメリットのほか、動画配信プラットフォーム(つまりIngest先)としてRTMPを再実行することの大変さも語られています。(ハンドシェイク時に"Genuine Adobe Flash Media Server 001"というテキストをやり取りすのは知りませんでした……。)

Cloudflare StreamでSRTプロトコルを使ったライブストリームをやってみる

映像打ち上げ時のプロトコルの実情、そしてCloudflare StreamでSRTプロトコルサポートにいたった背景などをざっと確認したところで、本題のSRTプロトコルを使ったCloudflare Streamのライブストリームを試してみましょう。

SRTプロトコルを使って映像を打上げる際に問題となりうるのが、Streaming Softwareの対応状況です。正直なところRTMPよりも対応Streaming Softwareが限られてしまい、いつも利用しているStreaming SoftwareがSRTプロトコルに対応していない、なんてこともあるかと思います。

そんな中ですが、今回はOBS Studioを使います!私もこちらのエントリを読むまで知らなかったのですが、OBS StudioはSRTに対応済みということです。今回はmacOS Big Sur上に現時点で最新版のOBS Studioをインストールしました。

Cloudflare Stream側の準備はこれまでと変わりません、名前を指定してLive Inputを作成します。

接続情報の確認で、プロトコルとしてRTMPSではなくSRTを選択します。「表示」部分のリンクからSRT URLが確認可能です。(確認の際には、このURLがプライベート情報であるため画面を共有していないかの確認ダイアログが入ります。)

なおAPIからもSRT URLは確認可能です。/live_inputs/${LIVE_INPUT_UID}にGETリクエストを行います。

 % curl -X GET \
     -H "Authorization: Bearer ${TOKEN}" \
     "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT}/stream/live_inputs/${LIVE_INPUT_UID}"
{
  "result": {
    "uid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "rtmps": {
      "url": "rtmps://live.cloudflare.com:443/live/",
      "streamKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "srt": {
      "url": "srt://live.cloudflare.com:778",
      "streamId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "passphrase": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "created": "2022-04-30T08:13:04.780963Z",
    "modified": "2022-04-30T08:13:04.780963Z",
    "meta": {
      "name": "srt-test-live-input"
    },
    "status": null,
    "recording": {
      "mode": "automatic",
      "requireSignedURLs": false,
      "allowedOrigins": null
    }
  },
  "success": true,
  "errors": [],
  "messages": []
}

ダッシュボードからは以下の形式でSRT URL(StreamIDとPassphraseを含む)が取得できます。API経由で取得した場合は以下のフォーマットに整形しておきましょう。

  • srt://live.cloudflare.com:778?passphrase=$PASSPHRASE&streamid=$STREAMID

OBS Studioへは、サーバーの箇所にこの形式でURLを貼り付けます。設定画面の「配信」の箇所ですね。

サービスは「カスタム」を選択しておき、ストリームキーの欄は入力しません。この設定で[配信開始]します。

SRTプロトコルでの映像の打ち上げをCloudflare Streamで受け、ライブストリームができました!なお画質、ビットレートなどは利用しているWebカメラやOBSの設定(PCが重くなるのが嫌だったので、、それほど高いビットレートや解像度にしていません)によるところが大きいため、他ブログエントリで紹介しているRTMPでの配信の場合との比較にはならないかと思います。あくまでSRTプロトコルで打ち上げた映像でライブストリーミングができている、という点をご確認ください。

SRTプロトコルで打ち上げた映像をRTMPで転送する

さて、Cloudflare StreamのライブストリーミングにはStream Connectというライブストリーミングを他プラットフォームに転送するサイマル放送(Simulcasting)用の機能があることを先のエントリでお伝えしました。

Cloudflare Streamの機能の1つとして、このStream Connectを使ってSRTプロトコルで受けた映像をRTMPプロトコルで、もしくはその逆のRTMPプロトコルで受けた映像をSRTプロトコルで転送することが可能です。SRTへの移行期である昨今、まだまだRTMPのみしか対応していない動画配信プラットフォームもあるかと思いますので、このプロトコルを変更しての転送は大変うれしい機能ではないでしょうか。今回はここまで確認してきたOBS StudioからのSRTプロトコルでの映像を打ち上げをCloudflare StreamのStream Connectを使ってYouTube Liveへの転送を確認してみます。

Stream Connectの設定は映像打ち上げにRTMPを使っている場合と変わりありません。まずはYouTube Live側の準備をして、ストリームURLとストリームキーを確認しておきます。

Cloudflare Streamの該当Live Inputで出力を作成します。出力するプロトコルとしてはRTMP(S)を選択し、YouTube LiveのURL(ストリームURL)、キー(ストリームキー)を入力します。

出力が作成できました。まだ映像の打ち上げを開始していないため「接続解除」の状態ですが、先ほどと同じようにOBS StudioからCloudflare StreamのChannel InputにSRTプロトコルで映像を打ち上げてみましょう。

映像打ち上げ後、ステータスは「接続済み」に変わります。YouTube Live側でもストリームを受け配信の準備ができた状態になります。

YouTube Live側でライブ配信を開始します。SRTからRTMPに転送したサイマル放送ができました!

まとめ

Cloudflare StreamのライブストリーミングでSRTプロトコルを使って映像の打ち上げ、ならびにSRTプロトコルからRTMPプロトコルでのYouTube Liveへの転送(サイマル放送)をやってみました。ライブストリーミングプラットフォームとしてIngestに次世代のプロトコルであるSRTが利用できることは大変大きなメリットと感じます。またSRTからRTMPでの転送もサポートしている点も大変うれしいですね!Streaming Softwareとして代表的なOBS StudioもSRTプロトコルに対応しました。これからいよいよRTMPからSRTへの移行が本格化するのではないでしょうか。