Windows: Рекурсивное преобразование FLAC в MP3 с ffmpeg

Dec 09 2020

У меня установлен ffmpeg, и я использую командные файлы для успешного преобразования MP4 h.264 в MKV x.265, но у меня проблема с преобразованием файлов FLAC в MP3 со скоростью 320 кбит / с без метаданных. Хотя во многих сообщениях объясняется, как это сделать в 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 дважды?
И вы всегда будете сохранять все преобразованные файлы в одной папке (рабочем каталоге)?

for %%A in (.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
for /R %% A in (
.flac)from ffmpeg -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"
  • Найд .: 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"
  • Наб .: 2 Для сохранения .mp3в текущем каталоге / work вы можете использовать:
 ... (...)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
  • Obs. :: 4 При использовании разрыва строки ^не используйте пробелы / символы после каретки:


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

  • Set /?
  • For /?
  • For /F
  • For /R
  • Where /?
  • Timeout /?
  • Перенаправление
    • |, <, >, 2>И т.д.
  • Условное исполнение
    • || и &&
  • Local Environment | Function| См. Также:Goto :EOF
    • Setlocal & Endlocal
  • Разделите длинные команды на несколько строк с помощью командного файла Windows
  • Как интерпретатор команд Windows [ cmd.exe] анализирует скрипты