मैं टर्मिनल से अकेले LAME & FLAC का उपयोग करके .flac से .mp3 तक कैसे जा सकता हूं?


31

लंबे समय से मैं एक रिश्तेदार क्लंकी तकनीक का उपयोग कर रहा हूं जिसमें एक लंगड़ा प्लगइन के साथ ऑडेसिटी शामिल है। यह ठीक है, मुझे लगता है, लेकिन टर्मिनल दृष्टिकोण की अपील है कि मैं अपने साथ थोड़ा महीन दाने वाला हो सकता हूं [options]और शायद अप-टू-डेट बायनेरिज़ का उपयोग कर सकता हूं ।

इसके अलावा, मेरा मैकबुक अब थोड़ा बूढ़ा हो रहा है और अगर मैं एक अनावश्यक जीयूआई से छुटकारा पा सकता हूं, तो सभी बेहतर होंगे।

अग्रिम में धन्यवाद।


1
आप वास्तव में ऐसा करने के लिए अंक प्राप्त करेंगे;)
मोर्टिमर

हाहा ... मैंने सवाल का जवाब दिया है, लेकिन यह कह रहा हूं कि मैं दो दिनों के लिए अपने जवाब की पुष्टि नहीं कर सकता। माफ़ कीजिये। फिर भी यह पता लगाना कि चीजें यहाँ कैसे काम करती हैं। बहुत बढ़िया साइट। : D
boehj

जवाबों:


41

टैग्स को संरक्षित किए बिना किसी एकल फ़ाइल को परिवर्तित करना

brew install lame
flac --decode --stdout test.flac | lame --preset extreme - test.mp3
  • --decode --stdout = -dc
  • lame - $outfile = एसटीडीआईएन से इनपुट
  • --preset extreme= ~ 245 kbit / s VBR

एक शेल स्क्रिप्ट जो कुछ ID3 टैग को संरक्षित करती है

#!/bin/bash

for f in "$@"; do
    [[ "$f" != *.flac ]] && continue
    album="$(metaflac --show-tag=album "$f" | sed 's/[^=]*=//')"
    artist="$(metaflac --show-tag=artist "$f" | sed 's/[^=]*=//')"
    date="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
    title="$(metaflac --show-tag=title "$f" | sed 's/[^=]*=//')"
    year="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
    genre="$(metaflac --show-tag=genre "$f" | sed 's/[^=]*=//')"
    tracknumber="$(metaflac --show-tag=tracknumber "$f" | sed 's/[^=]*=//')"

    flac --decode --stdout "$f" | lame --preset extreme --add-id3v2 --tt "$title" --ta "$artist" --tl "$album" --ty "$year" --tn "$tracknumber" --tg "$genre" - "${f%.flac}.mp3"
done

स्क्रिप्ट का उपयोग करने के लिए, बस इसे कहीं ~/bin/flac2mp3और सहेजें और इसे निष्पादन योग्य बनाएं chmod +x ~/bin/flac2mp3

यह आपके संगीत फ़ोल्डर में सभी flac फ़ाइलों को परिवर्तित करेगा:

find ~/Music/ -name '*.flac' -exec ~/bin/flac2mp3 {} \;

या थोड़ा तेज, क्योंकि यह केवल एक बार flac2mp3 कहता है:

find ~/Music/ -name '*.flac' -print0 | xargs -0 ~/bin/flac2mp3

2
आपको यहां उत्तर पोस्ट करना चाहिए, न कि प्रश्न में पाठ का संदर्भ। IMHO, आपको प्रश्न और उत्तर दोनों को संपादित करना चाहिए और निष्कर्ष पर जाना चाहिए।
lpacheco

ठीक। कर दूँगा। माफ़ कीजिये।
boehj

2
${file%.flac}.mp3कमाल है! पहले मैं ${x:: ${#x}-3}m4aगाने के फ़ाइल नाम को .wav से .m4a में बदलने के लिए उपयोग कर रहा था । एक तरह से देखने के लिए बहुत बढ़िया है जो थोड़ा आसान लगता है।
जेसन सलज

1
ऐसा लगता है कि विकल्प 3 में एक बग है। संभवतः लंगड़े संस्करण के कारण, लेकिन वर्तमान कोड को लंगड़ा करने के लिए नहीं कहा गया है कि इसे इनपुट फ़ाइल के रूप में इनपुट स्ट्रीम का उपयोग करना चाहिए, और आउटपुट फ़ाइल भी निर्दिष्ट नहीं है, क्योंकि धारा का उपयोग किया जाता है, यह है ज़रूरी। मेरे लिए अंतिम कोड है: !/bin/sh file="$1" outfile=${file%.flac}.mp3 eval $(metaflac --export-tags-to - "$file" | sed "s/=\(.*\)/='\1'/") flac -cd "$file" | lame --preset standard \ --add-id3v2 --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" \ --ty "$DATE" --tn "$TRACKNUMBER" --tg "$GENRE" \ - "$outfile"
मेहल

इसके अलावा एक ऐसी स्क्रिप्ट तैयार करना अच्छा है, जो इस 'सामान' को
खोजती हो

10

ffmpeg डिफ़ॉल्ट रूप से टैग (लेकिन कवर आर्ट नहीं) को संरक्षित करेगा।

for f in *.flac; do ffmpeg -i "$f" -aq 1 "${f%flac}mp3"; done

-aq 1-V 1लंगड़े में मेल खाती है । -acodec libfaacफ़ाइलों को AAC में कनवर्ट करेगा:

for f in *.flac; do ffmpeg -i "$f" -acodec libfaac -aq 200 "${f%flac}m4a"; done

मैंने अभी यह किया और यह कहा: `` `मेटाडेटा: टिप्पणी: कवर (सामने) एनकोडर: Lavc57.107.100 png` `` macOS खोजक कवर कला को दर्शाता है। काढ़ा से ffmpeg 3.4.2।
हबीबी

मुझे तब एहसास हुआ कि मेरा ffmpeg बहुत पुराना था। मैंने इसे 4.1.3 में एक ही परिणाम के साथ अपग्रेड किया - एक ही आकार के एमपी 3 फाइलें, काम करने वाली कला के साथ।
22

4

मैंने वह लिया जो आप लोगों के पास था, लेकिन फिर xargsनौकरियों को समानांतर करने के लिए इसका उपयोग करके इसे और भी तेज किया ।

find <directory> -name '*.flac' -print0 | xargs -0 -P8 -n1  /usr/local/bin/flac2mp3

फिर यह ऊपर / usr / स्थानीय / बिन / flac2mp3 से स्क्रिप्ट है

#!/usr/bin/env bash

for f in "$@"; do
  [[ "$f" != *.flac ]] && continue
  album="$(metaflac --show-tag=album "$f" | sed 's/[^=]*=//')"
  artist="$(metaflac --show-tag=artist "$f" | sed 's/[^=]*=//')"
  date="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
  title="$(metaflac --show-tag=title "$f" | sed 's/[^=]*=//')"
  year="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
  genre="$(metaflac --show-tag=genre "$f" | sed 's/[^=]*=//')"
  tracknumber="$(metaflac --show-tag=tracknumber "$f" | sed 's/[^=]*=//')"

  flac --decode --stdout "$f" \ 
         | lame --preset extreme \
                --add-id3v2 \
                 --tt "$title" \
                 --ta "$artist" \
                 --tl "$album" \
                 --ty "$year" \
                 --tn "$tracknumber" \
                 --tg "$genre" \
                 - "${f%.flac}.mp3"
done

और समानांतरता का उपयोग करते हुए प्रदर्शन स्पीडअप के लिए कुछ आँकड़े पाले।

find <dirOfFlac24s> -name '*.flac -print0 | xargs -0 -P8 -n1 /usr/local/bin/flac2mp320  

0.00s user 0.00s system 60% cpu 0.002 total
115.94s user 1.40s system 359% cpu 32.655 total

time /usr/local/bin/flac2mp320 <dirOfFlac24s>/*.flac
96.63s user 1.46s system 109% cpu 1:29.98 total

आप यह भी देख सकते हैं कि यह मेरे सीपीयू को अधिक प्रभावी ढंग से उपयोग करता है, मेरे पास एक इंटेल i7 है, इसलिए 8 संभवतः प्रक्रियाओं की सही संख्या है।


2

FLAC स्रोत फ़ाइलों से MP3 के सीधे एन्कोडिंग करने का प्रयास करते समय यह थ्रेड मिला। Boehj का उत्तर एक सभ्य स्क्रिप्टिंग विकल्प प्रदान करता है, लेकिन मैं व्यक्तिगत रूप से FFmpeg का उपयोग करना पसंद करता हूं, इसलिए यह बैश स्क्रिप्ट है जो मैं इस कार्य को संभालने के लिए आया था। परीक्षण किया गया और macOS Sierra (10.12.2) में बढ़िया काम किया।

अनुलाभ: आप होना चाहिए ffmpegऔर lameपहले से ही अपने मैक पर स्थापित। ऐसा करने का सबसे आसान तरीका होमब्रे है। पहले सुनिश्चित करें कि आपने Homebrew इस तरह स्थापित किया है:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

फिर स्थापित करने के लिए इस कमांड को चलाएं ffmpegऔर lame:

brew install ffmpeg lame

एक बार जो किया जाता है आप इस स्क्रिप्ट को चलाने के लिए तैयार हैं। यह स्क्रिप्ट निर्देशिका में FLAC फ़ाइलों को खोजेगी, path/to/FLAC/filesलेकिन इसे केवल .उसी निर्देशिका में FLAC फ़ाइलें होने पर परिवर्तित किया जा सकता है जब आप यह स्क्रिप्ट चला रहे हों। जब यह चलती है तो यह एक mp3/उपनिर्देशिका बनाएगी जहाँ सभी MP3 फ़ाइलें होंगी। रखा हे।

find -E "path/to/FLAC/files" -type f -iregex ".*\.(FLAC)$" |\
  while read full_audio_filepath
  do

    # Break up the full audio filepath stuff into different directory and filename components.
    audio_dirname=$(dirname "${full_audio_filepath}");
    audio_basename=$(basename "${full_audio_filepath}");
    audio_filename="${audio_basename%.*}";
    # audio_extension="${audio_basename##*.}";

    # Set the MP3
    mp3_dirpath="${audio_dirname}/mp3";
    mp3_filepath="${mp3_dirpath}/${audio_filename}.mp3";

    # Create the child MP3 directory.
    mkdir -p "${mp3_dirpath}";

    # Get the track metadata.
    mp3_title=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:TITLE= | cut -d '=' -f 2- );
    mp3_artist=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:ARTIST= | cut -d '=' -f 2- );
    mp3_album=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:ALBUM= | cut -d '=' -f 2- );
    mp3_year=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:YEAR= | cut -d '=' -f 2- );
    mp3_track=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:TRACK= | cut -d '=' -f 2- | sed 's/^0*//' );
    mp3_tracktotal=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:TRACKTOTAL= | cut -d '=' -f 2- | sed 's/^0*//' );
    mp3_genre=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:GENRE= | cut -d '=' -f 2- );

    # Where the magic happens.
    ffmpeg -y -v quiet -nostdin -i "${full_audio_filepath}" -ar 44100 -sample_fmt s16 -ac 2 -f s16le -acodec pcm_s16le - | \
      lame --quiet --add-id3v2 --pad-id3v2 --tt "${mp3_title}" --ta "${mp3_artist}" --tl "${mp3_album}" --tn "${mp3_track}"/"${mp3_tracktotal}" --tg "${mp3_genre}" -r -m s --lowpass 19.7 -V 3 --vbr-new -q 0 -b 96 --scale 0.99 --athaa-sensitivity 1 - "${mp3_filepath}";

  done

कुछ चीज़ें जो मैंने सीखीं "द हार्ड वे ™" ताकि दूसरों को इंटरनेट पर दूसरों की तुलना में इस स्क्रिप्ट में जो मैंने अलग तरीके से किया, उससे लाभ मिल सके।

  • grepटैग पार्स (प्रयोग करने के लिए आदेशों FFprobe जो FFmpeg के साथ स्थापित किया गया है) का उपयोग कर असंवेदनशील मामले हैं -iविकल्प इसे बनाने के लिए grep -i
  • निम्न cutकमांड अब केवल आउटपुट पर केवल =एक टैग नाम के आधार पर आउटपुट को विभाजित करने के लिए सीमित है , -f 2-जो विकल्प बनाता है cut -d '=' -f 2-। उदाहरण के लिए, फुटपाथ में एक गीत है जिसका शीर्षक "5-4 = एकता" है और यदि केवल दूसरे चंक को कट के माध्यम से चुना जाता है तो उस शीर्षक को "5-4" पर काट दिया जाएगा।
  • ट्रैक-और कुल ट्रैक-संख्या के लिए मैंने एक अतिरिक्त पाइप जोड़ा sed, जिससे अग्रणी शून्य से छुटकारा मिलता है sed 's/^0*//':।
  • इंटरनेट के चारों ओर समान स्क्रिप्ट में, FFmpeg आउटपुट कुछ ऐसा है -f wavऔर यह वास्तव में FFmpeg आउटपुट को संपीड़ित करेगा जो कि पाइप सेटअप में कोई मतलब नहीं रखता है जहां LAME इसे फिर से एनकोड करने जा रहा है। इसके बजाय यहाँ आउटपुट सेट है -f s16le -acodec pcm_s16leजो मूल रूप से रॉ आउटपुट है; इस तरह एक और प्रक्रिया के लिए ऑडियो पाइपिंग के लिए एकदम सही है।
  • पाइप के LAME साइड पर RAW आउटपुट से निपटने के लिए, मुझे -rविकल्प जोड़ना पड़ा ।
  • यह भी ध्यान रखें --tt, --ta, --tl, --tnऔर --tgID3v2 टैग लंगड़ा के लिए विकल्प। जब ऑडियो को LAME में एक प्रक्रिया से स्ट्रीम / पाइप किया जाता है, तो स्रोत फ़ाइल से मेटाडेटा खो जाता है। एक सुझाया गया विकल्प है FFmpeg पाने के लिए मेटाडेटा को टेक्स्ट फ़ाइल में सेव करने के विकल्प के साथ विकल्प सेट करके -f ffmetadata "[metadata filename here]"और फिर FFmpeg को कुछ इस तरह से चलाना -i "[metadata filename here]" -map_metadata 1 -c:a copy [destination mp3 file] id3v2_version 3 -write_id3v1 1। यह काम करता है, लेकिन एक गंतव्य फ़ाइल के लिए आवश्यकता पर ध्यान दें। FFmpeg की तरह लगता है केवल मेटाडेटा आयात करता है जब यह फ़ाइल को कॉपी कर सकता है जो एक बहुत ही बेकार प्रक्रिया की तरह लगता है। मूल्यों को प्राप्त करने के लिए FFprobe का उपयोग करते हुए और फिर साथ लंगड़ा में उन्हें स्थापित करने --tt, --ta, --tl, --tnऔर --tgविकल्प बेहतर काम करता है; सभी मेटाडेटा को जगह में लिखा गया है, इसलिए डुप्लिकेट फ़ाइल को उत्पन्न करने की आवश्यकता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.