SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

今日からできる! 動画配信基盤システム構築

【Webブラウザでストリーミング動画配信:前編】MP4プログレッシブダウンロードによるストリーミング再生を実現しよう

今日からできる! 動画配信基盤システム構築 第4回

ストリーミングに最適な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」オプションでキーフレーム間隔を指定しています。これは次の項で解説します。

次のページ
GOP長を調整して素早くシークができるようにする

この記事は参考になりましたか?

今日からできる! 動画配信基盤システム構築連載記事一覧

もっと読む

この記事の著者

矢野 完人(合同会社DMM.com)(ヤノ マサヒト)

 2016年にDMM.comへ新卒入社。CTO室に配属され、新規事業立案や動的画像リサイズエンジンのR&D等に従事。2017年に動画サービスを司る部署(現:動画配信開発部)に異動し、配信基盤グループにて設計・開発・運用・マネジメントなどさまざまな業務を行う。現在はメディア基盤開発部 部長とし...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/21095 2025/03/28 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー