Media over QUIC Transfork in Golang
Media over QUIC Transforkとは
QUIC上にメディアを構築するための交信プロトコル
どの層のプロトコルなの?
MOQ -> WebTransport -> HTTP/3 -> QUIC -> UDP...というように依存関係がなっている。
WebTransport(QUIC)上に構築されるプロトコルなのでQUICストリームの特性を生かしたデータ送信が可能。
利用例
- ライブ動画やライブ音声のリアルタイム通信
- CDN
Media over QUIC Transport との違い
複数の制御ストリーム
Media over QUIC Transportではすべての制御メッセージをひとつのQUICストリームで送ることになっている。
一方、MOQTransforkでは制御メッセージは種類ごとに別々のQUICストリームで送信される。
制御ストリームにはSubscribe Stream、Announce Stream、Info Streamの3種類があり、ひとつひとつのQUICストリームはひとつのやりとり
廃止された制御メッセージ
以下のメッセージがMOQTransportから派生してから廃止されました。
主な理由は、あえてMOQで定義したメッセージを送るのではなく、QUICにすでに備わっているメッセージでやりとりすればいいということです。
制御 | MOQTransport | MOQTransfork |
---|---|---|
SUBSCRIBEの許可 | SUBSCRIBE_OKを応答に送る | INFOメッセージを応答に送る。 |
SUBSCRIBEの拒否 | SUBSCRIBE_ERRORを応答として送る | エラーコードと一緒にSubscribe ストリームを閉じる。 |
SUBSCRIBEの解約 | UNSUBSCRIBEを送る | Subscribe ストリームを閉じる。 |
ANNOUNCEの許可 | ANNOUNCE_OKを応答として送る | ANNOUNCEメッセージを送る。 |
ANNOUNCEの拒否 | ANNOUNCE_ERRORを応答として送る。 | エラーコードと一緒にANNOUNCEストリームを閉じる。 |
策定されてない制御
以下の制御はMOQTransportに策定されているものの、まだMOQTransforkの方に策定されていない。
- 遷移制御
セッションを閉じる旨を通知し、送信側は既存のトラックの送信を停止し、新しいリクエストを拒否する。 - フェッチ制御
Frame vs Object
データの最小単位がMOQTransportではObject、MOQTransforkではFrameとなっている。
それぞれどちらも映像データにおける1フレームと対応する単位
実装
Media over QUIC Transforkの実装一覧です。
-
kixelated/moq-rs
Media over QUIC Transforkの仕様を決めている方のRust実装です。 -
Kixelated/moq-js
Media over QUIC Transforkの仕様を決めている方のTypeScript実装です。 -
OkutaniDaichi0106/gomoqt
僕のGo言語実装です。
コミュニティ
Media over QUICの仕様は有志によって改善、策定されています。
もし気になることやさらに知りたいことなどがある人は是非Discordサーバーに参加してみてください。
Media over QUICまわりのこと(MOQTransfork, MOQTransport, WebTransport, QUIC...)について広く議論されています。