Dynamic Adaptive Streaming over HTTP(DASH)は、MPEG(Moving Picture Experts Group)によって開発された、マルチメディアの適応型ストリーミングに関する国際標準です。DASHは、Media Presentation Description(MPD)形式のXMLストリーム記述を使用してHTTP経由でビデオとオーディオを配信し、コンテンツを異なるビットレートのセグメントに分割します。Bitmovin Video Developer Report(2025)によると、58%のビデオ開発者がDASHを使用しており、HLSに次いで2番目に人気のあるプロトコルとなっています。
重要ポイント
MPEG-DASH(Dynamic Adaptive Streaming over HTTP)は、国際標準ISO/IEC 23009-1であり、2012年に独自の適応型ストリーミングソリューションの断片化への対応として公開されました。HLS(Appleの独自プロトコル)やSmooth Streaming(Microsoft)とは異なり、DASHは当初からオープンでベンダーに依存しない標準として開発され、業界での幅広いサポートを確保しました。
DASHの主な革新は、ストリーム記述とメディアコンテンツの分離です。ストリーム記述はMPD(Media Presentation Description)と呼ばれるXMLファイルに保存され、利用可能なオプション(ビットレート、解像度、コーデック、字幕、オーディオトラック)に関するすべての情報が含まれます。メディアコンテンツは個別のセグメント(通常はfMP4)に保存され、HTTP経由で独立してロードできます。このアーキテクチャにより、サーバーインフラストラクチャを可能な限りシンプルにできます — 任意のHTTPサーバーがDASHコンテンツを配信できます。
DASHの適応性は、コンテンツバリアントの多重化を通じて実装されます。サーバーは複数のRepresentation(異なる圧縮パラメータを持つコンテンツのコピー)を準備します。クライアントはチャネルの帯域幅を分析し、品質と再生安定性の最適なバランスを選択して、表現間を動的に切り替えます。学術研究(IEEE Access、2024)によると、BOLAアルゴリズムを使用したDASHは、不安定な接続環境でHLSと比較して22%少ないビットレート切り替えを示しています。
MPEGは2010年に、既存のソリューション(Apple HLS、Microsoft Smooth Streaming、Adobe HDS)を分析した後、DASHの作業を開始しました。標準の最初のバージョン(ISO/IEC 23009-1:2012)は2012年にリリースされました。第2版(2014年)では、イベントのサポート、改善された広告挿入、サーバー制御の適応が追加されました。第3版(2019年)では、HDR、8K、触覚ビデオのサポートと、5Gネットワーク向けのMMT(MPEG Media Transport)との統合が改善されました。
2024年、MPEGはDASH Next Generationを発表しました。これには、ニューラルネットワークコーデックのサポート、クラウドレンダリング、拡張現実(XR)シナリオの最適化が含まれます。主要な革新は、ニューラルネットワークベースのビデオコーディング(NNVC)で、クライアント側のデコードにMLモデルを使用し、品質を維持しながらビットレートを30〜50%削減できる可能性があります。
DASHストリームの再生プロセスは、4つの連続した段階で構成されます:MPDの取得、ストリーム記述の解析、初期表現の選択、表現間の動的切り替え。各段階には独自の特性があり、ユーザーエクスペリエンスの品質に影響を与えます。
プレイヤーは既知のURLからMPDファイルをロードします。MPDには、ストリーム全体を記述するXML構造が含まれています:コンテンツの長さ、タイムライン、利用可能な期間(Period)、適応セット(AdaptationSet)、特定のエンコーディングパラメータを持つ表現(Representation)。プレイヤーはMPDを解析し、利用可能なメディアリソースの内部モデルを作成します。
2つの解像度を持つVODコンテンツの基本的なMPDファイルの例:
<?xml version="1.0" encoding="utf-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
profiles="urn:mpeg:dash:profile:isoff-live:2011"
type="static"
mediaPresentationDuration="PT1H30M">
<Period duration="PT1H30M">
<AdaptationSet mimeType="video/mp4">
<Representation bandwidth="5000000"
width="1920" height="1080"
codecs="avc1.640028"/>
<Representation bandwidth="1000000"
width="640" height="360"
codecs="avc1.64001E"/>
</AdaptationSet>
</Period>
</MPD>
初期表現を選択した後、プレイヤーはセグメントのロードを開始します。各セグメントには数秒のコンテンツ(通常2〜10秒)が含まれます。プレイヤーは数セグメント先のバッファを維持し、ネットワーク速度の短期的な低下に対する耐性を確保します。ABR(適応ビットレート)アルゴリズムは、セグメントのダウンロード速度を常に監視し、利用可能なビットレート間の切り替えを決定します。
DASHの最新ABRアルゴリズム、たとえばBOLA(Buffer Occupancy based Lyapunov Algorithm)やPensieve(強化学習ベース)は、現在の帯域幅だけでなく、バッファサイズ、コンテンツタイプ(スポーツ、ニュース、映画)、さらにはデバイスの消費電力も考慮します。dash.jsとExoPlayerの一部であるBOLAは、安定したバッファを維持しながらビットレート切り替えの回数を最小限に抑え、ACMの研究(Spiteri et al.、2020)によって確認されています。
DASHストリームの階層的な構造は、4つのレベルで構成されています:MPD → Period → AdaptationSet → Representation。各レベルは詳細のレイヤーを追加し、単純なVODから広告挿入やマルチアングルビデオを伴うライブ放送まで、複雑なシナリオを記述できます。
MPDは、メディアプレゼンテーション全体を記述するルート要素です。MPD属性は、ストリームタイプ(VODの場合はstatic、ライブの場合はdynamic)、全体の長さ、タイムライン、プロファイル、DRM情報を定義します。MPDには1つ以上のPeriodを含めることができ、それぞれがコンテンツの独立した時間セグメントを表します。
Periodはプレゼンテーションの時間セグメントです。VODの場合は、コンテンツ全体に単一のPeriodが使用されます。広告挿入のあるライブの場合は、Periodが動的に変化することがあります — プレイヤーは更新されたMPDをロードし、広告ブロックに対応する新しいPeriodを検出します。各Periodには1つ以上のAdaptationSetが含まれます。
AdaptationSetは、1つのメディアタイプ(ビデオ、オーディオ、字幕)の交換可能な表現のグループです。AdaptationSet内では、すべての表現はビットレートや解像度のみが異なり、同じコンテンツをエンコードします。重要な特性:プレイヤーは再生を中断することなく、セグメント境界で同じAdaptationSet内の表現を切り替えることができます。
Representationは、特定のビットレート、解像度、コーデックを持つ特定のエンコーディングバリアントです。各Representationについて、MPDはセグメントをロードするためのURLテンプレートを指定します。DASHは柔軟なセグメントアドレッシングシステムを使用します — セグメント番号と時間の置換($Number$、$Time$)を使用したURLテンプレートを通じて、サーバーがMPDで各セグメントを列挙することなく動的にファイル名を生成できます。
DASHのセグメントには、Segmentタイプ(メディアデータのみを含む)とSubsegmentタイプ(より細かいアクセスのためのセグメントの一部)の2つのタイプがあります。DASHコンテンツのエンコードには、FFmpegやバッチエンコーダなどのツールが使用されます。入力ファイルからDASHストリームを作成する例:
import subprocess
subprocess.run([
"ffmpeg",
"-i", "input.mp4",
"-filter_complex",
"[0:v]split=2[v1][v2];[v1]scale=1920:1080[v1out];[v2]scale=640:360[v2out]",
"-map", "[v1out]", "-b:v:0", "5000k",
"-map", "[v2out]", "-b:v:1", "1000k",
"-map", "0:a",
"-f", "dash",
"-seg_duration", "4",
"-use_template", "1",
"-use_timeline", "1",
"dash/stream.mpd"
])
DASHとHLSの選択は、ビデオストリーミングシステムを設計する際の重要な決定の1つです。両方のプロトコルは同じ問題(HTTP経由の適応型ビデオ配信)を解決しますが、アーキテクチャ、コーデックサポート、エコシステムに基本的な違いがあります。主要なパラメータで比較してみましょう。
| パラメータ | DASH | HLS |
|---|---|---|
| 標準 | 国際(ISO/IEC 23009-1) | 独自(RFC 8216、Apple) |
| ストリーム記述 | XML(MPD) | M3U8プレイリスト |
| コーデック | 任意(H.264、HEVC、AV1、VP9) | 制限あり(H.264、HEVC、2023年からAV1) |
| セグメント形式 | fMP4(主要)、MPEG-2 TS | MPEG-2 TS、fMP4 |
| DRM | CENC(全DRMで統一) | FairPlay、Widevine(個別) |
| iOS対応 | サードパーティプレイヤー経由 | ネイティブ(AVPlayer、Safari) |
| ブラウザ | Chrome、Firefox、Edge(MSE経由) | Safari(ネイティブ)、その他はMSE経由 |
主な利点 DASHの — コーデック独立性。HLSが当初コーデックをAppleがサポートするもの(H.264、HEVC、最近ではAV1)に制限していたのに対し、DASHはプレイヤーがサポートする任意のコーデック(VP9/VP8(YouTubeとChromeに不可欠)、AV1(効率性のため)、H.264/HEVC(互換性のため))を使用できます。これにより、DASHはすべてのデバイスで統一されたストリームを必要とするクロスプラットフォームサービスにとって好ましい選択肢となります。
欠点 iOSでのDASHの — SafariとAVPlayerでのネイティブサポートの欠如。iOS開発者は、サードパーティのHLS互換プレイヤーまたはVTDecoderを介した統合を備えたlibdashなどのライブラリを使用する必要があります。実際には、これはiOSファーストのプロジェクトではHLSが事実上の標準であり続ける一方、AndroidやウェブプラットフォームではDASHがより柔軟で強力なソリューションであることを意味します。
モバイルアプリケーションへのDASHの統合はプラットフォームに依存します。Androidでは、DASHは拡張モジュールを備えたExoPlayerを通じて直接サポートされています。iOSでは、AVFoundationまたはMPEGDASHPlayerを介した統合を備えたlibdashなどのサードパーティライブラリが必要です。両方のプラットフォームの実装を見てみましょう。
GoogleのExoPlayerは、`exoplayer-dash`モジュールを通じてDASHの組み込みサポートを提供します。DASHストリームの接続は他の形式と同じです — MediaItemにMPDファイルのURIを渡すだけです。ExoPlayerは自動的にコンテンツ形式を検出し、適切なレンダラーを起動し、すべての標準ABRアルゴリズムをサポートします。
val player = ExoPlayer.Builder(this).build()
val dashMediaItem = MediaItem
.Builder()
.setUri("https://example.com/dash/stream.mpd")
.setMimeType("application/dash+xml")
.build()
player.setMediaItem(dashMediaItem)
player.prepare()
player.playWhenReady = true
Common Encryption(CENC)はDASHの主要な機能の1つで、単一のメディアストリームを異なるDRMシステムで使用することを可能にします。MPDファイルには、DRMシステム識別子(Widevine、PlayReady、FairPlay)を持つContentProtection XML要素が含まれています。クライアントはプラットフォームに基づいて適切なDRMシステムを選択し、ライセンスサーバーにライセンスを要求します。
val drmLicenseUri = Uri.parse("https://license.example.com/wv")
val drmSessionManager = DefaultDrmSessionManager
.Builder()
.setUuidAndExoMediaDrmProvider(
C.WIDEVINE_UUID,
FrameworkMediaDrm.DEFAULT_PROVIDER
)
.build(drmLicenseUri, null)
val mediaItem = MediaItem
.Builder()
.setUri("https://example.com/encrypted/stream.mpd")
.setDrmConfiguration(
MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri("https://license.example.com/wv")
.build()
)
.build()
モバイルアプリケーションは、帯域幅と消費電力の制約のために特別なDASH設定が必要です。主な推奨事項には以下が含まれます:短期的な速度低下への耐性のための最小2〜3セグメントのバッファ設定、ネットワーク変更への迅速な応答のための2〜4秒のセグメント使用、品質切り替え時の次のセグメントのプリロード。
モバイルネットワークのトラフィックを節約するために、Bitmovin(2024)はContent Steeringの使用を推奨しています — HLSの同様の機能に類似したメカニズムで、クライアントを最適なCDNノードに動的に誘導できます。DASH Content SteeringはISO/IEC 23009-1:2022仕様で説明されており、dash.js 4.5+およびExoPlayer 2.18+でサポートされています。
よくある質問
DASHは、ベンダーに依存しないオープンな国際MPEG標準です。HLS(Appleの独自プロトコル)とは異なり、DASHは任意のコーデックをサポートし、M3U8の代わりにXMLストリーム記述(MPD)を使用し、CENCを通じて統一されたDRMシステムを提供します。HLSはiOSでネイティブサポートされていますが、DASHはクロスプラットフォームソリューションにより柔軟です。
Androidでは、DASHの主要プレイヤーはexoplayer-dashモジュールを備えたGoogleのExoPlayerです。iOSでは、AVFoundationを介した統合を備えたlibdashや、商用プレイヤー(THEOplayer、Bitmovin)などのサードパーティソリューションが使用されます。ウェブブラウザでは、DASHはMediaSource Extensionsを使用してdash.jsを介して再生されます。
MPD(Media Presentation Description)は、DASHストリーム構造(コンテンツの長さ、利用可能なビットレート、解像度、コーデック、セグメント形式、その場所)を記述するXMLファイルです。MPDはプレイヤーのエントリポイントとして機能し、HLSのマスタープレイリストを置き換えます。MPDファイルなしでは、DASHコンテンツの再生は不可能です。
はい、DASHはVODとライブ放送の両方をサポートしています。ライブでは、自動更新付きのdynamic MPDタイプが使用されます。サーバーは定期的にMPDを更新し、新しいセグメントを追加し、古いものを削除します。チャンクエンコーディングを使用したLow-Latency DASH(LL-DASH)は、LL-HLSに匹敵する3〜8秒のレイテンシを実現します。
DASHはCommon Encryption(CENC、ISO/IEC 23001-7)を使用しており、メディアコンテンツを一度暗号化し、任意のDRMシステムで復号化できます。MPDには、サポートされているDRM(Widevine、PlayReady、FairPlay)を示すContentProtection XML要素が含まれています。プレイヤーはプラットフォームに基づいて適切なDRMを選択し、指定されたURLを介してライセンスを要求します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。