Windows: Rekurencyjna konwersja FLAC do MP3 w / ffmpeg
Mam zainstalowany ffmpeg i używam plików wsadowych do pomyślnej konwersji MP4 h.264 na MKV x.265, ale mam problem z konwersją plików FLAC do MP3 320 kbps bez metadanych. Chociaż wiele postów wyjaśnia, jak to zrobić w systemie Linux, ich skrypty nie rozwiązują tego problemu, gdy są uruchamiane w wierszu poleceń systemu Windows.
Skrypt wiersza poleceń, który utworzyłem do konwersji do formatu MP3, ma następujący wiersz:
for %%A in (*.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
Nie będąc ekspertem w Powershell, szukam rozwiązania wiersza poleceń. Nie obchodzi mnie, czy metadane przetrwają, czy nie.
Jak mogę to zmienić, aby przekonwertować wszystkie pliki FLAC w bieżącym katalogu i wszystkie podkatalogi poniżej (jak pokazano w pierwszym linku powyżej dla systemu Linux)?
Odpowiedzi
.bat
Powinien to zrobić następujący plik:
for /R %%A in (*.flac) do ffmpeg -i "%%A" -c:v copy -b:a 320k "%%~dpnA.mp3"
Możesz to najpierw przetestować za pomocą tego skryptu:
for /R %%A in (*.flac) do echo ffmpeg -i "%%A" -c:v copy -b:a 320k "%%~dpnA.mp3"
Wyjaśnienie powyższych podstawień (są one połączone w powyższym skrypcie):
%~dA
- rozwija% A tylko do litery dysku%~pA
- rozwija% A tylko do ścieżki%~nA
- rozwija% A tylko do nazwy pliku
@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
- To samo bez definiowania / używania zmiennych:
@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
Czy naprawdę musisz dwukrotnie użyć rozszerzenia .Flac ?
I zawsze będziesz zapisywać wszystkie przekonwertowane pliki w tym samym folderze (katalogu roboczym)?
for %%A in (.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
for /R %% A in (
.flac)
przedffmpeg -i "%%~pI%%~nA.flac" -b:a 320k "%%~nA.mp3"
niepowodzeniem z tym samym błędem, co wcześniej ...
1. Usuń n
i.flac
for %%A in (*.flac) do ffmpeg -i "%%~
n
A
.flac
" -c:v copy -b:a 320k "%%~nA.mp3"
- Obs .: 1
For
zmienna pętla"%%~A"
zapewnić Państwu pełną ścieżkę dostępu do pliku wejściowego, nie trzeba by wymienić roślinnej i / lub dodać wyraźnie:
"%~
Drive\\
Path\\
Name
.Flac"
"%%~dpn.Flac"
"%%~N.Flac"
rem :: use
ffmpeg -i "%%#~A" ...
2. Zastosowanie For /R
:
For /R %%i in (*.flac)do ...
3. Rozważ zdefiniowanie / dodanie a, drive:\folder\
aby zapisać docelowy zakodowany plik, a nie tylko nazwę, jeśli nie, aby zapisać go w tym samym katalogu roboczym, w którym znajduje się bat.
... (...)do.... ffmpeg ... "%%~dpni.mp3"
- Obs .: 2 Aby zapisać swój
.mp3
plik w katalogu bieżącym / roboczym, możesz użyć:
... (...)do.... ffmpeg ... "%%~ni.mp3"
... (...)do.... ffmpeg ... ".\%%~ni.mp3"
... (...)do.... ffmpeg ... "%CD%\%%~ni.mp3"
- Obs. :: 3 Wszystkie metadane przetrwały !!
Jedna sugeruje użycie 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 Aby użyć linii przerwania
^
, nie używaj spacji / znaku po daszku:

Dodatkowe zasoby:
- Set /?
- For /?
- For /F
- For /R
- Where /?
- Timeout /?
- Przekierowanie
|
,<
,>
,2>
, Itd.
- Wykonanie warunkowe
- || i &&
- Local Environment | Function| Zobacz również:Goto :EOF
- Setlocal & Endlocal
- Podziel długie polecenia na wiele wierszy za pomocą pliku wsadowego systemu Windows
- W jaki sposób interpreter poleceń systemu Windows [ cmd.exe] analizuje skrypty