Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

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.

Saturday, June 4, 2011

Perbandingan Kecepatan Pembacaan File di Java

Kebetulan ingin membandingkan kecepatan dua metode dalam pemrograman Java, untuk mengakses file. Kode bisa dilihat di bagian bawah posting ini. Metode pertama, saya menggunakan FileInputStream dan FileOutputStream. Sedang metode kedua menggunakan FileReader dan FileWriter. Studi kasus yang saya gunakan adalah membuat salinan file. File yang saya gunakan untuk uji coba adalah file MP3 lagu India berjudul Zoobi Doobi yang ukurannya sebesar 4,25 MB.

Hasilnya, dengan menggunakan FileInputStream dan FileOutputStream, waktu yang diperlukan untuk menyalin file tersebut selama 1 menit 37 detik, sedang dengan menggunakan FileReader dan FileWriter, waktu yang dibutuhkan hanya sekitar 2 detik. WOW!!!

Khawatir ada caching yang terjadi, saya membalik urutan proses uji coba, dan hasil menunjukkan hal yang sama. Sekali lagi. WOW!!!


import java.io.*;
class copyFile {
public static void main(String args[]) throws Exception {
int i;
long start;
long elapsedTimeMillis;
int elapsedTimeSec, elapsedTimeMin;

///// METODE 1 /////
start = System.currentTimeMillis();
FileInputStream fin = new FileInputStream("3idiots02.mp3");
FileOutputStream fout = new FileOutputStream("3idiots02copy1.mp3");
while ((i = fin.read()) != -1) {
fout.write(i);
}
fin.close();
fout.close();
elapsedTimeMillis = System.currentTimeMillis()-start;
elapsedTimeSec = (int) elapsedTimeMillis/1000;
elapsedTimeMin = (int) elapsedTimeSec/60;
System.out.println(elapsedTimeMin + ":" + (elapsedTimeSec-(elapsedTimeMin*60)) + ":" +(elapsedTimeMillis-(elapsedTimeSec*1000)));

///// METODE 2 /////
start = System.currentTimeMillis();
FileReader fr = new FileReader("3idiots02.mp3");
FileWriter fw = new FileWriter("3idiots02copy2.mp3");
BufferedReader br = new BufferedReader(fr);
while ((i = br.read()) != -1) {
fw.write(i);
}
fr.close();
fw.close();
elapsedTimeMillis = System.currentTimeMillis()-start;
elapsedTimeSec = (int) elapsedTimeMillis/1000;
elapsedTimeMin = (int) elapsedTimeSec/60;
System.out.println(elapsedTimeMin + ":" + (elapsedTimeSec-(elapsedTimeMin*60)) + ":" +(elapsedTimeMillis-(elapsedTimeSec*1000)));
}
}

Friday, January 7, 2011

Mengubah Ukuran Gambar Di Java

Kode berikut akan menampilkan gambar yang sudah diubah ukurannya menjadi sebesar diameter r. Perhatikan baris 11-12.
public class showingImage {
    public static void main(String[] args) {
        BufferedImage gambar = null;
        Image gambar2 = null;

        try {
            gambar = ImageIO.read(new File("/home/kholimi/Pictures/Flowers_1280x960_right.jpg"));
        } catch (IOException e) { }

        int r = 100;
        gambar2 = gambar.getScaledInstance(r, r, Image.SCALE_DEFAULT);

        JFrame frame = new JFrame("Display image");
        Panel panel = new ShowImage(gambar2);
        frame.getContentPane().add(panel);
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

class ShowImage extends Panel {
    Image image;

    public ShowImage(Image image) {
        this.image = image;
    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(image, 0, 0, null);
    }
}

Thursday, January 6, 2011

Menampilkan Gambar Dengan Java (Bagian 2)

Kode berikut akan menampilkan gambar dengan diameter r dengan titik pusat (x,y).
public class showingImage {
    public static void main(String[] args) {
        BufferedImage gambar = null;
        Image gambar2 = null;

        try {
            gambar = ImageIO.read(new File("/home/kholimi/Pictures/Flowers_1280x960_right.jpg"));
        } catch (IOException e) { }

        int x = 500, y = 500, r = 300;
        gambar2 = gambar.getSubimage(x-r/2, y-r/2, r, r);

        JFrame frame = new JFrame("Display image");
        Panel panel = new ShowImage(gambar2);
        frame.getContentPane().add(panel);
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

class ShowImage extends Panel {
    Image image;

    public ShowImage(Image image) {
        this.image = image;
    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(image, 0, 0, null);
    }
}
Kode di atas merupakan kode pada tutorial menampilkan gambar dengan Java bagian pertama yang ditambahkan kode di bawah pada baris 10-11. Kode di bawah akan mengambil sebagian gambar saja.
int x = 500, y = 500, r = 300;
        gambar2 = gambar.getSubimage(x-r/2, y-r/2, r, r);

Wednesday, January 5, 2011

Menampilkan Gambar di Java

public class showingImage {
    public static void main(String[] args) {
        BufferedImage gambar = null;
        Image gambar2 = null;

        try {
            gambar = ImageIO.read(new File("/home/kholimi/Pictures/Flowers_1280x960_right.jpg"));
        } catch (IOException e) { }

        gambar2 = gambar;

        JFrame frame = new JFrame("Display image");
        Panel panel = new ShowImage(gambar2);
        frame.getContentPane().add(panel);
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

class ShowImage extends Panel {
    Image image;

    public ShowImage(Image image) {
        this.image = image;
    }

    @Override
    public void paint(Graphics g) {
        g.drawImage( image, 0, 0, null);
    }
}

Kode di atas terdiri dari dua bagian. Bagian pertama untuk mengambil data gambar, yakni pada baris 6-8. Bagian kedua untuk menampilkan data gambar ke layar setelah diambil, yakni pada baris 12-16 dan dibantu oleh class ShowImage.

Untuk mengambil data gambar, maka data asli gambar diubah menjadi objek BufferedImage. Objek BufferedImage ini yang nanti bisa diedit, untuk kemudian ditampilkan oleh Panel setelah diubah menjadi objek image, atau disimpan kembali sebagai file.

Wednesday, October 27, 2010

Error GlassFish di NetBeans 6.9.1

Kemarin saya ditanya oleh salah satu mahasiswa saya tentang J2EE yang tidak jalan di NetBeans 6.9.1. Selidik punya selidik, ternyata bukan hanya J2EE, tapi semua aplikasi web yang dibangun tidak bisa jalan di NetBeans 6.9.1.

Permasalahannya ada dua. Pertama, ada file-file konfigurasi milik GlassFish yang ternyata hanya bisa dibaca oleh root (OS saya Linux). File-file tersebut ada di folder:
/usr/local/glassfish-3.0.1/glassfish/domains/domain1/config/
Tambahkan hak akses bagi group dan other agar bisa membaca semua file konfigurasi yang ada di folder tersebut.

Permasalahan kedua, jika waktu NetBeans di install dua server, yakni Tomcat dan GlassFish, maka kedua server tersebut akan bentrok. Berbeda dengan NetBeans 6.8 ke bawah dimana Tomcat mendapat port 8080 dan GlassFish mendapat port 8084, pada NetBeans 6.9, kedua server tersebut diset pada port yang sama. Solusinya? Uninstall salah satunya. Atau kalau tidak mau, ubah konfigurasi pada file domain.xml di folder:
/home/kholimi/.netbeans/6.9/config/GF3_1/domain1/config/
Pada baris berikut, ganti port 8080 menjadi 8084:
 
Selamat menjalankan aplikasinya.