Berita Produk

Media3 1.9.0 - Yang baru

Waktu baca: 6 menit
Kristina Simakova
Engineering Manager

Media3 1.9.0 sudah tersedia. Selain perbaikan bug dan peningkatan performa seperti biasa, rilis terbaru ini juga berisi empat modul baru atau yang ditulis ulang sebagian besar:

  • media3-inspector - Mengekstrak metadata dan frame di luar pemutaran
  • media3-ui-compose-material3 - Buat UI Media Compose Material3 dasar hanya dalam beberapa langkah
  • media3-cast - Menangani transisi antara Cast dan pemutaran lokal secara otomatis
  • media3-decoder-av1 - Pemutaran AV1 yang konsisten dengan decoder ekstensi yang ditulis ulang berdasarkan library dav1d

Kami juga menambahkan peningkatan pengelolaan memori dan caching ke PreloadManager, serta menyediakan beberapa penyederhanaan ExoPlayerTransformer, dan MediaSession baru. 

Rilis ini juga memberi Anda akses eksperimental pertama ke CompositionPlayer untuk melihat pratinjau pengeditan media.  


Baca terus untuk mengetahui informasi selengkapnya, dan seperti biasa, lihat catatan rilis lengkap untuk mengetahui ringkasan komprehensif tentang perubahan dalam rilis ini.

Mengekstrak metadata dan frame di luar pemutaran

Ada banyak kasus ketika Anda ingin memeriksa media tanpa memulai pemutaran. Misalnya, Anda mungkin ingin mendeteksi format yang ada di dalamnya atau durasinya, atau mengambil thumbnail.

Modul media3-inspector baru menggabungkan semua utilitas untuk memeriksa media tanpa pemutaran di satu tempat:

  • MetadataRetriever untuk membaca durasi, format, dan metadata statis dari MediaItem.
  • FrameExtractor untuk mendapatkan frame atau thumbnail dari item.
  • MediaExtractorCompat sebagai pengganti langsung class MediaExtractor platform Android, untuk mendapatkan informasi mendetail tentang sampel dalam file.

MetadataRetriever dan FrameExtractor mengikuti pola AutoCloseable sederhana. Lihat halaman panduan baru kami untuk mengetahui detail selengkapnya.

  suspend fun extractThumbnail(mediaItem: MediaItem) {

  FrameExtractor.Builder(context, mediaItem).build().use {

    val thumbnail = frameExtractor.getThumbnail().await()

  } 

}

Bangun UI Media Compose Material3 dasar hanya dalam beberapa langkah

Pada rilis sebelumnya, kami mulai menyediakan kode penghubung antara elemen UI Compose dan instance Player Anda. Dengan Media3 1.9.0, kami menambahkan modul baru media3-ui-compose-material3 dengan tombol dan elemen konten Material3 yang sepenuhnya bergaya. Dengan komponen ini, Anda dapat membuat UI media hanya dalam beberapa langkah, sekaligus memberikan semua fleksibilitas untuk menyesuaikan gaya. Jika lebih suka membuat gaya UI sendiri, Anda dapat menggunakan blok bangunan yang menangani semua logika pembaruan dan koneksi, sehingga Anda hanya perlu berkonsentrasi pada desain elemen UI. Lihat halaman panduan yang diperluas untuk modul UI Compose.

Kami juga masih mengerjakan lebih banyak komponen Compose, seperti kolom penelusuran bawaan, pengganti PlayerView yang lengkap dan siap digunakan, serta integrasi iklan dan subtitel.

  @Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
  Column(modifier) {
    ContentFrame(player)  // Video surface and shutter logic
    Row (Modifier.align(Alignment.CenterHorizontally)) {                 
      SeekBackButton(player)   // Simple controls
      PlayPauseButton(player)
      SeekForwardButton(player)
    }
  }
}

 

image.png

UI pemutar Compose sederhana dengan elemen siap pakai

Menangani transisi antara Cast dan pemutaran lokal secara otomatis

 CastPlayer dalam modul media3-cast telah ditulis ulang untuk menangani transisi secara otomatis antara pemutaran lokal (misalnya dengan ExoPlayer) dan pemutaran Cast jarak jauh.

Saat menyiapkan MediaSession, cukup buat CastPlayer di sekitar ExoPlayer dan tambahkan MediaRouteButton ke UI Anda, lalu selesai.

  // MediaSession setup with CastPlayer 

val exoPlayer = ExoPlayer.Builder(context).build()

val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()

val session = MediaSession.Builder(context, castPlayer).build()

// MediaRouteButton in UI 

@Composable fun UIWithMediaRouteButton() {

  MediaRouteButton()

}
image.png

Integrasi CastPlayer baru di aplikasi demo sesi Media3

Pemutaran AV1 yang konsisten dengan ekstensi yang ditulis ulang berdasarkan dav1d

Rilis 1.9.0 berisi modul ekstensi AV1 yang ditulis ulang sepenuhnya berdasarkan library dav1d yang populer. 

Seperti semua modul dekoder ekstensi, perhatikan bahwa modul ini memerlukan build dari sumber untuk memaketkan kode native yang relevan dengan benar. Menggabungkan decoder memberikan konsistensi dan dukungan format di semua perangkat, tetapi karena menjalankan decoding dalam proses Anda, decoder ini paling cocok untuk konten yang dapat Anda percayai. 

Mengintegrasikan pengelolaan cache dan memori ke dalam PreloadManager

Kami juga meningkatkan kualitas PreloadManager kami. Sebelumnya, Anda sudah dapat memuat media ke dalam memori di luar pemutaran, lalu menyerahkannya dengan lancar ke pemutar saat diperlukan. Meskipun cukup berperforma, Anda tetap harus berhati-hati agar tidak melebihi batas memori karena tidak sengaja memuat terlalu banyak konten sebelumnya. Jadi, dengan Media3 1.9.0, kami menambahkan dua fitur yang membuat hal ini jauh lebih mudah dan stabil:

  1. Dukungan caching – Saat menentukan seberapa jauh untuk melakukan pra-muat, Anda kini dapat memilih PreloadStatus.specifiedRangeCached(0, 5000) sebagai status target untuk item yang telah dimuat sebelumnya. Tindakan ini akan menambahkan rentang yang ditentukan ke cache Anda di disk, bukan memuat data ke memori. Dengan demikian, Anda dapat menyediakan rentang item yang jauh lebih besar untuk pemuatan awal karena item yang lebih jauh dari item saat ini tidak perlu lagi menempati memori. Perhatikan bahwa hal ini memerlukan penetapan Cache di DefaultPreloadManager.Builder.
  2. Pengelolaan memori otomatis – Kami juga memperbarui antarmuka LoadControl untuk menangani kasus pra-pemuatan dengan lebih baik sehingga Anda kini dapat menetapkan batas atas memori eksplisit untuk semua item yang dimuat sebelumnya dalam memori. Ukuran defaultnya adalah 144 MB, dan Anda dapat mengonfigurasi batasnya di DefaultLoadControl.Builder. DefaultPreloadManager akan otomatis berhenti melakukan pra-pemuatan setelah batas tercapai, dan otomatis melepaskan memori item dengan prioritas lebih rendah jika diperlukan.

Mengandalkan perilaku default baru yang disederhanakan di ExoPlayer

Seperti biasa, kami juga menambahkan banyak peningkatan inkremental pada ExoPlayer. Beberapa di antaranya:

  • Membisukan dan mengaktifkan suara – Kami sudah memiliki metode setVolume, tetapi sekarang telah menambahkan metode mute dan unmute yang praktis untuk memulihkan volume sebelumnya dengan mudah tanpa perlu melacaknya sendiri.
  • Deteksi pemain yang macet – Dalam beberapa kasus yang jarang terjadi, pemain dapat macet dalam status buffering atau pemutaran tanpa membuat kemajuan apa pun, misalnya, karena masalah codec atau kesalahan konfigurasi. Pengguna Anda akan merasa kesal, tetapi Anda tidak pernah melihat masalah ini di analisis Anda. Agar lebih jelas, pemutar kini melaporkan StuckPlayerException saat mendeteksi status macet.
  • Wakelock secara default – Pengelolaan kunci tetap aktif sebelumnya bersifat keikutsertaan, sehingga sulit menemukan kasus ekstrem di mana progres pemutaran dapat tertunda cukup lama saat berjalan di latar belakang. Sekarang fitur ini bersifat keikutsertaan, jadi Anda tidak perlu mengkhawatirkannya dan juga dapat menghapus semua penanganan kunci tetap aktif manual di sekitar pemutaran.
  • Setelan yang disederhanakan untuk logika tombol CC – Mengubah TrackSelectionParameters menjadi "aktifkan/nonaktifkan subtitel" ternyata sulit dilakukan dengan benar, jadi kami menambahkan opsi boolean selectTextByDefault sederhana untuk kasus penggunaan ini.

Menyederhanakan preferensi tombol media di MediaSession

Hingga saat ini, menentukan preferensi Anda terkait tombol mana yang harus muncul di panel notifikasi media di Android Auto atau WearOS memerlukan penentuan perintah dan tombol kustom, meskipun Anda hanya ingin memicu metode pemutar standar.

Media3 1.9.0 memiliki fungsi baru untuk menyederhanakan hal ini – Anda kini dapat menentukan preferensi tombol media dengan perintah pemutar standar, tanpa memerlukan penanganan perintah kustom sama sekali.

  session.setMediaButtonPreferences(listOf(
    CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
      .setDisplayName(R.string.skip_forward)
      .setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action 
      .build()
))
image.png

Preferensi tombol media dengan tombol percepat

CompositionPlayer untuk pratinjau real-time

Rilis 1.9.0 memperkenalkan CompositionPlayer dengan anotasi @ExperimentalApi baru. Anotasi menunjukkan bahwa fitur tersebut tersedia untuk eksperimen, tetapi masih dalam pengembangan. 

CompositionPlayer adalah komponen baru di Media3 Editing API yang dirancang untuk pratinjau real-time pengeditan media. Dibangun di atas antarmuka Media3 Player yang sudah dikenal, CompositionPlayer memungkinkan pengguna melihat perubahan yang mereka lakukan sebelum melakukan proses ekspor. Objek ini menggunakan objek Composition yang sama dengan yang akan Anda teruskan ke Transformer untuk diekspor, sehingga menyederhanakan alur kerja pengeditan dengan menyatukan model data untuk pratinjau dan ekspor.

Sebaiknya Anda mulai menggunakan CompositionPlayer dan membagikan masukan Anda, serta terus memantau postingan dan update mendatang pada dokumentasi untuk mengetahui detail selengkapnya.

InAppMuxer sebagai muxer default di Transformer

Transformer kini menggunakan InAppMp4Muxer sebagai muxer default untuk menulis file penampung media. Secara internal, InAppMp4Muxer bergantung pada modul Muxer Media3, sehingga memberikan perilaku yang konsisten di semua versi API. 

Perhatikan bahwa meskipun Transformer tidak lagi menggunakan MediaMuxer platform Android secara default, Anda tetap dapat menyediakan FrameworkMuxer.Factory melalui setMuxerFactory jika kasus penggunaan Anda memerlukannya.

API penyesuaian kecepatan baru

Rilis 1.9.0 menyederhanakan API penyesuaian kecepatan untuk pengeditan media. Kami telah memperkenalkan metode baru langsung di EditedMediaItem.Builder untuk mengontrol kecepatan, sehingga membuat API lebih intuitif. Sekarang Anda dapat mengubah kecepatan klip dengan memanggil setSpeed(SpeedProvider provider) pada EditedMediaItem.Builder:

  val speedProvider = object : SpeedProvider {
    override fun getSpeed(presentationTimeUs: Long): Float {
        return speed
    }

    override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
        return C.TIME_UNSET
    }
}

EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
    .setSpeed(speedProvider)
    .build()

Pendekatan baru ini menggantikan metode sebelumnya yang menggunakan Effects#createExperimentalSpeedChangingEffects(), yang telah kami hentikan penggunaannya dan akan dihapus pada rilis mendatang.

Memperkenalkan jenis trek untuk EditedMediaItemSequence 

Pada rilis 1.9.0, EditedMediaItemSequence mengharuskan penentuan jenis jalur output yang diinginkan selama pembuatan urutan. Perubahan ini memastikan penanganan trek lebih eksplisit dan kuat di seluruh Komposisi. 

Hal ini dilakukan melalui konstruktor EditedMediaItemSequence.Builder baru yang menerima sekumpulan jenis jalur (misalnya, C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO). 

Untuk menyederhanakan pembuatan, kami telah menambahkan metode praktis statis baru:

  • EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
  • EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
  • EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)

Sebaiknya Anda beralih ke konstruktor baru atau metode praktis untuk definisi urutan yang lebih jelas dan andal.

Contoh pembuatan urutan khusus video:

  EditedMediaItemSequence videoOnlySequence =
    EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
        .addItem(editedMediaItem)
        .build()

Hubungi kami melalui Issue Tracker Media3 jika Anda mengalami bug, atau jika Anda memiliki pertanyaan atau permintaan fitur. Kami menantikan balasan dari Anda.

Ditulis oleh:

Lanjutkan membaca