Windows: Mengonversi FLAC ke MP3 secara rekursif dengan ffmpeg

Dec 09 2020

Saya telah menginstal ffmpeg dan menggunakan file batch untuk mengonversi MP4 h.264 ke MKV x.265 dengan sukses, tetapi saya memiliki masalah dengan mengonversi file FLAC ke 320 kbps MP3 tanpa metadata yang diperlukan. Meskipun banyak posting menjelaskan bagaimana melakukan ini di Linux, skrip mereka tidak menyelesaikan masalah ini ketika dijalankan di command prompt Windows.

Skrip baris perintah yang saya buat untuk dikonversi ke MP3 memiliki baris ini:

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

Tidak mahir di Powershell, saya mencari solusi baris perintah. Saya tidak peduli apakah metadata bertahan atau tidak.

Bagaimana saya bisa memodifikasinya untuk mengonversi semua file FLAC di direktori saat ini dan semua sub direktori di bawahnya (seperti yang ditunjukkan pada tautan pertama di atas untuk Linux)?

Jawaban

5 harrymc Dec 14 2020 at 17:28

File berikut .batharus melakukannya:

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

Anda dapat mengujinya terlebih dahulu dengan skrip ini:

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

Penjelasan untuk substitusi di atas (digabungkan dalam skrip di atas):

  • %~dA - memperluas% A menjadi huruf drive saja
  • %~pA - memperluas% A ke jalur saja
  • %~nA - memperluas% A ke nama file saja
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

  • Hal yang sama tanpa mendefinisikan / menggunakan variabel:
@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

Apakah Anda benar-benar perlu menggunakan .Flac dua kali?
Dan Anda akan selalu menyimpan semua file yang dikonversi dalam folder yang sama (direktori kerja)?

for %%A in (.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
for /R %% A in (
.flac)dari ffmpeg -i "%%~pI%%~nA.flac" -b:a 320k "%%~nA.mp3"gagal dengan kesalahan yang sama seperti yang dicatat sebelumnya ...

1. Hapus ndan.flac

for %%A in (*.flac) do ffmpeg -i "%%~
       
        n
       A
       
        .flac
       " -c:v copy -b:a 320k "%%~nA.mp3"
  • Obs .: 1 The Forvariabel loop "%%~A"memberikan kepada Anda path lengkap ke file input, Anda tidak perlu nama tanaman dan / atau menambahkan secara eksplisit:

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

       
        "%%~dpn.Flac"
       

        
         "%%~N.Flac"
        

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

2. Gunakan For /R:

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

3. Pertimbangkan untuk mendefinisikan / menambahkan drive:\folder\untuk menyimpan file yang dikodekan target, bukan hanya nama, jika tidak untuk menyimpannya di direktori kerja yang sama tempat kelelawar Anda berada.

 ... (...)do.... ffmpeg ... "%%~dpni.mp3"
  • Obs .: 2 Untuk menyimpan .mp3di direktori saat ini / kerja, Anda dapat menggunakan:
 ... (...)do.... ffmpeg ... "%%~ni.mp3"
 ... (...)do.... ffmpeg ... ".\%%~ni.mp3"
 ... (...)do.... ffmpeg ... "%CD%\%%~ni.mp3"
  • Obs. :: 3 Semua metadata bertahan !!

Satu menyarankan menggunakan 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 Untuk penggunaan garis putus-putus ^, jangan gunakan spasi / karakter apa pun setelah tanda sisipan:


Sumber daya tambahan:

  • Set /?
  • For /?
  • For /F
  • For /R
  • Where /?
  • Timeout /?
  • Pengalihan
    • |, <, >, 2>, Dll
  • Eksekusi Bersyarat
    • || dan &&
  • Local Environment | Function| Lihat juga:Goto :EOF
    • Setlocal & Endlocal
  • Pisahkan perintah panjang dalam beberapa baris melalui file batch Windows
  • Bagaimana Penerjemah Perintah Windows [ cmd.exe] Parse Scripts