---
# System prepended metadata

title: WebRTCを使って動画を配信する技術の勉強

---

# WebRTCを使って動画を配信する技術の勉強
## WebRTCとは
Web Real-Time Communication
リアルタイムなコミュニケーションを可能にする技術

> WebRTCは様々なシーンで利用されています。例えば、Web会議、Web面接、オンライン営業などのビジネスシーンではもちろん、オンライン教育、ボイスチャット、オンラインクレーンゲームなどでも利用されています。
> また、遠隔医療、オンラインフィットネス、IoT映像配信、VRライブ配信など今後その利用シーンはさらに広がることが予想されます。
> (https://jp.vcube.com/sdk/blog/webrtc-general-server-configuration-signaling-turn-sfu.html より)

## 基礎知識
### 配信方法
この３つをまず覚える。

- P2P
- SFU
- MCU

SFUが主流。
MCUは多分使うことないから無視していい。

#### P2P
ユーザー間で直接動画のやりとりをする
サーバーは動画を流さない
1:1の通信で最近よく使われてるらしい
大人数になると結構カクカク

#### SFU
サーバーはクライアントから別のクライアントにそのまま動画を流す。
転送するだけなので処理は小さい
多くのサービスはSFUを自社開発して使ってる
大人数でもサーバーの処理能力次第でサクサクいける

#### MCU
サーバー内でクライアントから送られてきた動画を合成してクライアントに返す
合成が入るので処理は大きい
WebRTCの話するときに出てくるけど最近のサービスはSFUで大体やってるから無視していい。

### コーデック
これまず見とく。
https://zenn.dev/voluntas/scraps/82b9e111f43ab3#comment-2bc538f8f49d49

調べてると大体映像コーデックが、特にモバイルのブラウザに対応してるかの話がよく出てくる。

ブラウザ自体が対応しているかどうかと、ライブラリが対応しているかを確認する必要がある。

各映像コーデックをブラウザが対応してるかをまとめてる資料↓
https://gist.github.com/voluntas/59a135343538c290e515#vp8

### STUN/TURN
どっちもNAT超えのプロトコル。WebRTCの接続の話で絶対出てくるし実際使うと思うので覚えてとくべき。

#### STUN
UDPでNATを超えるためのプロトコル

#### TURN
マルチメディアアプリケーション(動画とか音声)がNATやファイアウォールを超えて通信するためのプロトコル

NATはIPアドレス変換するやつ。例えばインターネットつなげたい機器をルータに繋いで、機器ごとのプライベートIPアドレスをネットに繋がるようにグローバルIPアドレスに変換したりするのに使ったりする。

ICEっていうSTUNとTURNを組み合わせた感じのプロトコルもあるけど、WebRTCだとSTUNかTURNを使うのがほとんどみたい。
特にWebRTCだとTURNの話が多いから、STUNを軽く覚えたら後はTURNのことだけ考えたらいい。
WebRTCで配信につながらないことが多いときの原因は大体TURNサーバーがないことが原因になってることが多いらしい。

TURNサーバーは、簡単にいうと、WebRTCだと動画とか音声配信するからUDP使うけど、うまくクライアント同士をつなげるには専用のプロトコルがないと繋がりにくいので、TURNプロトコルを導入してクライアントを繋げるためのサーバー。

STUNとNAT超えの話
https://qiita.com/Jxck_/items/a59d8896b845a8da2445

仕様についてはこれを見るべき。
https://gist.github.com/voluntas/a1d39c2b2a4392956ff69732dc493e39

### Data Channel データチャネル
WebRTCは音声や動画の配信に使うけど、それ以外の用途でも使えるようにできる。
動画配信のときでもデータチャネルを使えば色々便利らしいから覚えるべき。
ライブラリだと、Data Channel対応かどうかが比較の検討項目にあがる。
主な使い道は下のサイトにまとまってる。
https://qiita.com/udonchan/items/7f5ffa9e8982ae1636c3

## Janus Gateway
WebRTCの動画配信サーバーを組む仕組みを提供するライブラリ。
Data Channel対応。
pluginで機能追加が容易。
ライセンスはGPL3.0。
Janus Gatewayはサーバー側だけの話なので、そのままサービスに使って商用利用しても大丈夫。
ソースいじるならGPL3.0のライセンスのもとソースコード公開しないといけない。
WebRTCのOSSの中では一番機能が多いと思う。

## これからWebRTCするときに絶対読むべき資料
実際にやるときこれが一番参考になる
https://zenn.dev/voluntas/scraps/82b9e111f43ab3

用語とライブラリがまとまってる
https://gist.github.com/voluntas/59a135343538c290e515

商用利用できるSFUまとめ
https://gist.github.com/voluntas/379e48807635ed18ebdbcedd5f3beefa#%E3%81%8A%E9%87%91%E3%82%92%E6%89%95%E3%81%86%E7%94%A8%E6%84%8F%E3%81%AF%E3%81%AA%E3%81%84-oss-sfumcu-%E7%B7%A8

UbuntuにTURNサーバーの構築
https://ja.tech.jar.jp/webrtc/turn.html


## おまけ
海外のOSS なWebRTC SFU 開発者たちがコミュニティに絶望してる話
https://voluntas.medium.com/%E6%B5%B7%E5%A4%96%E3%81%AEoss-%E3%81%AAwebrtc-sfu-%E9%96%8B%E7%99%BA%E8%80%85%E3%81%9F%E3%81%A1%E3%81%8C%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%81%AB%E7%B5%B6%E6%9C%9B%E3%81%97%E3%81%A6%E3%82%8B%E8%A9%B1-5facd098d3f0