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 pemutaranmedia3-ui-compose-material3- Membuat UI Media Compose Material3 dasar hanya dalam beberapa langkahmedia3-cast- Menangani transisi antara pemutaran Cast dan lokal secara otomatismedia3-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:
MetadataRetrieveruntuk membaca durasi, format, dan metadata statis dariMediaItem.FrameExtractoruntuk mendapatkan frame atau thumbnail dari item.MediaExtractorCompatsebagai 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. Tombol dan elemen konten 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 penelusuran bawaan, 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)
}
}
}
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()
}
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 memaketkan kode native yang relevan dengan benar. Memaketkan 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 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 lebih stabil:
- Dukungan caching – 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 lagi perlu menempati memori. Perhatikan bahwa tindakan ini memerlukan penetapanCachediDefaultPreloadManager.Builder. - Pengelolaan memori otomatis – Kami juga memperbarui antarmuka
LoadControluntuk 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 diDefaultLoadControl.Builder.DefaultPreloadManagerakan 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. Beberapa di antaranya:
- Membisukan dan mengaktifkan suara – Kami sudah memiliki metode
setVolume, tetapi kini telah menambahkan metodemutedanunmuteyang 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
StuckPlayerExceptionsaat mendeteksi status macet. - Wakelock secara default – Pengelolaan penguncian layar saat aktif sebelumnya bersifat opsional, sehingga sulit menemukan kasus ekstrem saat progres pemutaran dapat tertunda cukup lama saat berjalan di latar belakang. Sekarang fitur ini bersifat pilihan tidak ikut, sehingga Anda tidak perlu khawatir dan juga dapat menghapus semua penanganan penguncian layar saat aktif manual di sekitar pemutaran.
- Setelan yang disederhanakan untuk logika tombol CC – Mengubah
TrackSelectionParametersuntuk mengatakan "aktifkan/nonaktifkan subtitle" ternyata sulit dilakukan dengan benar, jadi kami menambahkan opsi boolean sederhanaselectTextByDefaultuntuk kasus penggunaan ini.
Menyederhanakan preferensi tombol media di MediaSession
Hingga saat ini, menentukan preferensi tombol mana yang akan muncul di laci 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 membuat hal ini jauh lebih sederhana – 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()
))
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 fitur 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 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. 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 sekumpulan 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 Anda bermigrasi ke konstruktor baru atau metode praktis untuk definisi urutan yang lebih jelas dan lebih andal.
Contoh pembuatan urutan khusus video:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()Hubungi kami melalui Pelacak masalah Media3 jika Anda mengalami bug, atau jika Anda memiliki pertanyaan atau permintaan fitur. Kami menantikan balasan dari Anda.
-
Berita ProdukMenyediakan pengalaman online yang aman dan melindungi pengguna dari bahaya adalah prioritas utama di Google Play.
Paul Feng • Waktu baca: 2 menit -
Berita ProdukHari ini, kami secara resmi merayakan lima tahun sejak rilis Jetpack Compose 1.0. Dari versi 1.0, yang diumumkan pada 28 Juli 2021, hingga rilis 1.11 terbaru, kami telah melihat API berkembang secara signifikan selama bertahun-tahun, dan kami meluangkan waktu untuk merayakannya.
Rebecca Franks, Nick Butcher, Loryn Hairston • Waktu baca: 5 menit -
Berita ProdukAndroid Studio Quail 2 kini stabil dan siap Anda gunakan dalam produksi, sehingga menghadirkan perubahan pada IDE Anda dengan alur kerja agen serentak, pembuatan profil kebocoran memori yang terintegrasi secara native, dan perbaikan error yang kontekstual.
Amman Asfaw • Waktu baca: 3 menit
Dapatkan insight pengembangan Android terbaru yang dikirim ke kotak masuk Anda setiap minggu.