😸

極小規模でのライブ通信の料金比較について(P2P/ Agora/ SFU)

に公開

はじめに

ライブストリーミングアプリを作成しようと思い、ライブ通信の候補として、
WebRTC P2P or Agora or SFUが挙げました。

実際にアプリを作成して通信するにあたり、

  • 各々の通信手法にどのようなメリット、デメリットがあるのか
  • 1ヶ月単位の料金(概算)

は知っておく必要があると思い、調べていってここにまとめようと思います。

P2P/ Agora/ SFUそれぞれの特長

P2Pの場合

この特徴として、
料金が安いと言うメリットがあります。
STUNサーバーで通信が確立できた場合、通信する際にサーバーを、接続確立後は返さなくて良くなるので、通信料金料金として非常に安くなります。

しかしSTUNサーバーで通信が確立できなかった場合(NATやFirewallの影響で)、TURNサーバーを利用する必要があり、この場合、TURNサーバー経由で通信を返すことになるので料金としてまあまあ高くなります。

どれくらい料金がかかるのか概算してみましょう。以下の公式サイトを参考にします。

前提として以下を参考にすると、
TURNサーバーを東京リージョンのEC2にした場合、
インターネットへのデータ転送(OUT) :
月100GBまで無料で、超過分は従量課金。最初の10TB/月まで $0.114/GBらしいです。
また、
インターネットからのデータ転入(IN):
USD 0.00/GB(無料🙌)
とのことです。
https://aws.amazon.com/jp/ec2/pricing/on-demand/

STUNで経路探索が成功する場合のデータ転送料

STUNサーバーは経路探索時の経路探索時の小さなパケットのみのデータ転送量で、せいぜい1回あたり数KB〜数十KBなので、データ転送料は発生しないでしょう。

また、実メディアは端末間P2Pで直接流れるため、サーバのOUTの実質ゼロです。

これらを踏まえると、データ転送(OUT)の料金は、STUNの場合月100GB無料枠内に収まるのでデータ転送料は発生しないと考えていいでしょう。

STUNで接続確立できず、TURNサーバーを経由する場合のデータ転送料

TURNはサーバ中継なので、サーバから各クライアントへの“下り”が全部EC2のOUTとして課金されます(INは無料)。

ここで、ライブ配信の場合はデータが一方から片方通信になります。(P2Pで双方向にデータ転送する必要がない)ため、ビットレート×1(片方通信)のデータ転送量のみを考えればいいです。

ここで、1 Mbps のストリームを1時間流すと、
1 Mbps(メガビット毎秒)は
1,000,000 bit/s ÷ 8 = 125,000 Byte/s = 0.125 MB/s
0.125 MB/s × 3600 s = 450 MB/h = 0.45 GB/h

より、約0.45GBのデータ転送量になることが計算できます。

ライブで画像と音声を片方通信する場合、ビットレート(1秒間に転送または処理できるデータ量)は「映像ビットレート」+「音声ビットレート」= 「オーバルビットレート(映像ビットレートと音声ビットレートを合計した値)」となります。

https://www.stream.co.jp/blog/blogpost-32369/
こちらの記事を拝見したところ、
MP3、AAC、WMAなどは96kbps~128kbps程度らしいので、大体100kbpsとしましょう。

また、https://www.stream.co.jp/blog/blogpost-32369/#:~:text=映像ビットレートは数値,ということも多いです。
こちらの記事で、ネット配信の際によく使われている映像の解像度と適性ビットレートの目安について30fps想定(一般的に配信で使われている値)で記載があり、解像度は720×480ピクセルで、動物のライブ配信なので動きが多いと考えると大体1Mbps~2Mbpsとなるでしょう。
以下に解像度の比較した記事がありました。
https://jamdesign.co.jp/staffblog/about-pixel20210628/

となると、データ転送料は、

おおよそ2Mbpsとすると、1時間あたりのデータ転送量は
(2Mbps+0.1Mbps)×0.45 = 0.945 GB/h
つまり、映像 2 Mbps、音声 0.1 Mbpsを1時間送信すると、
約0.945GBのデータ転送量になることがわかります。

さて、AWSでは、データ転送料金が初回の10TBまでは$0.114/GBだったので、1時間あたりの料金は
0.945 GB/h × $0.114/GB = $0.108 /時間

と言うことがわかりました。
今考えているのは、配信者と視聴者が明確に分かれているライブ配信型なので、1人で1時間配信を見る場合は$0.108、2人の場合は2倍して$0.215、、と言うように、倍の数にしていけばいいです。

つまり、$0.108 /(時間・人)
と言う料金設定ができます。

P2PがSTUNだけ成立する場合としない場合

STUNだけでいける場合は、
・互いにUDPが通る(一般的な家庭用ルータ・モバイル回線)
・NATがFull-cone / (Address|Port)-restricted coneで、対称NATでない
・企業/学校のファイアウォールでUDPが塞がれていない

場合です。
一方、TURNが必要になる(中継が要る)場合は、

  • 対称NAT (Symmetric NAT) の背後
  • UDPがブロック(企業ネット/公共Wi-Fi等)。443/TCPしか通らない
  • 厳しいファイアウォール/プロキシ(ALGsやIDSの影響含む)
  • NATヘアピン不可で同一NAT配下同士が外向け経路で合流できない
  • IPv6/IPv4ミスマッチで片系が到達できない
    といった場合でしょう。

いろいろ複雑で、TURNがいる場合はどのくらいかと言うことですが、
以下の記事を見ると大体20%程度とのことでした。
https://www.reddit.com/r/WebRTC/comments/139ywjj/are_there_some_stats_on_the_average_failure/?tl=ja

P2Pの料金概算

さて、要件は揃いました。
20%TURNで、東京リージョンのEC2を使用した場合の平均コストは
$0.108 /(時間・人) × 0.20 = 0.0216 / (時間・人)
と言うことがわかりました。

1ドル=150円とすると、
0.0216×150=約3.24円 / (時間・人)

です。つまりP2Pの8割がSTUN直通、2割がTURN経由 なら、1(時間・人)あたり 約3円強 の通信費が平均的にかかると言うことがわかりました。

なかなか計算大変でしたね。お疲れ様です。

その他P2Pデメリット

P2Pに関して、その他大変なことがあるとすると、コーディング作成です。
うまくいくP2Pのコーディングをすることが必要ですね。

Agoraの場合

次にAgoraについて説明していきます。
Agora(アゴラ)は、開発者が自身のアプリケーションにリアルタイムの音声通話、ビデオ通話、ライブ配信、メッセージング機能などを組み込むためのクラウドプラットフォームです。

通信の分野においては、主に以下のような特徴があります。

  • リアルタイムコミュニケーション (RTC): 超低遅延での通信を実現しており、Web会議システム、音声SNS(Clubhouseなど)、ライブコマース、メタバースなどの分野で広く利用されています。
  • SDK(ソフトウェア開発キット)の提供: iOS、Android、Web、Unityなど多様なプラットフォームに対応したSDKを提供しており、開発者はこれらのライブラリをアプリに組み込むことで、複雑な通信インフラを自前で構築することなく、簡単に通話・配信機能を実現できます。
  • 独自のネットワーク基盤 (SD-RTN): WebRTC互換の技術を用いつつも、P2P(ピアツーピア)ではなくAgora独自のグローバルなネットワーク基盤「SD-RTN (Software-Defined Real-Time Network)」を経由して通信を行います。これにより、ネットワークの混雑やパケットロスに強く、高品質で安定した通信を提供します。
  • スケーラビリティ: 大規模なライブ配信(100万人の視聴対応など)にも安定して対応できる拡張性を持っています。
  • 豊富なAPIと機能: 通話・配信機能に加え、リアルタイム文字起こし、録画・録音、リアルタイム翻訳、AI連携などの多様な追加機能もAPIとして提供されており、幅広いカスタマイズが可能です。

要約すると、Agoraは、アプリケーションに高品質なリアルタイム通信機能を手軽に実装するための、強力なプラットフォームであると言えます。
WebRTC互換の技術を使っていますが、そのネットワークのグローバル基盤の安定性があり、NAT/ ファイアウォール越えでもSD-RTNノードが中継するため通信が非常に安定しています。TURNサーバーを自前で構築する必要もありません。

Agoraの場合の料金試算

前提

Agora公式のリアルタイム通信(RTC)料金体系は、次の通りです:
ただし、前提として音声と動画のライブ配信であり、片方向通信(非インタラクティブ)尚且つ数十~数百人程度の少人数視聴を考えています。

https://www.agora.io/en/pricing/
https://docs.agora.io/en/broadcast-streaming/overview/pricing
こちらを確認すると、
私が想定するサービスは「Broadcast StreamingのHD Videoプラン」に該当しそうでした。

この料金体系としては、

のようになっており、配信側、視聴者側双方で料金がかかるみたいです。

単価としては、視聴者は$1.99/1,000分で、配信側は$3.99/1,000分(1視聴者あたり)になりそうです。
これを1時間あたりに直すと

ロール 単価/1,000 分 1 時間あたり (USD) 円換算 (¥150/USD)
視聴者 HD $1.99 $0.1194 約 ¥18 / 人 時間
配信者 HD $3.99 $0.2394 約 ¥36 / 人 時間

また、毎月最初の10,000分までは無料枠があります。(但し、配信者・視聴者を区別せず、すべての利用分(Standard Minutes)を合算した合計に対して)

料金算出

以下の前提で、1時間・人あたりの料金を算出します。

  • Agora Broadcast Streaming(HD 720p)を使用
  • 配信者:1名
  • 視聴者:10名
  • 無料枠 月10,000分(配信+視聴者全員の合算)

視聴者の合計コスト:10人×(1.99×0.06)=10×0.1194=$1.194
配信者のコスト:  1人×(3.99×0.06)=$0.2394

よって合計コスト(1時間・人あたり)
1.194+0.2394÷10(人)= $0.14334 = 約 ¥22/時間・人

であることがわかります。
また、無料枠として月10,000分無料で、1時間あたり使用時間は
配信者:60分+視聴者10名×60分=660分
なので、約15.15時間分無料となります。

P2PとAgoraの比較

P2Pと比較すると、平均10人配信されると考えると、
P2Pでは毎時間約32円、Agoraでは初回の15時間は無料、以降は1時間あたり220円かかります。よって、

区間 Agora累計 P2P累計 比較
0〜15h ¥0 ¥480 Agora優勢
16h 約¥220 ¥512 Agoraまだ安い
17h 約¥408 ¥544 ほぼ拮抗
18h 約¥596 ¥576 P2Pが安い

となり、18時間を超えたあたりから通信量としてはP2Pの方が料金として安価となることが推定できました。

しかし、TURNサーバーを構築する手間と費用が別途かかることが問題としてあります。
仮にAWSのEC2(t3.micro)にTURNサーバーを立てる場合、ネットワーク性能は
程度バースト時に最大5 Gbpsですが、持続的には約500 Mbpsあたりです。
また、P2P通話において、
送信: 2.1 Mbps(映像2 + 音声0.1)
受信: 2.1 Mbps(映像2 + 音声0.1)
より理論上の最大接続数は
500 Mbps ÷ 4.2 Mbps = 約119人
です。しかし実際のところ、t3.microではメモリが1GBでメモリ不足に陥るのが最初でしょう。
10人くらいの同時接続が限界な気がするのですが、開発では問題ないと思います。

料金としては、t3.microにサーバーを立てる場合、
$0.0136/時間(約1,470円/月)(https://aws.amazon.com/jp/ec2/pricing/on-demand/)
がかかってきます。

こうなると、料金についてかなりかかるので、開発・検証においてはWebサプリと同居させるのが最もいいかなと思いました。

(補足メモ)TURNサーバーの構築や、STUN/TURNの基礎については、以下が参考になりました。
coTURN(STUN兼TURNサーバが構築できるOSS)を使って構築をしています。
https://qiita.com/okyk/items/2d7db6b148a43bc3b405

(補足メモ)TURNサーバーとアプリを本番環境で絶対同居してはいけない理由
->セキュリティリスク:
TURNサーバーは、外部公開必須で、攻撃対象になりやすいです。
また、WebアプリにはDB接続情報などの機密データがあります。そのため、同じサーバーだとリスク増大

SFUの場合

自前で mediasoup/Janus などを EC2 上に構築することを考えます。

SFUとは

WebRTC SFU(Selective Forwarding Unit)は、サーバーが配信元のデータを受け取り、複数の視聴者にそのまま転送する構造です。これにより、配信元の負荷は軽減され、複数拠点への効率的なデータ配信が可能となります。

P2P通信が端末同士が直接接続しデータを送受信する仕組みである一方で、SFUの場合はSFUサーバ-が必ず配信元と配信先を仲介します。

(補足メモ)TURN と SFU の根本的な違い
TURNは、全てのデータを単純に中継します。
[ユーザーA] ←→ [TURNサーバー] ←→ [ユーザーB]

一方、SFUサーバーは必要な相手にだけ選択的に転送します。
[配信者] → [SFUサーバー] → [視聴者1]
↘ → [視聴者2]
↘ → [視聴者3]

TURNとの通信料金の違いについてですが、
TURN使用時(P2P)

配信者: 2Mbps × 10人 = 100Mbps必要
TURNサーバー: (2Mbps受信 + 2Mbps送信)× 10 = 20Mbps転送量)

SFU使用時

配信者: 2Mbps × 1本だけ
SFU: 2Mbps受信 + 2Mbps×10送信 = 20Mbps(転送量)

但し、TURNサーバーはSTUNを試した後に繋ぐことになるので、サーバーを通した転送量は実質的に小さくなるでしょう。

また、SFUとして、TURNサーバーより高性能なサーバーが必要となることを考えると、SFUは、小規模配信には不向きなのかなと思いました。

(補足メモ)SFUサーバーがTURNサーバーより高性能となる理由

  1. CPU使用率
    TURNだと、処理内容としてはバケット転送のみである一方、SFUだと
    RTPパケット解析はRTCP処理、キーフレーム管理、帯域幅推定等でより高いCUP使用率となる。

  2. メモリ使用量
    TURNは、接続情報のみである一方で、SFUは、バッファやパケット履歴等も管理

おわりに

料金を主軸にWebRTC P2PとAgora、Web RTC SFUについて比較していきました。
個人的には開発時にはWebRTC P2Pで、TURNサーバーを同居させる仕組みで対応し、
本番環境時にはセキュリテイも兼ねて、TURNサーバーを別居、
さらに、10人以上の同時通信となる場合はSFUに切り替える、といった流れでいいと思いました。

Discussion