Last Updated:

Membuat MP3 Compressor Sendiri

Grup KPPDI
Grup KPPDI Delphi
» Source Code
» Compiled EXE
 

Note: Rename *.ppt to *.zip top open downloaded files.

Jangan percaya judul di atas. Yang dibahas di sini sesungguhnya hanyalah membuat antarmuka GUI untuk software WAV/MP3 Encoder\Decoder - Lame. Lame sudah lama negtop di dunia encoding & decoding suara antarformat MP3 & WAV. Namun yang akan saya ulas di bawah hanya pada fitur mengompres file MP3 hingga ukurannya menjadi lebih kecil. Yang selanjutnya, MP3 dengan ukuran kecil jauh lebih efisien digunakan pada handphone, PDA, MP3 player dan sejenisnya.
Kualitas MP3 tergantung pada beberapa hal, seperti bitrate, jumlah channel, dan beberapa hal lain yang spesifik dengan digital music. Berapa jumlah channel - untuk selanjutnya akan saya sebut Mode, dan bitrate serta kawan-kawannya - nanti saya sebut Preset, akan menjadi pokok pembicaraan di bagian awal tulisan ini.
Lame dipublikasikan dalam bentuk sebuah file EXE (Lame.exe) dan juga sebuah library (lame_enc.dll). Keduanya dapat didownload di http://lame.sourceforge.net/. DI tulisan ini hanya Lame.exe yang akan digunakan. Misalkan Anda mempunyai sebuah file MP3 dengan ukuran 4MB, yang terletak di c:\music\avril_lavigne.mp3, dan Anda ingin mengompressnya biar pas buat memori HP Anda (sebut saja Nokia N93, biar keren) yang memorinya cuma tersisa 500KB doang. Apa akal? Ada ide: coba saja download lame.exe dan ekstrak ke c:\lame, lalu jalankan command prompt dan ketik:
C:\lame\lame.exe -m mono --preset cbr 8 "c:\music\avril_lavigne.mp3" "c:\music\avril_lavigne_compressed.mp3"Kemudian tekan Enter. tunggu sampai proses yang ada di monitor Anda selesai. Sekarang cek file c:\music\avril_lavigne_compressed.mp3, dan ternyata, ukurannya pas buat HP Anda!
Kembali ke dua hal di atas, Mode & Preset, "-m mono" adalah Modenya sedang "--preset cbr 8" adalah Presetnya. Berikut penjelasannya, "-m mono" berarti MP3 hasil kompresi nantinya harus memiliki channel tunggal, alias Mono. Mode lainnya adalah Stereo, Joint Stereo dan Force. Preset, sebagaimana contoh di atas, dapat diartikan seperti ini: cbr artinya Constant BitRate dan angka 8 berarti MP3 hasil kompresi memiliki Bitrate 8Kbps.
Lebih lanjut, jalankan lame.exe tanpa parameter untuk melihat opsi-opsi lainnya.
Selanjutnya, kita membuat antarmuka GUI dengan Delphi untuk perintah di atas.
Urutan pengerjaan kompresi MP3 yang akan kita buat kira-kira seperti ini:

Input File MP3 -> jalankan lame.exe dengan parameter yang sesuai -> Tunggu sampai selesai -> File MP3 terkompres didapat.
Pertama, kita buat input MP3, berupa sebuah TEdit, TButton, dan TOpenFileDialog. Beri event OnClick pada TButton dan isi dengan kode berikut:
if openfiledialog.Execute then
  edit1.Text :=openfiledialog.FileName;
Selanjutnya, tambahkan sebuah TButton lagi, dan isi event OnClicknya dengan kode berikut:
var
  s:String;
  x:String;
begin
  if not fileexists(edit1.Text ) then
  begin
    MessageBox(handle,'Source file is not found.','Error',MB_ICONHAND);
    exit;
  end;
  if Lowercase(ExtractFileExt(edit1.Text))<>'.mp3' then
  begin
    MessageBox(handle,'Source file is not an MP3 file.','Error',MB_ICONHAND);
    exit;
  end;
  Params:='"'+Compressor +'" ';
  Params:=Params + '-m '+Lowercase(cbm.Items[cbm.itemindex]){[1]}+' '; //mode
  s:=lowercase(cbq.Items[cbq.itemindex]);
  x:='';
  if s = 'standard' then x:='--preset cbr 8';
  if s = 'medium' then x:='--preset cbr 16';
  if s = 'high' then x:='--preset cbr 32';
  if s = 'highest' then x:='--preset cbr 44';
  params:=params+x+'"'+edit1.Text +'" "'+changeFileExt(edit1.Text,'_compressed.mp3')+'"';
  b.Enabled:=False;
  try
    RunDos(Params, nil);
  finally
    b.Enabled:=true;
  end;
  MessageBox(handle,'Completed.','Information',MB_ICONINFORMATION or MB_OK);
End;
Terakhir, buat sebuah unit lagi dan berikut isinya. Jangan lupa tambahkan unit ini ke klausa uses pada form yang mengandung kode di atas.

unit ucons; 
 interface 
 uses Windows, SysUtils, Forms; 
 type 
 TConsoleProgress = procedure (const Buffer:PChar); procedure RunDos(DosApp:String; consoleProgress:TconsoleProgress) ;   

implementation 
procedure RunDos(DosApp:String; consoleProgress:TconsoleProgress) ; const   ReadBuffer = 2400; var   Security : TSecurityAttributes;   ReadPipe,WritePipe : THandle;   start : TStartUpInfo;   ProcessInfo : TProcessInformation;   Buffer : Pchar;   BytesRead : DWord;   Apprunning : DWord; begin   With Security do begin   	nlength := SizeOf(TSecurityAttributes) ;   	binherithandle := true;   	lpsecuritydescriptor := nil;   end;   if Createpipe (ReadPipe, WritePipe, @Security, 0) then 
	begin   	Buffer := AllocMem(ReadBuffer + 1) ;   	FillChar(Start,Sizeof(Start),#0) ;   	start.cb := SizeOf(start) ;   	start.hStdOutput := WritePipe;   	start.hStdInput := ReadPipe;   	start.dwFlags := STARTF_USESTDHANDLES +   	STARTF_USESHOWWINDOW;   	start.wShowWindow := SW_HIDE; 
		if CreateProcess(nil,  PChar(DosApp),  @Security,  @Security,  true,  NORMAL_PRIORITY_CLASS, 
		nil,  nil,  start,  ProcessInfo)  	then 		begin   		repeat   			Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100) ;   			Application.ProcessMessages;   		until (Apprunning <> WAIT_TIMEOUT) ;   		Repeat   			BytesRead := 0;   			ReadFile(ReadPipe,Buffer[0],   			ReadBuffer,BytesRead,nil) ;   			Buffer[BytesRead]:= #0;   			OemToAnsi(Buffer,Buffer) ;   			if @ConsoleProgress<>nil then 					consoleprogress(buffer);   		until (BytesRead < ReadBuffer) ;   	end;   	FreeMem(Buffer) ;   	CloseHandle(ProcessInfo.hProcess) ;   	CloseHandle(ProcessInfo.hThread) ;   	CloseHandle(ReadPipe) ;   	CloseHandle(WritePipe) ;   end; end; 
end.
Untuk lebih jelasnya, silahkan download demo project dan file exe hasil kompilasinya.
» Source Code
» Compiled EXE

Note: Rename *.ppt to *.zip top open downloaded files.
Selamat mencoba.JokoRB

Comments