環境
- ffmpeg 4.3
やりたいこと
タイトルで完結しているが、WEB配信している動画にはストリーミング再生できるようにHLS形式で配信されている。
が、これはChromeのネットワークタブ等で監視してもm3u8ファイルしか出てこない。それは動画本体ではなく、ただのURLが羅列されているいわばプレイリスト。
それを自動認識してダウンロードまでやってくれるChrome拡張機能もある。
今回はこれでも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.
(ビットストリームフィルタは、符号化されたストリームデータに対して動作し、デコードを行わずにビットストリームレベルの修正を行う。)
ふふっ、わからんわ