Help us understand the problem. What is going on with this article?

Video on demand (VOD) HLSをPCで作成

More than 1 year has passed since last update.

こんにちは、動画チームのhagi@streampackです。

はじめに

今回は"Video on demand (VOD) HLSをPCで作成"について書きたいと思います。
mp4をそのまま置いてプログレッシブダウンロードでVODを提供することもできますが、HLSにしてABRや暗号化と組み合わせることでダウンロードをめんどくさくすることが可能な上、再配布も簡単にできないようにすることができます。

環境

配信について

HLSは特別な配信サーバーは必要ないです。
インターネットからアクセスできてプレイヤーが必要なファイルをダウンロードできれば再生できます。

今回は配信環境はs3としますがwebサーバーであれば配信可能です。

HLSの作成

ffmpeg、mediafilesegmenter(OSX)、Media Converter(AWS)などありますが今回は"簡単"に"ローカルPC"で作成という自己テーマなので簡単に利用できるツールと思い、そこでWindows/Mac/Linux用バイナリやソースコードがあるbento4を使います。

動画のHLS作成環境はMAC(OSX)としていますが他のOSでも大きく変わらないと思います。

bento4の準備

bento4とは

bento4(https://www.bento4.com)

A fast, modern, open source C++ toolkit for all your MP4 and MPEG DASH media format needs

要約:MP4とMPEG DASH用のツールキット

あれ、HLSは?

HLSについてはこちらに記述

While Bento4 is an MP4 file format library, and HLS uses the MPEG2 TS (Transport Stream) format, Bento4 includes a set of tools and functions that allow the conversion from MP4 to MPEG2 TS, as well as tools to create the .m3u8 playlists for HLS (HTTP Live Streaming).

意訳:MP4からMPEG2 TSの変換もできるのでHLSもできますよー

ただし入力ファイルはMP4である必要がある。

bento4のインストール

  1. ダウンロードページに行く https://www.bento4.com/downloads/
  2. OSに対応したパッケージをダウンロードする(今回はMAC OSX用)
  3. ダウンロードしたzipファイルを解凍

以上

mp4のhls化

上記で解凍したパッケージにはbinフォルダーがあり、いくつものコマンドが準備されています。各コマンドの一覧や詳細はこちらをご参照ください。

例:

Bento4-SDK-1-5-1-622.universal-apple-macosx/bin
aac2mp4         mp42avc         mp42ts          mp4dashclone        mp4dump         mp4extract      mp4iframeindex      mp4rtphintinfo
libBento4C.dylib    mp42hevc        mp4compact      mp4dcfpackager      mp4edit         mp4fragment     mp4info         mp4split
mp42aac         mp42hls         mp4dash         mp4decrypt      mp4encrypt      mp4hls          mp4mux          mp4tag

HLS化で利用するのが mp42hlsです。

Usage

usage: mp42hls [options]

一番簡単な使い方が

1.HLSの格納フォルダーを作成 - コマンド実行場所が格納場所となってしまうため。
$ mkdir <dir>
2.作成したフォルダーに移動
$ cd <dir>
3.コマンド実行
$ mp42hls <動画>

例:

$ mkdir demohls
$ cd demohls
$ ../Downloads/Bento4-SDK-1-5-1-622.universal-apple-macosx/bin/mp42hls ../Downloads/Videos/demovid.mp4
$ ls
segment-0.ts    segment-1.ts    segment-2.ts    segment-3.ts    segment-4.ts    segment-5.ts    segment-6.ts    segment-7.ts    stream.m3u8

作成されたファイルについて

コマンドを実行しますと下記のファイルが作成されます。

segment-0.ts    segment-1.ts    segment-2.ts    segment-3.ts    segment-4.ts    segment-5.ts    segment-6.ts    segment-7.ts    stream.m3u8

*.m3u8 - プレイリスト
*.ts - mpeg2 ts データファイル

プレイリスト

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:7.382375,
segment-0.ts
#EXTINF:6.965292,
segment-1.ts
#EXTINF:7.090417,
segment-2.ts
#EXTINF:6.923583,
segment-3.ts
#EXTINF:6.923583,
segment-4.ts
#EXTINF:7.173833,
segment-5.ts
#EXTINF:7.007000,
segment-6.ts
#EXTINF:0.959292,
segment-7.ts
#EXT-X-ENDLIST

プレイリストには動画再生の順番や各ファイルの再生時間が記述されています。
プレイヤーはこのファイルの情報を元に動画を再生します。

ts データファイル

分割されたデータファイルです。

配信

1.プレイリスト+tsファイルを全てs3にアップロードします。
    場合によってはPublicにするのを忘れずに
2.プレーヤーにアップロードされたs3のプレイリストを指定します。(Safariであればそのまま再生ができるはずです。)

https://s3-ap-northeast-1.amazonaws.com/XXXXXXXX/demo/segment.m3u8

オプション例

AES-128暗号化を利用したい

フォーマット

mp42hls --encryption-key <key hexvalue> --encryption-key-uri <key location> <video name>

実行例

$ mp42hls --encryption-key 47de45c1b3931ab8baf4f7394bbecc02 --encryption-key-uri demo.key demovid.mp4
$ ls
demo.key    segment-0.ts    segment-1.ts    segment-10.ts   segment-2.ts    segment-3.ts    segment-4.ts    segment-5.ts    segment-6.ts    segment-7.ts    segment-8.ts    segment-9.ts    stream.m3u8

マニフェスト内容

EXT-X-KEYにAES-128と鍵のURIが記述されていることを確認

$ cat stream.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="demo.key"
#EXTINF:6.715042,
segment-0.ts
#EXTINF:6.506500,
segment-1.ts
#EXTINF:8.133125,
segment-2.ts
#EXTINF:6.965292,
segment-3.ts
#EXTINF:6.464792,
segment-4.ts
#EXTINF:10.093417,
segment-5.ts
#EXTINF:6.506500,
segment-6.ts
#EXTINF:6.589917,
segment-7.ts
#EXTINF:6.673333,
segment-8.ts
#EXTINF:6.339667,
segment-9.ts
#EXTINF:7.507500,
segment-10.ts
#EXT-X-ENDLIST

AES-128鍵の作成方法

いくつもの方法があると思いますがここではopensslでの作成方法を記述いたします。

適当な16byteの値を使って鍵を作成

$ openssl rand 16 > demo.key

鍵のhex値を確認

$ xxd -ps demo.key
47de45c1b3931ab8baf4f7394bbecc02

ファイル名を指定したい

 マニフェストのみ

フォーマット

$ mp42hls --index-filename <manifest filename>.m3u8 <video name>

実行例

$ mp42hls --index-filename demomanifest.m3u8 demovid.mp4
$ ls
demomanifest.m3u8   segment-0.ts        segment-10.ts       segment-3.ts        segment-5.ts        segment-7.ts        segment-9.ts
demovid.mp4     segment-1.ts        segment-2.ts        segment-4.ts        segment-6.ts        segment-8.ts

マニフェスト+データファイル名

フォーマット

$ mp42hls --index-filename <manifest filename>.m3u8 --segment-filename-template <segment filename>.%d.ts --segment-url-template <segment filename>.%d.ts <video name>

実行例

$ mp42hls --index-filename demomanifest.m3u8 --segment-filename-template demoseg%d.ts --segment-url-template demoseg%d.ts demovid.mp4
$ ls
demomanifest.m3u8   demoseg1.ts     demoseg2.ts     demoseg4.ts     demoseg6.ts     demoseg8.ts     demovid.mp4
demoseg0.ts     demoseg10.ts        demoseg3.ts     demoseg5.ts     demoseg7.ts     demoseg9.ts

マニフェスト内容

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:6.715042,
demoseg0.ts
#EXTINF:6.506500,
demoseg1.ts
#EXTINF:8.133125,
demoseg2.ts
#EXTINF:6.965292,
demoseg3.ts
#EXTINF:6.464792,
demoseg4.ts
#EXTINF:10.093417,
demoseg5.ts
#EXTINF:6.506500,
demoseg6.ts
#EXTINF:6.589917,
demoseg7.ts
#EXTINF:6.673333,
demoseg8.ts
#EXTINF:6.339667,
demoseg9.ts
#EXTINF:7.507500,
demoseg10.ts
#EXT-X-ENDLIST

segment長を指定したい

フォーマット

$ mp42hls --index-filename <manifest filename>.m3u8 --segment-filename-template <segment filename>.%d.ts --segment-url-template <segment filename>.%d.ts --segment-duration <segment length> <video name>

実行例

$ mp42hls --index-filename demomanifest.m3u8 --segment-filename-template demoseg%d.ts --segment-url-template demoseg%d.ts --segment-duration 18 demovid.mp4
$ ls
demomanifest.m3u8   demoseg0.ts     demoseg1.ts     demoseg2.ts     demoseg3.ts     demoseg4.ts     demovid.mp4

マニフェスト内容

EXT-X-TARGETDURATIONをご確認ください。

$ cat demomanifest.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-TARGETDURATION:19
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:18.226542,
demoseg0.ts
#EXTINF:18.435083,
demoseg1.ts
#EXTINF:18.184833,
demoseg2.ts
#EXTINF:19.936583,
demoseg3.ts
#EXTINF:3.712042,
demoseg4.ts
#EXT-X-ENDLIST

最後に

VODのHLS化はだいぶハードルが下がりmp4同様にウェブサーバーからの配信が可能です。
s3から配信すれば設定すらほぼいらずとなります。

またBento4はHLS作成以外にもMP4を操作して動画と音声を分けたり、MPEG-DASHを作成したり、動画に音声をつけたりも可能です。

https://www.bento4.com/documentation/

ぜひお試しください!

khagi
cloudpack
Amazon Web Services (AWS) の導入設計、環境構築、運用・保守をサポートするマネジドホスティングサービス
https://cloudpack.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした