motoh's blog

主に趣味の電子工作やプログラミングについて書いていきます

スマホから取り込んだ動画をFFmpegで圧縮するバッチファイルを作ってみた

最近家族からスマホAndroid)内の写真・動画をPCに取り込んで欲しいと頼まれたのですが、全部で40GB程あり、自分のPCHDD容量をかなり圧迫するサイズでした。この際RAID対応NASを導入しようかとも思いましたが、少々値が張るので、とりあえずサイズの大部分を占める動画(mp4)を圧縮してみることにしました。動画のサイズを見てみると、1分程度の動画で100MBを超えており、FFmpegで圧縮すると5分の1程度のサイズにすることができました。

バッチファイルの勉強を兼ねて、指定したフォルダ内のmp4ファイルをまとめて圧縮するバッチファイルを作成したので、せっかくなので公開したいと思います。

 

 

前置き① スマホからPCへの取り込みについて

詳細は割愛しますが、スマホUSBケーブルでPCに接続し、スマホ側でUSB転送モードをMTPに設定すると、PCエクスプローラからスマホ内(内臓ROM及びSDカード)のフォルダを参照できます。例ですが、SDカードのDCIM > 100ANDRO といった場所にスマホで撮影した写真・動画が格納されています。自分はフォルダごとPCHDDにコピーしました(デジカメの付属ソフトのように日付毎にフォルダ分けしてくれたりするツールは、探しても見つからないですね)。

 

前置き② FFmpegについて

FFmpegのダウンロードや使い方はインターネットで検索するとたくさん出てくるので割愛します。自分はこちらのサイトを参考にさせていただきました。

creatorsblog.nijibox.jp

 

前置き③ Google フォトの「バックアップと同期」について

Androidスマホを使っている方なら、Googleフォトの「バックアップと同期」を使えば、わざわざ自前でバックアップを取る必要がないことにお気付きかと思います。「バックアップと同期」は、容量無制限でオンラインストレージに写真・動画をバックアップでき、スマホ本体からはバックアップ済みの写真・動画を削除できます。また、バックアップした写真・動画は別のデバイスからも見ることができます。自分も「バックアップと同期」を使っていますが、念のために自分のPCや外付けHDDにバックアップを取っています。

 

作成したバッチファイル

引数で指定したフォルダパスにある動画(mp4)をすべて圧縮するバッチファイルを作成しました。対象フォルダをバッチファイル(.bat)にドラッグ&ドロップすることでも、フォルダパスを引数として渡せます。また、次回スマホから追加で取り込んだときに、同じファイルを圧縮しないようにするために、圧縮完了したmp4ファイルのファイル名をテキストファイル(compressed_file_list.txt)に保存し、次回はcompressed_file_list.txtにあるファイルは圧縮しない仕組みにしました。以下に、バッチファイル内容と解説を載せます。

※元ファイルは削除する(ゴミ箱にも残らない)ので、試す場合は念のためバックアップをお願いします。

 

バッチファイル内容

解説

@ECHO OFF
setlocal enabledelayedexpansion

IF "%1" == "" GOTO ERROR

ECHO
入力されたフォルダパス:%1
CD %1

SET is_comp=0

FOR %%a IN (*.mp4) DO (


  
FOR /F %%b IN (compressed_file_list.txt) DO (
    IF %%b==%%a (
      SET is_comp=1
    )
  )

  
IF !is_comp!==0 (
    ECHO %%a
を圧縮
     RENAME %%a %%a.tmp
    ffmpeg -i %%a.tmp -c:v libx264 -c:a aac %%a
    DEL %%a.tmp
    ECHO %%a >> compressed_file_list.txt
  ) ELSE (
    ECHO %%a
は圧縮済み
  )

  
SET is_comp=0
)

GOTO END

:ERROR
ECHO 入力エラー
SET /P inp = "何かキーを押して終了"

:END
SET /P inp = "何かキーを押して終了"


環境変数is_comp)の値を処理の途中で変更可能とするために遅延環境変数を使用する。


カレントディレクトリを入力されたフォルダパスに変更する。



フォルダ内のmp4ファイル名についてループ処理を行う。

compressed_file_list.txtにファイル名が存在する場合はフラグ(is_comp)を立てて圧縮処理をスキップする。



ファイル名を”ファイル名”.tmpにリネームし、ffmpegに入力する。ffmpegの出力は元ファイルの名前にすることで、圧縮前後でファイル名が変わらないようにする。
圧縮が終わったら、.tmpは削除し、元ファイルの名前をcompressed_file_list.txtに記録する。

 

 

 

 

 

補足

圧縮率が期待外れな場合の対処法

スマホの機種によっては、圧縮後のサイズがほとんど変わらない場合があるようです。その場合は、-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

また、出力ファイルの形式も変更可能であり、指定した出力ファイル名の拡張子を見て自動で切り替えてくれます。