WebRTC SFU でマルチストリームで配信が存在しない場合に視聴のみでも接続を実現した話

何言ってるかわからないと思いますが、3 年間くらい実現ができなかったのができたので書いていきます。

まとめ

WebRTC SFU Sora はマルチストリーム視聴のみのとき配信がない場合でも接続を確立できるようになりました。

そもそものお話

WebRTC ってそもそも P2P が前提なので「何もしない状態」で接続するってのはそもそも想定されていません。

Peer to Peer である以上「相手がいる」のが前提になるのに「何もしない状態」で接続してくることがそもそもおかしいという話です。

ただこれ WebRTC SFU のようにサーバを経由する場合は話が別になります。例えばライブ配信のときって観客はまず接続しておいて、配信が始まり次第、映像が見られるようにするってのを実現したいですよね?

配信者が不特定多数ではなく固定されているのであれば事前に利用するコーデックを固定することで実現可能です。

たとえば配信者が VP8 なのに視聴者が H.264 で待ち構えていたらそれは流石に無理です。なので「固定」するわけですね。

ただこれって配信者が「固定」できる場合だけですよね。マルチストリームの場合は「誰がどんなコーデックで入ってくるか」は固定は一応できますが「選択権」があって、対応が難しいわけです。

もう過去になった PlanB の時代はこれが実現できたのですが、 Unified Plan がデファクトになった今は「相手のコーデック」を尊重するようになったため、相手が何を使ってくるかわかりません。そのため「事前に想定したコーデックでつないでおく」みたいな使い方はおすすめできません。

そのため、マルチストリームで視聴のみで配信者がいない状態で接続したいときって「何もしないけど接続したい」という状態なんです。

で、最初の話しに戻ります。「何もしないけど接続したい?、何を言ってるんだお前は」という感じになります。

SDP 的な話

さて、何もしないという状態とは何でしょうか。audio / video である m=audio, m=video を使わずにつなぐということです。

ただ残念ながら現在の WebRTC では m= が 0 は接続できません。というか普通できない気がします。RFC 確認してませんが繋がせては行けない気がします。

途中で配信が存在しなくなった場合

実はマルチストリームの不思議な機能に「配信されている状態で視聴のみをつなぎ、配信がなくなっても何故か接続可能状態になる」というものがあります。

これは「あとから配信が追加で入ってくるかもしれないから繋ぎっぱなしにしてる」というものだと思いますが、だったら最初から配信なしでも繋がせてくれよって思いますよね … 。

うまく行かないパターン

「まずはあたかも配信っぽくつないで、SDP の更新を利用して配信か視聴のみになりかわる」という案を思いつくのではないでしょうか?

どうでもいいんですが、マルチストリームの SDP 更新機能についてはあまり知ってる人はいないと思います。実は新しく m= が増えると更新が必要になります。さらに昔のは削除してはいけません。ちなみにこれは仕様です。SDP の更新が必要なこと、 SDP の更新ができることを知ってる人はほとんどいないと思います。豆知識でした。

配信っぽくつなぐというのがキモですが、そもそもカメラやマイクを持っていない端末の場合は Answer 自体が作れない可能性が高く、この案は使えません。

解決方法

せっかくなので内緒にしておこうと思いますが、 Sora を使ってるかたはすぐわかると思います。是非 Sora Lite とかを使って調べてみてください。

実は色々調査しようと思ってプロトタイプ作ったら思いの外、うまくいきました。どうやら Unifeid Plan になった恩恵を受けたようです。

Written by

Erlang/OTP / 時雨堂 / WebRTC / E2EE

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store