Program multimedia dengan JMF, Bagian 1

Java Media Framework (JMF) adalah API besar dan serbaguna yang digunakan untuk memproses media berbasis waktu. Namun, kompleksitas JMF membutuhkan waktu berminggu-minggu untuk dipahami. Dengan mengingat kerumitan tersebut, artikel ini memperkenalkan JMF dengan cara mudah. Kami mulai dengan menggambar analogi dengan sistem stereo, dan kemudian melanjutkan dengan diskusi tentang antarmuka dan kelas JMF yang paling umum. Terakhir, kita akan melihat kode yang berfungsi yang mendemonstrasikan bagian dari kemampuan API.

Artikel ini, yang pertama dari seri dua bagian, berfokus pada arsitektur JMF. Bagian 2 sebagian besar akan berfokus pada kode yang menunjukkan cara mendaftarkan perangkat perekam, dan memutar serta merekam data audio dan video.

JMF, saat ini pada versi 2.1, adalah inisiatif Sun untuk membawa pemrosesan media berbasis waktu ke Java. Media berbasis waktu adalah data yang berubah secara bermakna sehubungan dengan waktu, seperti klip audio dan video, urutan MIDI, dan animasi. Perhatikan bahwa Sun baru-baru ini mengumumkan akan merilis kode sumber JMF 2.1 di bawah Sun Community Source Licensing Program (SCSL). Juga implementasi referensi lengkap, JMF 2.1 akan memungkinkan Anda melakukan apa pun yang dapat dibayangkan dengan multimedia. Di antara kegunaan lain, JMF dapat:

  • Putar berbagai file multimedia dalam applet atau aplikasi Java. Format yang didukung termasuk AU, AVI, MIDI, MPEG, QuickTime, dan WAV.
  • Putar media streaming dari Internet.
  • Rekam audio dan video dengan mikrofon dan kamera video Anda, lalu simpan data dalam format yang didukung.
  • Proses media berbasis waktu dan ubah format tipe konten.
  • Mengirimkan audio dan video secara realtime di Internet.
  • Menyiarkan program radio atau televisi langsung.

Namun, sebelum Anda menulis aplikasi JMF, Anda harus memahami arsitektur JMF, antarmuka, dan kelasnya sepenuhnya.

Arsitektur JMF

Untuk memahami arsitektur JMF dengan mudah, gunakan sistem stereo Anda sebagai perbandingan. Saat Anda memutar CD Sarah Vaughan dengan pemutar CD Anda, CD tersebut menyediakan data musik ke sistem. Data ini sebelumnya telah diambil dengan menggunakan mikrofon dan perangkat lain di studio rekaman. Mikrofon berfungsi sebagai perangkat penangkap audio. CD itu sendiri merupakan sumber data ke sistem stereo.

Pemutar CD mengeluarkan sinyal musik ke speaker - perangkat keluaran. Namun dari CD player kita juga bisa mencolokkan earphone. Dalam hal ini, earphone bertindak sebagai perangkat keluaran.

JMF menggunakan model yang sama. Saat Anda terus membaca, Anda akan menemukan istilah-istilah seperti:

  • Sumber data
  • Tangkap perangkat
  • Pemain
  • Prosesor
  • DataSink
  • Format
  • Pengelola

Mari kita lihat istilah-istilah ini lebih detail.

Sumber data

Sumber data merangkum aliran media seperti CD musik. Di JMF, sebuah DataSourceobjek mewakili media audio, media video, atau kombinasi keduanya. A DataSourcebisa berupa file atau aliran masuk dari Internet. Hal yang baik tentang kelas ini adalah, setelah Anda menentukan lokasi atau protokolnya, maka DataSourcelokasi media akan dikemas, serta protokol dan perangkat lunak yang digunakan untuk mengirimkan media. Setelah dibuat, a DataSourcedapat dimasukkan ke dalam Playeruntuk diberikan, dengan Playertidak peduli di mana DataSourceasalnya atau apa bentuk aslinya.

Data media dapat diperoleh dari berbagai sumber, seperti file lokal atau jaringan, atau siaran Internet langsung. Dengan demikian, DataSources dapat diklasifikasikan menurut cara transfer data dimulai:

  • Tarik sumber data: Klien memulai transfer data dan mengontrol aliran data dari sumber. HTTP dan FILE berfungsi sebagai contoh protokol yang ditetapkan untuk jenis data ini.
  • Sumber data push: Server memulai transfer data dan mengontrol aliran data dari sumber data push. Contoh sumber data push termasuk media siaran dan video on demand.

Seperti yang akan kita bahas di Bagian 2 dari seri ini, beberapa sumber data dapat digabungkan menjadi satu. Misalnya, jika Anda merekam adegan langsung, kemungkinan Anda memiliki dua sumber data: audio dan video. Dalam situasi itu, Anda mungkin ingin menggabungkan keduanya untuk kontrol yang lebih mudah.

Tangkap perangkat

Perangkat penangkap mewakili perangkat keras yang Anda gunakan untuk mengambil data, seperti mikrofon, kamera diam, atau kamera video. Data media yang diambil dapat dimasukkan ke dalam Playeruntuk dirender, diproses untuk mengubah data ke format lain, atau disimpan untuk penggunaan di masa mendatang.

Perangkat penangkap dapat dikategorikan sebagai sumber dorong atau tarik . Dengan sumber tarik, pengguna mengontrol kapan harus mengambil gambar. Sebagai contoh, bayangkan kamera diam di mana pengguna mengklik tombol untuk mengambil bidikan. Sebaliknya, mikrofon bertindak sebagai sumber dorong karena terus-menerus menyediakan aliran data audio.

Pemain

A Playermengambil sebagai masukan aliran data audio atau video dan membuatnya ke speaker atau layar, seperti CD player membaca CD dan mengeluarkan musik ke speaker. A Playerdapat memiliki status, yang ada secara alami karena Playerharus mempersiapkan diri dan sumber datanya sebelum dapat mulai memutar media. Untuk memahami ini, masukkan CD ke stereo Anda dan putar lagu keempat di CD. Apa yang akan terjadi? Pemutar CD tidak langsung memutar lagu. Pertama-tama harus mencari trek dimana lagu keempat dimulai dan melakukan beberapa persiapan lainnya. Setelah sekitar setengah detik (tergantung pada pemutar CD Anda), Anda mulai mendengarkan musik. Demikian juga, JMF Playerharus melakukan beberapa persiapan sebelum Anda dapat mendengarkan audio atau melihat videonya. Dalam operasi normal, aPlayerlangkah melalui setiap negara sampai mencapai keadaan akhir. JMF mendefinisikan enam status dalam Player:

  • Belum direalisasi: Dalam status ini, Playerobjek telah dibuat instance-nya. Ibarat bayi baru lahir yang belum mengenal lingkungannya, bayi baru lahir Playerbelum mengetahui medianya.
  • Menyadari: Sebuah Playerbergerak dari negara yang belum direalisasi untuk negara menyadari ketika Anda memanggil Player's realize()metode. Dalam keadaan sadar, Playersedang dalam proses menentukan kebutuhan sumber dayanya. A menyadari Playersering mengunduh aset melalui jaringan.
  • Disadari: Transisi dari keadaan sadar, Playerdatang ke keadaan terealisasi. Dalam keadaan ini, mereka Playermengetahui sumber daya apa yang dibutuhkannya dan memiliki informasi tentang jenis media yang akan disajikan. Itu juga dapat menyediakan komponen visual dan kontrol, dan koneksi ke objek lain dalam sistem sudah siap.
  • Prefetching: Saat prefetch()metode dipanggil, Playerperpindahan dari status realisasi ke status prefetching. Sebuah prefetching Playersedang bersiap untuk menampilkan medianya. Selama fase ini, Playerpramuat data medianya, mendapatkan sumber daya penggunaan eksklusif, dan melakukan apa pun yang diperlukan untuk memutar data media.
  • Prapengambilan: Keadaan di mana Playertelah selesai mengambil data media - siap untuk dimulai.
  • Dimulai: Status ini dimasukkan saat Anda memanggil start()metode. The Playersekarang siap untuk menyajikan data media.

Prosesor

A Processoradalah tipe dari Player. Di JMF API, sebuah Processorantarmuka meluas Player. Dengan demikian, a Processormendukung kontrol presentasi yang sama seperti file Player. Tidak seperti a Player, a Processormemiliki kendali atas pemrosesan apa yang dilakukan pada aliran media input.

Selain rendering sumber data, Processordapat juga mengeluarkan data media melalui a DataSourcesehingga dapat disajikan oleh yang lain Playeratau Processor, diproses lebih lanjut oleh yang lain Processor, atau diubah ke beberapa format lain.

Selain enam kondisi yang disebutkan di atas Player, a Processormencakup dua kondisi tambahan yang terjadi sebelum Processormemasuki kondisi menyadari tetapi setelah kondisi tidak terealisasi:

  • Configuring: A Processormemasuki keadaan konfigurasi dari keadaan belum direalisasi ketika configure()metode ini dipanggil. A Processorada dalam status konfigurasi saat terhubung ke DataSource, demultiplexes aliran input, dan mengakses informasi tentang format data input.
  • Dikonfigurasi: Dari status konfigurasi, Processorperpindahan ke status dikonfigurasi saat tersambung ke DataSourcedan format data telah ditentukan.

Seperti pada a Player, Processortransisi ke status terealisasi saat realize()metode dipanggil.

DataSink

Ini DataSinkadalah antarmuka dasar untuk objek yang membaca konten media yang dikirimkan oleh DataSourcedan merender media ke beberapa tujuan. Sebagai contoh DataSink, pertimbangkan objek penulis-file yang menyimpan media dalam sebuah file.

Format

Sebuah Formatobjek merupakan media format yang tepat obyek. Format itu sendiri tidak membawa parameter khusus pengkodean atau informasi waktu global; ini menjelaskan nama pengkodean format dan tipe data yang dibutuhkan oleh format. Formatsubclass termasuk AudioFormatdan VideoFormat. Pada gilirannya, VideoFormatberisi enam subclass langsung:

  • H261Format
  • H263Format
  • IndexedColorFormat
  • JPEGFormat
  • RGBFormat
  • YUVFormat

Pengelola

Seorang manajer, sebuah objek perantara, mengintegrasikan implementasi antarmuka kunci yang dapat digunakan secara mulus dengan kelas yang ada. Tidak ada padanan dunia nyata dalam sistem stereo, tetapi Anda dapat membayangkan manajer sebagai objek serbaguna yang dapat menghubungkan dua objek berbeda. Misalnya, dengan ManagerAnda dapat membuat Playerdari a DataSource. JMF menawarkan empat manajer:

  • Manager: Gunakan Manageruntuk membuat Players, Processors, DataSources, dan DataSinks. Misalnya, jika Anda ingin membuat sebuah DataSource, Anda dapat menggunakan Manageruntuk membuat Playeruntuk itu.
  • PackageManager: Manajer ini memelihara registry paket yang berisi kelas JMF, seperti adat Players, Processors, DataSources, dan DataSinks.
  • CaptureDeviceManager: Manajer ini mengelola registri perangkat tangkap yang tersedia.
  • PlugInManager: Manajer ini memelihara registri dari komponen pemrosesan plug-in JMF yang tersedia.

Buat Pemain

Dengan pemrograman multimedia JMF, salah satu tugas terpenting Anda adalah membuat file Player. Anda membuat Playerdengan memanggil Manager's createPlayer()metode. The Managermenggunakan URL dari media atau MediaLocatoryang Anda tentukan untuk membuat yang sesuai Player. Setelah Anda memiliki Player, Anda dapat memperoleh Playerobjek komponen visual - di mana Playerhadiah representasi visual dari medianya. Anda kemudian dapat menambahkan komponen visual ini ke jendela aplikasi atau applet Anda.

Untuk menampilkan Playerkomponen visual objek, Anda harus:

  1. Dapatkan komponen visual dengan memanggil getVisualComponent()metode
  2. Tambahkan komponen visual ke jendela aplikasi atau applet

A Playerjuga dapat menyertakan panel kontrol dengan tombol untuk memulai, menghentikan, dan menjeda aliran media, serta mengontrol volume, seperti tombol serupa pada pemutar CD Anda.

Banyak dari Playermetode yang dapat dipanggil hanya jika Playersedang dalam keadaan terealisasi. Untuk menjamin bahwa itu dalam keadaan ini, Anda dapat menggunakan metode Managers createRealizedPlayer()untuk membuat Player. Metode ini memberikan cara yang nyaman untuk membuat dan mewujudkan Playerdalam satu langkah. Ketika dipanggil, itu memblokir sampai Playerdirealisasikan.

Lebih lanjut, start()bisa dipanggil setelah a Playerdibuat tetapi sebelum mencapai status prefetch. start()mencoba untuk melakukan transisi Playerke keadaan awal dari apapun keadaannya saat ini. Misalnya, Anda dapat langsung memanggil start()metode setelah Playerdibuatkan instance. The start()Metode maka akan secara implisit memanggil semua metode yang diperlukan untuk membawa Playerke negara dimulai.

Tangkap data media

Penangkapan media adalah tugas penting lainnya dalam pemrograman JMF. Anda dapat mengambil data media menggunakan perangkat perekam seperti mikrofon atau kamera video. Ini kemudian dapat diproses dan diberikan, atau disimpan dalam format media. Untuk menangkap data media, Anda perlu:

  1. Temukan perangkat tangkap yang ingin Anda gunakan dengan menanyakan CaptureDeviceManager
  2. Dapatkan CaptureDeviceInfoobjek untuk perangkat tersebut
  3. Dapatkan a MediaLocatordari CaptureDeviceInfoobjek dan gunakan untuk membuat fileDataSource
  4. Buat a Playeratau a ProcessormenggunakanDataSource
  5. Mulai Playeratau Processoruntuk memulai proses penangkapan

Anda menggunakan CaptureDeviceManageruntuk mengakses perangkat tangkap yang tersedia di sistem. Manajer ini bertindak sebagai registri pusat untuk semua perangkat perekam yang tersedia untuk JMF. Anda dapat memperoleh daftar perangkat yang tersedia dengan memanggil getDeviceList()metode tersebut. Perangkat penangkap diwakili oleh sebuah CaptureDeviceInfoobjek. Anda menggunakan CaptureDeviceManager's getDevice()metode untuk mendapatkan CaptureDeviceInfountuk perangkat capture tertentu.

Untuk menggunakan perangkat penangkap untuk menangkap data media, Anda kemudian perlu mendapatkan perangkat MediaLocatordari CaptureDeviceInfoobjeknya. Anda dapat menggunakan ini MediaLocatoruntuk membuat Playeratau secara Processorlangsung, atau menggunakan MediaLocatoruntuk membuat DataSourceyang dapat Anda gunakan sebagai masukan ke Playeratau Processor. Gunakan metode Player's atau Processor' start()untuk memulai proses penangkapan.

Pemrosesan multimedia waktu nyata

Dengan JMF Anda juga dapat mengirim atau menerima siaran media langsung, seperti siaran langsung radio dan televisi, atau telekonferensi waktu nyata melalui Internet atau intranet.

Salah satu karakteristik transportasi media waktu nyata yang berbeda dari mengakses data statis: protokol waktu nyata tidak menjamin semua paket akan sampai dengan selamat. Lebih penting lagi, bagaimana Anda mengganti data yang hilang dan memastikan tidak ada penundaan yang besar dalam menerima data? Saat bekerja dengan aliran media waktu nyata, Anda memutar data media tanpa menunggu data aliran lengkap untuk diunduh. Demikian pula, transmisi melalui Internet secara realtime membutuhkan jaringan bandwidth tinggi sehingga penerima dapat memutar data media secara terus menerus.