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つのグループにしてください。