FLAC উত্স ফাইলগুলি থেকে এমপি 3 এর সরাসরি এনকোডিং করার চেষ্টা করার সময় এই থ্রেডটি পেয়েছে। বোহজের উত্তরটি একটি সুনির্দিষ্ট স্ক্রিপ্টিং বিকল্প সরবরাহ করে, তবে আমি ব্যক্তিগতভাবে এফএফপিপিগ ব্যবহার করতে পছন্দ করি, সুতরাং এই টাস্কটি পরিচালনা করার জন্য আমি এই বাশ স্ক্রিপ্টটি নিয়ে এসেছি। ম্যাকোস সিয়েরাতে (10.12.2) পরীক্ষিত এবং দুর্দান্ত কাজ করে।
বেতনের অতিরিক্ত ভাতাদি: তোমার উচিত ছিল ffmpegএবং lameইতিমধ্যেই আপনার Mac এ ইনস্টল করা নেই। এটি করার সবচেয়ে সহজ উপায় হ'ম হোমব্রুয়ের মাধ্যমে। প্রথমে নিশ্চিত করুন যে আপনি হোমব্রিউটি এটি ইনস্টল করেছেন:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
তারপরে এই কমান্ডটি ইনস্টল করুন ffmpegএবং lame:
brew install ffmpeg lame
এটি হয়ে গেলে আপনি এই স্ক্রিপ্টটি চালাতে প্রস্তুত। এই স্ক্রিপ্টটি ডিরেক্টরিতে FLAC ফাইলগুলি সন্ধান করবে তবে এফএলএসি ফাইলগুলি একই ডিরেক্টরিতে থাকলে আপনি এই স্ক্রিপ্টটি চালাচ্ছেন path/to/FLAC/filessimply .এটি চালিত হলে এটি একটি mp3/উপ-ডিরেক্টরি তৈরি করবে যেখানে এমপি 3 ফাইলগুলি হবে স্থাপিত।
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
আমি "হার্ড ওয়ে learned" শিখেছি এমন বিষয়ে কিছু নোট যাতে ইন্টারনেটের অন্যদের তুলনায় এই স্ক্রিপ্টে আমি অন্যভাবে যা করেছি তা থেকে অন্যরা লাভ করতে পারে।
grepট্যাগ পার্সিং (ব্যবহার করার জন্য কমান্ড FFprobe যা FFmpeg সঙ্গে ইনস্টল করা) ব্যবহার করে অবশ ক্ষেত্রে হয় -iবিকল্প এটি না করা grep -i।
- নিম্নলিখিত
cutকমান্ডটি কেবলমাত্র =ট্যাগ নামের প্রথম ভিত্তিতে আউটপুট বিভাজনের মধ্যে সীমাবদ্ধ রয়েছে যাতে -f 2-বিকল্পটি কমান্ড তৈরি করে cut -d '=' -f 2-। উদাহরণস্বরূপ, প্যাভমেন্টের একটি গান রয়েছে যার শিরোনাম রয়েছে “5-4 = ityক্য” এবং যদি কেবল দ্বিতীয় অংশটিকে কাটা মাধ্যমে নির্বাচিত করা হত তবে সেই শিরোনামটি “5-4” এ কেটে ফেলা হত।
- ট্র্যাক-এবং মোট ট্র্যাক-সংখ্যার জন্য আমি একটি অতিরিক্ত পাইপ যোগ করা
sedযা বসানো শূন্যগুলি পরিত্রাণ পায়: sed 's/^0*//'।
- ইন্টারনেটের আশেপাশের অনুরূপ স্ক্রিপ্টগুলিতে, এফএফপিপিগ আউটপুটটি এমন একটি বিষয়
-f wavএবং এটি আসলে এফএফএমপিগ আউটপুটকে সংকুচিত করবে যা পাইপ সেটআপে লাম এটিকে পুনরায় এনকোড করতে চলেছে এমন কোনও ধারণা রাখে না। পরিবর্তে এখানে আউটপুট সেট করা হয় -f s16le -acodec pcm_s16leযা মূলত RAW আউটপুট; এই জাতীয় প্রক্রিয়াতে অডিও পাইপ করার জন্য উপযুক্ত perfect
- পাইপের লাম পাশের কাঁচা আউটপুটটি মোকাবেলা করতে আমাকে
-rবিকল্পটি যুক্ত করতে হয়েছিল ।
- এছাড়াও মনে রাখবেন
--tt, --ta, --tl, --tnএবং --tgID3v2 ট্যাগ অগ্রহণযোগ্য জন্য অপশন। যখন অডিওটি একটি প্রক্রিয়া থেকে লামে প্রবাহিত হয় / উত্স থেকে উত্স ফাইল থেকে মেটাডেটা হারিয়ে যায়। এক প্রস্তাব বিকল্প বিকল্পটি সেটিংয়ের দ্বারা একটি টেক্সট ফাইলে মেটাডেটা সংরক্ষণ করতে 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। এটি কাজ করে তবে গন্তব্য ফাইলের প্রয়োজনীয়তাটি নোট করুন। দেখে মনে হচ্ছে এফএফম্পেগ কেবলমাত্র মেটাডেটা আমদানি করে যখন এটি ফাইলটি অনুলিপি করে যা খুব অপব্যয় প্রক্রিয়া বলে মনে হয়। মান পেতে FFprobe ব্যবহার এবং তারপর সঙ্গে অগ্রহণযোগ্য তাদের সেটিং --tt, --ta, --tl, --tnএবং --tgঅপশন ভাল কাজ করে; সমস্ত মেটাডেটা জায়গায় লেখা হয়েছে তাই নকল ফাইল তৈরি করা দরকার।