こんにちは!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)をhev1
にする必要があります。ffmpegでtag
を指定しない場合hvc1
となりますのでご注意ください。
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にあげアクセス可能にすれば再生可能となります。
ffmpegのオプション次第なので簡単には比較できませんがh264のHLSディレクトリーサイズとh265のディレクトリーサイズはおおよそ半分でした。
個人的にはすごーく細かくみないと画質の違いはわかりませんでした。
どっちの画像が良いかは動画によっても変わると思うので伏せておきます。
どうぞ変換してご確認くださいw
h264
HLS ファイル数 – 147、トータルファイルサイズ 259M
HLS変換前mp4 – ファイルサイズ 263M
h265
HLS ファイル数 – 162、トータルファイルサイズ 134M
HLS変換前mp4 – ファイルサイズ 111M