MPEG-DASHの基本概念

MPEG-DASH(Dynamic Adaptive Streaming over HTTP)は、動画を小さなファイル(セグメント)に分けて、HTTPで配信する規格です。

要素 説明
MPDファイル マニフェスト(プレイリストに当たるファイル)
セグメントファイル 映像・音声のデータ本体(通常2〜10秒ずつ)
Representation 1つの画質(ビットレートと解像度の組み合わせ)
AdaptationSet 映像・音声など、種類ごとのグループ

基本コマンド(シングルビットレート)

ffmpeg -i input.mp4 -c:v libx264 -b:v 1500k -c:a aac -b:a 128k -f dash -seg_duration 4 output.mpd

実行すると、次のファイルができます。

  • output.mpd:マニフェスト
  • init-stream0.m4s:映像の初期化セグメント(再生の最初に読み込む設定情報)
  • init-stream1.m4s:音声の初期化セグメント
  • chunk-stream0-XXXXX.m4s:映像のセグメント(連番)
  • chunk-stream1-XXXXX.m4s:音声のセグメント(連番)

セグメントはキーフレームの位置でしか区切れません。libx264 の初期設定では、キーフレームの間隔は最大 250 フレーム(30fps で約 8.3 秒)です。そのため -seg_duration 4 でも映像のセグメントは 4 秒にならず、場面の切り替わりがない映像では約 8.3 秒になります。4 秒ごとに区切るには、30fps の映像なら -g 120 -keyint_min 120 -sc_threshold 0 を付けます。

複数ビットレートのABR構成

ABR(アダプティブビットレート)は、同じ動画を複数の画質で用意しておき、回線の速さに合わせて切り替える仕組みです。-map で同じストリームを複数回指定すると、1回の実行で複数の画質を書き出せます。

ffmpeg -i input.mp4 \
  -map 0:v -map 0:v -map 0:a \
  -c:v libx264 \
  -b:v:0 2500k -s:v:0 1280x720 \
  -b:v:1 800k  -s:v:1 854x480 \
  -c:a aac -b:a 128k \
  -f dash \
  -seg_duration 4 \
  -adaptation_sets "id=0,streams=v id=1,streams=a" \
  output.mpd

この例では、720p(2500kbps)と480p(800kbps)の2つの画質と、1本の音声ができます。-adaptation_sets は、映像どうし・音声どうしを同じグループにまとめる指定です。プレイヤーは同じグループの中で、回線の状態に合わせて画質を自動で切り替えます。

主要オプション一覧

オプション 例 説明
-seg_duration 4 セグメントの長さ(秒)。通常2〜6秒
-use_timeline 1 セグメントの時刻一覧(SegmentTimeline)を書く。初期値は 1
-use_template 1 セグメントのURLをテンプレートで書く。初期値は 1
-window_size 5 ライブ時にMPDに残すセグメント数
-adaptation_sets "id=0,streams=v" ストリームをグループに分ける
-init_seg_name 'init_$RepresentationID$.m4s' 初期化セグメントのファイル名
-media_seg_name 'seg_$RepresentationID$_$Number$.m4s' 映像・音声セグメントのファイル名。$RepresentationID$ を入れないと、映像と音声のセグメントが同じ名前になり、上書きし合います

VOD向け設定

VOD(録画済みの動画を、見たいときに再生できる配信)向けの例です。

ffmpeg -i input.mp4 \
  -c:v libx264 -b:v 1500k \
  -c:a aac -b:a 128k \
  -f dash \
  -seg_duration 4 \
  -use_timeline 1 \
  -use_template 1 \
  output.mpd

-use_timeline 1 と -use_template 1 はどちらも初期値なので、付けなくても基本コマンドと同じ出力になります。VOD のために足すオプションはありません。変換が終わると、MPD は VOD 用の type="static" で書き出されます。

実測: 処理時間とサイズ

計測したコマンドは次のとおりです。

ffmpeg -i input.mp4 -c:v libx264 -b:v 2500k -c:a aac -b:a 128k -f dash -seg_duration 4 output.mpd

処理時間は 22.66 秒でした。サイズは記録していません。出力が MPD と多数のセグメントファイルに分かれていて、1つのファイルとして比べられないためです。

同じ計測で行ったほかの操作と比べると、次のようになります。

操作 処理時間
このDASHセグメント化(-seg_duration 4) 22.66 s
フィルタなしの再エンコード(libx264 CRF 23 / preset medium、音声なし) 27.97 s
ストリームマッピング(-c copy) 0.41 s
moov atom の先頭移動(-c copy) 0.49 s
音声フェード(映像は -c copy) 1.03 s

計測環境: Intel Core i9-14900KF(32スレッド)/ Windows / FFmpeg 8.1(gyan.dev)。素材は 1920x1080・30fps・120秒・351.4MB の映像(Big Buck Bunny をループ、CC BY 3.0)に、128 kb/s の AAC 音声を加えたもの(353.29MB)。2026-09-05 に1つずつ順に実行。生データはデータセットで公開しています。

22.66秒の中身

22.66 秒のほとんどは、H.264 へのエンコード(映像の作り直し)にかかった時間です。-f dash が追加でしているのは、セグメントに切り分けることと、MPD を書くことだけです。画素を加工する処理は1つも増えていません。そのため、この数字は再エンコードをするほかのコマンド(この計測では 17.52〜729.16 秒)と同じ範囲に入ります。フィルタなしの再エンコード(27.97 秒)とも桁が同じです。

ただし、22.66 秒と 27.97 秒は条件をそろえた比較ではありません。フィルタなしの再エンコードは -crf 23 で、音声を出力していません。DASH化のほうは -b:v 2500k で、AAC の音声エンコードもしています。分かるのは、桁が同じということだけです。2つの差を、DASH化の影響とは考えないでください。

効くのはパッケージングではなくエンコーダ

同じ計測で -c copy(再エンコードせずにそのまま書き写す指定)を使った操作は、0.41〜0.49 秒で終わりました。パッケージング(分割・多重化・マニフェスト作成)だけなら、この程度の時間です。DASH化に 22.66 秒かかったのは、切り分けたからではなく、映像を作り直したからです。

速くしたいときは、セグメントの設定ではなくエンコードを見直してください。素材がすでに配信に使える H.264 + AAC で、キーフレーム(単独で表示できるフレーム)の間隔がセグメントの長さとそろっているなら、-c copy のままセグメント化するのが最も速い方法です。

HLS vs MPEG-DASHの選択

比較項目 HLS MPEG-DASH
Apple Safari標準対応 ○(ネイティブ) △(要JS)
セグメント形式 .ts / .m4s .m4s / .mp4
標準化団体 Apple が策定(RFC 8216 として公開) ISO国際標準
動的ABR切替 ○ ○
主な用途 iOS・Safari向け 汎用・OTT向け

関連記事

よくある質問

DASH と HLS、どっちを使う?

iOS や Safari 向けなら、HLS がいちばん確実です。パソコンのブラウザやスマートテレビでは、DASH もよく使われます。両方に対応したいときは、-f dash に -hls_playlist 1 を付けてください。同じ fMP4 セグメントを使う HLS のプレイリスト(master.m3u8 と media_0.m3u8 など)も一緒に書き出されます。-f hls と -f dash で別々に作ることもできます。

セグメント長は何秒がいい?

4〜6 秒にすると、再生が始まるまでの時間と、切り替えにかかる時間のバランスが取れます。2 秒のように短くするとチャンネルの切り替えは速くなりますが、マニフェストの更新が増え、CDN(配信用のサーバー網)の費用も増えます。

DASH プレーヤーが品質切替時に毎回バッファする

画質ごとにキーフレームの位置がずれている可能性が高いです。すべての画質(レンディション)に -force_key_frames "expr:gte(t,n_forced*4)" を付けて、4秒ごとにキーフレームを入れてください。

FFmpeg だけでライブ DASH できる?

できます。-f dash -window_size 5 -extra_window_size 10 を付けると、MPD に直近の 5 セグメントだけを載せるライブ向けの出力になります(スライディングウィンドウ)。-extra_window_size 10 は、MPD から外れたあともディスクに残しておくセグメント数です。CDN へは、受け付け用のURL(ingest エンドポイント)に HTTP PUT で送ります。

音声を別セグメントにする必要は?

何も指定しなくても、-f dash は映像と音声を別々のセグメントに書き出します(chunk-stream0-… と chunk-stream1-…)。-adaptation_sets "id=0,streams=v id=1,streams=a" は、セグメントを分ける指定ではなく、ストリームをグループにまとめる指定です。指定しないと、ストリームごとに別のグループになります。画質の切り替えは同じグループの中で行われるので、複数の画質を用意するときは、映像をまとめて1つのグループにしてください。