ffmpegを使ってフォルダ配下の音楽ファイルを全てmp3形式に変換するWindowsバッチファイル

ロゴPC君 IT知識

ffmpegを使って手持ちのm4a形式の音楽ファイル30個をいっきにmp3形式に変換したかったため、Windowsのバッチファイルで作成。

やりたいこと

フォルダ階層の異なる複数のm4a形式のファイルフォルダ階層をそのままmp3形式にいっきに変換したい

元のm4a形式のファイルはそのまま残ります

方法

次のようなMS-DOSコマンドのバッチファイルを作成して実行すればいちいちコマンドを打つことなく一気にフォルダ内のファイルをMP3形式に変換できる。

ファイル名: file2mp3.bat

:
: フォルダ配下のm4aファイルをffmpegを使って全てmp3に変換するバッチ
: 変換したmp3ファイルのフォルダ構造は維持される
:

@echo off
for /r %%f in (*.m4a) do (ffmpeg -i "%%f" "%%~dpnf.mp3" -c copy)

上記、バッチファイルはダブルクリックで実行できますが条件があります。
以下の条件を必ず守ってください。

  1. このバッチファイルは変換したいm4aファイルがある一番上の階層に置いてください
  2. Windowsの設定でffmpeg.exeにパスを通してください。(Windowsへのパスの通し方が分からない場合は、ffmpeg.exeとそれに伴うファイル群をバッチファイルと同じフォルダにコピーしてください)

ちなみにm4a(変換前のファイルの拡張子)の部分とmp3(変換後のファイルの拡張子)の部分を修正すれば、いろいろな形式の変換に対応できます。

例)mp4形式の動画をすべてm4v形式に変換

for /r %%f in (*.mp4) do (ffmpeg -i "%%f" "%%~dpnf.m4v" -c copy)

バッチファイル解説

DOSコマンドのFOR~IN命令で拡張子がm4aのファイル名のみ全て取り出し(*.m4a)、取り出したファイル名をffmpegを使ってmp3ファイルに変換している。(ffmpeg -i “%%f” “%%~dpnf.mp3” -c copy)

ポイントは

%%~dpnf.mp3

の部分。FOR %%f IN~とすると取り出したファイル名は1つずつ%%fという変数に代入される。%%fのままだと パス名+ファイル名.m4a となっている。ffmpegでファイル変換するためには拡張子m4aを取り除き パス名+ファイル名.mp3 というファイル名にする必要がある。

例えば、ffmpegで単一のファイルをmp3変換するならこうしたいわけだ。

例)ffmpeg -i c:\music\hoge.m4a c:\music\hoge.mp3 -c copy

~dpnfを変数fの手前につけて %%~dpnf.mp3 として利用すると拡張子部分だけmp3としてくれる便利な機能だ。

コメント

  1. 匿名 より:

    めっちゃ参考になりました
    ネット探してもPythonだExcelだLinuxだMacだと環境を持ってないやり方しか出てこなかったのでWindowsPCだけあって手順どうりやればだれでも出来る方法すごく助かります

    • shuichi より:

      管理人です。ありがとうございます。
      そうですね。Pythonとかプログラミングによるものはネットに多数散見しますが、他のやり方もあるよ!と個人的には示したかったので、お役に立てたのなら嬉しいです。
      プログラミングしなくても出来るのならそれに越したことはないと思います。
      Perlというプログラミング言語を作ったラリー・ウォールという人の言葉がわたしはとりわけ好きです。

      There is more than one way to do it!

      そのやり方は色々ある!

      という意味だそうです。

  2. エラーマン より:

    こちらのバッチファイルを走らせてみたのですが、

    @echo off
    for %%f in (dir /b *.mp4) do (C:\ffmpeg\a\ffmpeg -i “%%f” “%%~nf.mp3” -c copy)

    %%fの使い方が誤ってるとエラーが出ます。
    何か変更が足りないんでしょうか?

    • shuichi より:

      エラーマンさん、こんにちは。管理人です。

      お伝え頂いたエラーマンさんのバッチファイルの C:\ffmpeg\a\ffmpeg の部分が気になります。
      これはffmpeg.exeが保存されているフォルダか何かでしょうか?だとしてもエラーになってしまいます。
      この記事で紹介しているように

      @echo off
      for %%f in (dir /b *.m4a) do (ffmpeg -i "%%f" "%%~nf.mp3" -c copy)
      

      として、該当のフォルダ(mp4のファイルとffmpeg.exeが保存されているフォルダ)に、このファイルをhenkan.batなどのファイル名で保存して実行してみてください。
      もしよければ実際のエラーメッセージなどもお伝え頂けるとありがたいです。

  3. 松野 より:

    アクションカメラ録画のMOVファイルが50以上もありmp4変換したく半分ぐらい一つずつコマンドラインでちまちまやっていたのですがせめて変換先ファイル名ぐらいはワイルド指定できればと思いネット探していたらバッチ例があったので2つ試したのですが動かず、こちらのFor Inを試すとなんと全く自動的に変換され、とても便利でした、金銭的なフィードバックなく失礼ながら本当に感謝です、助かりました

    • shuichi より:

      松野さん
      お役に立てて良かったです。感謝のコメントありがとうございます。
      自分はfor in命令に感謝しています(笑)

  4. 栗山 より:

    M:\iTunesMusic_MP3>for %%f in (dir /b *.m4a) do (ffmpeg -i “%%f” “%%~nf.mp3” -c copy)
    %%f was unexpected at this time.
    コマンドをコマンドプロンプトで実行すると上記のようなエラーになってしまいます。
    ffmpeg.exeもM:\iTunesMusic_MP3にコピーしていますが、何か悪いところあるでしょうか?

    • 栗山 より:

      よく読んでみてこれは、同一のフォルダ内の複数ファイルを変換するバッチだったんですね。私はi-tunesライブラリのフォルダ階層になっている、階層をすべて、フォルダ階層構造を崩さず変換してくれるソフトを探していました。ちょっと調べてみます

      • shuichi より:

        栗山さんのおっしゃるようにフォルダ階層配下の全てのファイルを変換したいのであれば、for文を以下のように修正すれば可能です。

        for /r %%f in (*.m4a) do (ffmpeg -i “%%f” “%%~dpnf.mp3” -c copy)

        自分でもやってみてこちらの方が使い勝手がいいと思いましたので、本記事自体も修正させて頂きました。
        ありがとうございます。

  5. 栗山 より:

    XRECODE 3 というソフトで、元のファイルと同じ場所に保存、かつ 元のファイルを削除のオプションを選んで、ライブラリ全体をコピーしたもに適用すれば、階層になったファイルをそのままMP3に変換できそうです。お騒がせしました

    • shuichi より:

      栗山さん、おはようございます。
      解決されたようで良かったです。

      返信が遅れてしまいましたが、ブログ記事では~.batなどのファイルを作ってそこにコマンドを保存する形で紹介していますが、コマンドプロンプト上で直接実行する場合は、%%の部分を%と1つにして

      for %f in (dir /b “*.m4a”) do (ffmpeg -i “%f” “%~nf.mp3” -c copy)

      のような記述にすれば動作するかと思います。

タイトルとURLをコピーしました