2018-06-22

学生LT大会で配信した話

https://fithack.connpass.com/event/87612/

私が主催してる九州学生エンジニアLT大会でせっかくなので配信しようという話になって、丁度作ってるトランスコーダの検証もかねて配信実験を行った。

https://live.kanzakiranko.jp (現在はご覧になれません)

構成としてはRTMPを使って配信を行い、HLS(MPEG2-TS)に変換してクライアント側に送るといった単純な構成である。ちなみにこちらはRustで実装している。

何故RTMPかというと現在実装されているのがRTMPしかないからだ。元々WebRTCは色々触っていたがRTMPはずいぶん昔に触った以来、忘れてしまっていたので勉強がてらに実装。この話はまた別の機会でしたいと思う。

配信ソフトウェアにはOBS Studioを利用した。1280x720でVBR min 1.5Mbps, max 3Mbpsで設定を行い、Intel Quick Sync Videoを使ってハードウェアエンコードを行った。音声はMP3 CBR 128kbps。

配信サーバはAWSやGCPといったクラウドサービスを一切利用せず、自宅にあるUbuntuサーバを使った。仕組みとしてはOpenH264とlibmp3lameでトランスコードを行い、MPEG2-TSにmuxして、m3u8が更新されていくという感じ。エンコード設定は送信側とほぼ同じ。

最初、配信側でキーフレームを1秒に設定したところ、バッファが間に合わずにプツプツになる声が多かったため、途中から3秒に切り換えたところ大幅に改善した。

恐らく、HLSのプレイリストにあるセグメントを3つに指定していたため、Safariなどのブラウザで視聴するときに次のセグメントを読み込めずに止まってしまう現象が発生していたと思われる。

次回からはHLSのセグメントの数を増やしていきたい。

また、当初HLSはCDNを経由させていたが、設定ミスによりm3u8がキャッシュされてしまい、更新しても同じセグメントが並ぶ状態になっていた。

CDNのキャッシュパージに時間がかかったため、一旦CDNを外してOriginからそのまま取得するように変更を行った。

幸いにも視聴者がそこまで多くなかったため、帯域不足に悩まされる心配は無かった。大体10Mbps~20Mbpsくらい流れていた。

遅延はキーフレーム1秒+CDNでおおよそ6秒くらい。キーフレーム3秒にしてCDN外して12秒くらいだった。

CDN側のバッファサイズも今後の課題だと痛感した。

また、機材関連ではHDMIキャプチャボードの不具合で映像が正常に映ってなかったりする部分があり、大変ご迷惑をおかけして申し訳ない。事前の検証不足であるため、今後の課題である。

何がともあれ、最終的には正常に配信できてとても良かった。

今後はSRTへの対応も進めていきたいと思っている。

余談だが、LTでは配信の歴史について話したがFlashが実はマクロメディア生まれであることが若者には知れ渡ってなかったことがとても面白かった。

資料もSpeakerDeckに上げているので適当に見て欲しい。

次回のLT大会も時間と余裕があれば配信するかもしれない。