mp4は動画ファイルでmp3は音声ファイルだ。パソコンや携帯電話を使っている期間も長いからそれくらいは知っている。そしてTwitterの動画を保存しようとしたら拡張子が.m3u8になっているけどこれは?ということで調べてみた。
blob?m3u8?動画を保存できない
ウェブ上の動画を保存しようとして、開発者ツールからファイルの場所を確認するとblob:https://...
というURLを参照していた。このURLにアクセスしても動画ファイルを開けない。動画を再生してNetworkタブを見てみるとい.m3u8
というファイルにアクセスしていることがわかった。このファイルはダウンロードすることができたが、開いてみるとtsファイルというのを示しているだけで動画を見ることもできなかった。
という問題にぶつかった。色々調べてみて保存できるようになったのでまとめ。
m3u8ファイルを保存するには?
ダウンロードする場合はffmpegを使うと良い。下記のようなコマンドでm3u8ファイルを指定すればmp4ファイルとして保存できる。
ffmpeg -i ****.m3u8 out.mp4
または、
ffmpeg -protocol_whitelist file,http,https,tcp,tls,crypo -user_agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36" -i "********.m3u8" -movflags faststart -c copy -bsf:a aac_adtstoasc out.mp4
元の目的として、複数の動画を半自動的に保存したいというのがあってこういう方法にたどり着いた。今は動画保存アプリとかもたくさんあると思うので、個別に保存するときはそういうのを使うのが良いと思う。
技術編
mp4って何?
メディアには映像、音声、画像などがある。こうしたデータはテキストデータに比べて情報量が多いのでファイルサイズも大きい。そのため、メディアファイルのやりとりの際に効率的に扱えるように圧縮されることがほとんどだ。圧縮したファイル形式のことを フォーマット という。構造上の決まりみたいなものだ。
圧縮する方法(アルゴリズム)によって様々なフォーマットがある。映像ファイルフォーマットにはH.264、MPEG-4、DivXなど、音声ファイルフォーマットにはMP3、AAC、WAVなどがある。ちなみに圧縮したり元に戻したりする技術をコーデックと呼ぶ。
ところで、動画はそもそも映像ファイルと音声ファイルをまとめて同時に再生しているに過ぎない。構造としては、圧縮された映像ファイルと音声ファイルが同じ入れ物に入っていて、ひとつの動画ファイルになっている。映像ファイルや音声ファイルなど複数のメディアをまとめたフォーマットのことを コンテナフォーマット という。コンテナフォーマットにはAVI、MP4、MOV、MPEG、FLVなどの種類がある。
つまり.mp4のファイルは、MP4というフォーマットにしたがって映像ファイルと音声ファイルをひとまとめにしたファイルのことだ。
m3u8って何?
mp4と別のコンテナフォーマットに MPEG-2 TS がある。MPEG-2 TSでは、画像や音声ファイルをトランスポートパケット(TS)という適当な大きさのパケットに分割してファイルの送受信を行う。MPEG-2 TS形式のファイルは.tsという拡張子で扱われる。
m3u8はプレイリストファイル。複数に分割されたファイルの再生順番などのメタ情報が記述されたテキストファイルフォーマットをm3uと呼び、中でも文字コードがUTF-8であることを明示したものが m3u8 だ。m3uとtsを合わせてHLS形式という。
m3u8ファイルに書かれた情報にしたがって複数のtsファイルを順番通りに再生すれば元の動画を再生することができる。
blobって何?
blob:https://...
が何かを理解するには、File API を知る必要がある。File APIとは、ウェブアプリケーションで使われるファイルオブジェクトを扱うためのAPIだ。このAPIにはBlob、File、FileReaderなどのインターフェースが含まれる。
Blobはバイナリデータやファイルデータを扱うための機能を提供する。バイナリデータとして扱いたいデータを引数にしてBlobオブジェクトを作成することができる。データとデータサイズ、そしてMIMEの種類で構成される。
FileはBlobが持つデータに加えて、ファイル名と最終変更日のプロパティを持っていて、FileReaderはバイナリデータをメモリに読み込む機能を提供する。
URL.createObjectURL(blob)という関数を実行すると、blob:…ではじまる仮想的なURLが生成される。この形式のURLをBlobURLという。BlobURLは生成されるたびにユニークな仮想URLになる。BlobURLはブラウザが終了するまで有効。オーディオなどのストリーミングデータを扱うときに、速度・メモリ効率が良い。
base64
BlobURLはbase64でエンコードされる。base64とは全てのデータを64文字で表すエンコード方式のこと。
かつて電子メールを送るためにSMTPというプロトコルが使われたが、このSMTPでは英数字の送受信しかできなかった。そこで、画像や音声データのやりとりを実現するためにすべてのデータを英数字で表現しようと考えられた。そこでbase64というデータ変換方式が定められた。
データをバイナリファイルに変換し、6ビットずつに分割、そして対応表を使って英数字に変換するとbase64文字列が得られる。データサイズは4/3~=1.3倍になる。