動かざることバグの如し

近づきたいよ 君の理想に

暗号化されたHLS形式(m3u8)の動画をダウンロードする

環境

やりたいこと

タイトルで完結しているが、WEB配信している動画にはストリーミング再生できるようにHLS形式で配信されている。

が、これはChromeのネットワークタブ等で監視してもm3u8ファイルしか出てこない。それは動画本体ではなく、ただのURLが羅列されているいわばプレイリスト。

それを自動認識してダウンロードまでやってくれるChrome拡張機能もある。

chrome.google.com

今回はこれでもDLできない、暗号化されたHLS形式の動画をダウンロードしたい。

暗号化されているかの確認方法

対象のm3u8ファイルを直接テキストエディタで開いてみると、以下のように EXT-X-KEY:METHOD の記載があれば暗号化されていると言える。つまりkeyがなければ動画を再生することはできない。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:13
#EXT-X-KEY:METHOD=AES-128,URI="mysec.key",IV=0xbd8a63ff8d314a2e5a13045b61cdsssa
#EXTINF:12.078733,

ダウンロードするコマンド

頼れるのはffmpeg様のみ

ffmpeg -i https://example.com/playlist.m3u8 -c copy -bsf:a aac_adtstoasc -movflags faststart output.mp4

ってだけ

ポイントは -bsf:a aac_adtstoascで bsfはbitstream filtersの略。後ろのaはaudio、つまり音声を意味している。で音声であるAACがadtsヘッダを持つ場合は明示的にaac_adtstoascを指定しなきゃいけないらしい。

じゃあbitstream filterってなんだよって話だが、ffmpegの公式ドキュメントいわく、

A bitstream filter operates on the encoded stream data, and performs bitstream level modifications without performing decoding.
(ビットストリームフィルタは、符号化されたストリームデータに対して動作し、デコードを行わずにビットストリームレベルの修正を行う。)

ふふっ、わからんわ

参考リンク