Di Android, sangatlah mudah untuk membuat aplikasi pemutar video; juga mudah untuk membuat aplikasi game dengan grafik 3D. Namun, tidak mudah untuk membuat aplikasi yang dapat memainkan video pada objek grafik 3D.
Artikel ini menjabarkan sebuah aplikasi yang saya buat dengan tujuan untuk menyelesaikan tantangan tersebut. Aplikasinya memainkan video pada permukaan 3D dan membuat pengguna aplikasi dapat berinteraksi dengan perukaan video.
Ada tiga tantangan yang harus diatasi di aplikasi ini:
- Bagaimana caranya untuk membuat kode pemrogramanya sehingga pengguna dapat mengganti permukaan 3D ketika video sedang dimainkan pada saat yang bersamaan
- Meskipun MediaPlayer bawaan di Android sudah dilengkapi dengan baik untuk pemutaran video, tidak mungkin untuk mendapatkan data gambar video dan me-render-nya dengan cara tersendiri.
- Bagaimana komponen grafik didesain agar dapat me-render data video?
Aplikasi ini juga menantang kapabilitas perangkat karena aplikasi ini memaksa video dan objek grafik bekerja pada waktu yang bersamaan. Artikel ini akan memperkenalkan fitur-fitur dan penggunaan dari aplikasi ini dan kemudian dijabarkan desainnya dengan singkat.
Fitur-Fitur
Aplikasi ini memiliki fitur-fitur berikut:
- Pengguna dapat memilih klip video dari koleksi media mereka.
- Aplikasinya dapat digunakan baik di tata letak jenis vertikal maupun horizontal; videonya dapat tetap bermain ketika tata letak berganti.
- Memiliki tiga mode pemutaran video:
- Mode awal: Ini adalah mode normal untuk pemutaran video; klip video akan dimainkan layaknya ketika dimainkan di pemutar video biasa
- Berputar secara acak: Permukaan video akan berputar secara acak baik pada axis horizontal maupun vertical; warnanya juga akan berganti-ganti antara corak kemerah-merahan dan warna normal.
- Berputar ketika disentuh: Pengguna dapat menggunakan sentuhan untuk menyapu dan memputar permukaan video ke kiri dan kanan dengan kecepatan yang berbeda-beda
- Ketika aplikasinya didorong ke latar atau ditutup, klip video yang sedang dimainkan akan disimpan dan dimainkan kembali ketika aplikasi diaktifkan lagi
Catatan: Tidak ada kontrol sesi video di aplikasinya jadi pengguna tidak dapat menghentikan, mempercepat, atau memutar balik videonya. Jika aplikasinya didorong ke latar atau distop, video hanya dapat dimainkan dari awal.
Model Penggunaan
Mulai memainkan klip video
Aplikasinya tidak termasuk video apapun sehingga pengguna dapat memilih klip video dengan format apapun yang didukung oleh platform Android. Namun dianjurkan untuk menggunakan klip video dengan codec H.264AC dengan kemasan MPEG-4 karena format inilah yang digunakan ketika pengetesan aplikasi ini. Ketika aplikasinya pertama kali dijalankan, tampilan pemilih berkas akan ditampilkan.
Setelah pengguna memilih pemilih berkas yang diinginkan, petunjuk pada layar akan ditampilkan. Setelah sebuah klip video dipilih, pemutaran video akan dimulai.
Catatan: Kadang-kadang butuh waktu agar videonya mulai dimainkan, sekitar 5-10 detik.
Pilih mode yang berbeda
Aplikasinya dimulai dengan mode normal. Untuk berganti mode, pengguna dapat mengklik tombol opsi pada antarmuka aplikasi untuk menampilkan menu opsi.
Menu opsi memiliki empat pilihan: tiga pertama adalah opsi untuk mode memainkan video; opsi terakhir membuat pengguna dapat memainkan klip video yang lain.
Berputar dengan acak
Memilih mode ini akan membuat permukan yang me-render video akan berputar secara acak dengan efek 3D pada sumbu horizontal dan vertikal. Mode ini juga akan memberikan warna kemerah-merahan pada videonya secara berkala.
Berputar ketika disentuh
Pada mode berputar ketika disentuh, pengguna dapat menyapu jari ke kiri atau ke kanan agar permukaan video berputar pada sumbu vertikal ke kiri atau ke kanan. Perputarannya akan semakin cepat bergantung seberapa cepat penyapuannya dan akan melambat secara natural ketika pengguna berhenti menyapu jarinya.
Desain Aplikasi
Tiga komponen utama pada aplikasi ini adalah: komponen antarmuka untuk memberikan presentasi yang interaktif tentang aplikasinya ke pengguna; komponen video untuk pemutaran video; Permukaan dari OpenGL untuk me-render video frame buffer dan membuat efek 3D ketika memainkan video dengan mode spesial.
Komponen pemutar video memiliki dua thread. Thread video engine menggunakan class MediaCodec. Class ini mulai tersedia sejak Android JellyBean dirilis (API 16). Ini juga memperilhatkan API level bawah dari Android media framework sehingga pemutaran video dapat dikontrol pada level frame. Pada setiap frame video, komponen grafik dapat menyimpan data gambar dan menggati cara gambar di-render.
Komponen pemutar video juga mengimplementasikan thread audio engine yang memainkan trek audio dari sebuah klip video. Untuk menyerempakkan antara thread video dan audio sehingga gerakan bibir dari karakter di video sama dengan suara yang dihasilkan, algoritma sinkronisasi AV digunakan. Pemutaran video selalu membandingkan waktu dengan waktu di audio. Ini akan mengatur kecepatan pemutaran video agar frame video tidak melibihi batas 30 mili detik.
Komponen grafik didapat dari GLSurfaceView sehingga class rendering tersendiri dibenamkan di class-nya. Class rendering-nya mengimplementasikan antarmuka Renderer untuk melakukan algoritma rendering OpenGL. Algoritmanya mengimplementasikan efek berputar 3D pada tekstur permukaan dan juga mengganti mode ke algoritma yang berbeda sesuai dengan masukan dari pengguna.
Pada proses render, memutar dan memberikan warna pada frame video ditangani oleh vertex dan pixel shader sederhana. Perputaran dari permukaan datar video dilakukan oleh aplikasi dengan rangkaian rotasi bersudut Euler. Pewarnaan pada frame dilakukan melalui pencampuran linear dari konten pada frame video dengan sebuah warna tertentu (pada kasus ini warna merah) di dalam pixel shader.
Komponen grafiknya juga bekerja sebagai video frame listener untuk video engine dan disampaikan ke objek MediaCode ketika konstruksi sehingga fungsi rendering akan dipanggil tiap sebuah frame tersedia. Komponen grafik memiliki fungsi pada komponen antar muka agar pengguna dapat mengubah mode pemutaran video.
Proses decoding pada MediaCodec bekerja pada kecepatan yang sama dengan frame video dan fungsi render pada komponen grafik bekerja pada kecepatan yang sama dengan frame grafik. Jadi, fungsi-fungsi ada kedua komponen harus tersinkronisasi ketika mengakses frame buffer.
Untuk mengunduh kode sumber pada artikel ini, bisa mengunjungi link ini.
* Artikel ini adalah hasil kerja sama dengan Intel Developer Zone. Artikel asli bisa dilihat di link ini.