जवाबों:
पिछला उत्तर केवल 1 आउटपुट फ़ाइल बनाएगा जिसे out.mov कहा जाता है। प्रत्येक पुरानी फिल्म के लिए एक अलग आउटपुट फ़ाइल बनाने के लिए, यह प्रयास करें।
for i in *.avi;
do name=`echo "$i" | cut -d'.' -f1`
echo "$name"
ffmpeg -i "$i" "${name}.mov"
done
i was unexpected at this time.
do name=`echo "${i%.*}"`;
उन में डॉट्स (और रिक्त स्थान) के साथ फ़ाइल नामों पर काम करेंगे।
.bat
विंडोज़ के लिए समर्थन है ?
के लिए लिनक्स और MacOS इस एक लाइन में किया जा सकता, का उपयोग कर पैरामीटर विस्तार आउटपुट फ़ाइल का फ़ाइल नाम एक्सटेंशन को बदलने के लिए:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
ffmpeg
उसी फ़ाइल में इनपुट और आउटपुट नहीं हो सकता है। 2) मुझे यकीन नहीं है कि अगर बाश विंडोज 10 पर मूल रूप से काम करता है। शायद मुझे इस जवाब में जोड़ना चाहिए कि यह उन प्रणालियों की ओर लक्षित है जो मूल रूप से Bash जैसे Linux और macOS का उपयोग कर सकते हैं। lxs ने इस प्रश्न के लिए एक विंडोज उत्तर प्रदान किया।
for f in *.mkv; do ffmpeg -i "$f" -map 0 -movflags faststart -c:v libx264 -c:a copy -c:s copy "${f/x265/x264}"; done
और विंडोज पर:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
FOR /F "tokens=*" %G IN ('dir /b *.mp3') DO ffmpeg -i "%G" -map_metadata -1 -c:v copy -c:a copy "%~nG .mp3"
एक-लाइन बैश स्क्रिप्ट को करना आसान होगा - *.avi
अपने फ़िलाटाइप के साथ बदलें :
for i in *.avi; do ffmpeg -i "$i" -qscale 0 "$(basename "$i" .avi)".mov ; done
-qscale
। इसे निकालें और डिफ़ॉल्ट सेटिंग्स का उपयोग करें, या -crf
इसके बजाय का उपयोग करें (डिफ़ॉल्ट है -crf 23
)।
basename
उप-भाग को उद्धृत नहीं किया गया है। यह ठीक इसी कारण है कि बैश के बजाय शेल का विस्तार होता है: i in * .avi के लिए; do ffmpeg -i "$ i" -qscale 0 "$ (बेसन" $ i ".avi")। किया
उपनिर्देशिकाओं के साथ परिवर्तित करने के लिए उदा
find . -exec ffmpeg -i {} {}.mp3 \;
find -name "*.vtt" -exec ffmpeg -i {} {}.srt \;
find *.mp4 -exec ffmpeg -i {} {}.mp3 \;
find . -name *.ogg -or -name *.wma -exec ffmpeg -i {} {}.mp3 \;
find . -name *.wma -exec ffmpeg -i {} {}.mp3 \; -exec rm {} \;
विंडोज के लिए:
यहाँ मैं सभी (.mp4) फ़ाइलों को (.mp3) फ़ाइलों में परिवर्तित कर रहा हूँ।
बस cmd खोलें, वांछित फ़ोल्डर गोटो और कमांड टाइप करें।
शॉर्टकट: (वैकल्पिक)
1. उस फ़ोल्डर को जहां आपकी (.mp4) फाइलें मौजूद हों
2. प्रेस शिफ्ट और लेफ्ट क्लिक करें और "ओपन पॉवरशेल विंडो हियर" चुनें
या "ओपन कमांड प्रॉम्प्ट विंडो यहां"
3. टाइप करें "cmd" [नोट : इस चरण को छोड़ दें यदि यह सीधे PowerShell के बजाय cmd को खोलता है]
4. कमांड चलाएँ
for %i in (*.mp4) do ffmpeg -i "%i" "%~ni.mp3"
यदि आप इसे विंडोज़ 10 पर एक बैच फ़ाइल में रखना चाहते हैं, तो आपको %% i का उपयोग करने की आवश्यकता है।
जो कोई भी बैच ffmpeg के साथ कुछ भी बदलना चाहता है, लेकिन एक सुविधाजनक विंडोज इंटरफ़ेस रखना चाहता है, मैंने इस फ्रंट-एंड को विकसित किया है:
https://sourceforge.net/projects/ffmpeg-batch
यह एक विंडो फैशन इंटरफ़ेस, प्रगति बार और शेष जानकारी के लिए ffmpeg को जोड़ता है, फीचर्स जो मैंने हमेशा ffmpeg का उपयोग करते समय याद किया।
यदि आपके पास जीएनयू समानांतर है तो आप vid_dir
अपने सीपीयू कोर को छोड़कर सभी का उपयोग करके समानांतर में सभी .avi फ़ाइलों को mp4 में बदल सकते हैं
find vid_dir -type f -name '*.avi' -not -empty -print0 |
parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4
परिवर्तित करने के लिए / विभिन्न स्वरूपों में, आवश्यकतानुसार '*.avi'
या परिवर्तित करें .mp4
। जीएनयू समानांतर को अधिकांश लिनक्स वितरण के भंडार में सूचीबद्ध किया जाता है जिसे आमतौर पर कहा जाता है parallel
।
!
बैश वन-लाइनर्स में से किसी को भी जोड़कर ऐसा नहीं कर सकते थे ?
मुझे पता है कि यह निरर्थक हो सकता है लेकिन मैं इस स्क्रिप्ट का उपयोग फ़ाइलों को परिवर्तित करने के लिए करता हूं।
old_extension=$1
new_extension=$2
for i in *."$old_extension";
do ffmpeg -i "$i" "${i%.*}.$new_extension";
done
इसे और अधिक लचीला बनाने के लिए 2 तर्क दिए गए हैं:
मैं इसके लिए एक उपनाम बनाता हूं लेकिन आप इसे इस तरह से मैन्युअल रूप से उपयोग कर सकते हैं:
sh batch_convert.sh mkv mp4
यह सभी mkv
फाइलों को mp4
फाइलों में बदल देता है।
जैसा कि आप इसे थोड़ा और बहुमुखी देख सकते हैं। जब तक ffmpeg
यह रूपांतरित हो सकता है तब तक आप कोई भी दो एक्सटेंशन निर्दिष्ट कर सकते हैं।
यहाँ कोड गोल्फ की तरह एक सा हो रहा है, लेकिन अब तक लगभग सभी उत्तरों के बाद से बैश हैं (एक अकेला सीएमडी को छोड़कर), यहाँ एक विंडोज़ क्रॉस-प्लेटफ़ॉर्म कमांड है जो पावरशेल (क्योंकि भयानक) का उपयोग करता है:
ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}
आप बदल सकते हैं * .AVI जो भी आपके स्रोत फुटेज से मेल खाता है।
बेशक, अब पावरशेल के साथ आया है, विशेष रूप से इस बेहद आसान की तरह कुछ बनाने के लिए बनाया गया है ।
और, हां, PowerShell केवल विंडोज के अलावा अन्य ऑपरेटिंग सिस्टम पर भी उपलब्ध है , लेकिन यह विंडोज पर पहले से इंस्टॉल आता है, इसलिए यह सभी के लिए उपयोगी होना चाहिए।
पहले, आप वर्तमान निर्देशिका के भीतर सभी फाइलों को सूचीबद्ध करना चाहते हैं, इसलिए, हम इसके साथ शुरू करेंगे:
ls
ls -Recurse
यदि आप उप-श्रेणियों में भी सभी फ़ाइलों को पुनरावर्ती रूप से परिवर्तित करना चाहते हैं, तो आप भी इसका उपयोग कर सकते हैं।
उसके बाद, हम उन फ़ाइलों को केवल उसी प्रकार फ़िल्टर करेंगे, जिसे हम कनवर्ट करना चाहते हैं - उदाहरण के लिए "avi"।
ls | Where { $_.Extension -eq ".avi" }
उसके बाद, हम उस जानकारी को FFmpeg के माध्यम से पास करेंगे ForEach
।
FFmpeg के इनपुट के लिए, हम FullName
- फ़ाइल के लिए संपूर्ण पथ का उपयोग करेंगे । और FFmpeg के उत्पादन के लिए हम का उपयोग करेगा Name
- लेकिन जगह.avi
के साथ अंत में .mp3
। तो, यह कुछ इस तरह दिखेगा:
$_.Name.Replace(".avi", ".mp3")
तो, आइए हम सब को एक साथ रखते हैं और यह परिणाम है:
ls | Where { $_.Extension -eq ".avi" } | ForEach { ffmpeg -i $_.FullName $_.Name.Replace(".avi", ".mp3") }
यह FFmpeg के माध्यम से सभी ".AVI" फ़ाइलों को ".mp3" फ़ाइलों में परिवर्तित कर देगा, बस तीन चीज़ों को बदलने के लिए उद्धरणों में यह तय करें कि आप किस प्रकार का रूपांतरण चाहते हैं, और महसूस करें कि FFmpeg में किसी भी अन्य तर्क को जोड़ा जाए ForEach
।
आप इसे एक कदम आगे ले जा सकते हैं और Remove-Item
पुरानी फाइलों को स्वचालित रूप से हटाने के लिए अंत में जोड़ सकते हैं।
यदि ffmpeg
आप अपने रास्ते में नहीं हैं, और यह वास्तव में उस निर्देशिका में है, जो आप वर्तमान में हैं, तो ./ffmpeg
बस के बजाय वहां लिखें ffmpeg
।
आशा है कि यह किसी को भी मदद करता है।
.ps1
फाइल में रखें, न कि किसी .bat
फाइल में। Set-ExecutionPolicy RemoteSigned
यदि आपने पहले कभी PS स्क्रिप्ट नहीं चलाई है, तो आपको व्यवस्थापक के रूप में चलना होगा ।
खिड़कियाँ:
@echo off
for /r %%d in (*.wav) do (
ffmpeg -i "%%~nd%%~xd" -codec:a libmp3lame -c:v copy -qscale:a 2 "%
%~nd.2.mp3"
)
यह गुणवत्ता 2 का चर बिटरेट है, आप इसे 0 पर सेट कर सकते हैं यदि आप चाहें तो, लेकिन जब तक आपके पास वास्तव में अच्छा स्पीकर सिस्टम नहीं है, तब तक यह बेकार है
यदि आप ffmpegX के साथ बैच प्रक्रिया के लिए एक ग्राफिकल इंटरफ़ेस चाहते हैं , तो त्वरित बैचर आज़माएं । यह मुफ़्त है और इसमें आपके द्वारा ड्रॉप की गई फ़ाइलों को परिवर्तित करने के लिए अपनी अंतिम ffmpegX सेटिंग्स लेगा।
ध्यान दें कि आप फ़ोल्डरों को क्विक बैच पर नहीं खींच सकते। इसलिए फ़ाइलों का चयन करें और फिर उन्हें क्विक बैच के माध्यम से डालें।
केवल इस एक ने मेरे लिए काम किया, pls ध्यान दें कि आपको "newfiles" फ़ोल्डर मैन्युअल रूप से बनाना होगा जहां ffmpeg.exe फ़ाइल स्थित है।
रूपांतरित करना । फ़ाइलें .wav ऑडियो कोड के लिए:
for %%a in ("*.*") do ffmpeg.exe -i "%%a" "newfiles\%%~na.wav"
pause
यदि आप सभी .mp3 फ़ाइलों को .wav में बदलना ("*.*")
चाहते हैं ("*.mp3")
।
इस लिपि के लेखक हैं:
https://forum.videohelp.com/threads/356314-How-to-batch-convert-multiplex-any-files-with-ffmpeg
आशा है कि इससे 🙏 को मदद मिली।
यह वर्तमान निर्देशिका से सभी jpg फ़ाइलों से mp4 वीडियो बनाएगा।
echo exec("ffmpeg -framerate 1/5 -i photo%d.jpg -r 25 -pix_fmt yuv420p output.mp4");
और विंडोज के लिए, यह काम नहीं करता है
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
भले ही मैं उन डबल करता हूँ %
।
मैं सुझाव भी दूंगा:
-acodec ***libmp3lame***
भी:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec libmp3lame "%~nG.mp3"
यह वही है जो मैं बैच कन्वर्ट करने के लिए उपयोग करता हूं 1280x mp4
FOR /F "tokens=*" %%G IN ('dir /b *.avi') DO "D:\Downloads\ffmpeg.exe" -hide_banner -i "%%G" -threads 8 -acodec mp3 -b:a 128k -ac 2 -strict -2 -c:v libx264 -crf 23 -filter:v "scale=1280:-2,unsharp=5:5:1.0:5:5:0.0" -sws_flags lanczos -b:v 1024k -profile:v main -preset medium -tune film -async 1 -vsync 1 "%%~nG.mp4"
एक cmd फ़ाइल के रूप में अच्छी तरह से काम करता है, इसे चलाएं, लूप उस फ़ोल्डर में सभी एवी फ़ाइलों को पाता है।
कॉल MY (आपके लिए परिवर्तन) ffmpeg, इनपुट नाम उत्तीर्ण करता है, सेटिंग्स को तेज करने के साथ rescaling के लिए है। मैं probs की जरूरत नहीं है CRF और " -b:v 1024k
" ...
आउटपुट फ़ाइल इनपुट फ़ाइल माइनस एक्सटेंशन है, mp4 के साथ नए ext के रूप में।
मैं इस एक-लाइनर का उपयोग लाइनक्स में फ़ाइलों (आमतौर पर H265) को उन मुद्दों में बदलने के लिए कर रहा हूं, जिन्हें मैं बिना मुद्दों के कोडी पर खेल सकता हूं:
for f in *.mkv; do ffmpeg -i "$f" -c:v libx264 -crf 28 -c:a aac -b:a 128k output.mkv; mv -f output.mkv "$f"; done
यह एक अस्थायी फ़ाइल में परिवर्तित हो जाता है और फिर मूल को बदल देता है ताकि रूपांतरण के बाद नाम समान रहें।
इसके अलावा यदि आप सबफ़ोल्डर में एक ही रूपांतरण चाहते हैं। यहाँ पुनरावर्ती कोड है।
for /R "folder_path" %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
ffmpeg.exe -i "%%~f" "%%~f.mp4"
)
थोड़ा php स्क्रिप्ट यह करने के लिए:
#!/usr/bin/env php
<?php
declare(strict_types = 1);
if ($argc !== 2) {
fprintf ( STDERR, "usage: %s dir\n", $argv [0] );
die ( 1 );
}
$dir = rtrim ( $argv [1], DIRECTORY_SEPARATOR );
if (! is_readable ( $dir )) {
fprintf ( STDERR, "supplied path is not readable! (try running as an administrator?)" );
die(1);
}
if (! is_dir ( $dir )) {
fprintf ( STDERR, "supplied path is not a directory!" );
die(1);
}
$files = glob ( $dir . DIRECTORY_SEPARATOR . '*.avi' );
foreach ( $files as $file ) {
system ( "ffmpeg -i " . escapeshellarg ( $file ) . ' ' . escapeshellarg ( $file . '.mp4' ) );
}
escapeshellarg()
, और विंडोज़ और लिनक्स दोनों पर काम करता है। मैं हालांकि इसके एक किनारे के मामले से सहमत हूं।
एक और सरल उपाय जिसका सुझाव अभी तक नहीं दिया गया है, वह है xargs
:
ls *.avi | xargs -i -n1 ffmpeg -i {} "{}.mp4"
एक मामूली नुकसान आउटपुट फाइलों (जैसे input.avi.mp4
) का अजीब नामकरण है । इसके लिए एक संभावित समाधान हो सकता है:
ls *.avi | xargs -i -n1 bash -c "i={}; ffmpeg -i {} "\${i%.*}.mp4"
"