Windows:ffmpegを使用してFLACをMP3に再帰的に変換します

Dec 09 2020

ffmpegをインストールし、バッチファイルを使用してMP4h.264をMKVx.265に正常に変換しましたが、FLACファイルをメタデータが不要な320 kbpsMP3に変換する際に問題が発生しました。けれども多くの記事が説明のLinuxでこれを行う方法のWindowsのコマンドプロンプトで実行した場合、そのスクリプトは、この問題を解決しません。

MP3に変換するために作成したコマンドラインスクリプトには、次の行があります。

for %%A in (*.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"

Powershellに精通していないので、コマンドラインソリューションを探しています。メタデータが存続するかどうかは関係ありません。

現在のディレクトリとその下のすべてのサブディレクトリにあるすべてのFLACファイルを変換するように変更するにはどうすればよいですか(Linuxの場合は上記の最初のリンクに示されています)。

回答

5 harrymc Dec 14 2020 at 17:28

次の.batファイルはそれを行う必要があります:

for /R %%A in (*.flac) do ffmpeg -i "%%A" -c:v copy -b:a 320k "%%~dpnA.mp3"

最初に、次のスクリプトでテストできます。

for /R %%A in (*.flac) do echo ffmpeg -i "%%A" -c:v copy -b:a 320k "%%~dpnA.mp3"

上記の置換の説明(これらは上記のスクリプトで結合されています):

  • %~dA -%Aをドライブ文字のみに展開します
  • %~pA -%Aをパスのみに展開します
  • %~nA -%Aをファイル名のみに展開します
2 ItWasn'tMe Dec 14 2020 at 21:09
@echo off 

cd /d "%~dp0" & setlocal 
set "_flag1=-c:v copy -b:a 320k"
set "_flag2=-hide_banner -v error -stats"
set "_ffmpeg="C:\Program Files\FFmpeg\Bin\FFmpeg.exe" -i"

for /r %%i in (*.Flac)do %_ffmpeg% "%%~i" %_flag1% "%%~dpni.mp3" %_flag2%
%__AppDir__%timeout.exe /t 5 /nobreak |echo=Is Done! & endlocal & goto :eof

  • 変数を定義/使用しなくても同じです。
@echo off & setlocal & cd /d "%~dp0"

for /r %%i in (*.Flac)do "C:\Program Files\FFmpeg\Bin\FFmpeg.exe" -i ^
  "%%~i" -c:v copy -b:a 320k "%%~dpni.mp3" -hide_banner -v error -stats
  
%__AppDir__%timeout.exe /t 5 /nobreak |echo=Is Done! & endlocal & goto :eof

本当に.Flacを2回使用する必要がありますか?
そして、変換されたすべてのファイルを常に同じフォルダー(作業ディレクトリ)に保存しますか?

for %%A in (.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
for /R %% A in (
.flac)fromffmpeg -i "%%~pI%%~nA.flac" -b:a 320k "%%~nA.mp3"は、前述と同じエラーで失敗します...

1.取り外しn.flac

for %%A in (*.flac) do ffmpeg -i "%%~
       
        n
       A
       
        .flac
       " -c:v copy -b:a 320k "%%~nA.mp3"
  • OBS:1Forループ変数は、"%%~A"入力ファイルにあなたに完全なパスを提供し、あなたは、作物名に必要および/または明示的に追加しないでください。

       
        "%~
        Drive\\
        Path\\
        Name
        .Flac"
       

       
        "%%~dpn.Flac"
       

        
         "%%~N.Flac"
        

rem :: use
ffmpeg -i  "%%#~A" ...

2.使用For /R

For /R %%i in (*.flac)do ...

3.バットが置かれているのと同じ作業ディレクトリに保存しないdrive:\folder\場合、名前だけでなく、ターゲットのエンコードされたファイルを保存するためにを定義/追加することを検討してください。

 ... (...)do.... ffmpeg ... "%%~dpni.mp3"
  • OBS:2をあなたを保存するには.mp3、現在/作業ディレクトリに、youcを使用することができます。
 ... (...)do.... ffmpeg ... "%%~ni.mp3"
 ... (...)do.... ffmpeg ... ".\%%~ni.mp3"
 ... (...)do.... ffmpeg ... "%CD%\%%~ni.mp3"
  • Obs。::3すべてのメタデータは存続します!!

1つは使用することをお勧めします For /F + where /R

@echo off

setlocal & cd /d "%~dp0"    

for /f delims^= %%i in ('
2^>nul %__AppDir__%where.exe /r . *.flac
')do "C:\Program Files\FFmpeg\Bin\FFmpeg.exe" -i "%%~i" -c:v ^
     copy -b:a 320k "%%~dpni.mp3" -hide_banner -v error -stats

%__AppDir__%timeout.exe 5 /nobreak |echo=Is Done! & endlocal & goto :eof
  • Obs。::4を使用するブレークラインの場合^、キャレットの後にスペース/文字を使用しないでください。


追加リソース:

  • Set /?
  • For /?
  • For /F
  • For /R
  • Where /?
  • Timeout /?
  • リダイレクション
    • |<>2>、など
  • 条件付き実行
    • || そして &&
  • Local Environment | Function| また参照してください:Goto :EOF
    • Setlocal & Endlocal
  • Windowsバッチファイルを介して長いコマンドを複数行に分割する
  • Windowsコマンドインタープリター[ cmd.exe]スクリプトの解析方法