मैं कैसे mp4 फाइलों से ffmpeg को बिना डिकंप्रेसन (स्वचालित ऑडियो कोडेक डिटेक्शन) से निकाल सकता हूं?


19

मेरे पास 228 mp4 फाइलें (2.6GB) हैं और मैं उनसे (mp3 या ogg) ऑडियो निकालना चाहूंगा। मैं उन्हें बैच निकालना चाहता हूं - अधिमानतः बैश के साथ। मुझे यकीन नहीं है कि सभी फाइलें समान ऑडियो कोडेक का उपयोग करती हैं क्योंकि वे 2006-2012 से अलग-अलग वर्षों में रिकॉर्ड किए गए थे।

मैं उन सभी के माध्यम से लूप करना चाहता हूं, फ़ाइल नाम चुनें, ऑडियो कोडेक का पता लगाएं और ऑडियो निकालने के लिए ffmpeg का उपयोग करें।

क्या यह संभव है?


यह एक स्क्रिप्टिंग प्रश्न है और जैसे कि उबंटू से इसका कोई लेना-देना नहीं है। यह यहां विषय नहीं है, लेकिन SO या unix.SE पूछने के लिए बेहतर जगह हो सकती है।
महेश

धन्यवाद। अगली बार मैं इस तरह के प्रश्न को अधिक उपयुक्त स्थान पर पूछने का प्रयास करूँगा।
wryrych

जवाबों:


29

आप कहते हैं कि आप उनसे (एमपी 3 या ओग) ऑडियो निकालना चाहते हैं। लेकिन क्या होगा अगर mp4 फ़ाइल में ऑडियो उनमें से एक नहीं है? आपको वैसे भी ट्रांसकोड करना होगा। तो क्यों नहीं ffmpeg तक का पता लगाने वाले ऑडियो प्रारूप को छोड़ दें?

एक फ़ाइल परिवर्तित करने के लिए:

ffmpeg -i videofile.mp4 -vn -acodec libvorbis audiofile.ogg

कई फ़ाइलों को परिवर्तित करने के लिए:

for vid in *.mp4; do ffmpeg -i "$vid" -vn -acodec libvorbis "${vid%.mp4}.ogg"; done

आप निश्चित रूप से ऑडियो एन्कोडिंग के लिए किसी भी ffmpeg मापदंडों का चयन कर सकते हैं, जो आपको पसंद हैं, बिटरेट जैसी चीजों को सेट करने के लिए और इसी तरह।

का प्रयोग करें -acodec libmp3lameऔर से विस्तार बदलने .oggके लिए .mp3एमपी 3 एन्कोडिंग के लिए।

यदि आप जो चाहते हैं वह वास्तव में ऑडियो को निकालना है, तो आप ऑडियो ट्रैक का उपयोग करके किसी फ़ाइल में ऑडियो कॉपी को "कॉपी" कर सकते हैं -acodec copy। बेशक, मुख्य अंतर यह है कि ट्रांसकोडिंग धीमा और सीपीयू-गहन है, जबकि नकल वास्तव में जल्दी है क्योंकि आप बस एक फाइल से दूसरे में बाइट ले जा रहे हैं। यहाँ केवल ऑडियो ट्रैक (एमपी 3 प्रारूप में मानकर) को कॉपी करने का तरीका बताया गया है:

ffmpeg -i videofile.mp4 -vn -acodec copy audiofile.mp3

ध्यान दें कि इस मामले में, ऑडीओफाइल प्रारूप में कंटेनर के अनुरूप होना चाहिए (यानी यदि ऑडियो एएसी प्रारूप है, तो आपको कहना होगा audiofile.aac)। आप ffprobeकिस कोडक को देखने के लिए कमांड का उपयोग कर सकते हैं, इससे कुछ जानकारी मिल सकती है:

ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "videofile.mp4"

ऑडियो कोडेक को स्वचालित रूप से पार्स करने का एक संभावित तरीका और तदनुसार ऑडियो फ़ाइल का नाम होगा:

mkdir -p output
# current directory has to contain at least one .mp4 file 
for vid in *.mp4; do
   codec="$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "$vid")"
   case "$codec" in
    mp3    ) filetype=mp3 ;;
    vorbis ) filetype=ogg ;;
    *      ) filetype= ;;
   esac

   if [ "$filetype" ]; then 
    ffmpeg -i "$vid" -vn -acodec copy output/"${vid%.*}"."$filetype"
   else
    ffmpeg -i "$vid" -vn -acodec libvorbis output/"${vid%.*}".ogg
done

नोट्स: आउटपुट फाइलें उप-निर्देशिका में बनाई जाती हैं outputजो शुरुआत में (यदि आवश्यक हो) बनाता है। एमपी 3 और vorbis के अलावा अन्य कोडेक्स के लिए यह ऑडियो को ogg में कनवर्ट करता है। Ubuntu 14.04 में मानक रिपॉजिटरी में ffmpeg नहीं है, लेकिन आप ppa जोड़ सकते हैं: mc3man / भरोसेमंद मीडिया रिपॉजिटरी और आवश्यक सॉफ़्टवेयर प्राप्त करने के लिए ffmpeg पैकेज स्थापित करें। देखें यहाँ जानकारी के लिए।


मैंने गलत डाल दिया। मैं एमपी 3 या ogg करना चाहता था, लेकिन जैसा कि आपने देखा कि ऑडियो कोडेक अलग था - इस उदाहरण में aac। इसलिए मुझे उन्हें वैसे भी ट्रांसकोड करना होगा। मदद के लिए आपका बहुत बहुत धन्यवाद!
बजे तक

आपका स्वचालित उदाहरण उन फ़ाइलनामों से टूटता है, जिनमें रिक्त स्थान हैं क्योंकि आपने ffprobe उप-कथन में $ फ़ाइल का उद्धरण नहीं किया है। इसे बदलना: फ़ाइल में * mp4 * avi के लिए; ffmpeg -i "$ फ़ाइल" -vn -acodec कॉपी "$ फ़ाइल"। ffprobe "$file" 2>&1 |sed -rn 's/.*Audio: (...), .*/\1/p'; किया जो ठीक करता है।
एंड्रयू बील्स

+1 लेकिन ऐसा लगता है कि यह उत्तर एक अद्यतन का उपयोग कर सकता है:This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
निकोलस राउल

ffmpegया ffprobeUbuntu 14.04 या बाद के लिए उपलब्ध नहीं हैं।
जारो

1
@jarno ffmpeg 15.04 में उबंटू में लौटा , और यह लीबाव की तरह दिखता है avconvऔर 15.10avprobe में हटा दिया गया है
१०:४

1

जैसा कि निकोलस राउल ने कहा, इसे अपडेट करने की जरूरत है। यहां वही लाइन है जो रोडमार्ट ने दी थी लेकिन इसके बजाय एवोकॉन का उपयोग कर रहा था:

for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done


यह अब पुराना हो चुका है। FFmpeg वापस आ गया है और Libav चला गया है।

बिलकुल सही। अगर किसी को लगा कि ffmpeg मरने वाला है, तो इसे पढ़ें: en.wikipedia.org/wiki/Libav#Confusion
स्कूबी -2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.