[MPEG-DASH] 初心者のためのWEBストリーミング入門

# はじめに
WEBのストリーミングについて初心者向けに紹介します。

# ストリーミング
- [TCP](https://ja.wikipedia.org/wiki/Transmission_Control_Protocol)または[UDP](https://ja.wikipedia.org/wiki/User_Datagram_Protocol)のプロトコルを使用する
- 専用のメディアサーバーとクライアントが通信しながら再生する
- ブラウザとは別に専用プレイヤー必要がある
    - [Real Time Streaming Protocol（RTSP）](https://ja.wikipedia.org/wiki/Real_Time_Streaming_Protocol)
        - [Real Player](https://ja.wikipedia.org/wiki/RealPlayer), [Windows Media Player](https://ja.wikipedia.org/wiki/Windows_Media_Player)
    - [Real Time Messaging Protocol（RTMP）](https://ja.wikipedia.org/wiki/Real_Time_Messaging_Protocol)
        - [Flash Video](https://ja.wikipedia.org/wiki/Flash_Video)

ストリーミングとは、メディアデータを時間分割して順次転送・再生する規格です。[TCP](https://ja.wikipedia.org/wiki/Transmission_Control_Protocol)または[UDP](https://ja.wikipedia.org/wiki/User_Datagram_Protocol)のプロトコルを使用して専用のメディアサーバーを用意する必要があります。クライアントも専用のプレイヤーが必要になり、サーバーとクライアントともに環境構築のコストが高いです。
1995～2005年頃のストリーミング黎明期では規格が乱立していました。その中で大きなシェアを獲得したのは、[Real Player](https://ja.wikipedia.org/wiki/RealPlayer)や[Windows Media Player](https://ja.wikipedia.org/wiki/Windows_Media_Player)でした。これらは、WEBブラウザではなく専用のクライアントを必要としていました。その後、WEBブラウザで再生する形式が普及しました。その中でシェアを獲得したのは、[Flash Video](https://ja.wikipedia.org/wiki/Flash_Video)でした。
<img width="40%" alt="ストリーミング" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50563/9df8b429-395a-d3c2-a6f6-e52983242df6.png">

# プログレッシブダウンロード
- WEBサーバーにメディアファイルを配置する
    - 専用サーバーが不要
- HTTPでメディアファイルをダウンロードしながら再生する
- ダウンロードした範囲でしかシークできない
    - [HTTP Progressive Download](https://ja.wikipedia.org/wiki/プログレッシブダウンロード)
        - YouTube

[プログレッシブダウンロード](https://ja.wikipedia.org/wiki/プログレッシブダウンロード)とは、HTTPを使ってメディアファイルをダウンロードできたところから再生する規格です。このプログレッシブダウンロードの形式をとったサービスは、YouTubeです。本来はメディアファイルのすべてをダウンロードしてから再生が始まるのですが、プログレッシブダウンロードではプレイヤーの工夫により、ダウンロードができたところから再生するので、再生を待つ時間が短縮されます。今まではストリーミングにリアルタイム性を求められているところが一般的でしたが、2005年頃にYouTubeのサービスが成功したことを受けて、プログレッシブダウンロードも普及しました。
<img width="50%" alt="プログレッシブダウンロード" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50563/5e1db55f-6de0-5b78-4f29-add7981fb7c9.png">

# アダプティブストリーミング
- WEBサーバーに分割されているメディアファイルを配置する
    - 専用サーバーが不要
    - 分割された動画がCDNにキャッシュされることによる分散化
- HTTPでメディアファイルをダウンロードしながら再生する
- ダウンロードされていない範囲のシークも可能
- ネットワークの状況（帯域幅）に応じてビットレートを動的に増減させる
    - （再生中にバッファリング状態にならない）
- デバイス毎に最大限の品質で継続的に配信する仕組み
    - [HLS](https://en.wikipedia.org/wiki/HTTP_Live_Streaming), [MPEG-DASH](https://en.wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP)

アダプティブストリーミングとは、HTTPを使ってネットワークの通信速度によって画質を自動で切り替えながらダウンロード再生する規格です。デバイスによっては通信速度の制限がある場合が多いので、幅広いデバイスに対応することができます。また、メディアファイルはWEBサーバーに配置しますので、環境構築のコストが低いです。また、[CDN](https://ja.wikipedia.org/wiki/コンテンツデリバリネットワーク)でキャッシュすることが可能になり、ダウンロードが高速化します。メディアファイルは、時間単位で分割されています。
<img width="60%" alt="アダプティブストリーミング" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50563/f6f8e8e0-dfd3-772d-27fc-54fd02efcf13.png">

# MPEG-DASH
- [MPEG-DASH = Dynamic Adaptive Streaming over HTTP](https://en.wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP)
- [Moving Picture Experts Group（MPEG）](https://ja.wikipedia.org/wiki/Moving_Picture_Experts_Group)で規格化
- 国際標準機関 ISO/IEC で 23009-1 として標準化されている
- WEBサーバーにマニフェストファイルと分割された動画ファイルを配置する

iPhoneが登場して、Appleの方針で[Flash Video](https://ja.wikipedia.org/wiki/Flash_Video)が排斥されました。そして、2008年にAppleから[HLS（HTTP Live Streaming）](https://en.wikipedia.org/wiki/HTTP_Live_Streaming)が開発されました。HLSでは、HTTPをベースにしています。プログレッシブダウンロードと違う点は、再生時間が長いメディアファイルでも時間で分割したファイルを順次ダウンロードする仕組みです。そして、Microsoftの[SS（Smooth Streaming）](https://en.wikipedia.org/wiki/Adaptive_bitrate_streaming#Microsoft_Smooth_Streaming)、Adobeの[HDS（HTTP Dynamic Streaming）](https://en.wikipedia.org/wiki/Adaptive_bitrate_streaming#Adobe_HTTP_Dynamic_Streaming)と規格が登場してきました。このように規格が乱立してきましたので2012年に[MPEG（Moving Picture Experts Group）](https://ja.wikipedia.org/wiki/Moving_Picture_Experts_Group)で[MPEG-DASH（Dynamic Adaptive Streaming over HTTP）](https://en.wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP)標準化が進められることになりました。

# MPEG-DASHを使用している商用サービス
- AbemaTV（LIVE配信）
- instagram（インスタライブ）
- YouTube（LIVE配信）

# MPEG-DASHの特徴
- ライブ配信とオンデマンド配信に対応
- マルチピリオド
    - 複数のコンテンツを再生、CM挿入も可能
- マルチビットレート
    - 帯域幅によって解像度を自動切換え
- マルチDRM
    - 複数のDRMに対応
- 多言語
    - 言語毎の字幕に対応
- コーデックに依存しない

# MPEG-DASHの構成
- 分割されているメディアファイル
- マニフェストファイル

MPEG-DASHの構成は大きく「分割されているメディアファイル」と「マニフェストファイル」の2つです。分割されているメディアファイルは「セグメントファイル」と言われています。映像や音声、再生時間、映像解像度、言語毎といった単位で分かれています。マニフェストファイルはXML形式で構成されており、セグメントファイルのアクセス方法や再生方法が記述されています。

# DRMについて
- [×] 対応していない媒体に保存できなくする
- [×] ファイルのコピーをできなくする
- [×] コピーの回数を制限する
- [○] 特定の環境でしか再生できない
- [○] 再生可能な期間を制限する

有料動画配信サイトでは、アダプティブストリーミングに[DRM（Digital Rights Management）](https://ja.wikipedia.org/wiki/デジタル著作権管理)を採用しているところが多いです。
DRM自体に様々な方式がありますが、アダプティブストリーミングでDRMの対象となるのは、「特定の環境でしか再生できない」と「再生可能な期間を制限する」になります。

# DRMのアダプティブストリーミング
- メディアファイルにパッケージング（暗号化）を行う
- 動画再生時にライセンスサーバーからKeyを取得して、復号化て再生する

アダプティブストリーミングでは、メディアファイルに暗号化を行います。メディアファイル読み込み時にDRMのライセンスサーバーに問い合わせてKeyを取得します。そのKeyをもとにメディアファイルを復号化して再生していきます。

# おわりに
今回、アダプティブストリーミングの概要について纏めました。
メディアファイルの作成方法や再生方法については別の投稿で紹介していますので
是非ご覧ください。ありがとうございました。

# 関連リンク
- [MPEG-DASH] 初心者のためのWEBストリーミング入門（本稿）
- [[MPEG-DASH] Fragmented MP4のファイル構造](https://qiita.com/yun_bow/items/a33266b78d5aab807c71)
- [[MPEG-DASH] MPDのファイル構造](https://qiita.com/yun_bow/items/780e49531174272e7c44)
- [[MPEG-DASH] DRMシステムの概要と種類](https://qiita.com/yun_bow/items/e573f4754579d1627a13)
- [[MPEG-DASH] Bento4でDRMパッケージを行う](https://qiita.com/yun_bow/items/77b86d75e15f245f265b)
- [[MPEG-DASH] dashJSでアダプティブストリーミングを再生する](https://qiita.com/yun_bow/items/88582964c113c8499742)
- [[MPEG-DASH] videoJSでアダプティブストリーミングを再生する](https://qiita.com/yun_bow/items/3cdcb0a4f961d6e1e06d)
- [[MPEG-DASH] パフォーマンスチューニングを行う](https://qiita.com/yun_bow/items/e4e37265643a661021ec)

## 参考リンク
- [MPEG DASHを知る](https://qiita.com/gabby-gred/items/c1a3dbe026f83dd7e1ff)
- [オンデマンド動画配信を支える技術 - わかる！HLS編](https://qiita.com/takeyuweb/items/331b80f2daad1527a99c)
- [Live Streaming on Web 概観](https://qiita.com/yohawing/items/fade93cdbb7e329b01de)
- [AbemaTV の MPEG-DASH 対応](https://qiita.com/sunfish-shogi/items/008b3da9309b08465604)

以上です。