share facebook facebook twitter menu hatena pocket slack

h.265のHLSをffmpegで作成

Kahoru Hagiya

WRITTEN BY Kahoru Hagiya

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

元記事はこちら

h.265のHLSをffmpegで作成

Kahoru Hagiya

Kahoru Hagiya

タバコやめて絶賛ベイプ中な動画チームの初老

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。