J2ME: Pengaksesan File Multimedia Pada Mobile Device dengan MMAPI

Wednesday, March 30, 2011 6:16 PM by Computer and Programming
By: Andi Sunyoto
Abstraksi
Mobile Media API (MMAPI) is an optional package yang mendukung aplikasi multimedia di peralatan J2ME. Ini adalah standar Java yang ditetapkan oleh Java Community Process (JCP) dalam JSR 135. Standar ini didesain fleksibel jalan di beberapa protokol dan format; contoh pengimplementasiannya tidak harus dengan protokol HTTP atau Real-Time Transport Protokol (RTP) saja, atau media dengan format MP3. MIDI atau MPEG-4 saja.

Pengantar MMAPI

Artikel ini menyediakan suatu pengenalan dari arsitektur MMAPI dan API, yang dilengkapi suatu contoh kode yang menunjukkan bagaimana MMAPI dapat digunakan untuk membangun aplikasi-aplikasi multimedia Wireless Java.
MMAPI sudah dirancang untuk berjalan di setiap virtual machine berbasis J2ME, termasuk CDC dan CLDC.
Pengembang MMAPI dirancang dengan fitur sebagai berikut:
  • Mendukung untuk Tone Generation, Playback, and Recording of Time-Based Media: paket ini mendukung setiap isi audio dan video yang berbasis waktu (time-based).
  • Small Footprint: MMAPI bekerja pada batas-batas memori yang tegas dari alat-alat CLDC.
  • Protocol- and Content-Agnostic: API tidak dibiaskan ke tipe atau protokol yang spesifik.
  • Subsettable: pengembang dapat mendukung tipe tertentu.
  • Extensible: Fitur baru dapat ditambahkan dengan mudah tanpa menghilangkan kemampuan sistem yang sebelumnya. Lebih penting lagi, format-format tambahan dapat dengan mudah didukung, dikbuat framework dan ditempatkan untuk kontrol tambahan.
  • Options for Implementers: API menawarkan fitur untuk tujuan-tujuan yang tertentu. API didesain dan dirancang untuk mengizinkan developer meninggalkan beberapa fitur jika mereka tidak bisa didukung.

 

Multimedia Processing

Ada dua bagian untuk mengolah multimedia:
  • Protocol Handling: membaca data dari suatu sumber seperti sebuah file atau suatu streaming server ke dalam sistem media-processing.
  • Content Handling: menguraikan (parsing) atau decoding data dan merendernya menjadi sebuah keluaran seperti spiker audio atau layar video.
Agar dapat memfasilitasi operasi di atas, API menyediakan dua tipe obyek high-level:
  • DataSource mengencapsulasi penanganan protokol dengan penyembunyian detail bagaimana data itu dibaca dari sumbernya. Method obyek mempunyai berguna yang memungkinkan obyek Player menangani? isi.
  • Player membaca data dari DataSource, memprosesnya merendernya untuk ditampilkan di piranti. Obyek ini menyediakan metoda untuk mengendalikan media untuk playback, termasuk metoda untuk mengendalikan tipe tertentu mengakses fitur tipe media tertentu..
MMAPI menetapkan obyek ketiga, sebuah mekanisme yang dikenal sebagai Manager yang memungkinkan aplikasi membuat Players dari DataSources, dan dari InputStreams.
Arsitektur MMAPI
Arsitektur MMAPI

Obyek Manager menyediakan method createPlayer(), yang merupakan level tertinggi API untuk memasukkan input. Berikut contoh penggunaannya:
...
Player player = Manager.createPlayer(String url);
...
Keterangan:
  • url : berisi protokol dan isi url
  • format pengisian url <protokol>:<isi lokasi>
Aplikasi menggunakan method yang dikembalikan Player untuk mengontrol data yang didapatkan dan playback media yang berdasarkan waktu (time-based).
Life-cycle Player berisi lima keadaan: UNREALIZED, REALIZED, PREFETCHED, STARTED, dan CLOSED. Ke enam method menghasilkan transisi keadaan:
realize()
prefetch()
start()
stop()
deallocate()
close()
Ketika sebuah player dibuat, berubah ke keadaan UNREALIZED. Kemudian memanggil realize() pindah ke keadaan REALIZED dan menganalisa informasi. Memanggil prefetch() keadaan pindah ke PREFETCHED, menetapkan koneksi jaringan untuk streaming data, dan melakukan tugas-tugas inisialisasi lainnya. Memangil start() menyebabkan transisi ke keadaan STARTED, dimana player dapat memproses data. Ketika selesai memproses data (sampai ke bagian terakhir data), akan mengembalikan keadaan PREFETCHED. Memanggil close() meyebabkan player pindah ke status CLOSED.
Sebuah Player menyediakan kendali yang dikhususkan untuk jenis tertentu dari media yang memproses. Aplikasi menggunakan getControl() untuk memperoleh suatu kendali, atau getControls() untuk mendapat satu berpakaian tentang mereka. Sebagai satu contoh, jika suatu pemain untuk MIDI menggunakan getControl() itu, maka akan mendapat MIDIControl.
MMAPI dikemas dalam tiga paket:
  • javax.microedition.media menyediakan beberapa interface, sebuah exception, dan class Manager, merupakan titik akses untuk memperoleh sumber daya, seperti Players untuk pengolahan multimedia.
  • javax.microedition.media.control menetapkan tipe control spesifik yang dapat digunakan dengan sebuah Player: VolumeControl, VideoControl, dan lainnya.
  • javax.microedition.media.protocol menetapkan protokol untuk menangani control yang berbeda.
Class, interface dan exception yang ada dipaket ini berisi dapat dilihat pada tabel berikut:
Tabel 1 : Class MMAPI
Package Class Keterangan
javax.microedition.media Manager Akses untuk memperoleh sumber daya pada system-dependent, seperti Player untuk mengolah multimedia.
javax.microedition.media.protocol ContentDescriptor Mendeskripsikan tipe isi dari media.
javax.microedition.media.protocol DataSource Menunjukkan bentuk abstraksi untuk protokol media menangani penyembunyian detail bagaimana data itu dibaca dari suatu file media atau server streaming; menyediakan? method untuk Player mengakses data masukan.
Table 2: MMAPI Interfaces
Package Interface Keterangan
javax.microedition.media Control Digunakan untuk mengendalikan beberapa pengolahan media yang berhubungan dengan fungsi:diperoleh dari interface Controllable, diturunkan oleh Player; mungkinkan suatu Player untuk menggunakan, sebagai contoh VolumeControl untuk mengizinkan user untuk menset volume.
javax.microedition.media Controllable Menyediakan sebuah interface untuk memperoleh Control dari Player atau obyek lain.
javax.microedition.media Player Digunakan untuk mengontrol render dari data media. Menyediakan method untuk mengatur life-cycle Player.
javax.microedition.media PlayerListener Menerima event yang dibuat oleh Player.
javax.microedition.media TimeBase Mengetahui urutan program tiap waktunya; digunakan untuk ukuran waktu proses, dan sikronisais media playback dengan banyak user.
javax.microedition.media.control FramePositionControl Mengontrol secara persis posisi frame dari video untuk sebuah Player.
javax.microedition.media.control GUIControl Harus diimplementasikan pada setiap control yang mendukung komponen GUI.
javax.microedition.media.control MetaDataControl Digunakan untuk mendapatkan informasi metadata di dalam media streaming.
javax.microedition.media.control MIDIControl Menyediakan akses render dan mengirimkan MIDI.
javax.microedition.media.control PitchControl Mengontrol pola playback audio tanpa merubah kecepatan playback.
javax.microedition.media.control RateControl Mengontrol playback rate dari player.
javax.microedition.media.control RecordControl Mengontrol recoding media dari player.
javax.microedition.media.control StopTimeControl Digunakan menentukan waktu stop untuk sebuah player.
javax.microedition.media.control TempoControl Mengontrol tempo sebuah lagu: diimplementasikan dalam player pada file MIDI.
javax.microedition.media.control ToneControl Mungkinkan user playback (memutar ulang) urutan nada-nada tunggal.
javax.microedition.media.control VideoControl Mengontrol tampilan video, sebagai contoh lokasinya dicanvas dimana video ditampilkan.
javax.microedition.media.control VolumeControl Mengontrol volume player.
javax.microedition.media.protocol SourceStream Digunakan bersama dengan DataSource untuk menyediakan interface masukan Player; turunan dari interface Controllable, sehingga menyediakan kendali yang spesifik.
Table 3: MMAPI Exceptions
Package Exception Keterangan
javax.microedition.media MediaException Melaporkan kesalahan tidak terduga (unexpected) method mengolaah media.

Menggunakan MMAPI

Pada bagian ini akan dibahas bagaimana memanfaatkan MMAPI untuk membangun aplikasi J2ME berbasis MMAPI.

Aplikasi Tone

Pembuatan Tone di identikkan dengan frekusi dan durasi. Tipe ini penting untuk game dan aplikasi audio, terutama untuk peralatan kecil, dimana hanya mempunyai kemampuan multimedia yang terbatas. Method Manager.playTone() membuat tone. Implemtasinya dapat dipetakan pada hardware tone generator, yaitu menetapkan note, durasi, dan volume.
1
2
3
4
5
6
7
8
...
try {
   // play a tone for 4000 milliseconds at volume 100
   Manager.playTone()(ToneControl.C4, 4000, 100);
}
catch(MediaException me) {
}
...

Aplikasi MP3 Playback

Berikut contoh simple bagaimana memutar file mp3 tanpa dilengkapi pengontrol.
1
2
3
4
5
6
7
8
9
10
11
12
...
try {
   Player p = Manager.createPlayer
  ("http://server/somemusic.mp3");
   p.setLoopCount(5);
   p.start();
}
catch(IOException ioe) {
}
catch(MediaException e) {
}
...
Berikut potongan program yang dilengkapi dengan pegontrol media.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
Player p;
VolumeControl vc;
try {
   p = Manager.createPlayer("http://server/somemusic.mp3");
   p.realize();
   // get volume control for player and set volume to max
   vc = (VolumeControl) p.getControl("VolumeControl");
   if(vc != null) {
   vc.setVolume(100);
   }
   // the player can start with the smallest latency
   p.prefetch();
   // non-blocking start
   p.start();
}
catch(IOException ioe) {
}
catch(MediaException e) {
}
...
Karena semua InputStream dapat dilewatkan method Manager.createPlayer(), maka aplikasi dapat diputar ulang media dari MIDP Record Management System (RMS), atau dari file JAR. Berikut ini bagaimana memperoleh InputStream dari RMS dan memutar media yang disimpan didalamnya.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
RecordStore store;
int id;
// play back from a record store
try {
   InputStream is = new ByteArrayInputStream
  (store.getRecord(id));
   Player player = Manager.createPlayer(is, "audio/X-wav");
   p.start();
}
catch (IOException ioe) {
}
catch (MediaException me) {
}
...
Di bawah ini contoh yang menyimpan mediannya di file JAR.
1
2
3
4
5
6
7
8
9
10
11
12
...
try {
   InputStream is =
  getClass().getResourceAsStream("audio.wav");
   Player player = Manager.createPlayer(is, "audio/X-wav");
   p.start();
}
catch(IOException ioe) {
}
catch(MediaException me) {
}
...

Aplikasi Video Playback

Berikut potongan program yang menunjukkan bagaimana memutar sebuah video berformat MPG.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
Player p;
VideoControl vc;
try {
   p = Manager.createPlayer("http://server/somemovie.mpg");
   p.realize();
   // get video control
   vc = (VideoControl) p.getControl("VideoControl");
   ....
   p.start();
}
catch(IOException ioe) {
}
catch(MediaException me) {
}
...

Aplikasi Camera

MMAPI memasukkan dukungan kamera di dalamnya.

Capture Video dari Player

Penentuan lokasi untuk kamera menggunakan: capture://video. Suatu aplikasi dapat menggunakan VideoControl untuk menampilkan suatu view finder di layar dengan ukuran standar.
mPlayer = Manager.createPlayer("capture://video");
Jika piranti yang digunakan tidak mendukung video capture, maka akan menghasilkan MediaException. Jika MediaException bernilai true medukung video capture.
Player perlu di release untuk memperoleh resource yang diperlukan dalam mengambil gambar.
mPlayer.realize();

Menampilkan Camera Video

Video yang berasal dari camera dapat ditampilkan di layar sebagai salah satu Item dalam Form atau bagian dari Canvas. Sebuah VideoControl membuatnya mungkin. VideoControl dapat diperoleh dari Player.
mVideoControl = (VideoControl)
mPlayer.getControl("VideoControl");
Jika mengharapkan menampilkan video dari camera di Canvas, inisialisasi VideoControl, kemudian set ukuran dan lokasi dari video di dalam Canvas, kemudian buat video menjadi terlihat (visible). Contoh berikut (konstruktor Canvas dan subclass) menunjukkan bagaimana video ditempatkan dua pixel di dalam form Canvas. Jika video tidak dapat ditempatkan pada lokasi yang ditentukan, maka oleh kontruktor diset menjadi satu layar penuh (full screen). Langkah terakhir adalah memanggil method setVisible() agar camera tampil.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public CameraCanvas(SnapperMIDlet midlet,
 VideoControl videoControl) {
  int width = getWidth();
  int height = getHeight();
 
  mSnapperMIDlet = midlet;
 
  videoControl.initDisplayMode(
   VideoControl.USE_DIRECT_VIDEO, this);
 
  try {
 videoControl.setDisplayLocation(2, 2);
 videoControl.setDisplaySize(width - 4, height - 4);
  }
  catch (MediaException me) {
 try { videoControl.setDisplayFullScreen(true); }
 catch (MediaException me2) {}
  }
  videoControl.setVisible(true);
}
Menampilkan video camera dalam sebuah Form hanya berbeda sedikit. Pada method initDisplayMode() pada VideoControl dari USE_DIRECT_VIDEO diganti dengan USE_GUI_PRIMITIVE. Dalam piranti MIDP dapat memperoleh Item yang dan dapat ditempatkan di dalam sebuah Form untuk ditampilkan.
1
2
3
4
Form form = new Form("Camera form");
Item item = (Item)mVideoControl.initDisplayMode(
GUIControl.USE_GUI_PRIMITIVE, null);
form.append(item);

Capture Image

Sekali camera dapat ditampilkan dipiranti, maka capture sebuah image dapat dilakukan dengan mudah dengan memanggil getSnapshot() pada VideoControl. Method tersebut dapat dilengkapi dengan tipe gambar atau tanpa tipe gambar. Default gambar yang dihasilkan bertipe PNG tergantung dengan tipe handset yang digunakan.
Method getSnapshot() mengembalikan sebuah array bertipe byte, yang merupakan data image dalam format yang diinginkan. Dari hasil array tersebut poin yang dapat diambil adalah: mungkin menyimpan byte tersebut dalam record store, mengirimkan ke server atau membuat sebuah Image dari array tersebut sehingga user dapat melihat gambar yang baru saja diambilnya. Berikut contoh pembuatan Image dari array yang dihasilkan dari method getSnapshot().
byte[] raw = mVideoControl.getSnapshot(null);
Image image = Image.createImage(raw, 0, raw.length);

Membuat Thumbnail Image

Satu hal kelihatannya sederhana adalah bagaimana menampilkan image (gambar) dengan thumbnail, suatu versi menangkap gambar dari kamera. Pada MIDP 2.0 di dalamnya terdapat method untuk memperoleh MIDP 20 memasukkan di dalamnya metoda untuk memperoleh nilai piksel paling luar dari image, dengan nilai tersebut memungkinkan membuat skala transformasi yang benar. Sayangnya MIDP 1.0 tidak dapat menghasilkan data piksel.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private Image createThumbnail(Image image) {
  int sourceWidth = image.getWidth();
  int sourceHeight = image.getHeight();
 
  int thumbWidth = 64;
  int thumbHeight = -1;
 
  if (thumbHeight == -1)
 thumbHeight = thumbWidth * sourceHeight / sourceWidth;
 
  Image thumb = Image.createImage(thumbWidth, thumbHeight);
  Graphics g = thumb.getGraphics();
 
  for (int y = 0; y &lt; thumbHeight; y++) {
 for (int x = 0; x &lt; thumbWidth; x++) {
   g.setClip(x, y, 1, 1);
   int dx = x * sourceWidth / thumbWidth;
   int dy = y * sourceHeight / thumbHeight;
   g.drawImage(image, x - dx, y - dy,
    Graphics.LEFT | Graphics.TOP);
 }
  }
 
  Image immutableThumb = Image.createImage(thumb);
 
  return immutableThumb;
}
MMAPI mendukung beberapa format audio dan video, yaitu:
  • Audio: PCM and WAV
  • MIDI: Type 0 (single track), Type 1 (multiple tracks), and SP-MIDI
  • Video: MPEG-1

Kesimpulan

Mobile Media API adalah suatu API yang fleksibel dan powerfull yang menyediakan rendering dan capture data audio dan video. Lokasi file dapat ditempatkan di piranti mobile maupun di server dengan memanfaatkan koneksi jaringan internet.

Daftar Pustaka

  • Knudsen, Jonathan., Taking Pictures with MMAPI., http://developers.sun.com/mobility/midp/articles/picture/., July 2003
  • Mahmoud, H, Qusay., The J2ME Mobile Media API., http://developers.sun.com/mobility/midp/articles/mmapioverview/., June 2003
  • Feng, Yu and Zhu Jun; Wireless Java Programming with 2 Micro Edition; SAMS; Indianapolis; USA; 2001
  • Keogh, James; J2ME:The Complete Reference; McGraw-Hill; New York;
  • Riggs, Roger; Taivalsaari, Antero; Peursem, Van, Jim; Huopaniemi, Jyri; Patel, Mark;? Uotila,? Aleksi; Editor,? Holliday, Jim; Programming Wireless Devices with the Java? 2 Platform, Micro Edition, Second Edition; Addison Wesley; Juni 2003.
  • Sun Developer Network;Java 2 Platform, Micro Edition (J2ME); JSR 68 Overview;

0 Response to "J2ME: Pengaksesan File Multimedia Pada Mobile Device dengan MMAPI"

Post a Comment