23
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ffmpegでMP4ファイルをHLS AES-128ストリーミング用のファイルに変換する

Last updated at Posted at 2017-05-15

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ファイルからの相対パスでも良いです。以下のような値が設定可能です。

キーURLの例
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ファイルを正しく参照できているかを確認してください。一部のファイルだけを違うフォルダに移動してしまったりすると動きません。

その他のさまざまなオプション設定については、公式ドキュメントを参照してください。

23
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?