Edited at

h.265のHLSをffmpegで作成

More than 1 year has passed since last update.

こんにちは!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で作成

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”コンテンツをダウンロードしました。

$ 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にあげアクセス可能にすれば再生可能となります。

screen.png

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

個人的にはすごーく細かくみないと画質の違いはわかりませんでした。

どっちの画像が良いかは動画によっても変わると思うので伏せておきます。

どうぞ変換してご確認くださいw


h264

HLS ファイル数 - 147、トータルファイルサイズ 259M

HLS変換前mp4 - ファイルサイズ 263M


h265

HLS ファイル数 - 162、トータルファイルサイズ 134M

HLS変換前mp4 - ファイルサイズ 111M