Windows: Rekurencyjna konwersja FLAC do MP3 w / ffmpeg

Dec 09 2020

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

5 harrymc Dec 14 2020 at 17:28

.batPowinien 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
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

  • 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)przed ffmpeg -i "%%~pI%%~nA.flac" -b:a 320k "%%~nA.mp3"niepowodzeniem z tym samym błędem, co wcześniej ...

1. Usuń ni.flac

for %%A in (*.flac) do ffmpeg -i "%%~
       
        n
       A
       
        .flac
       " -c:v copy -b:a 320k "%%~nA.mp3"
  • Obs .: 1For 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 .mp3plik 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