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
और --tg
ID3v2 टैग लंगड़ा के लिए विकल्प। जब ऑडियो को 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
विकल्प बेहतर काम करता है; सभी मेटाडेटा को जगह में लिखा गया है, इसलिए डुप्लिकेट फ़ाइल को उत्पन्न करने की आवश्यकता है।