h.265のHLSをffmpegで作成

こんにちは！hagi@streampackです。

最近やっとHigh　SierraにアップデートしたのでHLSでのh.265サポートが利用できるようになったので作成してみることにしました。
*すみません、ドラフトのまま少し忘れていました。

背景：High SierraやiOS 11.Xでh.265(HEVC)のサポートが入りSafariやQuickTimeでも再生できるようになった。

AWSのMediaConvertなどで簡単にできるが以前こんなのを書いたので

[Video on demand (VOD) HLSをPCで作成](https://qiita.com/khagi/items/6e8c8d10c77bee53487b)

h.265もPC上でHLSを作成する方法も書こうと思い立った次第です。

#はじめに

High SierraやiOS 11.XでHEVC HLSを利用する場合、Apple製品のネーティブプレイヤーで再生する場合、MPEG-2 TSではなくfmp4(fragmented mp4)で提供する必要がある。

以前利用したBento4でも作成することはできますが今回はライブもできるffmpegで行うことにします。

##必要なソフトウェア

ffmpeg　(https://ffmpeg.org/download.html)

#h.265のmp4を作成

ここは初めからh.265のコンテンツを準備することも可能ですが、ffmpegでは単純にh.264->h.265変換しただけではSafariやQuickTimeで再生ができないため記述します。

##1.h.264のコンテンツを準備

今回は”Big Buck Bunny”コンテンツを[ダウンロード](http://bbb3d.renderfarming.net/download.html)しました。

```
$　ffmpeg -i bbb_sunflower_1080p_30fps_normal.mp4

 　 　 　:　 　 　 　 　 　 　 　 　 :

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 2998 kb/s, 30 fps, 30 tbr, 30k tbn, 60 tbc (default)
```

h.264です。

##2.　h.265に変換

ffmpegで実行しましたがいろいろなオプションがあると思いますが、ここはh.265に簡単にすることを優先してとりあえずシンプルに変換しました。

###注意
h.265のmp4の場合、fourcc(four-character code)を`hvc1`にする必要があります。ffmpegで`tag`を指定しない場合`hev1`となりますのでご注意ください。

```
ffmpeg -i bbb_sunflower_1080p_30fps_normal.mp4 -c:a copy -c:v libx265 -tag:v hvc1 bbb_sunflower_1080p_ffmpeg_tag.mp4

$　ffmpeg -i bbb_sunflower_1080p_ffmpeg_tag.mp4

 　 　 　:　 　 　 　 　 　 　 　 　 :

Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 1122 kb/s, 30 fps, 30 tbr, 15360 tbn, 30 tbc (default)
```

ファイルサイズも幾分か小さくなります。

```
276134947  bbb_sunflower_1080p_30fps_normal.mp4
114804565  bbb_sunflower_1080p_ffmpeg_tag.mp4
```

##ffmpegでHLS化

h.265からのHLS化(tagがすでにhvc1の場合)

```
ffmpeg -i bbb_sunflower_1080p_ffmpeg_tag.mp4 -f hls -hls_segment_type fmp4 -hls_playlist_type vod -c:v copy stream.m3u8
```

h.264からh.265のhls変換を一括で行うには

```
ffmpeg -i bbb_sunflower_1080p_30fps_normal.mp4 -f hls -hls_segment_type fmp4 -hls_playlist_type vod -c:v libx265 -tag:v hvc1 stream.m3u8
```

###Playlist

下記にてh.264のプレイリストとh.265のを記述しましたが違いは `#EXT-X-MAP`の記述とファイルのフォーマットになります。

####h.264

stream.m3u8

```
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:9
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:8.421333,
stream0.ts
#EXTINF:7.900000,
stream1.ts
#EXTINF:3.866667,
stream2.ts
#EXTINF:7.300000,
stream3.ts
#EXTINF:8.333333,
stream4.ts
```

####h.265

stream.m3u8

```
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:9
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="init.mp4"
#EXTINF:8.200000,
stream0.m4s
#EXTINF:3.900000,
stream1.m4s
#EXTINF:3.866667,
stream2.m4s
#EXTINF:7.300000,
stream3.m4s
#EXTINF:8.333333,
stream4.m4s
```

#最後に

出来上がったファイルをs3にあげアクセス可能にすれば再生可能となります。

<img width="1436" alt="screen.png" src="https://qiita-image-store.s3.amazonaws.com/0/226670/7c3cf273-4fc0-2e4b-9cd1-24647a1a36c1.png">

ffmpegのオプション次第なので簡単には比較できませんがh264のHLSディレクトリーサイズとh265のディレクトリーサイズはおおよそ半分でした。

個人的にはすごーく細かくみないと画質の違いはわかりませんでした。
どっちの画像が良いかは動画によっても変わると思うので伏せておきます。
どうぞ変換してご確認くださいw

##h264 

HLS ファイル数 - 147、トータルファイルサイズ　259M
HLS変換前mp4 - ファイルサイズ 263M

##h265 

HLS ファイル数 - 162、トータルファイルサイズ　134M
HLS変換前mp4 - ファイルサイズ 111M