Windows: Рекурсивное преобразование FLAC в MP3 с ffmpeg
У меня установлен 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)?
Ответы
Это .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 только на имя файла
@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)
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"
- Найд .: 1
For
переменной цикла"%%~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] анализирует скрипты