Windows: पुनरावर्ती रूप से FLAC को MP3 w / ffmpeg में बदलें

Dec 09 2020

मेरे पास ffmpeg स्थापित है और बैच फ़ाइलों का उपयोग MP4 h.264 को MKV x.265 में सफलतापूर्वक परिवर्तित करने के लिए है, लेकिन मुझे FLAC फाइलें 320 kbps MP3 w / no मेटाडेटा में परिवर्तित करने की समस्या है। हालाँकि कई पोस्ट्स यह बताती हैं कि लिनक्स में यह कैसे किया जाता है, विंडोज की कमांड प्रॉम्प्ट में चलने पर उनकी स्क्रिप्ट्स इस समस्या को हल नहीं करती हैं।

कमांड लाइन स्क्रिप्ट जो मैंने एमपी 3 में बदलने के लिए बनाई है, में यह लाइन है:

for %%A in (*.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"

पॉवरशेल में निपुण नहीं, मैं एक कमांड लाइन समाधान की तलाश कर रहा हूं। मुझे परवाह नहीं है कि मेटाडेटा बचता है या नहीं।

वर्तमान निर्देशिका में सभी FLAC फ़ाइलों और उसके नीचे की सभी उप निर्देशिकाओं को परिवर्तित करने के लिए मैं इसे कैसे संशोधित कर सकता हूं (जैसा कि लिनक्स से ऊपर पहले लिंक में दिखाया गया है)?

जवाब

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)से 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"
  • Obs .: 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 वर्तमान / कार्य निर्देशिका में अपने को बचाने के लिए , आप उपयोग कर सकते हैं:
 ... (...)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 ब्रेक लाइन का ^उपयोग करने के लिए, कैरेट के बाद किसी भी स्थान / पात्र का उपयोग न करें :


अतिरिक्त संसाधन:

  • Set /?
  • For /?
  • For /F
  • For /R
  • Where /?
  • Timeout /?
  • पुनर्निर्देशन
    • |, <, >, 2>, आदि
  • सशर्त निष्पादन
    • || तथा &&
  • Local Environment | Function| यह भी देखें:Goto :EOF
    • Setlocal और Endlocal
  • विंडोज बैच फ़ाइल के माध्यम से कई लाइनों में लंबी कमांड को विभाजित करें
  • विंडोज कमांड इंटरप्रेटर [ cmd.exe] पार्स लिपियों को कैसे करता है