ट्रांसकोडिंग के बिना एवोकॉन के साथ बैच अर्क ऑडियो


14

मेरे पास लगभग 70 mp4 फाइलें हैं, और मैं आगे ट्रांसकोडिंग के बिना सीधे ऑडियो फाइलों को निकालना चाहता हूं। सभी mp4 फाइलों में aac ऑडियो फाइलें होती हैं।

मैं समझता हूं कि मैं mp4 फ़ाइल में से एक से ऑडियो फ़ाइल निकालने के लिए निम्न कमांड का उपयोग कर सकता हूं:

avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"

मैं सभी 70 mp4 फ़ाइलों से सभी ऑडियो फ़ाइलों को कैसे निकालूं, इसलिए मैं 70 aac फ़ाइलों के साथ समाप्त होता हूं?

जवाबों:


21

आप लूप के लिए एक सरल का उपयोग कर सकते हैं:

for i in *.mp4; do
    avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"
done

या एक लाइन पर:

for i in *.mp4; do avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"; done

क्या करता है avconvएक बार हर फ़ाइल के लिए चलाया जाता है जैसे *.mp4कि फ़ाइल नाम को ${i}चर में संग्रहीत किया जाता है।

${i%.mp4}का अर्थ है ${i}(यानी फ़ाइल नाम) .mp4अंत से दूर छीन लिया।


2
IIRC, कच्ची aac फ़ाइलों में मेटाडेटा नहीं हो सकता है; यदि आप मूल फ़ाइलों से मेटाडेटा रखना चाहते हैं, तो m4a (जो कि mp4 के लिए सिर्फ एक और नाम है, लेकिन ऑडियो खिलाड़ियों द्वारा काफी व्यापक रूप से पहचाना जाता है) एक फ़ाइल एक्सटेंशन के रूप में एएसी के बजाय।
evilsoup

-मैप विकल्प के लिए क्या है? आप अन्य धाराओं के बजाय 0: 1 स्ट्रीम क्यों चुनते हैं, जैसे कि 0: 0, 0: 2?
QED

मैं -map विकल्प गिरा दिया और यह सिर्फ ठीक काम करता है
QED

थूनर कस्टम क्रियाओं और इसी तरह की इस कमांड का उपयोग करने के लिए, यह काम करता है यदि स्क्रिप्ट में और थूनर क्रियाओं में जोड़ा जाता है: bash /path/to/the/script %F- यहाँ की

2
@qed: ड्रॉपिंग तब -mapभी वीडियो का कारण हो सकता है जब आप किसी अन्य आउटपुट स्वरूप पर स्विच करते हैं (यदि उस प्रारूप में ऑडियो और वीडियो दोनों हो सकते हैं)। इसे सुरक्षित रखना है।
डॉ। Sybren

5

यदि आपके पास एक निर्देशिका में सभी फाइलें हैं, तो जिओ का उत्तर आमतौर पर सबसे उपयोगी है; लेकिन अगर अलग-अलग निर्देशिकाओं में MP4 फ़ाइलें बिखरी हुई हैं, तो आप findउन सभी को बदलने के लिए इस कमांड का उपयोग कर सकते हैं ।

find . -type f -name '*.mp4' -exec bash -c 'avconv -i "$0" -c:a copy "${0/%mp4/m4a}"' {} \;

यह अंत में bash string प्रतिस्थापन के थोड़े अलग रूप का उपयोग करता है: "$ {0 /% mp4 / m4a}", mp4 को m4a से बदलने के लिए bash को बताता है, लेकिन केवल अगर mp4 स्ट्रिंग के अंत में है।


मुझे कभी नहीं पता था कि बैश में उस प्रकार का प्रतिस्थापन था। बहुत बढ़िया :)
एंड्रयू गुन्नर्सन

1
अगर आप %इसे छोड़ देते हैं , तो यह स्ट्रिंग के पहले उदाहरण के लिए प्रतिस्थापन का पता लगाएगा ; आप #इसे केवल स्ट्रिंग का विकल्प बनाने के लिए उपयोग कर सकते हैं यदि यह एक चर की शुरुआत में है; इसलिए $ {0 / mp4 / m4a} mp4 के पहले उदाहरण को m4a से बदल देगा (जो कि अगर आपके पास अजीब फ़ाइल नाम है तो समस्या हो सकती है); और $ {0 / # mp4 / m4a} m4a के लिए mp4 स्थानापन्न करेगा, लेकिन केवल अगर चर का मूल्य mp4 से शुरू होता है (यहां कोई उपयोग नहीं, जाहिर है, लेकिन यह कहीं और काम आ सकता है)।
evilsoup

3

एक ही समय में संसाधित होने वाली कई फ़ाइलों से बचने के लिए (जो बहुत अधिक संसाधनों का उपयोग कर सकते हैं), उपयोग करें parallel। डिफ़ॉल्ट रूप से, यह केवल एक समय में एक काम करता है। यदि आप समानांतर में कई सीपीयू कोर का उपयोग करना चाहते हैं, तो समानांतर में parallel -j 4 ...4 नौकरियों के लिए प्रयास करें । यह भी देखें man parallel

sudo apt-get install parallel

यह लाइन aacचयनित वीडियो से ऑडियो फाइलों को निकालेगी और उन्हें m4aकंटेनरों में डालेगी।

parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F

सीएलआई में सीधे काम करते समय, %Fअपनी इनपुट फ़ाइलों की सूची के साथ स्थानापन्न करें। उदाहरण के लिए*.mp4

से प्रेरित होकर इस , जवाब द्वारा पिछले एक जवाब इस सवाल का, और द्वारा evilsoup 'उत्तरार्द्ध (कह टिप्पणी रों: ' कच्चे AAC फ़ाइलें मेटाडेटा नहीं कर सकते हैं, आप मेटाडाटा मूल फाइलों से रखने के लिए तो m4a का उपयोग करें (चाहते हैं जो mp4 के लिए बस एक और नाम है, लेकिन ऑडियो खिलाड़ियों द्वारा काफी व्यापक रूप से पहचाना जाता है) एक फ़ाइल एक्सटेंशन के रूप में एएसी के बजाय ))।

मैं थूनर कस्टम क्रियाओं में इस तरह के कमांड का उपयोग करता हूं,

यहां छवि विवरण दर्ज करें

aacऑडियो वाले वीडियो पर एप्लिकेशन को सीमित करना ।

यहां छवि विवरण दर्ज करें

प्रसंस्करण के दौरान एक टर्मिनल विंडो खुली रहती है, जो अंत में बंद हो जाती है, कमांड को इस तरह बदला जा सकता है:

 gnome-terminal -e "parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F"

2

मैंने @ जिओ-लॉन्ग चेन के उत्तर को बढ़ाया, इसे एक स्क्रिप्ट में बदल दिया जो आउटपुट फाइल के नए होने पर फाइलों को छोड़ देती है:

#!/bin/bash

for file in *.mp4; do
    OUT="${file/.mp4/.m4a}"

    if [ "$file" == "$OUT" ]; then
        echo "Unable to handle $file" >&2
        exit 1
    fi

    if [ "$OUT" -nt "$file" ]; then
        echo "Skipping $file; output file is newer."
        continue
    fi

    echo "Converting \"$file\" -> \"$OUT\""
    avconv -loglevel warning -i "$file" -map 0:1 -c:a copy "$OUT"
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.