スマホから取り込んだ動画をFFmpegで圧縮するバッチファイルを作ってみた
最近家族からスマホ(Android)内の写真・動画をPCに取り込んで欲しいと頼まれたのですが、全部で40GB程あり、自分のPCのHDD容量をかなり圧迫するサイズでした。この際RAID対応NASを導入しようかとも思いましたが、少々値が張るので、とりあえずサイズの大部分を占める動画(mp4)を圧縮してみることにしました。動画のサイズを見てみると、1分程度の動画で100MBを超えており、FFmpegで圧縮すると5分の1程度のサイズにすることができました。
バッチファイルの勉強を兼ねて、指定したフォルダ内のmp4ファイルをまとめて圧縮するバッチファイルを作成したので、せっかくなので公開したいと思います。
前置き① スマホからPCへの取り込みについて
詳細は割愛しますが、スマホをUSBケーブルでPCに接続し、スマホ側でUSB転送モードをMTPに設定すると、PCのエクスプローラからスマホ内(内臓ROM及びSDカード)のフォルダを参照できます。例ですが、SDカードのDCIM > 100ANDRO といった場所にスマホで撮影した写真・動画が格納されています。自分はフォルダごとPCのHDDにコピーしました(デジカメの付属ソフトのように日付毎にフォルダ分けしてくれたりするツールは、探しても見つからないですね)。
前置き② FFmpegについて
FFmpegのダウンロードや使い方はインターネットで検索するとたくさん出てくるので割愛します。自分はこちらのサイトを参考にさせていただきました。
前置き③ Google フォトの「バックアップと同期」について
Androidスマホを使っている方なら、Googleフォトの「バックアップと同期」を使えば、わざわざ自前でバックアップを取る必要がないことにお気付きかと思います。「バックアップと同期」は、容量無制限でオンラインストレージに写真・動画をバックアップでき、スマホ本体からはバックアップ済みの写真・動画を削除できます。また、バックアップした写真・動画は別のデバイスからも見ることができます。自分も「バックアップと同期」を使っていますが、念のために自分のPCや外付けHDDにバックアップを取っています。
作成したバッチファイル
引数で指定したフォルダパスにある動画(mp4)をすべて圧縮するバッチファイルを作成しました。対象フォルダをバッチファイル(.bat)にドラッグ&ドロップすることでも、フォルダパスを引数として渡せます。また、次回スマホから追加で取り込んだときに、同じファイルを圧縮しないようにするために、圧縮完了したmp4ファイルのファイル名をテキストファイル(compressed_file_list.txt)に保存し、次回はcompressed_file_list.txtにあるファイルは圧縮しない仕組みにしました。以下に、バッチファイル内容と解説を載せます。
※元ファイルは削除する(ゴミ箱にも残らない)ので、試す場合は念のためバックアップをお願いします。
バッチファイル内容 |
解説 |
@ECHO OFF |
|
補足
圧縮率が期待外れな場合の対処法
スマホの機種によっては、圧縮後のサイズがほとんど変わらない場合があるようです。その場合は、-crfオプションで動画の品質を指定すると圧縮後のサイズを調整できます。
ffmpeg -i input.mp4 -crf 30 -c:v libx264 -c:a aac output.mp4
-crfオプションの値の範囲とデフォルト値はコーデックにより違うようです。小さい値ほど品質は良くなります。
mp4以外も圧縮できる
入力ファイルはmp4以外でも問題ありません。以下はmovを入力してmp4を得る場合。
ffmpeg -i input.mov -c:v libx264 -c:a aac output.mp4
また、出力ファイルの形式も変更可能であり、指定した出力ファイル名の拡張子を見て自動で切り替えてくれます。