Adaptive Bit Rate(ABR)について
前編ではプログレッシブMP4によるストリーミング配信を紹介しました。
静的ファイルを配信するだけなので、シンプルなWebサーバーやオブジェクトストレージ(+CDN)のみで動画配信が実現でき、手軽に実現できることがわかっていただけたかと思います。
一方で単一のストリームを提供するだけなので、ユーザーの回線環境によっては映像品質を重視すると頻繁にバッファリングが発生する可能性があり、クオリティを重視した長尺の配信には向かない旨を説明しました。
そこで役に立つのがこのAdaptive Bit Rate、通称ABRです(エンコード時のビットレート指定方法であるAverage Bit Rateと略称が同じで混同しがちですが、別物なので注意が必要です)。
Adaptive Bit Rateは名前の通り最適なビットレート(=ストリーム)をユーザーに提供する技術です。通信速度はもちろんのこと、場合によっては表示領域の解像度や、デバイスの再生能力(デコード能力)等も加味して、複数定義されたストリームから最適なストリームを選択できるようになる技術です。
最適なストリームを提供するということは、すなわち複数のストリームをユーザーから取得可能にしておくということを意味します。
一般的にはエンコードを動的に行うにはコンピューティングリソースが大量に必要となる割には圧縮率を高くすることが難しいため、ライブ配信等の即時性を求められる配信以外では、通常は静的にファイルをあらかじめエンコードしておくこととなります。
すなわち、ABRを行うためには、まず1本の元素材から複数の動画をエンコードする必要があります。
複数のストリームを用意する
今回は下記の4ストリームを用意し、ABR化していきます。
- 240p
- 480p
- 720p
- 1080p
まずはMP4ファイルを作っていきましょう。下記コマンドを実行することで、240p.mp4、480p.mp4、720p.mp4、1080p.mp4 の4ファイルが完成します。このファイルは中間ファイルのため、最終的には削除して構いません。
ffmpeg \ -i bbb_sunflower_1080p_60fps_normal.mp4 \ -r 30 -g 30 -s 426x240 -sar 1:1 -preset veryslow -b:v 1000k -maxrate 1500k -bufsize 1500k -level 3 -pix_fmt yuv420p -aspect 16:9 -c:a aac -b:a 64k -ac 2 -movflags +faststart 240p.mp4 \ -r 30 -g 30 -s 854x480 -sar 1:1 -preset veryslow -b:v 2000k -maxrate 2500k -bufsize 2500k -level 31 -pix_fmt yuv420p -aspect 16:9 -c:a aac -b:a 96k -ac 2 -movflags +faststart 480p.mp4 \ -r 30 -g 30 -s 1280x720 -sar 1:1 -preset veryslow -b:v 4000k -maxrate 4500k -bufsize 4500k -level 4 -pix_fmt yuv420p -aspect 16:9 -c:a aac -b:a 128k -ac 2 -movflags +faststart 720p.mp4 \ -r 30 -g 30 -s 1920x1080 -sar 1:1 -preset veryslow -b:v 6000k -maxrate 8500k -bufsize 8500k -level 42 -pix_fmt yuv420p -aspect 16:9 -c:a aac -b:a 128k -ac 2 -movflags +faststart 1080p.mp4
この時に大切なこととして、キーフレーム関連のパラメータは全ストリーム共通にしておきましょう。後述する配信形式に変換する際に重要になってきます。