新年度になりましたね。
気温の寒暖差が激しい今日このごろ、皆さまいかがお過ごしでしょうか、
streampack の木村です。

去年の話しになりますが、Apple が iOS11 と High Sierra でようやっと HEVC コーデックをサポートを開始し、HLS でも HEVC を利用できるようになりました。

コンテナは Fragmented MP4 (fMP4) に限定されますが、これにより MPEG-DASH と HLS でメディアを共通化することが可能になりました。

Bento4 を使うことで同じメディアで MPEG-DASH と HLS 配信に必要なファイル郡(MP4、プレイリスト)を一気に作成が可能ですので、手順を書いてみます。

用意するもの

  • 動画ファイル

今回は自分の iPhone7 Plus で撮影した動画を使用しました。
もちろん、その他のファイルでも良いです。

  • Bento4

DASH から HLS まで、DRM も掛けることができるすぐれものです。
https://www.bento4.com/

Bento4 のインストール

同じチームの hagi さんが書いてくれているので割愛!
下記ご参照下さい。

https://cloudpack.media/39829

フラグメント化

Apple HLS 仕様では HEVC を利用する場合は、フラグメント化されている必要があります。

https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html

もし手持ちのソースが Fragmented MP4(fMP4) ではない場合、Bento4 付属の mp4fragment でフラグメント化しておきます。

$ mp4fragment IMG_7611.mov IMG_7611_frag.mov
found regular I-frame interval: 997 frames (at 59.940 frames per second)

ソースファイル → HLS/DASH 化

フラグメント化したら、Bento4 の mp4dash でマニフェスト、プレイリスト(mpd、m3u8)を書き出します。

$ mp4dash --force --hls --no-split --profile=on-demand IMG_7611_frag.mov
Parsing media file 1: IMG_7611_frag.mov
Extracting track 2 from IMG_7611_frag.mov
Extracting track 1 from IMG_7611_frag.mov
Parsing media file 1: tmpaY7qJJ = Extracted[track 2 from IMG_7611_frag.mov]
Parsing media file 2: tmpzr8seI = Extracted[track 1 from IMG_7611_frag.mov]
Processing and Copying media file tmpzr8seI = Extracted[track 1 from IMG_7611_frag.mov]
Processing and Copying media file tmpaY7qJJ = Extracted[track 2 from IMG_7611_frag.mov]

デフォルトだと output フォルダが作成されて配下にファイル群が出力されます。
ビデオファイル、オーディオファイル、マニフェスト、プレイリストが作成されていますね。

$ ls output/
audio-und-mp4a.m3u8     stream.mpd
master.m3u8         video-hev1.m3u8
media-audio-und-mp4a.mp4    video-hev1_iframes.m3u8
media-video-hev1.mp4

ストリーミング

それでは実際に出来上がったファイルをメディアプレイヤーで視聴してみましょう!

ファイルアップロード

output 以下に生成されたファイルを S3 に放り込みます。

視聴

HLS

https://s3-ap-northeast-1.amazonaws.com/{S3バケット名}/encoded/fMP4/hevc/master.m3u8

iPhone の Safari で再生させてみました。

4/18 追記

上記の master.m3u8 では Hi Sierra の Safari では再生できないことが判明。
CODECS 情報を消すと再生に可能になる模様

master.m3u8

#EXTM3U
# Created with Bento4 mp4-dash.py, VERSION=1.8.0-621
#
#EXT-X-VERSION:6

# Media Playlists

# Audio
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio/mp4a",LANGUAGE="und",NAME="Unknown",AUTOSELECT=YES,DEFAULT=YES,URI="audio-und-mp4a.m3u8"

# Video
#EXT-X-STREAM-INF:AUDIO="audio/mp4a",AVERAGE-BANDWIDTH=3603386,BANDWIDTH=4306476,CODECS="hev1.1.6.L123.90,mp4a.40.2",RESOLUTION=1920x1080
video-hev1.m3u8

# I-Frame Playlists
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=3505453,BANDWIDTH=4209252,CODECS="hev1.1.6.L123.90",RESOLUTION=1920x1080,URI="video-hev1.m3u8"

以下のように CODECS 情報を消すと Hi Sierra Safari で再生可能になる

master_rev.m3u8

#EXTM3U
# Created with Bento4 mp4-dash.py, VERSION=1.8.0-621
#
#EXT-X-VERSION:6

# Media Playlists

# Audio
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio/mp4a",LANGUAGE="und",NAME="Unknown",AUTOSELECT=YES,DEFAULT=YES,URI="audio-und-mp4a.m3u8"

# Video
#EXT-X-STREAM-INF:AUDIO="audio/mp4a",AVERAGE-BANDWIDTH=3603386,BANDWIDTH=4306476,RESOLUTION=1920x1080
video-hev1.m3u8

# I-Frame Playlists
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=3505453,BANDWIDTH=4209252,RESOLUTION=1920x1080,URI="video-hev1.m3u8"

MPEG-DASH

Windows 10 Edge であればそのまま再生できる(はず!)

https://s3-ap-northeast-1.amazonaws.com/{S3バケット名}/encoded/fMP4/hevc/stream.mpd

こちらも手持ちが無いので Android の ExoPlayer で再生させてみます。

ちなみに ExoPlayer では前述の HLS もそのまま再生可能です。

まとめ

HLS と MPEG-DASH で共通のメディアファイルを使用することで、手間も減り且つリソースの削減にもつながります。
現時点では古いOSを考慮しなくてはなりませんが、今後はこちらが主流になるのではないでしょうか。

元記事はこちら

HLS と MPEG-DASH でメディアを共通化してみる