Windows: рекурсивное преобразование FLAC в MP3 с помощью ffmpeg

Windows: рекурсивное преобразование FLAC в MP3 с помощью ffmpeg

У меня установлен ffmpeg, и я успешно использую пакетные файлы для конвертации MP4 h.264 в MKV x.265, но у меня возникла проблема с конвертацией файлов FLAC в 320 кбит/с MP3 без необходимости в метаданных. Хотямногосообщенияобъяснятькак это сделать в Linux, их скрипты не решают эту проблему при запуске в командной строке Windows.

Скрипт командной строки, который я создал для конвертации в MP3, содержит следующую строку:

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

Не будучи экспертом в Powershell, я ищу решение командной строки. Мне все равно, выживут ли метаданные или нет.

Как мне изменить это, чтобы преобразовать все файлы FLAC в текущем каталоге и всех подкаталогах в нем (как показано в первой ссылке выше для Linux)?

решение1

.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

@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

Вам действительно нужно использовать.Флакдважды?
И вы всегда будете сохранять все преобразованные файлы в одной папке (рабочий каталог)?

for %%A in (.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
for /R %% A in (
.flac)из ffmpeg -i "%%~pI%%~nA.flac" -b:a 320k "%%~nA.mp3"завершается с той же ошибкой, что и отмечено ранее...

1.Удалить nи.flac

for %%A in (*.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
  • Наблюд.: 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\для сохранения целевого закодированного файла, а не просто имени, еслинетсохранить его в том же рабочем каталоге, в котором находится ваш bat.

 ... (...)do.... ffmpeg ... "%%~dpni.mp3"
  • Наблюд.: 2Чтобы сохранить файл .mp3в текущем/рабочем каталоге, можно использовать:
 ... (...)do.... ffmpeg ... "%%~ni.mp3"
 ... (...)do.... ffmpeg ... ".\%%~ni.mp3"
 ... (...)do.... ffmpeg ... "%CD%\%%~ni.mp3"
  • Наблюдение:: 3Все метаданные сохраняются!!

Один предлагает использовать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
  • Наблюдение:: 4Для разрыва строки с помощью ^не используйте никакихпробелы/символыпосле каретки:

введите описание изображения здесь


Дополнительные ресурсы:

Связанный контент