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.
- 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..
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>
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.
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) { } ... |
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) { } ... |
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) { } ... |
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); } |
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 < thumbHeight; y++) { for (int x = 0; x < 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; } |
- 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;
Post a Comment