.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.exeffmpeg.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 ファイルをダウンロード保存することができた。

参考