ffmpegでMP4 -> HLSのエンコーディングを行うには、次のようにコマンドを実行します。
ffmpeg -i video.mp4 -c:v copy -c:a copy video.m3u8
-i
に指定するのは入力ビデオファイルです。元のMP4を指定します。
-c:v copy -c:a copy
の部分は、動画・音声のコーデックを元のソースからコピーする設定です。これを指定すると再エンコードされないため、画質や音質は劣化せず処理も高速になります。
うまく再生できない場合や、ビットレートを変更したい場合は-c:v libx264 -c:a aac
,-b:v 9000k
などを指定してください。(詳細は公式ドキュメントを参照)
これで各 video{index}.ts ファイルに動画が分割され、.m3u8ファイルをVLCプレイヤー等で開けば再生できます。
AES-128で暗号化する
HLS用に変換する際に -hls_key_info_file
というパラメーターを使用することでストリームを暗号化できます。
このパラメーターには キー情報ファイル を指定します。キー情報ファイルとは、以下の情報が含まれたテキストファイルです。
- 1行目: m3u8に含まれる、キーファイルへのURL
- 2行目: 暗号化および復号化時に使用するキーファイル
- 3行目: 暗号化の初期化ベクトル(任意)
キー情報ファイルの1行目にはキーファイルのURLを指定します。フルURLでも良いし、m3u8ファイルからの相対パスでも良いです。以下のような値が設定可能です。
http://server/file.key
/path/to/file.key
file.key
これは生成される.m3u8ファイルの #EXT-X-KEY:METHOD=AES-128,URI="{この部分}"
の指定になります。なので、エンコードを行う段階ではURLからキーファイルが取得できるようになっている必要はありません。
キー情報ファイルの2行目にはキーファイルそのものへのパスを指定します。相対参照、絶対参照どちらでも設定可能です。
file.key
/path/to/file.key
こちらはエンコード時にキーファイルを読み込むために使用するので、キーファイルが存在するパスを参照していなければいけません。この値は.m3u8ファイルには現れません。
キー情報ファイルの3行目には初期化ベクトルを指定します。この行は任意なので指定しなくても構いません。指定する場合は暗号化を行うたびにランダムで生成するのかな?(あまりよくわかっていない)
0123456789ABCDEF0123456789ABCDEF
まとめると、キー情報ファイルの中身はこのようになります。例です。拡張子やファイル名はなんでも構いません。
http://server/video.key
/path/to/video.key
0123456789ABCDEF0123456789ABCDEF
動画の出力先と同じフォルダにキーファイルを作成するとして、とりあえずローカルですぐに再生確認したい場合はこのように指定するのが良いかもしれません(初期化ベクトルは省略してみました)。
video.key
video.key
次に、キーファイルを作成します。キーを作成するのは以下のコマンドを実行します。
openssl rand -out video.key 16
やっていることはランダムな16バイトのデータを作成してvideo.keyファイルに書き込んでいるだけです。なので必ずしもこの方法で作成しなければいけないということではありません。ただしファイルサイズは確実に16バイトである必要があります。
※WindowsのPowershell環境でopenssl rand 16 > video.key
のようにしてファイル書き出しをすると、正しく書き込まれませんので注意してください。クソが!!!
VLCなどのプレイヤーではこれでも再生できたりしますが、再生できない環境もあります。AES-128は128bit(16バイト)の鍵を使用するアルゴリズムなので、キーファイルは必ず16バイトにするようにしてください。openssl rand -out video.key 16
ならPowershellでも大丈夫です。
これで準備ができたので、エンコードをします。キー情報ファイルが video.keyinfo だとすると、以下のようなコマンドになります。
ffmpeg -i video.mp4 -c:v copy -c:a copy -hls_key_info_file video.keyinfo video.m3u8
生成された video.m3u8 ファイルをVLCプレイヤー等で読み込めば、再生されます。個々の.tsファイルは暗号化されているため、直接プレイヤーで開いても再生されません。
うまく再生されない場合は、.m3u8ファイルをテキストエディタで開き、キーのURLや個々の.tsファイルを正しく参照できているかを確認してください。一部のファイルだけを違うフォルダに移動してしまったりすると動きません。
その他のさまざまなオプション設定については、公式ドキュメントを参照してください。