ストリーミングに最適なMP4ファイルとは
ストリーミング再生では、どのような動画が最適か?というのは非常に難しい概念であり、一概に「これが最適」ということを言うのは難しいものです。しかしながら個別のベストプラクティスは存在しているため、今回は下記3つの項目を元にそれぞれ解説をしていきます。
- バッファリング(データの読み込みが再生に追いつかず、待ちが発生する現象)がなるべく発生しない
- 素早く動画再生が始まる
- シーク(動画の特定の場所から再生を開始する機能)が素早くできる
素早く動画再生が始まり、バッファリングがなるべく発生しないファイルを作る
動画の圧縮率を向上させて、なるべく小さなファイルにすることで多くの環境で動画視聴ができるようになります。
例えばスマートフォンで撮影したファイルをそのまま配信することは推奨されません。なぜなら一般的にそのようなファイルは映像品質が良くなるように工夫されており、なおかつ高速で圧縮できるようにハードウェアエンコーダー等が利用され、ビットレートが高くなる傾向にあるからです。
スマートフォンを用いて撮影したFullHDの動画ファイルの例を下記に示しています。こちらのファイルのビットレートは約20Mbps(19610kbps)となっています。

通信速度に馴染みのない方からするとピンとこないかもしれませんが、混み合っている地域/時間帯における携帯回線(移動体通信)において、20Mbpsを下回ることは少なくありません(参考記事)。
もし20Mbpsを下回る通信速度の回線環境で、この動画をストリーミング再生しようとした場合、頻繁にバッファリングが発生し、動画をスムーズに視聴することは難しいでしょう。すなわちスマートフォンで撮影した大容量の動画をそのままエンドユーザーに配信することは不適切であることが分かります。
そのため、動画配信を行う上では第3回にて紹介したようにエンコードを行いファイルを適切なサイズに圧縮することが望ましいとされています。
では、どのくらいに圧縮するのが望ましいでしょうか?
コーデック、ビットレート指定方法等々、さまざまな要素があるため一概に「これが良い」というものはなく、逆に言うと各サービス/システム開発者の思案のしどころと言えます。
ここでは、私達が過去長年利用していた、H.264を用いたビットレート指定でのエンコードにおけるターゲットビットレートを例として紹介しておきます。
| 解像度 | ビットレート |
|---|---|
| 1080p(1920x1080) | 6000kbps |
| 720p(1280x720) | 4000kbps |
| 480p(854x480) | 2500kbps |
例えば第2回の記事内でダウンロードした「bbb_sunflower_1080p_60fps_normal.mp4」を1080p 30fpsに映像を出力したいときはこのようにすると良いでしょう(当該ファイルは5.1ch音声のため、「-ac 2」により明示的に2chで出力させています)。
なおBigBuckBunnyはオリジナルファイルが高圧縮になっているため、オリジナルが6Mbpsよりも小さなファイルサイズとなっています。そのためこのファイルはそのままでも配信に耐えうる可能性はありますが、今回は例として再エンコードしています。
$ ffmpeg -i bbb_sunflower_1080p_60fps_normal.mp4 -c:v libx264 -preset veryslow -r 30 -g 120 -sc_threshold 0 -s 1920x1080 -b:v 6000k -maxrate 8500k -bufsize 8500k -level 42 -pix_fmt yuv420p -aspect 16:9 -sar 1:1 -c:a aac -b:a 128k -ac 2 -movflags +faststart output_1080p.mp4
上記コマンドは、第3回目で解説したMP4のデータ構造における「moov」Boxをファイルの冒頭に持ってくるオプションも含んでいます。これにより、冒頭のみをロードするだけで「00:40の映像を再生するには何バイト目を読めばよいか」を把握することができ、結果として再生開始やシークがスムーズに実行することができるようになります。
また、libx264には「-preset」と呼ばれる概念があり、これを変更することでエンコードに時間が掛かる代わりに、出力されるファイルの品質を高めることができます。今回は「veryslow」に設定しています。
なおかつ「-g」と「-sc_threshold 0」オプションでキーフレーム間隔を指定しています。これは次の項で解説します。
