Berita Produk

Media3 1.9.0 - Yang baru

Waktu baca: 6 menit
Kristina Simakova
Engineering Manager

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

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

Kami juga menambahkan peningkatan pengelolaan cache dan memori ke PreloadManager, serta menyediakan beberapa penyederhanaan ExoPlayer, Transformer, dan MediaSession baru. 

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


Baca terus untuk mengetahui lebih lanjut, dan seperti biasa, lihat catatan rilis lengkap untuk mendapatkan ringkasan komprehensif tentang perubahan dalam rilis ini.

Mengekstrak metadata dan frame di luar pemutaran

Ada banyak kasus saat 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()

  } 

}

Membuat UI Media Compose Material3 dasar hanya dalam beberapa langkah

Pada rilis sebelumnya, kami mulai menyediakan kode konektor antara elemen UI Compose dan instance Pemutar Anda. Dengan Media3 1.9.0, kami menambahkan modul baru media3-ui-compose-material3 dengan tombol dan elemen konten Material3 yang sepenuhnya bergaya. Modul ini memungkinkan Anda 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 penyusun yang menangani semua logika update 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 panel kontrol prabangun, pengganti lengkap siap pakai untuk PlayerView, serta integrasi subtitle dan iklan.

@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 pemutaran Cast dan lokal secara otomatis

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

Saat menyiapkan MediaSession, cukup buat CastPlayer di sekitar ExoPlayer dan tambahkan MediaRouteButton ke UI Anda, dan 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 sepenuhnya ditulis ulang berdasarkan library dav1d yang populer. 

Seperti semua modul decoder ekstensi, perhatikan bahwa modul ini memerlukan pembuatan dari sumber untuk menggabungkan kode native yang relevan dengan benar. Penggabungan decoder memberikan dukungan format dan konsistensi 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 PreloadManager

Kami juga meningkatkan kualitas PreloadManager. Fitur ini sudah memungkinkan Anda 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 dengan memuat terlalu banyak secara tidak sengaja. Jadi, dengan Media3 1.9.0, kami menambahkan dua fitur yang membuat hal ini jauh lebih mudah dan stabil:

  1. Dukungan cache – Saat menentukan seberapa jauh untuk memuat pramuat, Anda kini dapat memilih PreloadStatus.specifiedRangeCached(0, 5000) sebagai status target untuk item yang dimuat pramuat. 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 dimuat pramuat karena item yang lebih jauh dari item saat ini tidak perlu lagi menggunakan memori. Perhatikan bahwa tindakan ini memerlukan penetapan Cache di DefaultPreloadManager.Builder.
  2. Pengelolaan memori otomatis – Kami juga memperbarui antarmuka LoadControl untuk menangani kasus pramuat dengan lebih baik sehingga Anda kini dapat menetapkan batas memori atas eksplisit untuk semua item yang dimuat pramuat dalam memori. Batas ini adalah 144 MB secara default, dan Anda dapat mengonfigurasi batas di DefaultLoadControl.Builder. DefaultPreloadManager akan otomatis berhenti memuat pramuat setelah batas tercapai, dan otomatis melepaskan memori item prioritas yang lebih rendah jika diperlukan.

Mengandalkan perilaku default baru yang disederhanakan di ExoPlayer

Seperti biasa, kami juga menambahkan banyak peningkatan inkremental ke ExoPlayer. Berikut beberapa di antaranya:

  • Membisukan dan mengaktifkan suara – Kami sudah memiliki metode setVolume, tetapi kini telah menambahkan metode mute dan unmute yang praktis untuk memulihkan volume sebelumnya dengan mudah tanpa perlu melacaknya sendiri.
  • Deteksi pemutar yang macet – Dalam beberapa kasus yang jarang terjadi, pemutar dapat macet dalam status buffering atau pemutaran tanpa membuat progres apa pun, misalnya, karena masalah codec atau konfigurasi yang salah. 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 wake lock sebelumnya bersifat opsional, sehingga sulit menemukan kasus ekstrem saat progres pemutaran dapat tertunda cukup lama saat berjalan di latar belakang. Sekarang fitur ini bersifat tidak opsional, sehingga Anda tidak perlu khawatir dan juga dapat menghapus semua penanganan wake lock manual di sekitar pemutaran.
  • Setelan yang disederhanakan untuk logika tombol CC – Mengubah TrackSelectionParameters untuk mengatakan "aktifkan/nonaktifkan subtitle" 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 tombol yang akan muncul di laci notifikasi media di Android Auto atau WearOS memerlukan penentuan tombol dan perintah kustom, meskipun Anda hanya ingin memicu metode pemutar standar.

Media3 1.9.0 memiliki fungsi baru yang membuat hal ini jauh lebih sederhana – Anda kini dapat menentukan preferensi tombol media dengan perintah pemutar standar, tanpa memerlukan penanganan perintah kustom.

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 maju cepat

CompositionPlayer untuk pratinjau real-time

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

CompositionPlayer adalah komponen baru dalam API pengeditan Media3 yang dirancang untuk pratinjau real-time pengeditan media. Dibangun berdasarkan antarmuka Player Media3 yang sudah dikenal, CompositionPlayer memungkinkan pengguna melihat perubahan yang mereka lakukan sebelum melakukan proses ekspor. Fitur 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 mulai gunakan CompositionPlayer dan bagikan masukan Anda, serta pantau terus postingan dan update mendatang ke 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, yang memberikan perilaku 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. Anda kini dapat mengubah kecepatan klip dengan memanggil setSpeed(SpeedProvider provider) di 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 dan akan dihapus pada rilis mendatang.

Memperkenalkan jenis trek untuk EditedMediaItemSequence

Dalam rilis 1.9.0, EditedMediaItemSequence mengharuskan penentuan jenis trek 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 kumpulan jenis trek (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 migrasikan 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 menemukan bug, atau jika Anda memiliki pertanyaan atau permintaan fitur. Kami menantikan balasan dari Anda.

Ditulis oleh:

Lanjutkan membaca