FFmpegを使って、ネットワーク上でもお気持ち程度に快適再生開始可能な動画ファイルを作る

MP4ファイル内の「moov」を先頭に持ってくるだけ / 2022-06-19T00:00:00.000Z

FFmpegとは、クロスプラットフォームで動作するメディアを変換するCUIのソフトウェアです。こう書いても分かりやすいとは言えないので、もう少し簡単に書くと、「真っ黒い画面にコマンドを書いて、動画とか音声をどうにかする」ソフトです。

今回はこのFFmpegを用いて、お気持ち程度にネットワーク上で早く見られるMP4ファイルを作っていきましょう。ちなみにこれはストリーミングとは異なる処理なので、その点は注意してください。

MP4は要するに箱

動画や音声の話をする際に、h264/AVCであったり、AACであったりと、あまり聞きなれない言葉が飛び交うと思います。私たちが普段聞きなれている「MP4」であったり「MKV」とかとはどのような関係があるのでしょうか。

実はMP4の中にh264/AVCであったりAACであったりが含まれている、という感じです。つまりMP4は箱という感じで、その中に規格化された圧縮データが含まれているという感じです。もちろんMP4だけではなくMKVなどもあるということは、その箱にもいろいろな種類がある、ということです。

What's "moov"?

MP4ファイルの内部には単にメディアデータが含まれているのではなく、それらの他にもファイルタイプを示す部分やメタデータが含まれている部分が存在します。これらの部分をそれぞれ「Box」といい、それらのうちメタデータを含んでいるものを「moov」といいます。メタデータはメディアデータの処理が終わらないと生成できない(再生時間などが含まれることより)ので、そのままメディアデータの後ろにくっつけられることが多いです。

「メタデータ」と聞くと大したものではないかもしれません。しかしこのメタデータを読み込まないと動画そのものの再生ができません。すなわち転送速度が遅いネットワークにおいて動画を共有する場合において、この「moov」が読み込まれるまでの間、ずっと読み込み中となってしまいます。

そのため、コマンドを使って前にくっつけなおすことで、お気持ち程度に早く再生開始することが可能となります。

コマンド

ffmpeg -i input.mp4 -c:v copy -c:a copy -movflags +faststart output.mp4

今回はコンテナにあるメタデータの位置を書き換えているだけです。そのため-c:v copy-c:a copyの部分は単純に入力ファイルから映像と音声をコピーしているだけですので、環境に合わせて適切に書き換えることをおすすめします。

参考サイト

最後に

ざっくりわかるシリーズのようにあまり厳密性を求めずに書いています。刺さないでください。