Friday, June 10, 2011

JMF vs JLayer: Memainkan MP3 dengan Java

Ada kalanya pada saat memprogram, ingin sekali menggunakan file MP3. Secara default, Java sendiri mendukung file MIDI dengan menggunakan javax.sound.midi. Di Java, kita bisa menggunakan Java Media Framework atau JLayer. JMF sendiri, selain mendukung file MP3, juga mendukung file-file multimedia lain, termasuk file-file video. Berbeda dengan JLayer yang hanya mendukung MP3. Tapi, kalau kita hanya ingin membuat sebuah game dengan background suara MP3, maka penggunaan JMF menjadikan paket jar aplikasi kita menjadi besar, maka dalam hal ini, penggunaan JLayer lebih baik.

Untuk contoh ringkas penggunaan JLayer, bisa dilihat di sini. Contoh di sini cukup bagus, sederhana tapi sudah menggunakan Thread. Cocok untuk game.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class MP3 {
 private static InputStream parseArgs(String[] args) {
 if (args.length != 1) {
 System.err.println("Usage: java MP3 []");
 System.exit(1);
 }

 if (args[0].equals('-'))
 return System.in;

 try {
 return new FileInputStream(args[0]);
 } catch (FileNotFoundException e) {
 System.err.println(e);
 System.exit(1);

 return null;
 }
 }


 private static Player play(InputStream in) {
 final Player player;

 try {
 player = new Player(in);
 } catch (JavaLayerException e) {
 System.err.println(e);
 System.exit(1);

 return null;
 }

 new Thread() {
 public void run() {
 try {
 player.play();
 } catch (JavaLayerException e) {
 System.err.println(e);
 System.exit(1);
 }
 }
 }.start();

 return player;
 }

 private static void status(String filename, Player player) {
 int millis = player.getPosition();
 int secs = millis / 1000;
 int mins = secs / 60;
 int hours = mins / 60;
 System.out.printf("%s: %4d:%02d:%02d.%03d\r",
 filename, hours, mins % 60, secs % 60, millis % 1000);
 }

 public static void main(String[] args) {
 InputStream in = parseArgs(args);
 Player player = play(in);

 while (!player.isComplete()) {
 status(args[0], player);

 try {
 Thread.sleep(100);
 } catch (InterruptedException ignored) {}
 }

 System.out.println();
 }
}

Adapun apabila ingin menggunakan file OGG, karena mungkin file OGG itu bebas lisensi berbayar, bisa menggunakan J-OGG.

No comments:

Post a Comment