.m3u8 ファイルから .mp4 ファイルを保存する方法
一部の動画サイトは、Firefox アドオンの FlashGot で動画ファイルを特定できず、動画ダウンロードが上手くできない。
そこで開発者ツールでネットワーク通信を眺めてみると、.m3u8
というファイルが鍵を握っているらしいことが分かった。
調べてみると、.m3u8
ファイルというのは動画ファイルのプレイリストファイルで、このファイルをダウンロードしてメモ帳で開いてみると、細切れにされた動画ファイルの URL が羅列されていた。中身はこんな感じ。
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-ALLOW-CACHE:YES
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:6.006,
http://hoge.com/764422617.mp4/seg-1-v1-a1.ts
#EXTINF:10.010,
http://hoge.com/764422617.mp4/seg-2-v1-a1.ts
#EXTINF:10.010,
http://hoge.com/764422617.mp4/seg-3-v1-a1.ts
…「EXTINF」と URL の行が大量に並ぶ…
#EXT-X-ENDLIST
HLSとはHTTP Live Streamingの略で、Appleによって開発された動画配信技術です。
HLSを使用した配信では、インデックスファイルと分割された動画ファイルにより構成されています。
m3u8はインデックスファイルのことです。もともとM3U はマルチメディアプレイリストのファイルフォーマットで、M3U8はUTF-8で書かれたM3Uファイルということを表しています。
.m3u8
ファイルを開くと何やら .mp4
ファイルが見えるので、このファイルを上手く保存できないかと調べてみた。すると、ffmpeg を使って .m3u8
ファイルから .mp4
ファイルを生成・保存できることが分かった。
以下、やり方を説明。
ffmpeg のインストール
まずは ffmpeg をインストールする。以下のサイトからダウンロード・インストールしてもいいし、Chocolatey でインストールしても良い。
Chocolatey の場合は管理者モードで起動した PowerShell で以下のように叩く。
PS> choco install ffmpeg
Chocolatey の場合、ffmpeg のインストール先は C:\ProgramData\chocolatey\lib\ffmpeg\tools\ffmpeg\
というよく分からない場所になっている。このディレクトリごと任意の場所にコピーして使うと良いかと。
.m3u8
ファイルをダウンロードしておく
動画ファイルをダウンロードしたいページでブラウザの開発者ツールを開き、「ネットワーク」タブから .m3u8
ファイルを特定し、URL をコピーしたらアドレス欄に叩きつけて .m3u8
ファイルをローカルにダウンロードする。
Firefox でも Chrome でも同じようにできるはず。
ffmpeg でコマンドを叩く
分かりやすくするため、.m3u8
ファイルは ffmpeg.exe
と同じディレクトリに置いておく。Chocolatey でインストールした場合は C:\ProgramData\chocolatey\lib\ffmpeg\tools\ffmpeg\bin\ffmpeg.exe
に ffmpeg.exe
があるので、このディレクトリにでも置いておく。
で、コマンドプロンプトか PowerShell で、以下のようにコマンドを打つ。
> ffmpeg -protocol_whitelist file,http,https,tcp,tls -i 【m3u8 ファイル名】.m3u8 -movflags faststart -c copy 【生成したいファイル名】.mp4
-protocol_whitelist file,http,https,tcp,tls
というオプションを指定しないと
[ffmpeg] http: Protocol not on whitelist 'file,crypto'!
といったエラーが発生する。このオプションは先頭の方に書いておかないといけなかった。
-i 【m3u8 ファイル名】.m3u8
でインプットの指定、-movflags faststart
でエンコード後にメタデータを先頭に移動させる (イマイチ効果不明)、-c copy 【生成したいファイル名】.mp4
でオーディオとビデオを動画ファイルにコピーする。
これで .m3u8
ファイルをインプットに、.mp4
ファイルをダウンロード保存することができた。