モノトーンの伝説日記

スプラトゥーンが大好き。

<mini> プログラミング雑記 〈MPEG-DASH, HLS, HLS w/fMP4〉

 ストリーミングサービス構築して遊んでみようかなーって思ったり。

 何となくだけど,ストリーミングサービスを作りたくなった。

 普通に nginx とか ffmpeg とか既存の有り合わせで実際に稼働するものはできるのだけど,やっぱもうちょっと手を混んで,VP9 とか HEVC とかも提供したいな,って思いつつ色々と調べてる。あくまで趣味の領域としてやるので一般公開はないけれど。

 で,RAM disk にセグメントデータ書き出して,それを HDD に定期的に書き出してってのが理想だと思う。ただ,セグメントって解像度やコーデックで別々になるからそれなりにデータ量が多い。やっぱここ節約したいじゃんってのが思想。

 MPEG-DASH は fragmented MP4 (fMP4) と MPEG-2 TS がいけるらしい? 詳しい技術書見てない。

 HLS は一般に MPEG-2 TS だけど,iOS 10 から fMP4 のサポートしたとか?

 とりあえず,MPEG-2 TS の方がデータサイズ小さくなりそうだしそっちでいい気がするけど,なんか統一するには fMP4 とかいう資料もあって,MPEG-DASH は fMP4 の方が推奨されているのかあるのかもしれない。

 自分的にやりたいことはこの辺りのマルチビットレートのバックエンドシステム開発やりたいかなーって思ってるんだけど,どうですかね。

 VP8 は今時作るの勿体無いから排除して,VP9, AVC, HEVC の 3 つを各々の解像度用意するのがいいのかな?

 バックエンドでやるべきことはまずソースの検出だろうね。解像度とかフレームレートとか諸々。それを基準にマルチビットレート用に色々生成条件を自動生成。例えば,オリジナルが 20fps で配信されていたら,それに応じて,縮小版もビットレート調整しないと帯域が勿体無いとかそんな話ね。

 まあ現状のサービスに結構不満あるわけですよ,ストリーミングサービスって。低解像度だからこそエンコード設定突き詰めてしっかり見える画質にするとか大事だと思うし,逆に高解像度はハードウェアエンコードに回せばいいと思うんですよね。

 低解像度だからこそ解像感を残すことでモバイル帯域を削減しつつも画質がしっかり見れるみたいな絵作りができればそれこそ一番バランス取れると思うんですよ。

 この辺りはまあ趣味みたいなもんです。バックエンド定義をいかに楽するか,そしてパラメーター設定をやりやすくするか,みたいなのがこの辺り技量だと思うんですよね。nginx の conf ファイル書きだとやっぱ結構めんどくさいんすよね。再起動要求されるし。

 あとは,最近の配信システムならゲームタイトル指定が必須になってきてるわけで,タイトルごとに使用するビットレートを変動させるとか? まあそういう定義もバックエンドにアクセスできるコントロールパネルからちょいちょいと例外定義できるようになれば,それこそ大変なのはわかりますが,画質は結構よくなるかも? って印象ですね。

 まあ趣味っぽい話で大規模サービスをするのには向かないでしょうけど,こういうの面白いな,って思っちゃいます。

 普通に世の中にある配信サービスは YouTube で最低限だと思ってるんで,(YouTube でも 5.1ch ライブ配信はダメだとかそれなりに公式の制約がある)もっといい配信サービスになればいいと思うんですがね,なにせ分野が MPEG-DASH, HLS, HDS, MSS, rtmp のストリーミング技術から,VP8, VP9, AVC, HEVC, といった動画コーデック,AAC, MP3, Opus, といった音声コーデック,は最低限で,追加に x264, x265, といったエンコーダーのパラメーター設定っていう職人芸,とかもう専門的な話が多くて,Web エンジニアにはこの領域ってとりあえずこれでいっかな,って思っちゃうのもわからなくないですね。

 まあ上にあげた技術に完全に精通しているわけじゃないけれど,x264 はそれなりに昔から扱ってきた子なんでね,まあもう最近 YouTube の配信を NVENC に以降しましたから,パラメーターチューニングなんてことはしてないですけど,それでも低解像度では必要なことだと思うので……

 グダグダ書きましたがまじで雑記です。考えもまとまってないし,ひどい話ですけど,とりあえず技術ネタとして最近書いてなかったしとりあえず書いて見たのでした。続報あればブログに書くかも。