
У меня установлен 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"
- Наблюд.: 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\
для сохранения целевого закодированного файла, а не просто имени, еслинетсохранить его в том же рабочем каталоге, в котором находится ваш 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Для разрыва строки с помощью
^
не используйте никакихпробелы/символыпосле каретки:
Дополнительные ресурсы: