Monday, October 26, 2009

ලිනක්ස් මත MP3 ප්‍රති-කේතාංකනය



අද මගේ බ්ලොග් එක කියවන අයට පොඩි script එකක් ලැබෙනවා... MP3 වල bitrate අඩු කරගන්න පුළුවන්.  ඒක පිටපත් කරගෙන තියාගන්න. ප්‍රයෝජනවත් වෙයි. සටහන කියවන්න කම්මැලී වගේ නම් මෙන්න බාගන්න ඒක. :)

මාතෘකාවෙම තියෙනව ටිකක් නේද මහ අමුතු බර වචනයක් -- ප්‍රති-කේතාංකනය. බය වෙන්න එපා.. මේ යෙදුම මෙතනට ගැළපෙනවද කියල මමවත් දන්නෙ නෑ :D . Re-encoding කියන ඉංග්‍රීසි යෙදුමට සුදුසු සිංහල වචනයක් ගැන කල්පනා කරද්දි සිහියට ආවෙ ප්‍රති-කේතාංකනය. මේ වචනෙ පාවිච්චි කරන එකේ හරි වැරැද්ද මම දන්නෙ නැහැ :-/ . මොකක් වුණත්, මගේ අවශ්‍යතාව මුලින්ම කියන්නම්.

මම බොහෝම දැඩි ලෙස සංගීත ලෝලියෙක් B-) . ඒ නිසා මගේ පරිගණකයෙ තියෙන සම්පූර්ණ MP3 එකතුවම ජංගම දුරකථනයට ඔබාගත්තත් මට මදි වගේ. ජංගම දුරකථනයෙ තියෙන M2 චිප් එක 1 GB. පිංතූර ගන්නත් චිප් එකේ ඉඩ තියෙන්න ඕන නිසාත්, ගීත වැඩි ගණනක් ජංගම දුරකථනයට දමාගන්න ඕන නිසාත් මම කල්පනා කළා මගේ ළඟ තියෙන MP3 ගොනු වල bitrate අඩු කරන්න. එහෙම කළාම ගොනු ප්‍රමාණය සෑහෙන අඩු වෙනවා.

උදාහරණයක් විධියට ගත්තොත්,
320 kbps, 44100 Hz, මින්ත්තු 6 තත්පර 5 වෙන sterio MP3 ගොනුවක ප්‍රමාණය 14 MB නම්, ඒක 128 kbps දක්වා bitrate අඩු කළාම 5.6 MB පමණ ප්‍රමාණයක් වෙන්නේ. ඉතින්, ලොකු ඉතුරුවක්!

ඉතින්, අන්තර්ජාලයෙන් විසඳුමක් හොයද්දි හම්බවුණා එකක්. ඒ lame මෘදුකාංගය. Audacity පාවිච්චි කරල තියෙන අය මේ මෘදුකාංගය ගැන දන්නවා. Audacity වල MP3 encoding library එක වෙන්නෙ lame. ඉතින්, lame නැත්තම් මුලින්ම පරිගණකයෙ lame ස්ථාපනය කරගන්න.

# apt-get install lame

මෙන්න මට ලැබුණු විසඳුම:
http://www.linuxquestions.org/questions/linux-software-2/reduce-mp3-bitrate-336791/

#!/bin/bash

for file in `ls`
do
file=`echo $file | sed s/\ /_/g`
echo $file
lame --decode $file
lame -b 128 $file.wav
rm $file
rm $file.wav
mv $file.wav.mp3 $file
done

වැඩේ හොඳයි. මොකද MP3 ගොනු 100ක් විතර encode කරන්න ඕන වුණ වෙලාවට lame මෘදුකාංගයෙන් batch processing විධියට කරන්න බැහැ. ඒ නිසා loop එකක් ධාවනය වෙන පොඩි script එකක් අවශ්‍ය වෙනවා. හැබැයි මේක ප්‍රායෝගික නෑ. හේතුව, එයාල දීල තියෙන script කේතය වැඩ කරන්නෙ නැහැ MP3 ගොනු වල නමේ හිස්තැන් (whitespaces, ASCII character 32) තිබුණොත්. For loop එකෙන් ගොනු නමේ සීමාව ලෙස හඳුනගන්නෙ හිස්තැන. නමුත් ප්‍රායෝගිකව අපට ලැබෙන MP3 ගොනු බොහොමයක නමේ මැද හිස්තැන් තියෙනවා. ඉතින් මේවා එකින් එක rename කර කර ඉන්නවට වැඩිය හොඳයි පැය ගාණක් වැය කරලා එකින් එක වෙන වෙනම encode කරන එක.

ඉතින් මම කල්පනා කළා විසඳුමක්. මුලින් කල්පනා කළේ, ls වෙනුවට ls -Q පාවිච්චි කළොත් ප්‍රතිපලයෙ හැම ගොනු නමක්ම වෙන වෙනම උධෘත සලකුණු දෙකක් අතරට එනවා. දැන් ඒකෙන් ගොනු නම් ටික වෙන් කරගන්න ලූප් එකක් ඇතුලෙ වැඩ කරන පොඩි ඇල්ගොරිතම් එකක් ලියන්න පුළුවන්...........

........... හාපෝයි බෑ.... අවශ්‍යතාව අනුව බරපතල වැඩියි... මම යන්නෙ වැරදි පාරේ............!!!! :-O

විසඳුමක් කල්පනා කරද්දි මතක් වුණා කැම්පස් එකේදි ළඟදි ඉගෙනගන්න ලැබුණු find shell විධානය. ඉතින් කෑලි බෑලි ටිකක් එක්ක අටවලා මම script එකක් ලිව්වා. මම ඉතින් free ඇන්ඩ් open නොවැ... බෙදා හදාගෙන කාලා බොහෝම පුරුදුයි. ඒකයි මේ ලියමන ලියන්නේ.... මෙන්න code එක. වැඩ දන්නා ඇත්තෝ මේක දියුණු කරත්වා!

if [ $# -eq 2 ]
then
mkdir $1/output
cd $1
find . -maxdepth 1 -exec lame -h -b $2 {} ./output/{}  \;
else
echo "Invalid arguements, please refer http://blog.shaakunthala.com/2009/10/mp3.html"
fi

මේක අළුත් text file එකකට copy-paste කරගන්න. ඒක කැමති නමකින් (උදා: mp3enc.sh) සුරකින්න.

දැන්,
$ chmod +x mp3enc.sh

පාවිච්චි කරණ පිළිවෙළ:
ප්‍රති-කේතාංකනය කරන්න අවශ්‍ය MP3 ගොනු සියල්ලම එක ඩිරෙක්ටරියකට (ෆෝල්ඩරයකට) පිටපත් කරන්න. දැන්,

$ ./mp3enc.sh <mp3_files_directory> <target_bitrate_kbps>

උදාහරණයක් විධියට අපට අවශ්‍ය ප්‍රතිදාන bitrate එක 128 kbps ලෙසත්, අපේ MP3 ගොනු ටික තියෙන්නෙ /home/shaakunthala/Desktop/music ඩිරෙක්ටරියෙ බවත් සලකමු. එහෙම නම් කරන්න තියෙන්නේ,

$ ./mp3enc.sh /home/shaakunthala/Desktop/music 128

හරිම පහසුයි නේද? දැන් අපේ MP3 ගොනු තියෙන ඩිරෙක්ටරිය ඇතුළෙ output ලෙස තව ඩිරෙක්ටරියක් නිර්මාණය වෙනවා. Bitrate අඩු කළ (ප්‍රතිදාන) ගොනු ටික එහි ඇති. :)

එතකොට code එකේ තේරුම? ඒක තනියම තේරුම් ගන්න පහසුයි. නමුත්,

find . -maxdepth 1 -exec lame -h -b $2 {} ./output/{}  \;

මේක මත තමයි අපේ වැඩේ රඳා පවතින්නේ.
find වලින් කරන්නේ දෙන ලද ඩිරෙක්ටරියක සහ සබ්ඩිරෙක්ටරි වල තියෙන ගොනු සෙවීම.
-maxdepth 1 මේකෙන් කරන්නේ අපි ලබා දුන් ඩිරෙක්ටරියෙ සිට පහළට එක මට්ටමකට පමණක්, එනම් අපි ලබා දුන් ඩිරෙක්ටරියෙ පමණක් ගොනු සෙයන්න කියන එක. තවත් පහළට ගියොත් හමු වෙන්නේ output ඩිරෙක්ටරිය ඇතුළෙ තියෙන ප්‍රති-කේතාංකනය කළ ගොනු. ඒවත් එක්ක පටලැවිල්ලක් ඇති වීම වැළැක්වීමයි අරමුණ.
-exec find විධානයෙන් දෙන ප්‍රතිදානය මත වෙනත් විධානයක් ක්‍රියාත්මක (execute) කරන්නෙ මේකෙන්.
$1, $2 මෙයින් නිරූපණය වෙන්නේ විධාන පෙළට ලබා දුන් පරාමිතීන්. ඒ කියන්නේ අපේ MP3 ගොනු තියෙන ඩිරෙක්ටරිය සහ ප්‍රතිදාන bitrate එක.
{} find විධානයේ ප්‍රතිදානය.

මේක මාගලක් වගේ මහා ලියමනක් ලියන්න තරම් ලොකු දෙයක් නෙමෙයි. මට නම් සුළු දෙයක්. නමුත් වැඩි පිරිසකට තේරුම් ගන්න පුළුවන් විධියට ලියන්න මට ඕන වුණ නිසයි ටිකක් දීර්ඝව විස්තර කළේ. Shell Script ලිවීම ගැන සිංහලෙන් උපකාරක අත්වැලක් diGIT සඟරාවේ පළ වෙන බවත් නැවත මතක් කරන්න කැමතියි. මමයි ලියන්නේ. :) ඉතින්, අදට ආයුබෝ....!

10 අදහස්:

ගයන්ත said...

තවම නම් ඔහොම අව්‍ශ්‍යතාවයක් ඇවිල්ලා නෑ.. ;)
ඒත් Terminal එකේ Loop run කිරිල්ල අධ්‍යයනය කරන්න වටිනවා වගේ.. :)

Thanx

ඉන්දරේ said...

හොඳ ලිපියක්. සිරා !

ඒ වගේම ලිනක්ස් වලදි mp3-mp4-ogg-flac වගේ audio formats අතරෙ කොන්වර්ට් කරගන්න පුලුවන් හොඳ ටූල් එකක් තියේද?

ශාකුන්තල said...

ස්තුතියි ප්‍රතිචාර වලට. :)

@ඉන්දරේ,
Audacity වලින් පුළුවන් මම හිතන්නෙ. ඒකෙ පාවිච්චි වෙන library ටික මොනවද කියල ටිකක් හොයල බැලුවනං මේ වගේ script කෑල්ලක් අටවගන්න එක අමාරු නෑ. ;)

රොකියා | Udara said...

Mr. Linux ගෙන් තවත් ගින්දර වගේ ලිපියක්. මමත් ඊයෙ Kubuntu දැම්ම, මේ හැම දෙයක්ම හෙට අනිද්දම අත්හදා බලන්න ඕනෙ. අපිට Ubuntu වලවගේ 'Kubuntu' වල, වින්ඩෝස් උඩ වෙනම පාර්ටිශන් එකක් හදන්නෙ නැතුව Kubuntu දාන්න පුලුවන්ද ?(wudi වලින් වගේ)

änthräX said...

එල..

මාස්ටර් said...

වැඩේ නම් එල වගේ පෙනේ. හැබැයි අපි තාම Windows නිසා මුකුත් නොතේරේ.

Kanishka | කණියා said...

නොතේරුනා‍ට ලොකු වැදගත් කමක් තියේ කියල තේරෙනව..
මම නම් ඉතින් Jet audio තමයි :D

සුසිත රවින්ද සෙනරත් | Susitha Ravinda Senarath said...

එළස්.....

kanishka© said...

file එකේ නමට 'space' තියෙන එක නං හරිම ගැටළුවක් තමයි. මෙතනිදි 'space' එක '_' එකකින් ප්‍රතිස්ථාපනය කරල තියෙනව වගේ. එතකොට lame ට හරි නම ලැබුනෙ කොහොමද?
හරි නම my file
lame ට ලැබුනෙ my_file

ශාකුන්තල said...

ආයෙමත්, ප්‍රතිචාර වලට ස්තුති වේවා! :)

@රොකියා,
Ubiquity හරි ගියේ නැද්ද වැඩේට?

@kanishka©,
මේකට underscore එකේ සම්බන්ධයක් නෑනේ? :-/
find . -exec echo {} \;
ඔය ලයින් එක දුවවලා බලන්න කොහෙද underscore එන්නෙ කියලා...
ls වලින් return කරන්නෙ නිකම් string එකක් පමණයි. ඒත් find වලින් return කරන්නෙ path එකක්. මම හිතන්නෙ මෙතන වැඩේ හරියන්න හේතුව ඒකයි.

ඔබේ අදහස්..?

මොකද හිතන්නෙ සටහන ගැන? දන්න සිංහලෙන් හරි කඩ්ඩෙන් හරි ප්‍රතිචාරයක් සටහන් කරලම යන්න. (හැබැයි කුණුහරුප මතක් වෙනව නම් ඒව ලියන්න එපා -- කුණුහරුප මකනවා)
සිංහලෙන් ටයිප් කරන්න අමාරු නම් යුනිකෝඩ් එසැණින් පරිවර්තකය පාවිචිචි කරන්න පුළුවන්.

ප්‍රතිචාරයක් තැබූ සැනින් ප්‍රතිචාර කොටුවට පහළින් ඇති 'Subscribe by email' සබැඳිය ක්ලික් කරන්නත් අමතක කරන්න එපා!

 

Blogger Template by GoogleBoy ve anakafa | Sponsored by Noow!

Blogger Template modified by ශාකුන්තල | Shaakunthala.