Media3

Mendukung library untuk kasus penggunaan media.
Update Terbaru Rilis Stabil Kandidat Rilis Rilis Beta Rilis Alfa
26 Oktober 2026 1.11.1 - - 1.12.0-alpha02

Mendeklarasikan dependensi

Untuk menambahkan dependensi pada Media3, Anda harus menambahkan repositori Maven Google ke project Anda. Baca repositori Maven Google untuk informasi selengkapnya.

Tambahkan dependensi untuk artefak yang diperlukan dalam file build.gradle bagi aplikasi atau modul Anda:

Groovy

dependencies {
    def media3_version = "1.11.1"

    // For media playback using ExoPlayer
    implementation "androidx.media3:media3-exoplayer:$media3_version"

    // For DASH playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
    // For HLS playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
    // For SmoothStreaming playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version"
    // For RTSP playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation "androidx.media3:media3-exoplayer-midi:$media3_version"
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-ima:$media3_version"

    // For loading data using the Cronet network stack
    implementation "androidx.media3:media3-datasource-cronet:$media3_version"
    // For loading data using the OkHttp network stack
    implementation "androidx.media3:media3-datasource-okhttp:$media3_version"
    // For loading data using librtmp
    implementation "androidx.media3:media3-datasource-rtmp:$media3_version"

    // For building media playback UIs using Jetpack Compose
    implementation "androidx.media3:media3-ui-compose:$media3_version"
    // For building media playback UIs using Jetpack Compose with Material Design 3
    implementation "androidx.media3:media3-ui-compose-material3:$media3_version"
    // For building media playback UIs using Views
    implementation "androidx.media3:media3-ui:$media3_version"
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation "androidx.media3:media3-ui-leanback:$media3_version"

    // For exposing and controlling media sessions
    implementation "androidx.media3:media3-session:$media3_version"

    // For extracting data from media containers
    implementation "androidx.media3:media3-extractor:$media3_version"

    // For inspecting media files
    implementation "androidx.media3:media3-inspector:$media3_version"
    // For extracting and processing video frames
    implementation "androidx.media3:media3-inspector-frame:$media3_version"

    // For integrating with Cast
    implementation "androidx.media3:media3-cast:$media3_version"

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version"

    // For transforming media files
    implementation "androidx.media3:media3-transformer:$media3_version"

    // For applying effects on video frames
    implementation "androidx.media3:media3-effect:$media3_version"
    // For applying Lottie effects on video frames
    implementation "androidx.media3:media3-effect-lottie:$media3_version"

    // For muxing media files
    implementation "androidx.media3:media3-muxer:$media3_version"

    // Utilities for testing media components (including ExoPlayer components)
    implementation "androidx.media3:media3-test-utils:$media3_version"
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation "androidx.media3:media3-test-utils-robolectric:$media3_version"

    // Common functionality for reading and writing media containers
    implementation "androidx.media3:media3-container:$media3_version"
    // Common functionality for media database components
    implementation "androidx.media3:media3-database:$media3_version"
    // Common functionality for media decoders
    implementation "androidx.media3:media3-decoder:$media3_version"
    // Common functionality for loading data
    implementation "androidx.media3:media3-datasource:$media3_version"
    // Common functionality used across multiple media libraries
    implementation "androidx.media3:media3-common:$media3_version"
    // Common Kotlin-specific functionality
    implementation "androidx.media3:media3-common-ktx:$media3_version"
}

Kotlin

dependencies {
    val media3_version = "1.11.1"

    // For media playback using ExoPlayer
    implementation("androidx.media3:media3-exoplayer:$media3_version")

    // For DASH playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-dash:$media3_version")
    // For HLS playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-hls:$media3_version")
    // For SmoothStreaming playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version")
    // For RTSP playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version")
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation("androidx.media3:media3-exoplayer-midi:$media3_version")
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-ima:$media3_version")

    // For loading data using the Cronet network stack
    implementation("androidx.media3:media3-datasource-cronet:$media3_version")
    // For loading data using the OkHttp network stack
    implementation("androidx.media3:media3-datasource-okhttp:$media3_version")
    // For loading data using librtmp
    implementation("androidx.media3:media3-datasource-rtmp:$media3_version")

    // For building media playback UIs using Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs using Views
    implementation("androidx.media3:media3-ui:$media3_version")
    // For building media playback UIs using Jetpack Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation("androidx.media3:media3-ui-leanback:$media3_version")

    // For exposing and controlling media sessions
    implementation("androidx.media3:media3-session:$media3_version")

    // For extracting data from media containers
    implementation("androidx.media3:media3-extractor:$media3_version")

    // For inspecting media files
    implementation("androidx.media3:media3-inspector:$media3_version")
    // For extracting and processing video frames
    implementation("androidx.media3:media3-inspector-frame:$media3_version")

    // For integrating with Cast
    implementation("androidx.media3:media3-cast:$media3_version")

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version")

    // For transforming media files
    implementation("androidx.media3:media3-transformer:$media3_version")

    // For applying effects on video frames
    implementation("androidx.media3:media3-effect:$media3_version")
    // For applying Lottie effects on video frames
    implementation("androidx.media3:media3-effect-lottie:$media3_version")

    // For muxing media files
    implementation("androidx.media3:media3-muxer:$media3_version")

    // Utilities for testing media components (including ExoPlayer components)
    implementation("androidx.media3:media3-test-utils:$media3_version")
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation("androidx.media3:media3-test-utils-robolectric:$media3_version")

    // Common functionality for reading and writing media containers
    implementation("androidx.media3:media3-container:$media3_version")
    // Common functionality for media database components
    implementation("androidx.media3:media3-database:$media3_version")
    // Common functionality for media decoders
    implementation("androidx.media3:media3-decoder:$media3_version")
    // Common functionality for loading data
    implementation("androidx.media3:media3-datasource:$media3_version")
    // Common functionality used across multiple media libraries
    implementation("androidx.media3:media3-common:$media3_version")
    // Common Kotlin-specific functionality
    implementation("androidx.media3:media3-common-ktx:$media3_version")
}

Untuk mengetahui informasi dependensi selengkapnya, lihat Menambahkan Dependensi Build.

Masukan

Masukan Anda membantu meningkatkan kualitas Jetpack. Anda dapat menggunakan Issue tracker media3 untuk menemukan jawaban atas pertanyaan, masalah umum dan permintaan fitur, serta mengajukan masalah baru.

Versi 1.12.0

Versi 1.12.0-alpha02

26 Oktober 2026

Versi 1.12.0-alpha02 berisi commit berikut.

  • Layanan Play Efek:
    • Memperkenalkan modul media3-effect-play-services baru yang menyediakan efek media layanan Google Play, termasuk EnhancementSessionDecorator untuk peningkatan kualitas video dan StudioSoundAudioProcessor untuk pemisahan sumber audio.

Versi 1.12.0-alpha01

21 Oktober 2022

Versi 1.12.0-alpha01 berisi commit berikut.

  • Library Umum:
    • Menambahkan C.COLOR_SPACE_DISPLAY_P3 dan mendukung ruang warna Display P3 dalam pemetaan warna ISO MediaFormatUtil dan ColorInfo.
    • Menambahkan registry Flags pusat untuk mengelola tombol fitur eksperimental dan peluncuran bertahap (Flags.setCanaryModeEnabled). Memigrasikan banyak metode @ExperimentalApi yang ada untuk menggunakan API tombol baru.
    • Tambahkan MediaMetadata.playlistId, MediaMetadata.Builder.setPlaylistId(String), MediaMetadata.categories, dan MediaMetadata.Builder.setCategories(List<String>).
    • Ganti androidx.media3.common.util.NonNullApi dengan org.jspecify.annotations.NullMarked JSpecify.
  • ExoPlayer:
    • Memperbaiki masalah saat pemutaran multi-periode DASH macet saat bagian pertama periode berikutnya gagal dimuat (#3396).
    • Laporkan wasCanceled = true di AnalyticsListener.onLoadError dan MediaSourceEventListener.onLoadError saat percobaan ulang pemuatan habis.
    • Mendukung pendaftaran beberapa instance VideoFrameMetadataListener menggunakan ExoPlayer.addVideoFrameMetadataListener dan ExoPlayer.removeVideoFrameMetadataListener, menghentikan penggunaan ExoPlayer.setVideoFrameMetadataListener dan ExoPlayer.clearVideoFrameMetadataListener.
    • Tambahkan dukungan untuk iklan dalam konten multi-periode (misalnya, DASH) dengan memisahkan dan mengimbangi AdPlaybackState untuk setiap periode.
    • Memperbaiki kondisi race di PreCacheHelper, yaitu pembatalan permintaan persiapan yang sedang berlangsung masih dapat memulai download di latar belakang.
    • Batasi setLoadOnlySelectedTracks(true) di ProgressiveMediaSource dan DefaultMediaSourceFactory agar hanya memfilter trek video dan gambar yang tidak dipilih. Trek audio dan teks selalu dimuat untuk memungkinkan peralihan trek yang lancar tanpa buffering ulang.
    • Aktifkan setLoadOnlySelectedTracks(true) secara default di ProgressiveMediaSource dan DefaultMediaSourceFactory. Hal ini menghemat memori dan memungkinkan penghitungan alokasi buffer DefaultLoadControl berfungsi lebih akurat saat tidak semua trek dipilih. Perhatikan bahwa hal ini dapat menyebabkan buffering tambahan jika trek video atau gambar yang tidak dipilih baru diaktifkan di tengah pemutaran.
    • Memperbaiki masalah saat Player.getCurrentPosition() dapat menampilkan nilai lama (hanya diupdate beberapa kali per detik) saat penjadwalan dinamis diaktifkan (#3286).
    • Memperbaiki masalah saat penurunan atau reset yang tidak terduga pada posisi head pemutaran AudioTrack dapat salah dianggap sebagai overflow bilangan bulat, sehingga menyebabkan pemutaran terhenti dalam buffering (#3407).
    • Hapus eksperimental DefaultMediaCodecAdapterFactory.setAsyncCryptoSynchronizationEnabled(boolean).
    • Menghindari pengaktifan ulang perender yang tidak perlu dan gangguan saat kembali dari interstisial atau iklan ke konten yang dipotong di akhir (#3371).
    • Memperbaiki masalah saat error perender pada item playlist mendatang dapat mengganggu pemutaran saat ini sebelum waktunya saat Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION diaktifkan.
    • Memperbaiki NullPointerException yang dapat terjadi jika ExoPlayer mentransisikan perender ke periode media yang tidak siap saat Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION diaktifkan.
    • Memperbaiki masalah saat frame video dapat dilewati atau dihapus secara tidak terduga selama penjadwalan dinamis saat Flags.FLAG_VIDEO_RENDERER_DURATION_TO_PROGRESS diaktifkan.
    • Memperbaiki ArrayIndexOutOfBoundsException di pemroses analisis saat menghentikan pemutaran selama iklan di livestream (#3423).
    • Memperbaiki masalah saat PreloadMediaSource dapat secara tidak terduga memposting peristiwa pramuat saat preload() tidak pernah dipanggil (#3408).
    • Memperbaiki masalah saat Format.subsampleOffsetUs diabaikan untuk trek metadata, sehingga menyebabkan stempel waktu pemutaran yang salah dalam perintah penyambungan SCTE-35 yang didekode (#3413).
    • Memperbaiki kebocoran memori di PreloadMediaSource dan DefaultPreloadManager saat preload() dipanggil beberapa kali pada sumber yang sama (#3445).
    • Memperbaiki NullPointerException saat merilis AdsMediaSource saat refresh linimasa konten tertunda (#3442).
    • Memperbaiki masalah saat pemutaran media progresif dapat melompat ke posisi yang salah saat pemuatan setelah pencarian (atau saat memulai pemutaran di posisi bukan nol) gagal dan dicoba lagi (#3440).
    • Menambahkan solusi untuk decoder H.264 Xiaomi TV Stick 4K (MiTV-AYFR0) yang berhenti berfungsi saat perubahan resolusi yang lancar (#3457).
    • Memperbaiki NullPointerException di SteeringManifestTracker saat pelacak dihentikan sebelum callback penyelesaian pemuatan atau error yang diposting dieksekusi (#3443).
    • Mendukung pemutaran metadata berjangka waktu HAGC (ST 2094-50) dari trek metadata dalam kotak mebx di file MP4.
    • Memperbaiki masalah saat periode media yang lambat disiapkan dalam playlist dapat dilewati.
  • CompositionPlayer:
    • Mendukung konfigurasi kecepatan frame agregasi frame video menggunakan Composition.Builder.setVideoFrameAggregationParameters untuk alur kerja pemutaran.
    • Memperbaiki penurunan frame dalam komposisi multi-urutan yang disebabkan oleh ketidakcocokan kuantisasi atau pembulatan stempel waktu, dengan memilih frame yang memiliki stempel waktu terdekat selama agregasi frame. Hal ini hanya diaktifkan dari API 29, karena memerlukan satu frame tambahan dalam penerbangan per urutan video.
  • Transformator:
    • Mendukung konfigurasi kecepatan frame agregasi frame video menggunakan Composition.Builder.setVideoFrameAggregationParameters untuk alur kerja ekspor.
    • Memperbaiki penurunan frame dalam komposisi multi-urutan yang disebabkan oleh ketidakcocokan kuantisasi atau pembulatan stempel waktu, dengan memilih frame yang memiliki stempel waktu terdekat selama agregasi frame. Hal ini hanya diaktifkan dari API 29, karena memerlukan satu frame tambahan dalam penerbangan per urutan video.
    • Mematuhi Transformer#setAudioMimeType(AUDIO_RAW) saat AudioProcessors digunakan. Sebelum perbaikan ini, meminta MimeTypes.AUDIO_RAW dan menerapkan AudioProcessor akan menghasilkan output yang dikompresi.
  • Pemilihan Trek:
    • Memperbaiki masalah saat trek SDR salah dipilih daripada trek Dolby Vision yang didukung di beberapa perangkat (#3135).
  • Ekstraktor:
    • Mp4Extractor: Memperbaiki penguraian kotak dOps untuk Opus di MP4, tempat PreSkip, InputSampleRate, dan OutputGain tidak dikonversi dari big-endian ke little-endian, sehingga audio sekitar 299 md pertama dihapus saat tidak ada daftar edit (#3431).
    • Hapus Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES, Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265, FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES, dan FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265 karena penguraian dependensi sampel dalam GOP untuk H.264 dan H.265 diaktifkan secara default.
    • Mp4Extractor: Memperbaiki penguraian metadata lokasi dari kotak xyz yang berisi koordinat ketinggian untuk mengisi Mp4LocationData.
    • Menambahkan ExtractorUtil.getFramesPerEncodedSample untuk menghitung jumlah frame audio per sampel untuk format audio yang dienkode (#3367).
    • Menambahkan FLAG_READ_XMP_METADATA ke Mp4Extractor untuk mengekstrak metadata XMP dari kotak UUID level teratas.
    • Memperbaiki audio AC-3, DTS, dan LPCM yang rusak saat memutar konten MPEG-PS gaya DVD, dengan menghapus header sub-stream private_stream_1 dari setiap paket PES di PsExtractor sebelum payload diteruskan ke pembaca audio (#3327).
    • Memperbaiki kegagalan di FragmentedMp4Extractor saat kotak tfdt versi 1 mengenkode baseMediaDecodeTime negatif (#3412).
    • MPEG-TS: Mendukung penguraian pesan SEI pengaturan pengemasan frame H.264 dan H.265 untuk mengisi Format.stereoMode (#3419).
    • Mengurai data konfigurasi Dolby Vision Profile 20 dan menolak profil Dolby Vision yang tidak didukung, bukan memutarnya sebagai HEVC standar dengan warna yang salah (#3427).
    • MP3: Mengembalikan penyesuaian metadata padding & penundaan encoder LAME/Xing karena tidak kompatibel dengan banyak dekoder MP3 MediaCodec (#3425).
    • Matroska: Memperbaiki NullPointerException saat mengurai elemen ChapterAtom bertingkat (#3438).
    • Ogg: Memperbaiki bug saat paket yang ukurannya kelipatan 255 byte dan berakhir di batas halaman digabungkan dengan paket berikutnya.
    • MP4: Mengurai trek metadata berjangka waktu dalam kotak mebx di Mp4Extractor dan FragmentedMp4Extractor. Trek yang membawa kunci it35 diekspos sebagai MimeTypes.APPLICATION_ITUT_T35 (mengaktifkan pemutaran HAGC). Trek mebx lainnya akan diabaikan kecuali jika FLAG_EMIT_RAW_MEBX_DATA ditetapkan, yang dalam hal ini semua trek mebx akan ditampilkan sebagai MimeTypes.APPLICATION_MEBX mentah.
    • Ogg: Mendukung ekstraksi padding akhir Opus untuk pemutaran tanpa jeda (#2576), dan memperbaiki stempel waktu sampel setelah mencari halaman yang dimulai dengan paket lanjutan.
    • Ogg: Memperbaiki error dekode dan lompatan stempel waktu ~1 dtk dalam streaming Ogg Opus berantai dengan mengabaikan paket header komentar dan ID Opus di tengah streaming.
  • Inspektur:
    • Mendukung pengambilan metadata XMP dari file MP4 menggunakan MetadataRetriever.
    • Mendukung ekstraksi trek metadata berjangka waktu dalam kotak mebx di MediaExtractorCompat sebagai MimeTypes.APPLICATION_MEBX.
  • Frame Inspector:
    • Memperbaiki pemangkasan warna BT.2020 gamut lebar dalam gambar dasar SDR saat mengekstrak frame Ultra HDR dengan FrameExtractor. Warna di luar gamut kini dikompresi secara halus ke dalam gamut sRGB, bukan dipotong.
  • Audio:
    • Menambahkan solusi untuk perangkat yang memanggil android.media.AudioDeviceCallback di thread yang salah (#3386).
    • Memperbaiki potensi pemutaran macet setelah transisi trek dengan offload terkompresi.
    • Mengatasi masalah pada Amazon Fire TV stick saat audio AC-3 dapat terhenti selama transisi periode (#3448).
    • Mendukung pemangkasan padding encoder akhir streaming untuk pemutaran tanpa jeda Ogg dan WebM/Matroska Opus (#2576).
    • Memperbaiki update padding dan penundaan gapless offload dinamis selama transisi trek sehingga diterapkan ke trek yang masuk, bukan trek yang sedang diputar.
    • Pangkas padding akhir encoder pada streaming tunggal dan streaming akhir dalam playlist, selain transisi tanpa jeda di tengah playlist (#2576).
    • Menghindari salinan buffer audio yang tidak perlu di TrimmingAudioProcessor setelah pemangkasan penundaan encoder awal streaming selesai dan tidak ada padding akhir streaming yang perlu dipangkas.
  • Video:
    • Memperbaiki pelaporan frame video yang terlambat dengan stempel waktu rilis yang identik sehingga dilaporkan sebagai dihapus, bukan dilewati.
  • Teks:
    • Tambahkan MediaItem.SubtitleConfiguration.timeOffsetUs untuk menggeser stempel waktu subtitel yang di-sideload relatif terhadap media. Offset dapat diubah selama pemutaran dengan Player.replaceMediaItem(int, MediaItem) tanpa mengganggu pemutaran (#1976).
    • SubRip: Menambahkan dukungan untuk memasukkan CharsetDetector ke dalam DefaultSubtitleParserFactory untuk mendeteksi encoding karakter subtitel SubRip mandiri tanpa tanda urutan byte (#2247).
  • Efek:
    • Terapkan SoundSeparationAudioProcessor untuk pemisahan sumber audio menggunakan modul GMSCore StudioSound.
  • Muxer:
    • Memperbaiki penulisan kotak dOps untuk Opus di Mp4Muxer dan FragmentedMp4Muxer tempat PreSkip, InputSampleRate, dan OutputGain ditulis dalam little-endian, bukan big-endian (#3431).
    • Mendukung penulisan ketinggian GPS di Mp4LocationData menggunakan Mp4Muxer.
    • Tambahkan Muxer.Factory.create(ParcelFileDescriptor) untuk mengizinkan muxing langsung ke ParcelFileDescriptor.
    • Tulis kotak tfdt (Track Fragment Base Media Decode Time) secara default di kotak traf file MP4 yang terfragmentasi untuk memberikan stempel waktu dekode media.
    • Mendukung penulisan kotak penampung dec3 E-AC-3 dan E-AC-3 JOC (Dolby Atmos) di Mp4Muxer.
    • Menambahkan dukungan format WebM ke MediaMuxerCompat.
    • Tulis kotak mfra (Movie Fragment Random Access) di akhir file MP4 yang terfragmentasi untuk memungkinkan pencarian di FragmentedMp4Extractor menggunakan FLAG_READ_MFRA_FOR_SEEK_MAP.
    • Memperbaiki error di Mp4Writer dan FragmentedMp4Writer saat menulis sampel EOS sebelum sampel lainnya ditulis.
    • Memperbaiki kepatuhan container saat melakukan muxing konten Dolby ke file MP4 atau MP4 Terfragmentasi dengan mengiklankan merek yang kompatibel dengan dby1 di header container (#3369).
    • Mendukung trek audio PCM float 32-bit di Mp4Muxer dan FragmentedMp4Muxer (#3389).
    • Menolak profil Dolby Vision yang tidak didukung di Mp4Muxer dan FragmentedMp4Muxer saat menambahkan trek.
    • Mendukung trek audio PCM bilangan bulat 24-bit dan 32-bit di Mp4Muxer dan FragmentedMp4Muxer.
  • Ekstensi IMA:
    • Teruskan peristiwa jeda dan lanjutkan pemutar ke IMA SDK di ImaServerSideAdInsertionMediaSource.
  • Sesi:
    • Tambahkan MediaConstants.EXTRAS_KEY_PLAYLIST_ID, MediaConstants.EXTRAS_KEY_PLAYLIST_TITLE, MediaConstants.EXTRAS_KEY_PLAYLIST_ARTWORK_URI, dan MediaConstants.EXTRAS_KEY_CATEGORIES untuk mengisi metadata playlist dan item dari metadata dan deskripsi lama, serta MediaConstants.EXTRAS_KEY_SUGGESTED_TYPE dan MediaConstants.EXTRAS_KEY_TTL_SECONDS untuk saran LibraryParams.extras.
    • Memperbaiki error SecurityException saat membuat atau merilis MediaSession di perangkat yang menerapkan batas PendingIntent yang ketat.
    • Memperbaiki masalah saat MediaSession.getControllerForCurrentRequest() menampilkan null selama permintaan pemutaran di Android 12 (API 31 dan 32) saat MediaSessionService belum berada di latar depan.
    • Memperbaiki error IllegalArgumentException saat MediaController terhubung ke sesi lama yang melaporkan volume maksimum negatif.
    • Memperbaiki masalah saat memanggil MediaController.setMediaItem atau setMediaItems yang diikuti dengan play() pada MediaSessionCompat lama yang dijeda dapat mengirimkan callback onPrepareFrom* yang tidak didukung, bukan onPlayFrom*, atau mengirimkan onPlay() tanpa melakukan inisialisasi ulang item media yang diminta.
    • Memperbaiki NullPointerException di MediaBrowser lama saat menerima respons perintah kustom (#3432).
    • Memperbaiki error IllegalArgumentException saat menerima metadata lama dengan kunci duplikat di Bundle yang mendasarinya.
    • Menggabungkan panggilan MediaControllerCompat.TransportControls keluar yang dilakukan dalam iterasi Looper yang sama saat mengontrol MediaSessionCompat lama (misalnya, memanggil setMediaItem, prepare, dan play bersama-sama kini mengirimkan satu callback onPlayFrom*).
  • UI:
    • Memperbaiki posisi tanda baca subtitel RTL dan mempertahankan rentang span saat pengemasan teks dua arah diaktifkan (#3454, #3455).
    • Tambahkan class TrackSelectionState dan TrackSelectionParametersState serta fungsi remember status Composable yang sesuai ke modul media3-ui-compose.
    • Memperkenalkan PresentationState.videoAspectRatio dan membuat Modifier.resizeWithContentScale mengambil aspectRatio: Float?, bukan sourceSizeDp: Size?.
    • Tambahkan class CuesState dan Composable rememberCuesState ke modul media3-ui-compose untuk memproses isyarat pemutar saat ini.
    • Tambahkan dukungan mode scrubbing ke ProgressSlider jika didasarkan pada ExoPlayer atau CompositionPlayer.
    • Menambahkan dukungan showArtwork ke PresentationState dan menggunakannya untuk mengatur waktu rendering Composable artwork opsional yang disediakan di ContentFrame dan Player. Tambahkan Composable Artwork untuk digunakan sebagai nilai default untuk slot artwork.
    • Tambahkan kolom baru ke PlayPauseButtonState (showBuffering, showRetry, showReplay) dan gunakan di PlayPauseButton untuk merender lebih banyak ikon dan indikator buffering.
    • Menambahkan class PlaybackState untuk memungkinkan pengamatan status pemutaran kustom, dan memperkenalkan BufferingIndicator sebagai komponen independen tombol.
    • Memperbaiki masalah saat PlayerView dan PlayerControlView menampilkan penanda iklan di batas periode untuk placeholder post-roll live di livestream multi-periode.
    • Slot composable Player, ContentFrame, PlayerDefaults, dan MiniController tidak lagi menerima visibilitas pemutar atau kontrol sebagai parameter. Sebagai gantinya, ambil dari cakupan panggilan (misalnya, topControls sekarang menjadi @Composable BoxScope.() -> Unit). Ini adalah perubahan yang dapat menyebabkan gangguan pada API yang tidak stabil.
    • Tambahkan parameter alignment ke ContentFrame, Player, dan Modifier.resizeWithContentScale untuk memosisikan konten yang diskalakan dalam penampungnya, dan pangkas konten ContentFrame ke batasnya, sehingga video yang diskalakan dengan ContentScale.Crop tidak lagi digambar di luar batasnya.
    • Menambahkan dukungan UI livestream ke ProgressSlider, ProgressStateWithTickCount, dan ProgressStateWithTickInterval dengan mengekspos isLive dan liveOffsetMs. Menambahkan Composable LiveButton ke media3-ui-compose-material3 (#2213).
  • Ekstensi Ktor:
    • Memperbaiki masalah saat KtorDataSource dapat memperlakukan kegagalan koneksi di tengah streaming sebagai akhir input, bukan menampilkan HttpDataSourceException (#3460).
  • Ekstensi HLS:
    • Mengurai VIDEO-RANGE (PQ dan HLG) di EXT-X-STREAM-INF dan EXT-X-I-FRAME-STREAM-INF menjadi Format.colorInfo (#3441).
    • Memperbaiki NullPointerException saat mengurai segmen inisialisasi EXT-X-MAP MPEG-TS yang berisi sampel media PES (#3456).
    • Memperbaiki regresi saat Format.id dan Format.metadata adalah null untuk trek HLS yang terekspos (#3402).
    • Potong iklan daftar aset menjadi X-PLAYOUT-LIMIT dan lewati iklan yang sepenuhnya melewati batas, dan tetapkan offset melanjutkan konten secara default ke 0 jika interstisial menghilangkan X-RESUME-OFFSET dan durasinya tidak diketahui meskipun X-PLAYOUT-LIMIT ditetapkan.
    • Memperbaiki masalah saat penyelesaian interstisial X-ASSET-LIST menimpa kontribusi offset kelanjutan konten dari interstisial lain dalam grup iklan yang sama.
  • Ekstensi DASH:
    • Mendukung penguraian peristiwa Penyisipan MPD Alternatif (urn:mpeg:dash:event:alternativeMPD:insert:2025) dan Penggantian (urn:mpeg:dash:event:alternativeMPD:replace:2025) di DashManifestParser dan mengeksposnya sebagai instance AlternativeMpdEvent di Period.alternativeMpdEvents. Ini adalah perubahan yang dapat menyebabkan gangguan untuk aplikasi yang membuat subclass DashManifestParser: DashManifestParser.buildPeriod kini mengambil parameter List<AlternativeMpdEvent> tambahan dan overload sebelumnya telah dihapus. Aplikasi yang mengganti DashManifestParser.parseEventStream(XmlPullParser) harus mengganti DashManifestParser.parseEventStream(XmlPullParser, String), karena yang pertama tidak digunakan lagi dan akan dijadikan pribadi dalam rilis mendatang.
    • Menguraikan informasi warna CICP (ColourPrimaries, TransferCharacteristics, MatrixCoefficients, dan VideoFullRangeFlag) dari deskriptor EssentialProperty dan SupplementalProperty ke dalam Format.colorInfo (#3426).
    • Mendukung daftar nilai @id yang dipisahkan spasi kosong dalam atribut @value deskripsi mode trik (http://dashif.org/guidelines/trickmode) (#3315).
    • Mendukung penguraian <ProducerReferenceTime> di DashManifestParser, mengeksposnya di AdaptationSet.producerReferenceTimes, dan menggunakannya untuk mengisi Timeline.Window.presentationStartTimeMs dan Timeline.Window.windowStartTimeMs untuk streaming VOD.
    • Menambahkan dukungan untuk Pengarahan Konten DASH (#1689).
    • Memperbaiki NullPointerException yang dapat terjadi saat mengurai manifes DASH dengan atribut yang tidak ada dalam elemen <UTCTiming> (#3436).
  • Ekstensi RTSP:
    • Memperbaiki error IllegalStateException yang terjadi saat memproses respons jaringan yang tertunda setelah klien RTSP ditutup.
    • Memperbaiki masalah saat scrubbing cepat dapat memicu mekanisme penggantian protokol TCP secara tidak benar.
    • Memperbaiki error IllegalStateException yang dapat terjadi saat memproses respons jaringan yang tertunda setelah klien RTSP mereset status selama pemilihan ulang trek, penghentian sesi, atau pengalihan URI.
    • Memperbaiki masalah saat pencarian lagi sebelum pemutaran dimulai ulang dapat menyebabkan error IllegalStateException.
    • Memperbaiki masalah saat melakukan pencarian mundur saat pencarian sudah tertunda dapat menyebabkan audio terputus dan pemutaran video terhenti.
    • Memperbaiki masalah saat unit akses keyframe H.264 dan H.265 yang diakhiri dengan paket agregasi atau non-IDR tidak ditandai sebagai keyframe, sehingga pemutaran tetap macet dalam buffering (#3434).
  • Ekstensi decoder (FFmpeg, VP9, AV1, dll.):
    • Ekstensi Opus: Memperbaiki error JNI saat mendekode data Opus yang tidak valid.
    • Ekstensi Opus: Memperbaiki padding penghapusan yang diabaikan saat pra-lewati dan padding penghapusan berada pada paket yang sama (#2576).
  • Ektensi Cast:
    • Memperkenalkan SessionAvailabilityListener.SessionUnavailableReason untuk mewakili alasan ketidaktersediaan sesi, dan menyediakan metode overload untuk SessionAvailabilityListener.onCastSessionUnavailable guna mengeksposnya.
    • Memperbaiki masalah saat pemutaran dilanjutkan secara lokal secara tidak terduga setelah menghentikan sesi Transmisi.
    • Mencatat error ke dalam log saat operasi RemoteMediaClient (seperti putar, jeda, perubahan kecepatan, mode ulang, volume, bisukan, atau pemilihan trek) gagal di RemoteCastPlayer (#3373).
    • Memperbaiki ArrayIndexOutOfBoundsException di RemoteCastPlayer saat antrean penerima Cast berubah atau menyusut saat operasi pencarian tertunda (#3372).
    • Memperbaiki masalah pada penerima Cast default saat linimasa hanya mengisi item media yang langsung mengelilingi item aktif, bukan seluruh playlist (#3129).
    • Segera perbarui linimasa dan posisi pemutaran saat mengubah playlist (setMediaItems, addMediaItems, moveMediaItems, removeMediaItems) atau melakukan pencarian di RemoteCastPlayer, dan mengantrekan operasi playlist berturut-turut sehingga dijalankan dengan andal secara berurutan (#2639, #3272).
    • Memperbaiki masalah saat memanggil addMediaItems pada antrean kosong di RemoteCastPlayer gagal memuat item media di penerima Cast (#2402).
    • Memperbaiki masalah di RemoteCastPlayer saat mencapai akhir antrean penerima Cast menghapus linimasa, bukan mempertahankan playlist.
    • Memperbaiki masalah saat playWhenReady, repeatMode, dan playbackParameters tidak ditransfer atau diterapkan saat ditetapkan di RemoteCastPlayer sebelum memuat item media (misalnya, selama transfer pemutaran lokal ke jarak jauh di CastPlayer) (#889).
  • Aplikasi demo:
    • Menambahkan dukungan untuk item media yang dilindungi DRM dan streaming sampel HLS tambahan ke katalog aplikasi demo sesi.
    • Konfigurasikan RemoteCastPlayer dengan CastTrackSelector di aplikasi demo sesi untuk mengaktifkan pemilihan subtitel dan trek audio saat melakukan transmisi.
  • Menghapus simbol yang tidak digunakan lagi:
    • Menghapus DashUtil.buildDataSpec(Representation, RangedUri, int) dan DashUtil.buildDataSpec(Representation, String, RangedUri, int). Sebagai gantinya, gunakan DashUtil.buildDataSpec(Representation, BaseUrl, RangedUri, int, Map<String, String>).
  • Build:
    • Tingkatkan minSdk Gradle menjadi 24.

Versi 1.11.0

1.11.1

10 September 2026

  • ExoPlayer:
    • Pindahkan flag untuk mengaktifkan/menonaktifkan metadata HAGC untuk media progresif dari MediaSource.Factory ke ExtractorsFactory. Metode setExperimentalEnableHagcPlayback sebelumnya dihapus dan diganti dengan ExtractorsFactory.setParseHagcMetadata. Tindakan ini juga menyelesaikan masalah saat penonaktifan tidak berfungsi untuk penampung Matroska/WebM.
    • Memperbaiki penghentian pemutaran yang disebabkan saat melakukan pra-pemanasan perender sekunder yang tidak bertransisi.
    • Memperbaiki masalah pra-pemanasan saat Surface harus ditampilkan ke perender utama saat pencarian mereset dan menonaktifkan kedua perender.
    • Memperbaiki ArrayIndexOutOfBoundsException saat pemuatan ulang linimasa live memindahkan posisi default melewati iklan yang disisipkan sisi server yang saat ini sedang diputar (#3348).
    • Memperbaiki masalah mode scrubbing yang menyebabkan frame video usang ditampilkan sebentar saat melakukan pencarian dengan ScrubbingModeParameters.allowSkippingMediaCodecFlush diaktifkan.
  • Ekstraktor:
    • Matroska: Memperbaiki masalah saat Trek yang ditempatkan setelah cluster tidak menghasilkan linimasa yang dapat di-seek (#3377).
  • Audio:
    • Memperbaiki penghitungan ukuran buffer di SilenceSkippingAudioProcessor sehingga durasi senyap minimum tidak salah diperkecil skala oleh ukuran frame (#3271).
    • Memperbaiki penanganan PCM 8-bit di PcmAudioUtil untuk memperlakukan sampel sebagai unsigned seperti yang ditentukan oleh Android (#3271).
    • Memperbaiki masalah offload saat pemutaran dapat terhenti selama transisi pre-roll atau gapless karena ukuran buffer hardware yang terbatas.
    • Memperbaiki bug di DefaultAudioSink yang menyebabkan jumlah rilis tidak berkurang saat thread pemutaran tidak lagi aktif (#3338).
  • Sesi:
    • Memperbaiki NullPointerException saat MediaController dalam proses dirilis dari callback Player.Listener (#3375).
    • Memperbaiki deadlock pada thread utama saat MediaBrowser lama terhubung ke layanan yang menampilkan hasil asinkron dari onGetLibraryRoot() atau onConnectAsync() (#3393).
  • Ekstensi HLS:
    • Memperbaiki penghitungan offset melanjutkan konten saat segmen target untuk snapping belum ada dalam playlist (#3322).
    • Memperbaiki masalah saat HlsMediaChunk yang digunakan sepenuhnya mencoba ulang pemuatan saat menerima EOFException dari ekstraktor (#3350).
  • Ekstensi DASH:
    • Memperbaiki penghitungan stempel waktu sampel yang salah untuk trek gambar dengan presentationTimeOffset (#3334).
  • Ekstensi decoder (FFmpeg, VP9, AV1, dll.):
    • Opus: Memperbaiki kerusakan memori saat beberapa instance OpusDecoder diinisialisasi secara serentak.
    • MPEG-H: Memperbaiki kebocoran memori, pemotongan karakter non-ASCII, dan potensi error native dalam kondisi memori rendah saat mengirim perintah ke MpeghUiManager (#3365).

Versi 1.11.0

05 Agustus 2026

  • Library umum:
    • Menambahkan Format.channelMask untuk secara eksplisit merepresentasikan mask saluran audio, dan overload Util.getAudioTrackChannelConfig(Format) baru untuk menyelesaikannya dengan aman.
    • Mengupgrade Kotlin dari 2.0.20 ke 2.2.0.
  • ExoPlayer:
    • Memperbaiki bug serentak yang bergantung pada waktu yang dapat menyebabkan IllegalStateException atau IndexOutOfBoundsException di ExoPlayer.
    • Melonggarkan pemeriksaan jumlah grup iklan di AdsMediaSource untuk memungkinkan jumlah grup iklan berkurang saat grup iklan diproses sepenuhnya (hasUnplayedAds() adalah false), sehingga mengakomodasi pengubahan ukuran grup iklan dinamis selama alur kerja reset.
    • Tambahkan getFlags() dan FLAG_STRICT_DURATION ke SampleStream untuk memungkinkan aliran data melaporkan flag, dan mengupdate perender untuk memeriksa flag ini secara dinamis.
    • Menggunakan estimator kecepatan frame di MediaCodecVideoRenderer dan format output codec di MediaCodecAudioRenderer untuk menghitung kecepatan operasi codec saat format streaming tidak memberikan nilai yang valid, dan menghindari reset codec yang tidak perlu.
    • Menghapus kliping konten untuk iklan yang disisipkan di sisi klien di pemutar inti. Sebagai gantinya, AdsMediaSource akan menangani logika pemangkasan. Sumber iklan kustom yang disisipkan di sisi klien perlu diperbarui untuk menerapkan kliping konten secara internal.
    • Tandai trek dengan profil atau level codec yang terbentuk dengan baik, tetapi tidak dikenali sebagai supported=NO_EXCEEDS_CAPABILITIES, bukan supported=YES (yang merupakan cara trek dengan info profil atau level yang tidak ada atau salah format ditandai). Hal ini memastikan trek ini (yang kemungkinan tidak didukung oleh perangkat) tidak dipilih jika ada alternatif yang lebih didukung.
    • Tambahkan DefaultPreloadManager.SimpleRankingDataComparator, yang merupakan RankingDataComparator yang membandingkan peringkat item media berdasarkan jaraknya dengan indeks item media yang sedang diputar. Aplikasi dapat mengganti metode compare(Integer, Integer)-nya jika diperlukan logika perbandingan yang lebih disesuaikan. SimpleRankingDataComparator kustom dapat diinjeksikan melalui konstruktor baru DefaultPreloadManager.Builder.
    • Mengurangi risiko OOM DefaultLoadControl.prioritizeTimeOverSizeThresholds dengan beralih ke batas ukuran byte buffer jika memori heap yang tersedia tampak terbatas.
    • Menyelaraskan penanganan gambar diam saat MediaItem.imageDurationUs tidak ditetapkan: Gambar diam JPEG dan HEIC kini 'diputar' dengan durasi default yang sangat singkat (sama seperti perilaku PNG dan gambar lainnya sebelumnya).
    • Tambahkan MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter) untuk menghubungkan BandwidthMeter ke MediaSource. Metode yang tidak digunakan lagi dengan penerapan kustom akan tetap dipanggil secara default, tetapi sebaiknya terapkan metode baru dan gunakan BandwidthMeter.getTransferListener() untuk mendapatkan paritas dengan metode lama.
    • Di DefaultBandwidthMeter, tambahkan dukungan untuk InitialBitrateSupplier kustom. Hal ini memungkinkan aplikasi menyediakan logikanya sendiri untuk menentukan estimasi kecepatan bit awal, yang akan digunakan saat pembuatan DefaultBandwidthMeter dan saat perubahan jenis jaringan. Pemasok dapat ditetapkan melalui DefaultBandwidthMeter.Builder.setInitialBitrateSupplier().
    • Aktifkan penjadwalan dinamis secara default. Loop kerja pemutaran ExoPlayer akan berjalan secara dinamis, bukan pada interval statis.
    • Menghapus reset yang tidak perlu yang dapat terjadi saat menggabungkan trek dengan sampel pre-roll ke pemutaran aktif.
    • Di DefaultBandwidthMeter, optimalkan getInitialBitrateCountryGroupAssignment untuk menampilkan penetapan grup negara yang dikemas ke dalam bilangan bulat 32-bit, bukan array, sehingga mengurangi ukuran kode dan menghindari alokasi.
    • Memperbaiki kegagalan inisialisasi AudioTrack di beberapa perangkat dengan memastikan logika percobaan ulang selalu mencoba ukuran buffer minimum 1 detik jika percobaan ulang lainnya (dengan mengurangi separuh ukuran buffer) tidak berhasil (#3207).
    • Memperbaiki masalah codec di beberapa perangkat yang menyebabkan codec menelan semua sampel jika sebelumnya di-flush sebelum menerima buffering input.
    • Menambahkan ExoPlayer.Builder.enablePerStreamMediaProgression() eksperimental untuk memungkinkan pemrosesan media lanjutan per streaming. Hal ini mengurangi latensi startup antara item playlist dan mencegah pemutaran menjadi "macet" dengan konten yang sangat singkat (#3122).
    • Memperbaiki kondisi race terkait penggunaan ID sesi audio, yaitu ID sesi audio awal yang dibuat otomatis oleh ExoPlayer akan digunakan, bukan nilai yang ditetapkan oleh setAudioSessionId (#3241).
    • Menambahkan dukungan pemutaran metadata berjangka waktu HAGC (ST 2094-50) eksperimental untuk media progresif (misalnya, MP4, Matroska). Pemutar akan otomatis menggabungkan trek metadata HAGC dengan trek video terkait dan mengirimkan metadata out-of-band ke dekoder di perangkat API 37+. Perilaku ini dapat dinonaktifkan melalui DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false).
    • Menambahkan Format.selectionPriority yang mewakili preferensi relatif Format dalam pemilihan trek (#3236).
    • Memperbaiki potensi masalah mode scrubbing, yaitu scrubbing dapat terhenti saat mencari 'akhir streaming'.
  • CompositionPlayer:
    • Memperbaiki masalah saat instance TrackSelector tidak dirilis.
  • Transformator:
    • Memperbaiki masalah yang menyebabkan ExportResult.fileSizeBytes dilaporkan secara berlebihan.
  • Pemilihan trek:
    • Mengekspos BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR dan menambahkan AdaptiveTrackSelection.Factory.setTrackFormatComparator untuk memungkinkan pengurutan format kustom dan prioritas pemilihan ABR di luar pengurutan khusus kecepatan bit.
    • Memperbaiki masalah serentak yang bergantung pada waktu, yaitu update berurutan yang cepat pada parameter pemilihan trek dapat menyebabkan beberapa update hilang atau ditimpa.
  • Ekstraktor:
    • MP4, MP3, dan FLAC: Menambahkan FLAG_DISABLE_ARTWORK_METADATA untuk memungkinkan penghapusan gambar terlampir dan metadata gambar sampul selama penguraian penampung untuk mengurangi konsumsi memori runtime (#2077). Hal ini juga dapat diaktifkan secara terpusat melalui DefaultExtractorsFactory.setDisableArtworkMetadata.
    • MP4: Menambahkan dukungan untuk mengekstrak trek metadata berjangka waktu ITU-T T.35 (it35).
    • MP4: Menambahkan dukungan untuk mengekstrak metadata bab (format Nero dan QuickTime). Segmen QuickTime lebih disarankan jika keduanya ada. Informasi bab yang diekstrak ditampilkan sebagai entri Chapter dalam Metadata trek, sehingga memungkinkan navigasi bab native dalam file MP4, M4A, dan M4B (seperti buku audio dan podcast) (#2803).
    • WAV, Matroska, dan MP4: Menambahkan dukungan untuk audio PCM floating point 64-bit (#3090).
    • Matroska: Menggunakan metadata bitstream codec untuk mengisi ColorInfo yang akurat.
    • MP4: Menambahkan dukungan untuk pencarian dalam file MP4 yang terfragmentasi menggunakan kotak mfra saat kotak sidx tidak ada. Untuk mengaktifkannya, berikan FLAG_READ_MFRA_FOR_SEEK_MAP ke FragmentedMp4Extractor, yang kini dilakukan secara default di DefaultExtractorsFactory (#3088).
    • Mengabaikan data av1C dengan versi yang tidak didukung.
    • MP4: Menambahkan dukungan untuk PCM floating point big-endian dalam kotak fpcm.
    • Matroska: Mengurai info bab ke entri Chapter di Metadata trek.
    • MPEG-TS: Meningkatkan ekstraksi streaming DTS-HD dan DTS Express dengan menggabungkan Substream Core dan Ekstensi menjadi satu sampel, memperbaiki masalah pemutaran saat keduanya sebelumnya dihasilkan sebagai sampel terpisah (#3147).
    • MP4: Mencegah loop tanpa batas dan pembacaan di luar batas saat mengurai item tag metadata ilst kosong (#3191).
    • MPEG-TS: Memastikan frame terakhir dirender untuk streaming yang paket PES terakhirnya memiliki panjang yang diketahui (#3206).
    • MP3: Memperbaiki pelaporan kecepatan bit untuk file dengan header Xing dan VBRI.
    • Matroska: Menangani trek yang ditentukan di cluster terakhir (#3250).
    • Matroska: Menambahkan dukungan untuk ALAC (#3268).
    • MP4: Mengizinkan kotak sgpd dengan panjang variabel dalam file MP4 yang terfragmentasi (#3243).
    • AVI: Memperbaiki masalah saat memutar file tanpa tanda keyframe di trek audio menyebabkan hilangnya audio dan OutOfMemoryError.
    • MP3: Menggunakan durasi yang mendukung gapless dari header Xing/Info (#3183).
    • MP3: Menyesuaikan penundaan encoder LAME/Xing dan metadata padding agar sesuai dengan pemangkasan PCM yang didekode (#3200).
  • Audio:
    • Menambahkan masa tenggang 100 md di perender audio ExoPlayer saat beralih dari status siap ke tidak siap, untuk mendebounce underrun sementara dan menghindari status buffering yang tidak terduga selama pemutaran aktif (#3210).
    • Mengubah logika ukuran buffer PCM default di DefaultAudioTrackBufferSizeProvider untuk menggunakan buffer 500 md tetap agar tidak terlalu bergantung pada perangkat.
    • Perbarui MediaCodecAudioRenderer untuk mengekstrak channelMask spasial dari dekoder platform, sehingga DefaultAudioSink dapat menggunakan mask eksplisit ini, bukan menyimpulkannya dari jumlah saluran.
    • Konversi parameter AudioSink.configure ke class data. Penggantian kustom ForwardingAudioSink.configure harus dimigrasikan ke tanda tangan metode baru.
    • Menambahkan dukungan untuk mempertahankan nada saat melakukan time-stretching pada streaming audio dengan EditedMediaItem.Builder#setSpeed(SpeedParameters).
    • Meningkatkan ToFloatPcmAudioProcessor untuk mendukung konversi PCM 8-bit, PCM big-endian 16-bit, dan PCM floating point 64-bit ke PCM floating point 32-bit (#3090).
    • Ubah nilai yang ditampilkan DecoderAudioRenderer.getChannelMapping menjadi ImmutableIntArray.
    • Memperbaiki bug yang menyebabkan pemutaran macet saat memutar playlist audio tanpa jeda dalam mode offload terkompresi.
    • Meneruskan Timeline dan UID periode ke AudioSink.configure dan AudioProcessor.StreamMetadata untuk memberikan konteks playlist ke pemroses audio (#418).
    • Menetapkan AudioProcessor.StreamMetadata.positionOffsetUs yang benar untuk memungkinkan pemrosesan audio berbasis waktu (#418).
    • Menambahkan dukungan untuk PCM floating point 32-bit dan 64-bit big endian.
    • Menghapus jalur penggantian EAC3-JOC ke EAC3 untuk pemutaran di perangkat Google Pixel karena dekoder EAC3 standarnya tidak dapat mendekode streaming EAC3-JOC (#3257).
  • Video:
    • Memperbaiki logika penggabungan video untuk menghitung buffering yang dihapus selama penggabungan sebagai dilewati, bukan dihapus.
    • Memperbaiki keputusan rendering langsung saat menyetel platform baru untuk menghindari penurunan frame pada perangkat yang tidak mendukung platform placeholder.
    • Memperbaiki estimasi kecepatan frame di MediaCodecVideoRenderer agar lebih akurat dengan memperhitungkan frame yang dilewati atau dihapus.
    • Mengizinkan konfigurasi nilai minimum yang digunakan untuk menjadwalkan frame lebih awal. Nilai defaultnya adalah 50 md, tetapi Anda dapat menyesuaikan nilai tersebut melalui MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold().
    • Memperbaiki bug di VideoFrameReleaseHelper yang menyebabkan perubahan tampilan dapat memicu callback Choreographer yang redundan dan pengaktifan CPU yang berlebihan di thread utama.
  • Teks:
    • TTML: Penggantian ke displayAlign dari style untuk region (#2559).
    • TTML: Mewarisi waktu mulai isyarat dari induk elemen <p> (#3246).
  • Metadata:
    • Tambahkan kolom MediaMetadata.discSubtitle dan uraikan dari data ID3v2.4 TSST dan Vorbis DISCSUBTITLE.
    • Mengurai nomor & jumlah disk dari frame TPOS ID3.
  • Efek:
    • Hapus status gambar ulang di FinalShaderProgramWrapper saat melakukan flush untuk mencegah pemutar berhenti berfungsi saat melakukan pencarian.
  • Muxer:
    • Menambahkan dukungan untuk referensi trek (kotak tref) di Mp4Muxer melalui API addTrackReference baru. Hal ini memungkinkan pembuatan hubungan antar-trek, seperti menautkan trek metadata ke trek video yang dijelaskannya.
    • Tambahkan OggMuxer untuk mengizinkan muxing streaming media OPUS atau VORBIS ke dalam format file ogg.
    • Tambahkan WavMuxer untuk pembuatan file WAV (mendukung PCM bilangan bulat dan floating point).
    • Tambahkan setAttemptStreamableOutputEnabled ke InAppMp4Muxer.Factory untuk memungkinkan penulisan file yang lebih kecil dan tidak dapat di-streaming tanpa ruang yang dicadangkan.
    • Menambahkan dukungan untuk audio IAMF di Mp4Muxer dan FragmentedMp4Muxer.
  • Ekstensi IMA:
    • Tambahkan ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot untuk mengizinkan penyediaan slot iklan yang akan digunakan untuk iklan saat jeda.
    • Memperbaiki bug saat iklan VAST yang dapat dilewati secara berturut-turut langsung menampilkan tombol lewati pada iklan kedua (#3165).
  • Sesi:
    • Memperbaiki potensi deadlock dan error IllegalStateException di dalam MediaNotificationManager saat menggunakan sesi dengan looper pemutar thread latar belakang.
    • Menerapkan persyaratan threading yang lebih ketat untuk metode MediaSession. Metode void kini otomatis memposting eksekusi ke thread looper aplikasi, dan pengakses status (pengambil) secara eksplisit menampilkan IllegalStateException jika dipanggil dari thread selain looper aplikasi.
    • Memperbaiki error penggabungan linimasa di luar batas (IllegalStateException di MediaUtils.mergePlayerInfo) dengan melacak konsistensi status per pengontrol di sisi sesi.
    • Tambahkan androidx.media3.session.MediaSessionManager untuk memberikan dukungan untuk membuat kueri sesi media aktif dan menampilkan instance SessionToken Media3.
    • Mengubah perilaku default MediaSession.Callback.onConnect jika metode tidak diganti untuk hanya memberikan akses baca ke pengontrol yang tidak tepercaya.
    • Menambahkan dukungan untuk mengganti nama paket saat membuat MediaSession melalui API baru MediaSession.Builder#setPackageNameOverride. Pemanggil harus memiliki izin android.permission.OVERRIDE_MEDIA_SESSION_OWNER untuk mengganti nama paket sesi.
    • Menambahkan MediaSession.Callback.onConnectAsync(). Metode baru ini memungkinkan pemrosesan upaya koneksi pengontrol secara asinkron. Aplikasi dapat segera menampilkan Future dengan Futures.immediateFuture(ConnectionResult) untuk mencapai perilaku sebelumnya. Sebaiknya lakukan migrasi ke metode baru karena Callback.onConnect adalah kandidat yang tidak digunakan lagi.
    • Memperbaiki masalah saat penjelajahan AVRCP Bluetooth tidak mengenali MediaLibraryService di API 36 dan 37.
    • Memperbaiki penurunan skala ganda pada poster di MediaSession saat ukuran gambar mendekati batas platform, sehingga mengatasi keburaman dalam notifikasi (#3134).
    • Memperbaiki error ForegroundServiceStartNotAllowedException di MediaNotificationManager saat callback pemuatan bitmap poster asinkron mencoba memulai layanan latar depan saat aplikasi berada di latar belakang (#3270).
    • Memperbaiki masalah saat objek PositionInfo yang diterima oleh MediaController tidak memiliki UID Timeline aslinya. Sesi ini sekarang menerjemahkan dan menyebarkan UID ini dengan andal selama update status.
    • Memperbaiki error dengan menangkap ForegroundServiceStartNotAllowedException di MediaSessionService.stopSelfSafely() (#3310).
    • Memperbaiki callback onMediaItemTransition() yang tidak terduga di MediaController saat melakukan pencarian di dalam item media yang sama (#3248).
  • UI:
    • Memperbaiki rendering frame pertama pada ukuran yang salah saat ContentFrame direkomposisi di tengah pemutaran (#3238).
    • Tambahkan class CurrentMediaItemState dan Composable rememberCurrentMediaItemState yang sesuai ke modul media3-ui-compose. Holder status ini digunakan di demo-compose untuk menampilkan berbagai informasi metadata tentang MediaItem yang sedang diputar.
    • Tambahkan class PlaylistState dan Composable rememberPlaylistState yang sesuai ke modul media3-ui-compose. Holder status ini digunakan di demo-compose untuk menampilkan berbagai informasi metadata tentang MediaItems yang ditetapkan di Pemutar.
    • Menambahkan API percepat/gerak lambat ke PlaybackSpeedState. Gunakan fungsi ini di demo-compose untuk menampilkan fitur percepat dengan menekan lama.
    • Tambahkan composable MiniController ke modul media3-ui-compose-material3. Fitur ini memberikan affordance yang ringkas untuk mengontrol Player sekaligus menampilkan judul, artis, poster, dan progres item media saat ini.
    • Tambahkan class ErrorState dan Composable rememberErrorState yang sesuai ke modul media3-ui-compose. Tambahkan composable ErrorText ke media3-ui-compose-material3 dan jadikan sebagai overlay default di Player.
    • Publikasikan objek PlayerDefaults dengan composable untuk TopControls, CenterControls, BottomControls, dan ErrorOverlay.
    • Menambahkan FocusRequester ke Composable Player dan slot kontennya.
    • Publikasikan PlayerPool (common-ktx) dan rememberPooledPlayer (ui-compose) untuk mendukung pramuat MediaItems di lingkungan UI jendela geser. Tampilkan fungsi ini di demo-compose dengan ShortFormPlayerScreen baru.
    • Memperbaiki bug penekanan shutter di PlayerView dan Compose PresentationState yang menyebabkan error pada linimasa yang tidak mendukung pencarian UID periode (#3264).
  • Download:
    • Menyelesaikan variabel HLS di playlist media saat diambil untuk didownload (#3258).
  • Ekstensi Ktor:
    • Tambahkan modul ekstensi media3-datasource-ktor baru yang menyediakan KtorDataSource yang didukung oleh stack HTTP Ktor.
    • Memperbaiki KtorDataSource yang memuat seluruh isi respons HTTP ke dalam memori saat membuka koneksi (#3305).
  • Ekstensi HLS:
    • Menambahkan dukungan untuk Pengarahan Konten HLS dan Cloning Jalur (#1689).
    • Menambahkan setWithAssetListReset ke HlsInterstitialsAdsLoader agar aplikasi dapat mereset interstisial daftar aset yang telah diproses sepenuhnya kembali ke status tidak tersedia untuk resolusi ulang on-demand.
    • Mengurai atribut SCORE dari EXT-X-STREAM-INF dan EXT-X-I-FRAME-STREAM-INF, lalu mengisinya ke Format.selectionPriority (#3236).
    • Memperbaiki bug saat pemuatan ulang playlist HLS terjadwal terus berlanjut meskipun playlist tidak lagi menjadi yang utama atau aktif (#3254).
    • Memperbaiki penghitungan offset melanjutkan konten saat me-resolve daftar aset interstisial (#3322).
    • Memperbaiki diskontinuitas stempel waktu trek audio yang tidak terduga saat melanjutkan pemutaran live latensi rendah setelah kegagalan permintaan playlist (#3311).
    • Memperbaiki bug di HlsMediaPeriod.getStreamKeys() yang menyebabkan trek ID3 dalam rendisi audio dianggap sebagai subtitel (#3333).
  • Ekstensi DASH:
    • Memisahkan teks tertutup CEA ke dalam TrackGroup yang berbeda berdasarkan bahasa (#3113).
    • Menambahkan dukungan untuk mengurai beberapa elemen Location dari manifes (MPD) dan melakukan penggantian lokasi di DashMediaSource saat pemuatan manifes gagal.
    • Memperbaiki error (IndexOutOfBoundsException) saat membuka manifes dengan elemen <SegmentTimeline/> kosong (#3326).
  • Ekstensi RTSP:
    • Memperbaiki kegagalan atau penghentian pemutaran sementara selama persiapan pemutaran RTSP yang disebabkan oleh error pengikatan port UDP.
  • Ektensi Cast:
    • Menambahkan class CastParams baru untuk memungkinkan konfigurasi Cast dengan memanggil Cast.initialize(CastParams).
    • Menambahkan opsi CastParams.getShowSystemOutputSwitcherOnCastIconClick() baru, yang memicu penggunaan Pengalih Output SystemUI, bukan pemilih perangkat Cast dalam aplikasi jika tersedia.
    • Menambahkan MediaRouteButtonState dan rememberMediaRouteButtonState untuk mendukung pengamatan status visibilitas pemilih rute media, dan menambahkan parameter state ke MediaRouteButton (#3172).
    • Memperbaiki bug yang menyebabkan RemoteCastPlayer dapat macet secara permanen dalam status penyamaran trek setelah pemilihan trek, sehingga mengabaikan update trek berikutnya dari penerima Cast (#3237).
    • Memperbaiki bug saat DefaultMediaItemConverter menampilkan NullPointerException saat mencoba bergabung ke sesi transmisi yang dimulai dari pengirim non-Media3.
    • Mencegah CastPlayer mentransfer MediaItems yang tidak dapat diputar saat mengubah pemutar aktif (#3199).
    • Memperbaiki bug yang menyebabkan live stream yang tidak dikonfigurasi (liveConfiguration == UNSET) diantrekan sebagai STREAM_TYPE_BUFFERED (#3318).
  • Utilitas pengujian:
    • Perluas DataSourceContractTest untuk menyertakan dukungan bagi permintaan POST dengan header & isi, tambahkan beberapa resource POST ke HttpDataSourceTestEnv, dan tambahkan pernyataan untuk metode, header & isi HTTP yang diharapkan di WebServerDispatcher.
    • Perketat pernyataan di DataSourceContractTest untuk panjang yang ditampilkan dari DataSource.open(). Resource yang dapat menghasilkan C.LENGTH_UNSET harus menunjukkan hal ini menggunakan TestResource.Builder.setMayResolveToUnknownLength(boolean).
    • Menambahkan setPlaybackLooper ke TestExoPlayerBuilder.
  • Menghapus simbol yang tidak digunakan lagi:
    • Menghapus androidx.media3.exoplayer.MetadataRetriever. Menggunakan androidx.media3.inspector.MetadataRetriever sebagai gantinya.
    • Menghapus androidx.media3.exoplayer.MediaExtractorCompat. Menggunakan androidx.media3.inspector.MediaExtractorCompat sebagai gantinya.
    • Hapus Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATA. Gunakan HeifExtractor untuk mengekstrak metadata foto motion dari file HEIC.
    • Hapus androidx.media3.extractor.metadata.mp4.MotionPhotoMetadata. Menggunakan androidx.media3.extractor.metadata.MotionPhotoMetadata sebagai gantinya.
    • Menghapus androidx.media3.extractor.DummyTrackOutput. Menggunakan androidx.media3.extractor.DiscardingTrackOutput sebagai gantinya.
    • Menghapus androidx.media3.extractor.DummyExtractorOutput. Menggunakan androidx.media3.extractor.NoOpExtractorOutput sebagai gantinya.
    • Menghapus androidx.media3.common.C.generateAudioSessionIdV21. Sebagai gantinya, gunakan androidx.media3.common.util.Util.generateAudioSessionId.
  • Bangun
    • Memperbarui petunjuk README.md untuk bergantung pada Media3 secara lokal agar menggunakan Build Komposit Gradle (includeBuild). Skrip core_settings.gradle telah dihapus, dan properti androidxMediaModulePrefix serta androidxMediaEnableMidiModule tidak lagi digunakan.

1.11.0-rc01

Gunakan versi stabil 1.11.0.

1.11.0-beta01

7 Juli 2026

Gunakan versi stabil 1.11.0.

1.11.0-alpha01

24 Juni 2026

Gunakan versi stabil 1.11.0.

Versi 1.10.0

1.10.1

12 Mei 2026

  • Library umum:
    • Memperbaiki penanganan onAudioSessionIdChanged di SimpleBasePlayer dan ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Memperbaiki kondisi race terkait pembuatan ID sesi audio yang dapat menyebabkan IllegalStateException dengan mode tunneling. (#3099).
    • Memperbaiki kemungkinan error aplikasi saat memulihkan dari error dekoder dengan pra-pemanasan perender.
    • Memperbaiki masalah saat artefak video disebabkan oleh penyediaan data inisialisasi saat menggunakan codec Dolby Vision berbasis AV1 (#3153).
  • Pemilihan trek:
    • Menyesuaikan logika pemilihan trek di VideoTrackInfo untuk menyelesaikan jenis MIME penggantian dan memindahkan preferensi skor HDR dan codec ke preferensi kualitas (#3135).
  • Ekstraktor:
    • MP3: Mengabaikan panjang data Xing jika lebih panjang dari panjang streaming yang diketahui (#3117).
    • Memperbaiki ArrayIndexOutOfBoundsException di Mp4Extractor saat FLAG_OMIT_TRACK_SAMPLE_TABLE ditetapkan dan trek tidak memiliki kotak sampel sinkronisasi (stss).
  • Audio:
    • Memperbaiki bug yang menyebabkan peristiwa audio mungkin salah dirutekan jika beberapa perender audio ditambahkan ke pemutar.
  • Video:
    • Menyesuaikan logika untuk penggunaan ulang codec pada perubahan kecepatan frame di API di bawah 30 untuk menghindari reset codec jika tidak bermanfaat (#3120).
    • Menonaktifkan solusi sinkronisasi paksa di queueSecureInputBuffer untuk API 31+. Solusi ini merupakan bottleneck buatan yang memaksa dekripsi berjalan secara serial, sehingga mencegah video kacau karena masalah framework yang ada sebelum API 31.
  • Gambar:
    • Memperbaiki masalah dalam mode scrubbing saat update gambar hanya akan diterapkan saat pengguna "berhenti melakukan scrubbing" (#2815).
  • Sesi:
    • Memperbaiki bug yang menyebabkan ForegroundServiceStartNotAllowedException tidak disebarkan di seluruh batas thread jika thread aplikasi bukan thread utama (#2499).
    • Memperbaiki bug saat COMMAND_SEEK_TO_MEDIA_ITEM tidak tersedia di MediaController saat terhubung ke sesi khusus platform yang mendukung pencarian ke item lain, tetapi tidak ada modifikasi playlist.
    • Memperbaiki masalah saat MediaController tidak dapat menyetel item media di sesi media platform yang tidak mengizinkan tindakan PREPARE_FROM.
    • Memperbaiki bug yang menyebabkan proses sendiri tidak ditandai dengan Controller.isTrusted() di API 27 atau yang lebih lama saat terhubung melalui pengontrol platform.
  • Ekstensi HLS:
    • Memperbaiki bug saat ArrayIndexOutOfBoundsException ditampilkan selama penggantian streaming jika pemilihan trek adalah subset dari trek yang tersedia (#3161).
    • Memperbaiki masalah saat segmen inisialisasi tidak diteruskan di seluruh update playlist media jika tag #EXT-X-MAP tidak diulang dalam update berikutnya (#3105).
  • Ekstensi DASH:
    • Memperbaiki error di SampleQueue saat mencari ke dalam potongan yang saat ini sedang dibatalkan.

1.10.0

26 Maret 2026

  • Library umum:
    • Mempromosikan Player.mute() dan Player.unmute() dari UnstableApi ke stabil.
    • Mempromosikan Format.pcmEncoding dan C.PcmEncoding dari UnstableApi ke stabil.
    • Menambahkan Format.primaryTrackGroupId untuk mengidentifikasi grup utama instance Format tersemat (#294).
  • ExoPlayer:
    • Menambahkan kemampuan kliping ke AdsMediaSource.
    • Menambahkan dukungan untuk penjadwalan dinamis di MediaCodecVideoRenderer agar penjadwalan pekerjaan dan siklus bangun CPU lebih selaras dengan waktu pemrosesan frame video. Anda dapat mengaktifkannya menggunakan experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs() di DefaultRenderersFactory.
    • Mengizinkan penetapan DataSource.Factory kustom di DefaultPreloadManager.Builder.
    • Mengizinkan ExoPlayer untuk di-mock tanpa Robolectric dengan memindahkan beberapa konstanta default ke ExoPlayer.Builder. Meniru antarmuka yang kompleks ini umumnya tidak dianjurkan - hanya jika penggunaannya minimal/sederhana/insidental (#2985).
      • Hal ini memerlukan pemindahan DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MS dari ExoPlayer ke ExoPlayer.Builder (tanpa penghentian penggunaan).
    • Memperbaiki bug saat ProgressiveMediaSource menyebarkan info linimasa yang sudah tidak berlaku ke pemutar, dan periode yang diantrekan dihapus secara tidak terduga (#3016).
    • Memperbaiki masalah yang menyebabkan ExoPlayer tidak meminta fokus audio yang tertunda saat pemutaran diminta selama panggilan telepon.
    • Memperbaiki bug saat transisi dari konten on-demand ke konten live dapat menyebabkan buffering ulang di akhir konten on-demand (#3052).
    • Menambahkan dukungan untuk Dolby Vision Profile 10 (#2830).
    • Memperbaiki bug saat iklan pre-roll yang tidak diinisialisasi menghasilkan ArrayIndexOutOfBoundsException (#3125).
  • CompositionPlayer:
    • Menambahkan dukungan untuk EditedMediaItem.removeVideo.
  • Transformator:
    • EditedMediaItem.Builder.setFrameRate() kini dapat menetapkan kecepatan frame output maksimum untuk video, yang sangat membantu saat meningkatkan kecepatan media dengan setSpeed().
  • Pemilihan trek:
    • Ubah tanda tangan DefaultTrackSelector.selectAllTracks untuk menyertakan array output sebagai parameter, yang diisi otomatis dengan penggantian trek.
    • Memperbaiki masalah saat trek metadata tersemat dipilih terlepas dari apakah trek utama yang sesuai dipilih atau tidak (#294).
    • Menstabilkan opsi TrackSelectionParameters untuk preferredVideoLanguages, preferredVideoLabels, preferredAudioLabels, preferredTextLabels, dan selectTextByDefault.
  • Ekstraktor:
    • MP4: Mendukung file dengan kotak uuid besar sebelum kotak lain seperti moov (#3046).
    • MP4: Menambahkan dukungan untuk trek Versatile Video Coding (VVC) dalam penampung MP4.
  • Inspektur:
    • Perubahan yang dapat menyebabkan gangguan: menghapus FrameExtractor. Pengguna sekarang harus bergantung pada modul :media3-inspector-frame baru dan mengupdate impor ke androidx.media3.inspector.frame.FrameExtractor.
    • Memperkenalkan modul baru untuk mengekstrak dan memproses frame video yang didekode.
  • Audio:
    • Mengubah library decoding yang mendasari untuk ekstensi decoder IAMF dari libiamf menjadi iamf_tools.
    • Dekode IAMF mendukung output binaural melalui dekoder (saat menggunakan ekstensi dekoder IAMF) atau melalui Android Spatializer.
    • Menghapus dukungan untuk AC4Profile22 dan profil lama lainnya dengan benar saat menilai dukungan dekoder AC-4 dalam skenario Automotive (#2609).
    • Meningkatkan logika percobaan ulang inisialisasi AudioOutput di DefaultAudioSink (#2905).
    • Mencoba mencocokkan tata letak output speaker (atau Spatializer jika berlaku) saat mendekode IAMF, baik dengan ekstensi IAMF maupun dekoder codec media, yang didukung oleh kolom dan logika baru di AudioCapabilities dan AudioCapabilitiesReceiver.
    • Memperbaiki bug yang menyebabkan pemutaran macet saat memutar playlist audio tanpa jeda dalam mode offload terkompresi.
  • Teks:
    • VobSub: Menggunakan perintah kontrol SPU START dan STOP untuk mendapatkan durasi tanda, bukan selalu menggunakan default 5 detik (#2935).
  • Metadata:
    • Meningkatkan jumlah default perender metadata menjadi empat untuk mencakup semua potensi trek metadata yang dipublikasikan oleh varian dan rendition HLS (#3043).
  • Efek:
    • Memindahkan LottieOverlay ke modul :media3-effect-lottie baru (yang juga melibatkan penggantian nama dari androidx.media3.effect.LottieOverlay menjadi androidx.media3.effect.lottie.LottieOverlay).
  • Lottie Efek:
    • Memperkenalkan modul :media3-effect-lottie baru yang menyediakan fungsi untuk menerapkan efek lottie ke frame video.
  • Ekstensi IMA:
    • Update versi IMA SDK ke 3.39.0 agar dapat mengakses API info media iklan terbaru.
    • Memperbaiki bug saat jenis MIME iklan tidak cocok dengan jenis MIME yang diberikan dalam peristiwa IMA LOADED. Perbaikan ini sekarang memetakan jenis MIME iklan menggunakan info media iklan yang disediakan oleh IMA.
    • Menambahkan setEnableCustomTabs ke ImaAdsLoader dan ImaServerSideAdInsertionMediaSource, sehingga pengguna dapat mengontrol apakah URL klik-tayang iklan diluncurkan menggunakan Tab Khusus.
    • Tambahkan ImaAdTagUriBuilder, class yang menawarkan cara alternatif untuk membuat adTagUri. Library ini berisi setPreferredLinearOrientation API. Ini adalah API dalam pengujian alfa yang akan memungkinkan Anda menetapkan orientasi pilihan untuk iklan linear. Jika Anda ingin bergabung ke grup pengujian alfa, hubungi partner akun Anda.
  • Sesi:
    • Memperbaiki bug yang menyebabkan array besar di MediaMetadata.artworkData dapat membuat aplikasi error.
    • Gunakan jenis int untuk argumen @Player.Command di antarmuka ActionFactory (#2933).
    • Menjadikan MediaSessionService dan MediaLibraryService sebagai LifecycleService, sehingga memungkinkan operasi berbasis siklus proses dilampirkan ke siklus proses layanan (#187).
    • Berhenti mendukung perintah perubahan volume perangkat dari MediaController dan MediaBrowser untuk pemutaran lokal. Aplikasi tidak boleh mengubah volume perangkat lokal, dan jika diperlukan, dapat menggunakan API AudioManager untuk tujuan ini.
    • Mendeteksi instance Intent yang tidak berlaku yang memulai layanan sebagai layanan latar depan. Hal ini mencegah ForegroundServiceDidNotStartInTimeException dilempar oleh sistem. Ini adalah perubahan yang dapat menyebabkan gangguan pada API yang tidak stabil untuk aplikasi yang mengimplementasikan MediaNotification.Provider kustom karena ada metode baru yang diperlukan.
    • Menambahkan builder untuk instance PendingIntent yang akan digunakan dengan widget layar utama (#2933).
    • Menambahkan metode statis untuk membuat instance Intent untuk widget layar utama berbasis Compose (#2933).
    • Memperbaiki bug saat transisi item media tidak dilaporkan ke pengontrol saat pemutaran beralih dari indeks item media tertentu ke indeks item media lain dengan item media yang sama untuk alasan diskontinuitas 'AUTO' dan 'SEEK' (#2997).
    • Memperbaiki masalah saat solusi penempatan tombol UI sistem berdampak negatif pada platform UI lain seperti Android Auto atau produsen yang tidak memerlukan solusi (#3041).
    • Memperbaiki masalah saat akses ke langganan tidak disinkronkan (#3056).
    • Solusi bug SysUI di API 29 saat poster sesi media dalam ukuran tertentu dapat membuat SysUI error dan memaksa perangkat untuk memulai ulang (#3118).
    • Memperbaiki penskalaan ikon poster notifikasi di Android Q (#3084).
  • UI:
    • Tambahkan Composable PlaybackSpeedControl ke media3-ui-compose untuk menampilkan dan mengubah kecepatan pemutaran.
    • Tambahkan Composable PlaybackSpeedToggleButton ke media3-ui-compose-material3 untuk mengontrol kecepatan pemutaran.
    • Menambahkan ProgressSlider Composable ke media3-ui-compose-material3 untuk menampilkan progres pemutar dan melakukan pencarian menggunakan penyeretan dan pengetukan (#2288).
    • Hindari buffer di luar layar yang besar saat menganimasikan PlayerControlView.
    • Menambahkan Composable Player ke media3-ui-compose-material3 yang menggabungkan ContentFrame dengan kontrol yang dapat disesuaikan yang sejajar dengan bagian atas, tengah, dan bawah.
    • Sembunyikan posisi pemutaran dari layanan aksesibilitas untuk mencegah pembaruan pengumuman berkelanjutan saat PlayerControlView terlihat.
  • Ekstensi HLS:
    • Mendukung X-PLAYOUT-LIMIT dengan interstisial HLS (#2484).
    • Mendukung atribut QUERYPARAM dengan #EXT-X-DEFINE (#1854).
    • Mengoptimalkan penguraian playlist HLS dengan meng-cache pencocok ekspresi reguler (#3008).
    • Mengekspos trek metadata ID3 (EMSG) dalam rendition audio (#3043).
    • Mengizinkan penggantian lokasi saat terjadi error pemuatan, jika streaming redundan dari lokasi yang berbeda tersedia (#1988).
    • Memperbaiki perilaku X-SNAP untuk interstisial HLS agar dapat menghitung posisi mulai dan melanjutkan dengan benar (#3013).
  • Ekstensi DASH:
    • Memperbaiki masalah saat trek dengan waktu mulai segmen yang tidak selaras menyebabkan penundaan atau sampel yang terlewat di awal pemutaran (#3057).
    • Memperbaiki bug saat stempel waktu metadata EMSG v0 inband tidak ditetapkan dengan benar (#3024).
  • Ekstensi RTSP:
    • Memperbaiki regresi dalam streaming H.264 dan H.265 yang salah mengurai sampel unit akses yang sama yang mencakup beberapa paket RTP. Hal ini menyebabkan artefak visual dan kerusakan pada video (#3121).
  • Ekstensi decoder (FFmpeg, VP9, AV1, dll.):
    • Menambahkan dukungan pengelola UI MPEG-H ke ekstensi dekoder MPEG-H (#3066).
  • Ektensi Cast:
    • Menambahkan metode RemoteCastPlayer.Builder#setTrackSelector yang memungkinkan penerapan pemilihan trek untuk pemutaran Cast.
  • Menghapus simbol yang tidak digunakan lagi:
    • Menghapus ExperimentalFrameExtractor. Menggunakan androidx.media3.inspector.frame.FrameExtractor sebagai gantinya.
    • Menghapus ChannelMixingMatrix.create(). Menggunakan ChannelMixingMatrix.createForConstantGain() sebagai gantinya.
    • Menghapus androidx.media3.extractor.metadata.flac.VorbisComment. Menggunakan androidx.media3.extractor.metadata.vorbis.VorbisComment sebagai gantinya.
    • Hapus MediaSource.prepareSource(MediaSourceCaller, TransferListener). Sebagai gantinya, gunakan MediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId).

1.10.0-rc03

25 Maret 2025

Gunakan versi stabil 1.10.0.

1.10.0-rc02

16 Maret 2026

Gunakan versi stabil 1.10.0.

1.10.0-rc01

10 Maret 2026

Gunakan versi stabil 1.10.0.

1.10.0-beta01

25 Februari 2026

Gunakan versi stabil 1.10.0.

1.10.0-alpha01

6 Februari 2026

Gunakan versi stabil 1.10.0.

Versi 1.9.0

1.9.4

16 Mei 2026

Versi 1.9.4 berisi commit berikut.

  • Efek:
    • Tetapkan GL_DRAW_BUFFER dan GL_READ_BUFFER secara eksplisit saat beralih dari konteks tanpa platform.

1.9.3

16 Maret 2026

Versi 1.9.3 berisi commit berikut.

  • Audio:
    • Memperbaiki bug yang menyebabkan pemutaran macet saat memutar playlist audio tanpa jeda dalam mode offload terkompresi.

1.9.2

6 Februari 2026

Versi 1.9.2 berisi commit berikut.

  • ExoPlayer:
    • Memperbaiki bug saat ProgressiveMediaSource menyebarkan info linimasa yang sudah tidak berlaku ke pemutar dan periode yang diantrekan dihapus secara tidak terduga (#3016).
  • Sesi:
    • Memperbaiki masalah saat solusi penempatan tombol UI sistem berdampak negatif pada platform UI lain seperti Android Auto atau produsen yang tidak memerlukan solusi (#3041).
  • Ektensi Cast:
    • Memperbaiki bug yang menyebabkan transfer dari Transmisi ke pemutaran lokal rusak.

1.9.1

26 Januari 2026

Versi 1.9.1 berisi commit ini.

  • Library Umum:
    • Mendukung string tanggal-waktu dengan hanya jam dalam selisih zona waktu (#2929).
  • ExoPlayer:
    • Izinkan penjadwalan dinamis untuk memperlambat interval doSomeWork hanya setelah audio mulai mendukung sinkronisasi A/V yang lebih lancar di awal pemutaran.
    • Memperbaiki bug di DefaultLoadErrorHandlingPolicy yang menyebabkan FileNotFoundException dan jenis pengecualian serupa dicoba ulang beberapa kali.
    • Memperbaiki bug dengan penjadwalan dinamis, yaitu waktu yang dihitung untuk doSomeWork berikutnya secara keliru dikurangi dengan waktu yang berlalu dari iterasi doSomeWork saat ini. Mengatasi hal ini diharapkan dapat memperpanjang waktu tidak ada aktivitas CPU dan menghemat daya.
    • Memperbaiki masalah saat beberapa pemutaran file Dolby Vision gagal saat mencoba menggunakan codec AVC atau HEVC pengganti.
    • Memperbaiki bug saat pemuatan berlanjut setelah pemutaran berakhir saat menghapus item yang sedang diputar dari playlist (#2873).
    • Menghindari kebocoran instance MediaItem saat berulang kali menggunakan ExoPlayer.replaceMediaItem pada item yang sama (#2993).
    • Mencegah potensi ANR yang disebabkan oleh rilis penguncian layar saat aktif darurat (#2979).
  • Ekstraktor:
    • MP3: Mengurai data ReplayGain LAME (#2840).
  • Audio:
    • Menghapus dukungan untuk AC4Profile22 dan profil lama lainnya dengan benar saat menilai dukungan dekoder AC-4 dalam skenario Automotive (#2609).
  • Video:
    • Menghapus codec video di perangkat di bawah API 30 saat kecepatan frame konten berubah untuk menghindari pemutaran yang tersendat-sendat (#2941).
  • Teks:
    • VobSub: Memperbaiki beberapa subtitel yang hilang dengan menangani SPU yang hanya berisi satu urutan kontrol, atau memiliki info penting yang dibagi di beberapa urutan kontrol (#2935).
  • Ekstensi IMA:
    • Perbaikan bug: Memperbaiki masalah saat jenis MIME iklan tidak cocok dengan jenis MIME yang disediakan dalam peristiwa IMA LOADED. Perbaikan ini sekarang memetakan jenis MIME iklan menggunakan indeks pod iklan dan posisi iklan.
    • Tambahkan pemeriksaan null sebelum mengakses hasil getAdsManager() dan AdEvent.getAd().
  • Sesi:
    • Memperbaiki bug saat menghentikan MediaController yang terhubung ke sesi platform menyebabkan aplikasi error jika penghentian terjadi selama pemutaran iklan (#2948).
    • Menambahkan verifikasi tambahan pada instance extras Bundle di berbagai class untuk melindungi dari instance Bundle yang salah format yang dikirim dari proses lain.
    • Memperbaiki masalah saat perintah yang tidak ada untuk COMMAND_SEEK_NEXT atau COMMAND_SEEK_BACK dapat menyebabkan kesenjangan dalam notifikasi media sistem (#2976).
    • Memindahkan penskalaan bitmap untuk ikon notifikasi dari thread utama (#2829).
    • Memperbaiki bug yang menyebabkan penulis, penulis lirik, dan komposer tidak digunakan sebagai pengganti saat mengonversi dari MediaMetadataCompat dan MediaDescriptionCompat lama (#3018).
  • Download:
    • Memperbaiki potensi loop tak terbatas saat PriorityTooLowException ditangani oleh SegmentDownloader (untuk DASH, HLS, dan SmoothStreaming). Penggantian kustom SegmentDownloader menggunakan metode execute yang dilindungi harus menyediakan tugasnya yang digabungkan dalam Supplier agar dapat dibuat ulang (#2931).
  • Ekstensi HLS:
    • Teruskan dokumen JSON daftar aset mentah ke callback Listener.onAssetListLoadCompleted. Ini adalah perubahan yang dapat menyebabkan gangguan pada API yang tidak stabil yang mengharuskan aplikasi yang mengimplementasikan callback ini untuk menambahkan argumen tambahan jenis JSONObject (#2950).
  • Ekstensi RTSP:
    • Menangani Paket RTP dengan stempel waktu yang digabungkan dengan benar (#2930).
  • Ekstensi decoder (FFmpeg, VP9, AV1, dll.):
    • Memperbaiki potensi NullPointerException yang dapat terjadi saat melakukan pencarian sebelum memproses frame video pertama (#2965).
  • Ektensi Cast:
    • Memperbaiki bug yang mencegah linimasa RemoteCastPlayer diperbarui dengan benar saat mengganti playlist.

1.9.0

17 Desember 2025

  • Library Umum:
    • Mengupdate minSdk ke 23 sesuai dengan library AndroidX lainnya.
    • Menambahkan PlayerTransferState, yang memfasilitasi transfer status pemutaran di seluruh instance Player.
    • Tambahkan metode void mute() dan void unmute() ke Player yang mempertahankan dan akibatnya memulihkan volume Player sebelum dan setelah menyetelnya ke nol.
    • Memublikasikan class utilitas WakeLockManager, WifiLockManager, AudioFocusManager, AudioBecomingNoisyManager, dan StuckPlayerDetector yang sebelumnya digunakan oleh ExoPlayer secara internal untuk memungkinkan penggunaan kembali bagi pemutar lain (#1893).
    • Memperbaiki penanganan pemroses ForwardingPlayer saat pemutar delegasi yang mendasarinya menggunakan kesetaraan referensi untuk membandingkan instance pemroses (#2675).
    • Tambahkan fungsi ekstensi penangguhan Player.listenTo di library media3-common-ktx yang menentukan Player.Events tertentu yang harus ditindaklanjuti.
    • Memperbaiki error di BasePlayer.getBufferedPercentage yang disebabkan oleh integer overflow saat posisi buffering yang dilaporkan jauh lebih besar daripada durasi yang dilaporkan (#2750).
    • Memperbaiki deteksi otomatis jenis trek TrackGroup dengan tidak mengabaikan jenis MIME sampel kustom dan beralih menggunakan jenis trek yang berpotensi salah dari jenis MIME penampung (#2860).
  • ExoPlayer:
    • Tambahkan deteksi pemutar macet yang memicu error pemutar StuckPlayerException jika pemutar tampak macet. Hal ini terjadi dalam kasus berikut, dengan setiap waktu tunggu default dapat dikonfigurasi di ExoPlayer.Builder jika diperlukan:
      • Setelah 10 menit STATE_BUFFERING saat mencoba memutar dan tidak ada progres buffering.
      • Setelah 10 detik STATE_READY saat mencoba memutar dan tidak ada progres pemutaran.
      • Setelah 1 menit STATE_READY melampaui durasi yang dinyatakan tanpa mencapai akhir item.
      • Setelah 10 menit dengan alasan penekanan pemutaran saat mencoba memutar.
    • Aktifkan penanganan penguncian layar saat aktif secara default untuk memperbaiki masalah buffering selama pemutaran di latar belakang. Ini sama dengan menetapkan ExoPlayer.Builder.setWakeMode ke C.WAKE_MODE_LOCAL.
    • Tambahkan logika pemrosesan untuk otomatis memperbarui ID perangkat virtual saat perubahan dilaporkan ke Context yang awalnya diteruskan ke ExoPlayer.Builder.
    • Tambahkan ExoPlayer.setVirtualDeviceId untuk memperbarui ID perangkat virtual secara manual yang diperoleh dari Context yang diteruskan ke ExoPlayer.Builder.
    • Pastikan perender tidak menggunakan data dari item playlist berikutnya lebih dari 10 detik sebelum akhir item saat ini.
    • Menambahkan setSeekBackIncrementMs, setSeekForwardIncrementMs, dan setMaxSeekToPreviousPositionMs ke ExoPlayer untuk memperbarui setelan ini setelah konstruksi (#2736).
    • Tambahkan fungsi pra-cache di DefaultPreloadManager. Aplikasi kini dapat menampilkan DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs) atau DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs) melalui TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData) untuk menunjukkan bahwa item media perlu di-pra-cache.
    • Menggunakan fungsi pra-cache DefaultPreloadManager di aplikasi demo video pendek.
    • Tambahkan penyetel DefaultLoadControl.Builder untuk pemutaran lokal dan sesuaikan nilai default DefaultLoadControl agar berfungsi dengan baik di berbagai file lokal.
    • Memperbaiki bug yang menyebabkan pemutar tetap berada di STATE_READY atau STATE_BUFFERING saat menyetel playlist kosong.
    • Meningkatkan API pengelola pramuat:
      • Tambahkan addMediaItems(List<MediaItem>, List<T>) dan addMediaSources(List<MediaSource>, List<T>) yang menambahkan item media atau sumber media dalam batch, dan otomatis memanggil invalidate() setelahnya.
      • Tambahkan removeMediaItems((List<MediaItem>) dan removeMediaSources(List<MediaSource>) yang menghapus item media atau sumber media dalam batch, dan pastikan pengelola pramuat tidak mulai melakukan pramuat atau melanjutkan pramuat salah satunya setelah penghapusan.
      • Izinkan DefaultPreloadManager.setCurrentPlayingIndex(int) untuk membatalkan dirinya sendiri secara otomatis. Aplikasi tidak perlu lagi memanggil invalidate() secara eksplisit setelah mengupdate indeks pemutaran saat ini.
    • Menambahkan kemampuan untuk melewati reset keyframe untuk pencarian maju dalam grup gambar yang sama saat dalam mode scrubbing.
    • Tambahkan DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) untuk aplikasi guna menetapkan nilai byte buffering target bagi pemutar dengan playerName yang ditentukan. DefaultLoadControl kini dapat membuat keputusan untuk setiap pemutar secara terpisah berdasarkan byte yang dialokasikan dan byte buffer targetnya sendiri.
    • Tambahkan SkipInfo ke AdPlaybackState.AdGroup untuk membawa informasi lewati untuk setiap iklan di grup iklan.
    • Memperbaiki bug saat memanggil removeMediaItems(List) selama pemutaran post-roll menyebabkan error (#2746).
    • Memperbaiki beberapa gangguan dalam pemutaran playlist saat frame salah disetel sebagai sampel terakhir dan dirender.
    • Mengaktifkan jalur percobaan ulang jika pemutar gagal membuat ID sesi audio (#2382, #2678).
    • Menambahkan dukungan untuk mengontrol total byte buffer untuk sumber di DefaultPreloadManager guna menghindari total byte buffer untuk pramuat bertambah secara arbitrer. Untuk menggunakan logika kontrol default, Aplikasi dapat menetapkan byte buffering target untuk pramuat melalui DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) untuk playerName PlayerId.Preload.name ("pramuat"), dan memasukkan DefaultLoadControl yang dibuat melalui DefaultPreloadManager.Builder.setLoadControl(LoadControl).
    • Menambahkan cloneAndSet(int, int) ke ShuffleOrder dengan implementasi default (#2834).
    • Menambahkan offset melanjutkan konten saat melewati pemutaran iklan setelah penyesuaian pencarian atau transisi otomatis (#2484).
    • Menambahkan API untuk menetapkan dan mengamati parameter codec untuk trek audio dan video. Fitur ini diimplementasikan untuk perender berbasis MediaCodec dan memerlukan API 29+.
      • Gunakan ExoPlayer.setAudioCodecParameters() dan ExoPlayer.setVideoCodecParameters() untuk menerapkan parameter.
      • Gunakan ExoPlayer.addAudioCodecParametersChangeListener() dan ExoPlayer.addVideoCodecParametersChangeListener() untuk memproses perubahan. Mengamati kunci khusus vendor memerlukan API 31+.
    • Memperbaiki IllegalStateException yang disebabkan oleh penetapan sumber media kosong setelah mencari posisi bukan nol, lalu menyiapkan pemutar dengan sumber media yang tidak kosong.
    • Memperbaiki bug saat mencari item media lain saat dalam mode scrubbing dapat menyebabkan IllegalStateException.
    • Memperbaiki potensi NullPointerException di DefaultPlaybackSessionManager (#2885).
    • Mengaktifkan peningkatan performa pencarian untuk video yang memenuhi syarat.
    • Mengaktifkan kembali penggunaan dekripsi asinkron di MediaCodec pada API 36+ setelah masalah waktu tunggu dengan API platform ini diperbaiki (#1641).
    • Mengubah nilai default MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs menjadi 15 md dan mengaktifkan penghapusan frame video yang lebih efisien sebelum decoding untuk video yang memenuhi syarat.
    • Menambahkan batas memori maksimum ke penghitungan memori otomatis di DefaultLoadControl. Hal ini hanya akan berlaku jika jumlah trek yang dipilih berlebihan (#2860).
    • Memperbaiki bug saat, jika diputar dalam playlist atau mode ulang, pencarian dalam mode scrub di dekat akhir dapat menyebabkan pencarian ke item media berikutnya.
  • CompositionPlayer:
    • Publikasikan CompositionPlayer di bawah anotasi @ExperimentalApi baru untuk menunjukkan bahwa fitur tersebut tersedia untuk eksperimen, tetapi masih dalam pengembangan. Beberapa API kemungkinan akan berubah secara signifikan dalam rilis mendatang, dan ada masalah umum serta batasan pada beberapa kasus penggunaan (beberapa tidak terdokumentasi).
    • Menambahkan dukungan untuk COMMAND_SET_AUDIO_ATTRIBUTES dan penanganan fokus audio di CompositionPlayer.
    • Menambahkan dukungan untuk perubahan kecepatan dalam urutan sekunder di CompositionPlayer.
    • Menambahkan dukungan untuk EditedMediaItem.removeVideo.
  • Transformator:
    • Gunakan InAppMp4Muxer sebagai muxer default.
    • Menambahkan EditedMediaItem.Builder#setSpeed() dan menghentikan penggunaan Effects#createExperimentalSpeedChangingEffects().
    • Ganti forceAudioTrack dan forceVideoTrack dengan trackTypes di EditedMediaItemSequence.
  • Pemilihan Trek:
    • Tambahkan TrackSelectionParameters.selectTextByDefault untuk memilih pilihan trek teks apa pun tanpa menentukan preferensi lain yang lebih spesifik.
    • Menambahkan preferredVideoLabels, preferredAudioLabels, dan preferredTextLabels di TrackSelectionParameters untuk menentukan preferensi trek dengan label tertentu, misalnya yang dibaca dari tag HLS NAME (#1666).
  • Ekstraktor:
    • FLAC: Memperketat deteksi header untuk mengurangi kemungkinan menemukan header palsu dalam data FLAC yang dienkode, sehingga menyebabkan error decoding (#558).
    • MP3: Mengizinkan jeda di antara (dan sebelum) tag ID3 di awal file MP3 (#811, #5718).
    • MP3: Meningkatkan batas sniffing menjadi 128 kB agar sesuai dengan batas penelusuran yang ada untuk byte sinkronisasi (#2713).
    • MP3: Mengubah FLAG_ENABLE_INDEX_SEEKING agar lebih memilih mencari informasi dari header metadata (seperti Xing dan VBRI) jika tersedia, dan beralih ke pencarian berbasis indeks jika tidak ada informasi pencarian lain. Hal ini meningkatkan performa untuk file dengan metadata pencarian (#2839).
    • MP3: Mengubah Mp3Extractor agar secara default menggunakan asumsi kecepatan bit konstan (CBR) saat tidak ada metadata pencarian (misalnya, Xing, VBRI) yang ditemukan, meskipun FLAG_ENABLE_INDEX_SEEKING ditetapkan. Hal ini didasarkan pada histori spesifikasi MP3, di mana CBR adalah standar dan VBR memerlukan header eksplisit. Hal ini meningkatkan kemampuan pencarian langsung untuk file tanpa metadata dengan mengorbankan potensi akurasi untuk file VBR yang tidak memiliki header. Pencarian indeks kini digunakan sebagai penggantian jika asumsi CBR tidak dapat dicari (misalnya, untuk streaming dengan panjang yang tidak diketahui) (#2848).
    • MP4: Menghilangkan ambiguitas antara jenis MIME audio/mpeg (MP3), audio/mpeg-L1, dan audio/mpeg-L2 dengan mengintip nilai lapisan sampel pertama sebelum memunculkan format trek dari ekstraktor (#2683).
    • MP4: Meningkatkan efisiensi sniffing file yang sangat besar dengan mengasumsikan bahwa kotak stbl yang lebih besar dari 1 MB menyiratkan bahwa file tersebut tidak boleh terfragmentasi (#2650).
    • MP4: Menambahkan dukungan untuk metadata ©mvn (nama gerakan) dan ©mvi (indeks gerakan), yang kini ditampilkan sebagai objek TextInformationFrame di Format.metadata dengan ID MVNM dan MVIN (#2754).
    • MP4: Mengabaikan trek yang tidak memiliki kotak stsd (bukan gagal mengurai seluruh file).
    • Matroska: Menambahkan dukungan untuk deteksi DTS-HD (#6225).
    • Memperbaiki masalah di MatroskaExtractor yang menyebabkan pencarian tidak akurat untuk file dengan beberapa trek. Titik tanda kini dikaitkan dengan benar ke trek masing-masing, sehingga menghasilkan pencarian yang lebih akurat.
    • MPEG-TS: Memperbaiki IllegalArgumentException dari ReorderingBufferQueue yang disebabkan oleh paket PES tanpa stempel waktu (#2764).
    • Menambahkan dukungan untuk mengekstrak Foto Motion HEIC. HeifExtractor kini dapat mengurai file HEIC yang berisi trek video dan audio tersemat.
  • Inspektur:
    • Memperkenalkan modul :media3-inspector baru yang berfungsi sebagai tempat khusus untuk utilitas pemeriksaan media. Modul ini sekarang menampung androidx.media3.inspector.MetadataRetriever baru, yang akan menyediakan API terpadu untuk ekstraksi metadata dan frame. androidx.media3.exoplayer.MetadataRetriever yang ada kini tidak digunakan lagi dan digantikan dengan versi baru ini.
    • Memperkenalkan androidx.media3.inspector.FrameExtractor, API publik baru untuk ekstraksi frame. Class AutoCloseable ini menyediakan cara untuk mengekstrak frame dengan dukungan untuk video HDR, efek video, dan pemilihan dekoder kustom. Objek ini harus dibuat melalui Builder-nya untuk MediaItem tertentu.
    • FrameExtractor: Menambahkan getThumbnail() untuk mengekstrak frame thumbnail representatif dari file media tanpa memerlukan stempel waktu tertentu.
    • Tambahkan androidx.media3.inspector.MediaExtractorCompat, pengganti langsung untuk android.media.MediaExtractor platform yang menyediakan cara untuk mengekstrak sampel media mentah yang dienkode dari file media. androidx.media3.exoplayer.MediaExtractorCompat yang ada kini tidak digunakan lagi dan digantikan dengan class baru ini.
  • Audio:
    • Membuat instance AudioProcessor mengetahui pencarian.
    • Mengizinkan injeksi antarmuka AudioOutputProvider baru ke DefaultAudioSink.Builder untuk mendukung jalur output audio kustom. Defaultnya adalah AudioTrackAudioOutputProvider.
    • Menangani pencarian di GainProcessor.
    • Memanfaatkan kemampuan level dan profil dekoder AC-4 dalam penilaian dukungan format trek (#2580).
    • Menghindari potensi penundaan yang disebabkan oleh penanganan callback perubahan pemilihan rute di awal pemutaran (#2646).
    • Mengizinkan penggunaan ulang codec untuk format EAC3, EAC3-JOC, dan AC-4 (#1346).
    • Menambahkan dukungan untuk sampel PCM float di Sonic.
    • Menambahkan dukungan untuk sampel PCM 16 bit di ToFloatPcmAudioProcessor.
  • Video:
    • Menonaktifkan penggunaan kembali codec untuk konten Dolby-Vision dengan profil yang berbeda.
    • Mengaktifkan kembali solusi untuk poin performa yang salah dilaporkan untuk codec aman (#2856).
  • Teks:
    • Memperbaiki penguraian subtitel CEA-6/708 dalam konten Dolby Vision (#2775).
  • Gambar:
    • Memperbaiki masalah ScrubbingMode saat pemutar macet saat melakukan scrubbing trek thumbnail DASH (#2815).
  • DRM:
    • Mengubah jenis nilai yang ditampilkan dari metode MediaDrmCallback dari byte[] menjadi jenis MediaDrmCallback.Response baru, untuk memungkinkan menampilkan informasi opsional tambahan. Ini adalah perubahan yang dapat menyebabkan gangguan pada sumber, tetapi gangguan tersebut dapat dengan mudah diselesaikan dengan menggabungkan nilai yang ditampilkan byte[] sebelumnya dengan new Response sebelum ditampilkan.
    • Menambahkan info permintaan kunci seperti URL dan latensi ke AnalyticsListener.onDrmKeysLoaded (#1001).
    • Pindahkan data permintaan penyediaan dari parameter URL ke isi POST.
  • Efek:
    • Menambahkan Presentation.copyWithUnsetSideRoundedTo untuk membulatkan sisi output yang tidak ditetapkan saat Presentation dibuat dengan panjang satu sisi.
  • Muxer:
    • Menambahkan MediaMuxerCompat, pengganti langsung untuk framework MediaMuxer.
    • Menambahkan MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo() untuk mengizinkan pembuatan Foto Motion.
    • Tambahkan WebmMuxer untuk memungkinkan muxing streaming media OPUS, VORBIS, VP8, dan VP9 ke dalam format file webm.
  • Ekstensi IMA:
    • Penghapusan aturan proguard kustom, sehingga aplikasi dapat menggunakan aturan yang dirilis di arsip Android IMA.
    • Menambahkan ImaServerSideAdInsertionUriBuilder.setNetworkCode, API baru untuk menetapkan kode jaringan Google Ad Manager untuk IMA SDK guna menangani ID iklan seperti yang ditentukan dalam setelan Google Ad Manager. Kode jaringan bersifat opsional, tetapi direkomendasikan untuk permintaan streaming Layanan lengkap. Untuk menemukan kode jaringan, lihat artikel ini.
    • Menambahkan nomor versi dependensi IMA menjadi 3.37.0 yang memerlukan pengaktifan desugaring library inti. Fitur ini juga harus diaktifkan oleh aplikasi dependen. Lihat catatan konfigurasi IMA. * Mendukung opsi UI kustom IMA DAI di builder URI SSAI. Opsi UI kustom untuk penyisipan iklan sisi server mencakup dukungan rendering "Dapat dilewati" dan "Tentang Iklan Ini". Fitur ini saat ini tersedia untuk penayang tertentu yang masuk dalam daftar yang diizinkan. Perubahan ini juga mengupgrade versi IMA SDK ke 3.38.0 (catatan rilis) untuk mengakses API opsi UI kustom.
    • Memperbaiki masalah saat error persiapan konten untuk konten setelah iklan akan dilaporkan secara keliru sebagai error pemutaran iklan (#2656).
  • Sesi:
    • Menambahkan parameter baru ke MediaSession.Callback.onPlaybackResumption untuk menunjukkan apakah panggilan terjadi hanya untuk mengumpulkan informasi atau untuk memulai pemutaran (#1764).
    • Mengupdate MediaSession.ControllerInfo.isTrusted untuk juga mendeklarasikan pengontrol dari aplikasi sendiri sebagai tepercaya (#2542).
    • Menambahkan MediaSessionService.triggerNotificationUpdate untuk memicu update notifikasi secara manual (#1833).
    • Menambahkan ProgressListener ke metode perintah kustom.
    • Ubah nilai default untuk MediaLibrarySession.Builder.setLibraryErrorReplicationMode menjadi non- fatal.
    • Menambahkan parameter Context ke MediaButtonReceiver.onForegroundServiceStartNotAllowedException (#2625).
    • Membaca ID kontrol volume dari platform PlaybackInfo, bukan mengambilnya melalui binder. Hal ini memastikan bahwa jenis pemutaran dan ID kontrol volume dibaca secara atomik dan cocok satu sama lain.
    • Memperbaiki bug saat peristiwa tombol ACTION_UP difilter sebelum diteruskan ke callback untuk penanganan kustom. Hal ini memberikan paritas dengan apa yang dilakukan media1 dan platform (#2637).
    • Memperbaiki bug yang menyebabkan getCurrentTimeline() dipanggil oleh PlayerWrapper meskipun perintah tidak tersedia (#2665).
    • Memperbaiki bug saat pesan tertinggal dalam antrean pesan looper utama yang menyebabkan kebocoran memori setelah layanan dihentikan (#2692).
    • Saat terhubung ke aplikasi sesi lama dengan MediaBrowser, perintah kustom hanya dikirim ke sesi jika tindakan kustom diiklankan sebagai tindakan kustom di PlaybackStateCompat sesi lama. Semua tindakan kustom lainnya dikirim ke layanan.
    • Mengimplementasikan onAudioSessionIdChanged untuk memberi tahu pengontrol media saat ID sesi audio ditetapkan oleh sesi (#244).
    • Memperbaiki bug yang menyebabkan KEYCODE_HEADSETHOOK tidak memulai pemutar saat peristiwa tombol media Intent tiba di onStartCommand(). Masalah ini diperbaiki dengan menangani 'KEYCODE_HEADSETHOOK' seperti KEYCODE_MEDIA_PLAY_PAUSE (#2816).
    • Memperbaiki bug yang menyebabkan ukuran Surface tidak dikomunikasikan antara sesi dan pengontrol, sehingga gagal menerapkan efek video dalam demo-session. Jika Anda menggunakan pengontrol, hal ini mungkin merupakan perubahan yang dapat menyebabkan gangguan jika pemutar Anda tidak dapat menangani panggilan setVideoSurfaceHolder.
    • Memperbaiki penyebaran nilai metadata CharSequence non-String seperti string bergaya span (#2853).
    • Tambahkan CommandButton.executeAction agar pengontrol dapat lebih mudah memicu tindakan yang diinginkan. Juga memungkinkan untuk menentukan parameter untuk beberapa perintah pemutar dan sesi guna menentukan tindakan yang akan dipicu.
    • Tambahkan kompatibilitas mundur untuk instance CommandButton menggunakan Player.Command atau SessionCommand non-kustom untuk menentukan tindakannya. Hal ini sekarang direpresentasikan dengan benar dalam sesi media platform, misalnya untuk UI Sistem atau Android Auto.
    • Memperbaiki masalah saat Bitmap yang sama dikompresi beberapa kali saat menghubungkan MediaController ke sesi media platform.
  • UI:
    • Tambahkan class ProgressStateWithTickInterval dan Composable rememberProgressStateWithTickInterval yang sesuai ke modul media3-ui-compose. Holder status ini digunakan di demo-compose untuk menampilkan posisi dan durasi saat ini dalam bentuk teks.
    • Tambahkan MuteButtonState ke ui-compose yang menangani penonaktifan volume Player. Holder status ini digunakan di demo-compose untuk menampilkan tombol aktifkan/nonaktifkan audio.
    • Tambahkan class ProgressStateWithTickCount dan Composable rememberProgressStateWithTickCount yang sesuai ke modul media3-ui-compose. Holder status ini digunakan di demo-compose untuk menampilkan progres sebagai status progres horizontal hanya baca.
    • Tambahkan Composable ContentFrame ke media3-ui-compose yang menggabungkan pengelolaan PlayerSurface dengan pengubahan ukuran rasio aspek dan penutupan dengan shutter.
    • Mengatasi bug platform API 34 umum yang menyebabkan video direntangkan/dipangkas saat menggunakan SurfaceView di dalam Compose AndroidView sehingga memengaruhi Composable ContentFrame dan PlayerSurface dengan SURFACE_TYPE_SURFACE_VIEW (#1237, #2811).
    • Buat modul media3-ui-compose-material3 baru dan tambahkan Composable bertema Material3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton) ke dalamnya.
    • Tambahkan composable TimeText ke media3-ui-compose-material3 untuk menampilkan progres pemain dalam bentuk tekstual. Komponen ini dapat dikonfigurasi untuk menampilkan posisi, durasi, atau waktu yang tersisa saat ini.
    • Menambahkan dukungan untuk menempatkan tombol rute media di PlayerView.
    • Menggunakan BidiFormatter untuk menampilkan tanda baca dengan benar dalam subtitel teks RTL (#11214).
  • Ekstensi HLS:
    • Mengurai atribut lewati interstisial HLS.
    • Petakan atribut kontrol lewati dari playlist HLS dan dokumen daftar aset ke AdPlaybackState untuk akses publik.
    • Memperbaiki bug saat waktu mulai playlist dihapus ketika tag EXT-X-PROGRAM-START-DATE yang menentukan tanggal mulai dihapus dari playlist (#2760).
    • Menggunakan penelusuran biner untuk menemukan indeks segmen dari posisi tertentu dalam playlist (#2826).
    • Tambahkan HlsInterstitialsAdsLoader.skipCurrentAd() dan skipCurrentAdGroup() serta metode yang sesuai untuk melewati iklan dan grup iklan menurut indeks.
    • Menambahkan HlsInterstitialsAdsLoader.Listener.onAdStarted untuk melaporkan awal periode iklan (#2859).
    • Menerima spasi sebagai pemisah tanggal/waktu dalam string tanggal-waktu ISO 8601.
    • Menangani pengambilan potongan berikutnya dengan benar untuk HlsMediaPlaylist tanpa segmen (#2821).
    • Gunakan posisi mulai default untuk pre-roll dengan live stream.
  • Ekstensi DASH:
    • Memperbaiki UnsupportedOperationException saat memutar streaming DASH dengan manifes URI data: non-hierarkis (#2688).
    • Mereset LiveConfiguration ke nilai yang diberikan oleh MediaItem dari DashMediaSource saat dirilis dan saat item media diperbarui oleh pengguna (#2606).
    • Menghindari error yang disebabkan oleh update manifes tidak valid yang tidak dilaporkan sebagai error pemutar (#2805).
  • Ekstensi RTSP:
    • Menangani error paket RTP yang hilang saat memproses unit NAL yang terfragmentasi untuk H264 dan H265 (#2613).
  • Ekstensi decoder (FFmpeg, VP9, AV1, dll.):
    • Ekstensi AV1: Decoder software AV1 kini menggunakan library dav1d berperforma tinggi, menggantikan implementasi libgav1 sebelumnya untuk meningkatkan kecepatan decoding.
    • Ekstensi FFmpeg: Memperbaiki masalah yang mencegah beberapa file FLAC diputar dengan memastikan blok STREAMINFO diuraikan dengan benar dan diteruskan ke dekoder (#2887).
  • Ektensi Cast:
    • Tambahkan CastPlayer.Builder, yang memungkinkan CastPlayer melakukan pemutaran lokal dan Cast. Untuk mempertahankan perilaku CastPlayer lama yang hanya mendukung pemutaran Cast, Anda dapat menggunakan RemoteCastPlayer. Konstruktor CastPlayer yang sudah ada mempertahankan perilaku lamanya, tetapi tidak digunakan lagi dan digantikan dengan builder CastPlayer atau RemoteCastPlayer.
    • Berhenti menerapkan jenis MIME non-null di DefaultMediaItemConverter.
    • Gunakan MediaItem.mediaMetadata.mediaType untuk menyimpulkan MEDIA_TYPE Cast yang akan digunakan di DefaultCastOptionsProvider#toMediaQueueItem, jika tersedia.
    • Aktifkan transfer jarak jauh ke lokal di DefaultCastOptionsProvider.
    • Menambahkan dukungan untuk Cast dalam demo Sesi.
    • Menambahkan dukungan untuk menampilkan tombol rute media di UI Composable.
    • Menambahkan dukungan untuk menampilkan tombol rute media di menu panel tindakan.
    • Menambahkan dukungan untuk menampilkan tombol rute media sebagai UI View.
  • Utilitas Pengujian:
    • Tambahkan perbedaan waktu maksimum untuk perilaku maju otomatis FakeClock. Secara default, nilainya adalah 1 detik, tetapi dapat dikonfigurasi melalui FakeClock.Builder.
    • Menambahkan perbedaan waktu maksimum antara pesan untuk RobolectricUtil.runMainLooperUntil (dan runLooperUntil). Defaultnya adalah 1 detik, tetapi dapat dikonfigurasi melalui overload baru metode ini.
    • Memindahkan CapturingRenderersFactory dari test-utils ke test-utils-robolectric.
  • Menghapus simbol yang tidak digunakan lagi:
    • Menghapus konstruktor DefaultPreloadManager yang tidak digunakan lagi. Sebagai gantinya, gunakan DefaultPreloadManager.Builder.
    • Menghapus konstruktor EditedMediaItemSequence yang tidak digunakan lagi. Sebagai gantinya, gunakan EditedMediaItemSequence.Builder.
    • Menghapus BitmapFactoryImageDecoder.BitmapDecoder. Sebagai gantinya, gunakan ExternallyLoadedImageDecoder.
    • Menghapus ShadowMediaCodecConfig.forAllSupportedMimeTypes() yang tidak digunakan lagi. Sebagai gantinya, gunakan ShadowMediaCodecConfig.withAllDefaultSupportedCodecs().
    • Menghapus ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes() yang tidak digunakan lagi. Sebagai gantinya, gunakan ShadowMediaCodecConfig.withNoDefaultSupportedCodecs().

1.9.0-rc01

1 Desember 2025

Gunakan versi stabil 1.9.0.

1.9.0-beta01

20 November 2025

Gunakan versi stabil 1.9.0.

1.9.0-alpha01

22 Oktober 2025

Gunakan versi stabil 1.9.0.

Versi 1.8.0

1.8.1

21 Mei 2026

Versi 1.8.1 berisi commit berikut.

  • Efek:
    • Tetapkan GL_DRAW_BUFFER dan GL_READ_BUFFER secara eksplisit saat beralih dari konteks tanpa platform.

Versi 1.8.0

30 Juli 2025

Versi 1.8.0 berisi commit ini.

  • Library Umum:
    • Menambahkan dukungan untuk mengganti pemutar di ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Menambahkan pengambil untuk mode acak ke antarmuka ExoPlayer (#2522).
    • Menampilkan pengecualian dengan lebih jelas jika DefaultAudioSink diakses dari beberapa thread. Jika hal ini terjadi karena panggilan ke RendererCapabilities.getFormatSupport di luar pemutar, pastikan untuk memanggil metode ini di thread yang sama dengan thread pemutaran ExoPlayer atau gunakan instance yang berbeda dari yang digunakan untuk pemutaran (#1191).
    • Memperbaiki bug yang menyebabkan format audio non-stereo di TV mungkin ditandai sebagai tidak didukung oleh DefaultTrackSelector.
    • Pastikan frame terakhir dirender dengan benar saat menggunakan flag DECODE_ONLY MediaCodec (yang diaktifkan secara default dalam mode scrubbing).
    • Menambahkan dukungan untuk menggunakan ID perangkat virtual dari Context yang diteruskan ke ExoPlayer.Builder.
    • Mengaktifkan penjadwalan dinamis secara default dalam mode scrubbing.
    • Menghindari pemuatan ulang sumber yang tidak perlu saat mencari ke akhir item.
    • Gunakan MediaCodec.BUFFER_FLAG_DECODE_ONLY secara default dalam mode scrubbing.
    • Menampilkan IllegalStateException saat PreloadMediaSource diputar oleh ExoPlayer dengan thread pemutaran yang berbeda dengan thread pemuatan awal (#2495).
    • Menambahkan cloneAndMove ke ShuffleMode dengan implementasi default (#2226).
    • Ubah perilaku default Renderer.getMinDurationToProgressUs untuk menampilkan nilai yang lebih besar jika tidak diperlukan panggilan ke render.
    • Memperbaiki bug saat penjadwalan internal menunda frame terakhir saat mencari ke akhir saat dijeda. Untuk saat ini, perbaikan bug hanya berlaku jika ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled diaktifkan.
    • Tambahkan metode ExoPlayer.setScrubbingModeEnabled(boolean). Tindakan ini akan mengoptimalkan pemutar untuk banyak pencarian yang sering dilakukan (misalnya, dari pengguna yang menarik panel scrubber). Perilaku mode scrubbing dapat disesuaikan dengan setScrubbingModeParameters(..) di ExoPlayer dan ExoPlayer.Builder.
    • Mengizinkan penyesuaian toleransi pencarian pecahan dalam mode scrubbing.
    • Meningkatkan kecepatan operasi codec dalam mode scrubbing.
    • Memperbaiki bug yang menyebabkan error persiapan dalam konten AdsMediaSource mungkin tidak pernah dilaporkan (#2337).
    • Memperbaiki kebocoran memori di MergingMediaSource, misalnya yang digunakan saat melakukan sideload subtitel (#2338).
    • Mengizinkan CmcdConfiguration.Factory menampilkan null untuk menonaktifkan logging CMCD untuk item media tertentu (#2386).
    • Meningkatkan ukuran buffer gambar default dari 128 kB (kesalahan salin tempel dari trek teks) menjadi 26 MB, yang cukup besar untuk gambar Ultra HDR 50 MP (#2417).
    • Menambahkan PreCacheHelper yang memungkinkan aplikasi melakukan pra-cache satu media dengan posisi dan durasi mulai yang ditentukan.
    • Menambahkan dukungan pramuat dari posisi yang ditentukan di DefaultPreloadManager.
  • Transformator:
    • Tambahkan CodecDbLite yang memungkinkan pengoptimalan setelan encoding video khusus chipset.
    • Tambahkan flag setEnableCodecDbLite ke DefaultEncoderFactory untuk mengaktifkan pengoptimalan setelan CodecDB Lite. Secara default, flag ini ditetapkan ke false.
    • Mengisi jeda awal (ditambahkan melalui addGap()) dengan audio senyap kini memerlukan setelan eksplisit experimentalSetForceAudioTrack(true) di EditedMediaItemSequence.Builder. Jika celah berada di tengah urutan, flag ini tidak diperlukan.
    • Pindahkan antarmuka Muxer dari media3-transformer ke media3-muxer.
    • Buat setelan MediaItem.Builder().setImageDuration(long) wajib untuk mengimpor item media sebagai gambar.
    • Tambahkan Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean) yang menyertakan daftar edit MP4 saat memangkas untuk menginstruksikan pemutar agar mengabaikan sampel antara frame utama sebelum titik awal pemangkasan, dan titik awal pemangkasan.
    • Update aplikasi Composition Demo untuk menggunakan Kotlin dan Jetpack Compose, serta tambahkan VideoCompositorSettings kustom untuk mengatur urutan ke dalam tata letak 2x2 atau PiP.
  • Ekstraktor:
    • Mengurai metadata dari file MP4 yang terfragmentasi (#2084).
    • JPEG: Mendukung foto motion (foto dengan gambar bergerak) yang tidak memiliki segmen Exif di awal (#2552).
    • Menambahkan dukungan untuk pencarian di MP4 terfragmentasi dengan beberapa atom sidx. Perilaku ini dapat diaktifkan menggunakan flag FLAG_MERGE_FRAGMENTED_SIDX di FragmentedMp4Extractor (#9373).
    • Mengabaikan tabel pencarian kosong dalam file FLAC (termasuk yang hanya berisi titik pencarian placeholder), dan beralih ke pencarian biner jika durasi file diketahui (#2327).
    • Memperbaiki penguraian unit H.265 SEI untuk sepenuhnya melewati jenis SEI yang tidak dikenali (#2456).
    • Memperbarui WavExtractor agar menggunakan data SubFormat ekstensi header untuk format audio saat mengurai file jenis WAVE_FORMAT_EXTENSIBLE.
    • MP4: Menambahkan dukungan untuk kotak ipcm dan fpcm yang menentukan trek audio PCM mentah (PCM floating point 64-bit tidak didukung).
    • MP4: Menangani bagian rotasi matriks transformasi tkhd yang memutar dan memantulkan video. Hal ini memastikan bahwa video yang direfleksikan yang diambil oleh kamera depan iPhone ditampilkan dengan benar, tetapi direfleksikan secara tidak benar di sumbu y (#2012).
    • MP3: Menggunakan durasi dan ukuran data dari Xing, VBRI, dan metadata kecepatan bit variabel serupa yang tidak dapat dicari saat beralih ke pencarian kecepatan bit konstan karena FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) (#2194).
  • Audio:
    • Memperbaiki bug saat AnalyticsListener.onAudioPositionAdvancing tidak dipanggil ketika pemutaran audio dimulai sangat dekat dengan akhir media.
    • Menambahkan dukungan untuk semua format sampel PCM linear di ChannelMappingAudioProcessor dan TrimmingAudioProcessor.
    • Menambahkan dukungan untuk jeda audio di CompositionPlayer.
    • Menghapus panggilan palsu ke BaseAudioProcessor#flush() dari BaseAudioProcessor#reset().
    • Mengizinkan upmixing/downmixing daya konstan di DefaultAudioMixer.
    • Membuat ChannelMappingAudioProcessor, TrimmingAudioProcessor, dan ToFloatPcmAudioProcessor menjadi publik (#2339).
    • Gunakan AudioTrack#getUnderrunCount() di AudioTrackPositionTracker untuk mendeteksi underrun di DefaultAudioSink, bukan estimasi upaya terbaik.
    • Meningkatkan penghalusan stempel waktu audio untuk pergeseran posisi yang tidak terduga dari perangkat output audio.
    • Memperbaiki bug saat sinkronisasi A/V rusak selama 10 detik pertama setelah melanjutkan dari jeda saat terhubung ke perangkat Bluetooth.
    • Memperbaiki bug yang menyebabkan AnalyticsListener.onAudioPositionAdvancing tidak melaporkan waktu saat audio mulai dimajukan, tetapi waktu pengukuran pertama.
    • Memperbaiki pemulihan ke audio multisaluran setelah penggantian ke audio stereo di beberapa perangkat (#2258).
  • Video:
    • Memperluas solusi platform yang terlepas ke perangkat "lenovo" dan "motorola" (#2059).
    • Meningkatkan kelancaran rilis frame video saat startup ketika sampel audio tidak dimulai tepat pada posisi yang diminta.
    • Memperluas solusi platform yang terlepas ke perangkat "realme" (#2059).
    • Menambahkan API ExoPlayer eksperimental untuk menyertakan flag MediaCodec.BUFFER_FLAG_DECODE_ONLY saat mengantrekan buffer input khusus dekode. Flag ini akan memberi sinyal kepada decoder untuk melewati buffer khusus dekode, sehingga menghasilkan pencarian yang lebih cepat. Aktifkan dengan DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag. * Meningkatkan pemeriksaan performa codec untuk codec video software. Hal ini dapat menyebabkan beberapa trek tambahan ditandai sebagai EXCEEDS_CAPABILITIES.
    • Memperbaiki error pemutaran Widevine VP9 di beberapa perangkat (#2408).
  • Teks:
    • Menambahkan dukungan untuk trek VobSub dalam file MP4 (#2510).
    • Memperbaiki penghentian pemutaran saat segmen subtitel awalnya gagal dimuat dan kemudian berhasil dimuat, diikuti oleh beberapa segmen subtitel kosong (#2517).
    • Memperbaiki SSA dan SubRip untuk menampilkan tanda yang sedang berlangsung saat mengaktifkan subtitel (#2309).
    • Memperbaiki pemutaran yang macet saat beralih dari streaming dengan error subtitel ke live stream dengan trek subtitel kosong (#2328).
    • Memperbaiki subtitel CEA-608 yang kacau saat memutar streaming H.262 yang berisi frame B (#2372).
    • Menambahkan dukungan untuk subtitel SSA dengan CodecId = S_TEXT/SSA dalam file Matroska. Sebelumnya, MatroskaExtractor hanya mendukung CodecId = S_TEXT/ASS yang dimaksudkan untuk merepresentasikan varian 'lanjutan' (v4+) dari subtitle SubStation Alpha (tetapi logika penguraian ExoPlayer sama untuk kedua varian) (#2384).
    • Menambahkan dukungan untuk properti layer dalam file subtitel SubStation Alpha (SSA) yang digunakan untuk menentukan urutan z tanda saat lebih dari satu tanda ditampilkan di layar secara bersamaan (#2124).
  • Metadata:
    • Menambahkan dukungan untuk mengambil durasi media dan Timeline ke MetadataRetriever dan memigrasikannya ke API AutoCloseable berbasis instance. Gunakan Builder baru untuk membuat instance untuk MediaItem, lalu panggil retrieveTrackGroups(), retrieveTimeline(), dan retrieveDurationUs() untuk mendapatkan ListenableFuture untuk metadata. Metode statis sebelumnya kini tidak digunakan lagi (#2462).
  • Gambar:
    • Batasi bitmap yang didekode ke ukuran tampilan di BitmapFactoryImageDecoder, untuk menghindari error aplikasi dengan Canvas: trying to draw too large bitmap. dari PlayerView saat mencoba menampilkan gambar yang sangat besar (misalnya, 50 MP).
    • Ubah tanda tangan DefaultRenderersFactory.getImageDecoderFactory() untuk mengambil parameter Context.
    • Menyelaraskan ukuran output bitmap maksimum yang digunakan di CompositionPlayer dengan yang sudah digunakan di Transformer (artinya, CompositionPlayer tidak mempertimbangkan ukuran tampilan saat mendekode bitmap, tidak seperti ExoPlayer).
  • DRM:
    • Menambahkan overload baru OfflineLicenseHelper.newWidevineInstance yang menerima MediaItem.DrmConfiguration agar header permintaan HTTP dapat diterapkan dengan benar (#2169).
  • Efek:
    • Tambahkan Presentation.createForShortSide(int) yang membuat Presentation yang memastikan sisi terpendek selalu cocok dengan nilai yang diberikan, terlepas dari orientasi input.
  • Muxer:
    • Memperbaiki bug saat flag sampel yang benar tidak ditetapkan untuk sampel audio di MP4 terfragmentasi.
    • writeSampleData() API kini menggunakan class BufferInfo khusus muxer, bukan MediaCodec.BufferInfo.
    • Tambahkan Muxer.Factory#supportsWritingNegativeTimestampsInEditList yang secara default ditetapkan ke false.
  • Ekstensi IMA:
    • Memperbaiki bug yang menyebabkan error pemuatan di satu iklan dapat secara tidak sengaja membatalkan grup iklan lain.
    • Memperbaiki bug yang menyebabkan grup iklan setelah akhir periode VOD menghentikan pemutaran. Grup iklan dengan waktu mulai setelah periode tidak lagi dimasukkan ke dalam antrean MediaPeriodQueue (#2215).
  • Sesi:
    • Memperbaiki bug saat koneksi dari pengontrol Media3 pihak ketiga yang tidak memiliki hak istimewa diabaikan.
    • Menghapus pemeriksaan perintah yang tersedia saat mengirim perintah kustom ke MediaBrowserServiceCompat lama. Hal ini setara dengan perilaku pengontrol/browser lama saat terhubung ke aplikasi lama.
    • Memperbaiki bug yang menyebabkan error pemutaran pertama pemain diperlakukan secara salah sebagai pengecualian kustom persisten. Hal ini mencegah aplikasi melakukan pemulihan.
    • Memperbaiki bug yang menyebabkan beberapa perubahan pengontrol yang tidak ditangani oleh sesi dapat menyebabkan IllegalStateExceptions.
    • Memperbaiki bug yang menyebabkan tindakan pengontrol yang tidak ditangani oleh sesi dapat membuat pengontrol dalam status tidak valid.
    • Memperbaiki peringatan pelanggaran peluncuran tidak aman StrictMode (#2330).
    • Memperbaiki bug saat memanggil setSessionExtras dari thread utama saat menjalankan pemutar dari thread aplikasi yang berbeda, lalu thread utama menyebabkan IllegalStateException (#2265).
    • Jangan otomatis menampilkan notifikasi jika pemain disiapkan dengan item media tanpa menyiapkan atau memutarnya (#2423https://github.com/androidx/media/issues/2423). Perilaku ini dapat dikonfigurasi melalui MediaSessionService.setShowNotificationForIdlePlayer.
    • Tambahkan PlaybackException kustom untuk semua atau pengontrol yang dipilih.
    • Memperbaiki bug yang menyebabkan pencarian dalam live stream di MediaController dapat menyebabkan IllegalArgumentException.
    • Untuk live stream, berhenti memublikasikan posisi pemutaran dan kemampuan untuk men-seek item saat ini untuk pengontrol media platform, guna menghindari artefak posisi di UI Android Auto (dan pengontrol lain yang menggunakan informasi ini dari sesi media platform) (#1758).
    • Memperbaiki bug saat meneruskan null ke getLibraryRoot dari MediaBrowser yang terhubung ke MediaBrowserServiceCompat lama menghasilkan NullPointerException.
    • Memperbaiki bug saat mengirim tindakan kustom, hasil penelusuran, atau permintaan getItem menyebabkan aplikasi sesi lama error dengan ClassNotFoundException.
    • Memperbaiki bug yang menyebabkan MediaItem.LocalConfiguration.uri dibagikan ke MediaMetadata sesi platform. Untuk sengaja membagikan URI agar pengontrol dapat meminta ulang media, tetapkan MediaItem.RequestMetadata.mediaUri.
  • UI:
    • Memperbaiki bug saat PlayerSurface di dalam komponen yang dapat digunakan kembali seperti LazyColumn tidak berfungsi dengan benar (#2493).
    • Memperbaiki bug Compose yang menyebabkan jeda antara penetapan status tombol awal dan pengamatan perubahan status (misalnya, bentuk ikon atau diaktifkan). Setiap perubahan yang dilakukan pada Pemutar di luar periode pengamatan kini diambil (#2313).
    • Tambahkan holder status dan composable ke modul media3-ui-compose untuk SeekBackButtonState dan SeekForwardButtonState.
    • Menambahkan dukungan untuk mode scrubbing ExoPlayer ke PlayerControlView. Jika diaktifkan, tindakan ini akan menempatkan pemutar ke mode scrubbing saat pengguna mulai menarik panel scrubber, mengeluarkan panggilan player.seekTo untuk setiap gerakan, lalu keluar dari mode scrubbing saat sentuhan diangkat dari layar. Integrasi ini dapat diaktifkan dengan time_bar_scrubbing_enabled = true di XML atau metode setTimeBarScrubbingEnabled(boolean) dari Java/Kotlin.
    • Buat PlayerSurface menerima argumen Player nullable.
  • Download:
    • Menambahkan dukungan download sebagian untuk streaming progresif. Aplikasi dapat menyiapkan streaming progresif dengan DownloadHelper, dan meminta DownloadRequest dari helper dengan menentukan posisi awal dan akhir media berbasis waktu yang harus dicakup oleh download. DownloadRequest yang ditampilkan membawa rentang byte yang di-resolve, yang dapat digunakan untuk membuat ProgressiveDownloader dan mendownload konten yang sesuai.
    • Tambahkan DownloadHelper.Factory yang menggantikan metode DownloadHelper.forMediaItem() statis.
    • Menambahkan Factory untuk implementasi SegmentDownloader.
    • Menambahkan dukungan download sebagian untuk streaming adaptif. Aplikasi dapat menyiapkan streaming adaptif dengan DownloadHelper, dan meminta DownloadRequest dari helper dengan menentukan posisi awal dan akhir media berbasis waktu yang harus dicakup oleh download. DownloadRequest yang ditampilkan membawa rentang waktu yang diselesaikan, yang dapat digunakan untuk membuat SegmentDownloader konkret dan mendownload konten yang sesuai.
  • Ekstensi Cronet:
    • Menambahkan penanganan cookie otomatis (#5975).
  • Ekstensi HLS:
    • Memperbaiki bug saat HlsSampleStreamWrapper mencoba mencari di dalam buffer saat tidak ada potongan yang tersedia di buffer #2598.
    • Memperbaiki bug saat perubahan pemilihan trek setelah memuat bagian latensi rendah dan petunjuk pramuat dapat menyebabkan pemutaran macet atau berhenti (#2299).
    • Mencegah pemuatan ulang yang berlebihan dengan menunggu setengah durasi target saat CAN-BLOCK-RELOAD=YES tidak dipatuhi oleh server (#2317).
    • Memperbaiki bug yang menyebabkan pemutaran terhenti saat memulai streaming interstisial sebelum mid-roll dan resolusi daftar aset dicoba untuk iklan yang salah (#2558).
    • Memperbaiki penguraian playlist untuk menerima \f (penggantian halaman) dalam nilai atribut string yang dikutip (#2420).
    • Mendukung pembaruan interstisial dengan ID yang sama (#2427).
    • Memperbaiki bug yang menyebabkan error pemuatan playlist terkadang tidak disebarkan setelah live stream kehabisan segmen untuk dimuat (#2401https://github.com/androidx/media/issues/2401).
    • Mengelompokkan rendition subtitel menurut tag NAME, mirip dengan cara pengelompokan rendition audio yang sudah ada (#1666).
    • Mendukung X-ASSET-LIST dan live stream dengan HlsInterstitialsAdsLoader.
  • Ekstensi DASH:
    • Memperbaiki masalah saat set adaptasi trick-play digabungkan dengan set adaptasi utamanya untuk membentuk TrackGroup yang tidak valid (#2148).
    • Memperbaiki bug saat mempersingkat durasi periode DASH dapat memunculkan pengecualian saat sampel di luar durasi baru telah dibaca oleh pipeline rendering (#2440).
    • Memperbaiki bug yang menyebabkan pengalihan tidak diikuti saat menggunakan parameter kueri CMCD (#2475).
  • Ekstensi RTSP:
    • Menambahkan dukungan untuk Paket Agregasi RTP untuk H265 sesuai dengan RFC 7798#4.4.2 (#2413).
    • Memperbaiki RtspClient untuk menggunakan URI lokasi seperti yang disediakan saat memproses respons HTTP 302 (#2398).
    • Menambahkan dukungan penguraian untuk SessionDescription yang berisi baris dengan karakter spasi kosong di akhir (#2357).
  • Ekstensi decoder (FFmpeg, VP9, AV1, dll.):
    • Memperbaiki bug saat DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange tidak berpengaruh untuk ekstensi dekoder audio (#2258).
  • Ektensi Cast:
    • Menambahkan dukungan untuk setVolume(), dan getVolume() (#2279).
    • Mencegah CastPlayer memasuki STATE_BUFFERING saat linimasa kosong.
    • Menambahkan dukungan untuk getDeviceVolume(), setDeviceVolume(), getDeviceMuted(), dan setDeviceMuted() (#2089).
  • Utilitas Pengujian:
    • Tambahkan advance(player).untilPositionAtLeast dan untilMediaItemIndex ke TestPlayerRunHelper untuk memajukan pemutar hingga posisi yang ditentukan tercapai. Dalam sebagian besar kasus, metode ini lebih andal daripada metode untilPosition dan untilStartOfMediaItem yang ada.
    • Pindahkan FakeDownloader ke modul test-utils-robolectric untuk digunakan kembali dalam pengujian lain.
    • Menghapus transformer.TestUtil.addAudioDecoders(String...), transformer.TestUtil.addAudioEncoders(String...), dan transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...). Gunakan ShadowMediaCodecConfig untuk mengonfigurasi encoder dan dekoder bayangan.
    • Mengganti awalan "exotest" dengan "media3" dalam nama codec yang dilaporkan oleh ShadowMediaCodecConfig.
  • Menghapus simbol yang tidak digunakan lagi:
    • Menghapus konstruktor SegmentDownloader yang tidak digunakan lagi SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) dan konstruktor yang sesuai di subclass-nya DashDownloader, HlsDownloader, dan SsDownloader.
    • Menghapus Player.hasNext(), Player.hasNextWindow() yang tidak digunakan lagi. Sebagai gantinya, gunakan Player.hasNextMediaItem().
    • Menghapus Player.next() yang tidak digunakan lagi. Sebagai gantinya, gunakan Player.seekToNextMediaItem().
    • Menghapus Player.seekToPreviousWindow() yang tidak digunakan lagi. Sebagai gantinya, gunakan Player.seekToPreviousMediaItem().
    • Menghapus Player.seekToNextWindow() yang tidak digunakan lagi. Sebagai gantinya, gunakan Player.seekToNextMediaItem().
    • Menghapus BaseAudioProcessor yang tidak digunakan lagi di modul exoplayer. Gunakan BaseAudioProcessor di modul common.
    • Menghapus konstruktor MediaCodecVideoRenderer yang tidak digunakan lagi MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider).

Versi 1.8.0-rc02

24 Juli 2025

Gunakan versi stabil 1.8.0.

Versi 1.8.0-rc01

16 Juli 2025

Gunakan versi stabil 1.8.0.

Versi 1.8.0-beta01

2 Juli 2025

Gunakan versi stabil 1.8.0.

Versi 1.8.0-alpha01

19 Mei 2025

Gunakan versi stabil 1.8.0.

Versi 1.7.0

Versi 1.7.1

16 Mei 2025

Rilis ini memiliki kode yang sama dengan 1.6.1 dan dirilis untuk memastikan rilis ini muncul sebagai rilis 'yang lebih baru' daripada 1.7.0, yang merupakan rilis alfa yang tidak sengaja ditandai sebagai stabil (lihat di bawah).

Versi 1.7.0

16 Mei 2025

Rilis ini seharusnya adalah 1.7.0-alpha01, tetapi tidak sengaja diberi tag 1.7.0 (yaitu stabil) di maven.google.com. Jangan gunakan rilis ini. Tetap gunakan 1.6.1 atau upgrade ke 1.7.1 (yang memiliki kode yang sama dengan 1.6.1).

Versi 1.6.0

1.6.1

14 April 2025

androidx.media3:media3-*:1.6.1 dirilis. Versi 1.6.1 berisi commit ini.

  • Library Umum:
    • Menambahkan metode PlaybackParameters.withPitch(float) untuk menyalin PlaybackParameters dengan nilai pitch baru dengan mudah (#2257).
  • ExoPlayer:
    • Memperbaiki masalah saat transisi item media gagal karena error perender yang dapat dipulihkan selama inisialisasi item media berikutnya (#2229).
    • Memperbaiki masalah saat ProgressiveMediaPeriod menampilkan IllegalStateException saat PreloadMediaSource mencoba memanggil getBufferedDurationUs() sebelum disiapkan (#2315).
    • Memperbaiki pengiriman CmcdData dalam permintaan manifes untuk DASH, HLS, dan SmoothStreaming (#2253).
    • Pastikan AdPlaybackState.withAdDurationsUs(long[][]) dapat digunakan setelah grup iklan dihapus. Pengguna masih perlu meneruskan array durasi untuk grup iklan yang dihapus yang dapat kosong atau null (#2267).
  • Ekstraktor:
    • MP4: Mengurai alternate_group dari kotak tkhd dan mengeksposnya sebagai entri Mp4AlternateGroupData di Format.metadata setiap trek (#2242).
  • Audio:
    • Memperbaiki masalah offload yang menyebabkan posisi mungkin macet saat memutar playlist konten pendek (#1920).
  • Sesi:
    • Menurunkan waktu tunggu agregasi untuk callback MediaSession platform dari 500 menjadi 100 milidetik dan menambahkan penyetel eksperimental untuk memungkinkan aplikasi mengonfigurasi nilai ini.
    • Memperbaiki masalah saat notifikasi muncul kembali setelah ditutup oleh pengguna (#2302).
    • Memperbaiki bug yang menyebabkan sesi menampilkan linimasa satu item saat pemutar yang digabungkan sebenarnya kosong. Hal ini terjadi saat pemutar yang digabungkan tidak memiliki COMMAND_GET_TIMELINE yang tersedia, sedangkan COMMAND_GET_CURRENT_MEDIA_ITEM tersedia dan pemutar yang digabungkan kosong (#2320).
    • Memperbaiki bug saat panggilan MediaSessionService.setMediaNotificationProvider diabaikan secara otomatis setelah interaksi lain dengan layanan seperti setForegroundServiceTimeoutMs (#2305).
  • UI:
    • Aktifkan PlayerSurface agar berfungsi dengan ExoPlayer.setVideoEffects dan CompositionPlayer.
    • Memperbaiki bug yang menyebabkan PlayerSurface tidak dapat dikomposisi ulang dengan Player baru.
  • Ekstensi HLS:
    • Memperbaiki masalah saat durasi potongan tidak ditetapkan di CmcdData untuk media HLS, yang menyebabkan kegagalan pernyataan saat memproses segmen media terenkripsi (#2312).
  • Ekstensi RTSP:
    • Menambahkan dukungan untuk URI dengan skema RTSPT sebagai cara untuk mengonfigurasi sesi RTSP agar menggunakan TCP (#1484).
  • Ektensi Cast:
    • Menambahkan dukungan untuk metadata playlist (#2235).

1.6.0

26 Maret 2025

androidx.media3:media3-*:1.6.0 dirilis. Versi 1.6.0 berisi commit ini.

  • Library Umum:
    • Menambahkan AudioManagerCompat dan AudioFocusRequestCompat untuk menggantikan class yang setara di androidx.media.
    • Upgrade Kotlin dari 1.9.20 ke 2.0.20 dan gunakan plugin Gradle Compose Compiler. Mengupgrade library KotlinX Coroutines dari 1.8.1 ke 1.9.0.
    • Menghapus metode Format.toBundle(boolean excludeMetadata), gunakan Format.toBundle() sebagai gantinya.
    • Memperbaiki bug di SimpleBasePlayer saat menyetel currentMediaItemIndex baru di State setelah setPlaylist dengan null MediaMetadata tidak mengevaluasi ulang metadata (#1940).
    • Mengubah akses SimpleBasePlayer.State dari dilindungi menjadi publik untuk memudahkan penanganan update di class lain (#2128).
  • ExoPlayer:
    • Menambahkan MediaExtractorCompat, class baru yang menyediakan fitur yang setara dengan MediaExtractor platform.
    • Menambahkan dukungan pra-pemanasan 'ExoPlayer' eksperimental untuk pemutaran menggunakan MediaCodecVideoRenderer. Anda dapat mengonfigurasi DefaultRenderersFactory melalui experimentalSetEnableMediaCodecVideoRendererPrewarming untuk menyediakan MediaCodecVideoRenderer sekunder ke ExoPlayer. Jika diaktifkan, ExoPlayer akan melakukan pra-pemrosesan video item media berturut-turut selama pemutaran untuk mengurangi latensi transisi item media.
    • Kurangi nilai default untuk bufferForPlaybackMs dan bufferForPlaybackAfterRebufferMs di DefaultLoadControl menjadi masing-masing 1.000 dan 2.000 md.
    • Lakukan inisialisasi DeviceInfo dan volume perangkat secara asinkron (jika diaktifkan menggunakan setDeviceVolumeControlEnabled). Nilai ini tidak langsung tersedia setelah ExoPlayer.Builder.build(), dan Player.Listener memberi tahu perubahan melalui onDeviceInfoChanged dan onDeviceVolumeChanged.
    • ID sesi audio awal tidak lagi langsung tersedia setelah membuat pemutar. Anda dapat menggunakan AnalyticsListener.onAudioSessionIdChanged untuk memproses update awal jika diperlukan.
    • Pertimbangkan bahasa saat memilih trek video. Secara default, pilih trek video 'utama' yang cocok dengan bahasa trek audio yang dipilih, jika tersedia. Preferensi bahasa video eksplisit dapat dinyatakan dengan TrackSelectionParameters.Builder.setPreferredVideoLanguage(s).
    • Tambahkan parameter selectedAudioLanguage ke metode DefaultTrackSelector.selectVideoTrack().
    • Menambahkan parameter retryCount ke MediaSourceEventListener.onLoadStarted dan metode MediaSourceEventListener.EventDispatcher yang sesuai.
    • Memperbaiki bug saat item playlist atau periode dalam streaming DASH multi-periode dengan durasi yang tidak sesuai dengan konten sebenarnya dapat menyebabkan frame terhenti di akhir item (#1698).
    • Pindahkan BasePreloadManager.Listener ke PreloadManagerListener tingkat teratas.
    • RenderersFactory.createSecondaryRenderer dapat diimplementasikan untuk menyediakan perender sekunder untuk prapenyiapan. Pra-pemanasan memungkinkan transisi item media yang lebih cepat selama pemutaran.
    • Mengaktifkan pengiriman CmcdData untuk permintaan manifes dalam format streaming adaptif DASH, HLS, dan SmoothStreaming (#1951).
    • Menyediakan MediaCodecInfo codec yang akan diinisialisasi di MediaCodecRenderer.onReadyToInitializeCodec (#1963).
    • Ubah AdsMediaSource untuk memungkinkan AdPlaybackStates berkembang dengan menambahkan grup iklan. Modifikasi yang tidak valid akan terdeteksi dan memunculkan pengecualian.
    • Memperbaiki masalah saat frame tambahan khusus dekode dapat ditampilkan secara berurutan dengan cepat saat beralih ke media konten setelah iklan mid-roll.
    • Buat DefaultRenderersFactory menambahkan dua instance MetadataRenderer agar aplikasi dapat menerima dua skema metadata yang berbeda secara default.
    • Mengevaluasi ulang apakah pemuatan potongan yang sedang berlangsung harus dibatalkan saat pemutaran dijeda (#1785).
    • Menambahkan opsi ke ClippingMediaSource untuk mengizinkan pemangkasan di media yang tidak dapat di-seek.
    • Memperbaiki bug saat pencarian dengan pra-pemanasan dapat memblokir transisi item media berikutnya.
    • Memperbaiki bug yang menyebabkan ExoPlayer.isLoading() tetap true saat telah bertransisi ke STATE_IDLE atau STATE_ENDED (#2133).
    • Menambahkan lastRebufferRealtimeMs ke LoadControl.Parameter (#2113).
  • Transformator:
    • Menambahkan dukungan untuk transmuxing ke format alternatif yang kompatibel dengan versi lama.
    • Menambahkan dukungan untuk transcoding dan transmuxing format Dolby Vision (profil 8).
    • Mengupdate parameter VideoFrameProcessor.registerInputStream dan VideoFrameProcessor.Listener.onInputStreamRegistered untuk menggunakan Format.
    • Buat metadata statis HDR saat menggunakan DefaultEncoderFactory.
    • Mengaktifkan dukungan untuk diagnostik platform Android menggunakan MediaMetricsManager. Transformer meneruskan peristiwa pengeditan dan data performa ke platform, yang membantu memberikan informasi performa dan informasi proses debug sistem di perangkat. Data ini juga dapat dikumpulkan oleh Google jika berbagi data penggunaan dan diagnostik diaktifkan oleh pengguna perangkat. Aplikasi dapat memilih untuk tidak berkontribusi pada diagnostik platform untuk Transformer dengan Transformer.Builder.setUsePlatformDiagnostics(false).
    • Pisahkan InAppMuxer menjadi InAppMp4Muxer dan InAppFragmentedMp4Muxer. Anda menggunakan InAppMp4Muxer untuk menghasilkan file MP4 yang tidak terfragmentasi, sedangkan InAppFragmentedMp4Muxer digunakan untuk menghasilkan file MP4 yang terfragmentasi.
    • Pindahkan antarmuka Muxer dari media3-muxer ke media3-transformer.
    • Menambahkan MediaProjectionAssetLoader, yang menyediakan media dari MediaProjection untuk perekaman layar, dan menambahkan dukungan untuk perekaman layar ke aplikasi demo Transformer.
    • Tambahkan #getInputFormat() ke antarmuka Codec.
    • Mengalihkan tanggung jawab untuk merilis GlObjectsProvider ke pemanggil di DefaultVideoFrameProcessor dan DefaultVideoCompositor jika memungkinkan.
  • Ekstraktor:
    • AVI: Memperbaiki penanganan file dengan audio terkompresi kecepatan bit konstan, yang header streaming-nya menyimpan jumlah byte, bukan jumlah potongan.
    • Memperbaiki penanganan unit NAL dengan panjang yang dinyatakan dalam 1 atau 2 byte (bukan 4).
    • Memperbaiki ArrayIndexOutOfBoundsException dalam daftar edit MP4 saat daftar edit dimulai pada frame non-sinkronisasi tanpa frame sinkronisasi sebelumnya (#2062).
    • Memperbaiki masalah saat streaming TS dapat macet di beberapa perangkat (#2069).
    • FLAC: Menambahkan dukungan untuk file FLAC 32-bit. Sebelumnya, video ini akan gagal diputar dengan IllegalStateException: Playback stuck buffering and not loading (#2197).
  • Audio:
    • Memperbaiki onAudioPositionAdvancing agar dipanggil saat pemutaran dilanjutkan (sebelumnya dipanggil saat pemutaran dijeda).
    • Jangan mengabaikan SonicAudioProcessor saat SpeedChangingAudioProcessor dikonfigurasi dengan parameter default.
    • Memperbaiki underflow di Sonic#getOutputSize() yang dapat menyebabkan DefaultAudioSink terhenti.
    • Perbaiki MediaCodecAudioRenderer.getDurationToProgressUs() dan DecoderAudioRenderer.getDurationToProgressUs() agar pencarian dapat mereset durasi yang diberikan dengan benar.
    • Menjadikan androidx.media3.common.audio.SonicAudioProcessor final.
    • Menambahkan dukungan untuk PCM float ke ChannelMappingAudioProcessor dan TrimmingAudioProcessor.
  • Video:
    • Mengubah MediaCodecVideoRenderer.shouldUsePlaceholderSurface menjadi dilindungi sehingga aplikasi dapat mengganti untuk memblokir penggunaan platform placeholder (#1905).
    • Menambahkan penguraian dependensi sampel AV1 ExoPlayer eksperimental untuk mempercepat pencarian. Aktifkan dengan API DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies baru.
    • Menambahkan API ExoPlayer eksperimental untuk menghapus buffer input dekoder MediaCodecVideoRenderer yang terlambat dan tidak diperlukan. Aktifkan dengan DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs. * Memperbaiki masalah saat pemutar tanpa platform langsung siap dan sangat lambat mendekode frame yang tertunda (#1973).
    • Mengecualikan perangkat Xiaomi dan OPPO dari mode platform terpisah untuk menghindari kedipan layar (#2059).
  • Teks:
    • Menambahkan dukungan untuk subtitel VobSub (#8260).
    • Berhenti memuat semua file subtitel yang dikonfigurasi dengan MediaItem.Builder.setSubtitleConfigurations, dan hanya muat satu jika dipilih oleh pemilihan trek (#1721).
    • TTML: Menambahkan dukungan untuk mereferensikan tts:origin dan tts:extent menggunakan style (#2953).
    • Batasi stempel waktu WebVTT dan SubRip menjadi tepat 3 tempat desimal. Sebelumnya, kami salah mengurai jumlah tempat desimal, tetapi selalu mengasumsikan nilainya dalam milidetik, sehingga menyebabkan stempel waktu yang salah (#1997).
    • Memperbaiki pemutaran yang berhenti saat playlist berisi item yang dipotong dengan teks CEA-608 atau CEA-708.
    • Memperbaiki IllegalStateException saat file SSA berisi tanda dengan durasi nol (waktu mulai dan berakhir sama) (#2052).
    • Menyembunyikan (dan mencatat) error penguraian subtitel saat subtitel di-mux ke dalam penampung yang sama dengan audio dan video (#2052).
    • Memperbaiki penanganan karakter UTF-8 multi-byte dalam file WebVTT menggunakan akhiran baris CR (#2167).
  • DRM:
    • Memperbaiki error MediaCodec$CryptoException: Operation not supported in this configuration saat memutar konten ClearKey di perangkat API < 27 (#1732).
  • Efek:
    • Memindahkan fungsi OverlaySettings ke StaticOverlaySettings. OverlaySettings dapat dibuat subclass-nya untuk memungkinkan setelan overlay dinamis.
  • Muxer:
    • Memindahkan MuxerException dari antarmuka Muxer untuk menghindari nama yang sepenuhnya memenuhi syarat yang sangat panjang.
    • Mengganti nama metode setSampleCopyEnabled() menjadi setSampleCopyingEnabled() di Mp4Muxer.Builder dan FragmentedMp4Muxer.Builder.
    • Mp4Muxer.addTrack() dan FragmentedMp4Muxer.addTrack() kini menampilkan ID trek int, bukan TrackToken.
    • Mp4Muxer dan FragmentedMp4Muxer tidak lagi mengimplementasikan antarmuka Muxer.
    • Menonaktifkan pengelompokan dan penyalinan sampel Mp4Muxer secara default.
    • Memperbaiki bug di FragmentedMp4Muxer yang membuat banyak fragmen saat hanya trek audio yang ditulis.
  • Sesi:
    • Mempertahankan status layanan latar depan selama 10 menit tambahan saat pemutaran dijeda, dihentikan, atau gagal. Hal ini memungkinkan pengguna melanjutkan pemutaran dalam waktu tunggu ini tanpa berisiko terkena pembatasan layanan latar depan di berbagai perangkat. Perhatikan bahwa hanya memanggil player.pause() tidak dapat lagi digunakan untuk menghentikan layanan latar depan sebelum stopSelf() saat mengganti onTaskRemoved, gunakan MediaSessionService.pauseAllPlayersAndStopSelf() sebagai gantinya.
    • Membuat notifikasi tetap terlihat saat pemutaran mengalami error atau berhenti. Notifikasi hanya akan dihapus jika playlist dihapus atau pemutar dirilis.
    • Meningkatkan penanganan tindakan MediaSession platform Android ACTION_PLAY dan ACTION_PAUSE untuk hanya menetapkan salah satunya sesuai dengan perintah yang tersedia dan juga menerima jika hanya salah satunya yang ditetapkan.
    • Menambahkan Context sebagai parameter ke MediaButtonReceiver.shouldStartForegroundService (#1887).
    • Memperbaiki bug saat memanggil metode Player pada MediaController yang terhubung ke sesi lama akan menghapus perubahan dari update yang tertunda.
    • Membuat MediaSession.setSessionActivity(PendingIntent) menerima null (#2109).
    • Memperbaiki bug yang menyebabkan notifikasi usang tetap terlihat saat playlist dihapus (#2211).
  • UI:
    • Tambahkan holder status dan composable ke modul media3-ui-compose untuk PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState, dan PlaybackSpeedState.
  • Download:
    • Memperbaiki bug di CacheWriter yang menyebabkan sumber data tetap terbuka dan area cache terkunci jika sumber data menampilkan Exception selain IOException (#9760).
  • Ekstensi HLS:
    • Tambahkan versi pertama HlsInterstitialsAdsLoader. Loader iklan membaca interstisial HLS dari playlist media HLS dan memetakannya ke AdPlaybackState yang diteruskan ke AdsMediaSource. Versi awal ini hanya mendukung streaming VOD HLS dengan atribut X-ASSET-URI.
    • Menambahkan HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Aplikasi dapat menggunakannya untuk membuat instance AdsMediaSource yang menggunakan HlsInterstitialsAdsLoader dengan cara yang mudah dan aman.
    • Mengurai tag SUPPLEMENTAL-CODECS dari playlist HLS untuk mendeteksi format Dolby Vision (#1785).
    • Melonggarkan kondisi untuk mencari posisi sinkronisasi dalam streaming HLS (#2209).
  • Ekstensi DASH:
    • Menambahkan dukungan format AC-4 Level-4 untuk DASH (#1898).
    • Memperbaiki masalah saat menghitung interval update untuk penyisipan iklan di live stream multi-periode (#1698).
    • Mengurai atribut scte214:supplementalCodecs dari manifes DASH untuk mendeteksi format Dolby Vision (#1785).
    • Meningkatkan penanganan transisi periode dalam live stream yang periodenya berisi sampel media di luar durasi periode yang dideklarasikan (#1698).
    • Memperbaiki masalah saat kumpulan adaptasi yang ditandai dengan adaptation-set-switching, tetapi bahasa atau flag peran yang berbeda digabungkan (#2222).
  • Ekstensi decoder (FFmpeg, VP9, AV1, dll.):
    • Menambahkan modul dekoder MPEG-H yang menggunakan dekoder MPEG-H bawaan untuk mendekode audio MPEG-H (#1826).
  • Ekstensi MIDI:
    • Hubungkan instance AudioSink dan AudioRendererEventListener kustom ke MidiRenderer.
  • Ektensi Cast:
    • Meningkatkan dependensi play-services-cast-framework ke 21.5.0 untuk memperbaiki error FLAG_MUTABLE di aplikasi yang menargetkan API 34+ pada perangkat yang menginstal layanan Google Play, tetapi dinonaktifkan (#2178).
  • Aplikasi demo:
    • Perluas demo-compose dengan tombol tambahan dan sempurnakan integrasi PlayerSurface dengan dukungan penskalaan dan shutter.
  • Menghapus simbol yang tidak digunakan lagi:
    • Menghapus metode AudioMixer.create() yang tidak digunakan lagi. Sebagai gantinya, gunakan DefaultAudioMixer.Factory().create().
    • Menghapus metode Transformer.Builder yang tidak digunakan lagi berikut:
      • setTransformationRequest(), gunakan setAudioMimeType(), setVideoMimeType(), dan setHdrMode().
      • setAudioProcessors(), tetapkan pemroses audio di EditedMediaItem.Builder.setEffects(), dan teruskan ke Transformer.start().
      • setVideoEffects(), tetapkan efek video di EditedMediaItem.Builder.setEffects(), dan teruskan ke Transformer.start().
      • setRemoveAudio(), gunakan EditedMediaItem.Builder.setRemoveAudio() untuk menghapus audio dari EditedMediaItem yang diteruskan ke Transformer.start().
      • setRemoveVideo(), gunakan EditedMediaItem.Builder.setRemoveVideo() untuk menghapus video dari EditedMediaItem yang diteruskan ke Transformer.start().
      • setFlattenForSlowMotion(), gunakan EditedMediaItem.Builder.setFlattenForSlowMotion() untuk meratakan EditedMediaItem yang diteruskan ke Transformer.start().
      • setListener(), gunakan addListener(), removeListener(), atau removeAllListeners().
    • Menghapus metode Transformer.Listener yang tidak digunakan lagi berikut:
      • onTransformationCompleted(MediaItem), gunakan onCompleted(Composition, ExportResult) sebagai gantinya.
      • onTransformationCompleted(MediaItem, TransformationResult), gunakan onCompleted(Composition, ExportResult) sebagai gantinya.
      • onTransformationError(MediaItem, Exception), gunakan onError(Composition, ExportResult, ExportException) sebagai gantinya.
      • onTransformationError(MediaItem, TransformationException), gunakan onError(Composition, ExportResult, ExportException) sebagai gantinya.
      • onTransformationError(MediaItem, TransformationResult, TransformationException), gunakan onError(Composition, ExportResult, ExportException) sebagai gantinya.
      • onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest), gunakan onFallbackApplied(Composition, TransformationRequest, TransformationRequest) sebagai gantinya.
    • Hapus class TransformationResult yang tidak digunakan lagi. Sebagai gantinya, gunakan ExportResult.
    • Hapus class TransformationException yang tidak digunakan lagi. Sebagai gantinya, gunakan ExportException.
    • Menghapus Transformer.PROGRESS_STATE_NO_TRANSFORMATION yang tidak digunakan lagi. Sebagai gantinya, gunakan Transformer.PROGRESS_STATE_NOT_STARTED.
    • Menghapus Transformer.setListener() yang tidak digunakan lagi. Sebagai gantinya, gunakan Transformer.addListener(), Transformer.removeListener(), atau Transformer.removeAllListeners().
    • Menghapus Transformer.startTransformation() yang tidak digunakan lagi. Sebagai gantinya, gunakan Transformer.start(MediaItem, String).
    • Menghapus SingleFrameGlShaderProgram yang tidak digunakan lagi. Sebagai gantinya, gunakan BaseGlShaderProgram.
    • Menghapus Transformer.flattenForSlowMotion. Sebagai gantinya, gunakan EditedMediaItem.flattenForSlowMotion.
    • Menghapus ExoPlayer.VideoComponent, ExoPlayer.AudioComponent, ExoPlayer.TextComponent, dan ExoPlayer.DeviceComponent.
    • androidx.media3.exoplayer.audio.SonicAudioProcessor dihapus.
    • Menghapus metode DownloadHelper yang tidak digunakan lagi berikut:
      • Konstruktor DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), gunakan DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList) sebagai gantinya.
      • getRendererCapabilities(RenderersFactory), fungsi yang setara dapat dicapai dengan membuat DefaultRendererCapabilitiesList dengan RenderersFactory, dan memanggil DefaultRendererCapabilitiesList.getRendererCapabilities().
      • Menghapus metode PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat). Gunakan PlayerNotificationManager.setMediaSessionToken(MediaSession.Token) dan teruskan (MediaSession.Token) compatToken.getToken() sebagai gantinya.

1.6.0-rc02

19 Maret 2025

Gunakan versi stabil 1.6.0.

1.6.0-rc01

12 Maret 2025

Gunakan versi stabil 1.6.0.

1.6.0-beta01

26 Februari 2025

Gunakan versi stabil 1.6.0.

Versi 1.6.0-alpha03

6 Februari 2025

Gunakan versi stabil 1.6.0.

Versi 1.6.0-alpha02

30 Januari 2025

Gunakan versi stabil 1.6.0.

Versi 1.6.0-alpha01

20 Desember 2024

Gunakan versi stabil 1.6.0.

Versi 1.5

Versi 1.5.1

19 Desember 2024

androidx.media3:media3-*:1.5.1 dirilis. Versi 1.5.1 berisi commit ini.

  • ExoPlayer:
    • Menonaktifkan penggunaan dekripsi asinkron di MediaCodec untuk menghindari masalah waktu tunggu codec yang dilaporkan dengan API platform ini (#1641).
  • Ekstraktor:
    • MP3: Jangan menghentikan pemutaran lebih awal saat daftar isi frame VBRI tidak mencakup semua data MP3 dalam file (#1904).
  • Video:
    • Rollback penggunaan nilai rasio aspek piksel yang disediakan MediaCodecAdapter saat diberikan saat memproses onOutputFormatChanged (#1371).
  • Teks:
    • Memperbaiki bug di ReplacingCuesResolver.discardCuesBeforeTimeUs yang menyebabkan isyarat yang aktif di timeUs (dimulai sebelumnya, tetapi belum berakhir) salah dibuang (#1939).
  • Metadata:
    • Mengekstrak penomoran disk/lagu dan genre dari komentar Vorbis ke MediaMetadata (#1958).

Versi 1.5.0

27 November 2024

androidx.media3:media3-*:1.5.0 dirilis. Versi 1.5.0 berisi commit ini.

  • Library Umum:
    • Menambahkan ForwardingSimpleBasePlayer yang memungkinkan penerusan ke pemutar lain dengan penyesuaian kecil sekaligus memastikan konsistensi penuh dan penanganan pemroses (#1183).
    • Ganti metode SimpleBasePlayer.State.playlist dengan getPlaylist().
    • Tambahkan penggantian untuk SimpleBasePlayer.State.Builder.setPlaylist() guna menentukan Timeline serta Tracks dan Metadata saat ini secara langsung, bukan membuat struktur playlist.
    • Tingkatkan minSdk ke 21 (Android Lollipop). Hal ini selaras dengan semua library AndroidX lainnya.
    • Menambahkan artefak androidx.media3:media3-common-ktx yang menyediakan fungsi khusus Kotlin yang dibangun di atas library Common
    • Tambahkan fungsi ekstensi penangguhan Player.listen untuk memutar coroutine guna memproses Player.Events ke library media3-common-ktx.
    • Menghapus anotasi @DoNotInline dari class dalam yang tidak sejalan secara manual, yang dirancang untuk menghindari kegagalan verifikasi class runtime. Versi terbaru R8 kini otomatis melakukan out-of-line panggilan seperti ini untuk menghindari kegagalan runtime (sehingga out-of-line manual tidak lagi diperlukan). Semua pengguna Gradle library harus sudah menggunakan versi Plugin Android Gradle yang menggunakan versi R8 yang melakukan hal ini, karena compileSdk = 35. Pengguna library dengan sistem build non-Gradle harus memastikan langkah penyingkatan/obfuskasi yang setara dengan R8 melakukan proses out-of-lining otomatis yang serupa untuk menghindari kegagalan verifikasi class runtime. Perubahan ini sudah dilakukan di library AndroidX lainnya.
  • ExoPlayer:
    • MediaCodecRenderer.onProcessedStreamChange() kini dapat dipanggil untuk setiap item media. Sebelumnya, callback ini tidak dipanggil untuk item pertama. Gunakan MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart() untuk mengaktifkannya.
    • Menambahkan PreloadMediaSource.PreloadControl.onPreloadError untuk mengizinkan implementasi PreloadMediaSource.PreloadControl mengambil tindakan saat terjadi error.
    • Tambahkan BasePreloadManager.Listener untuk menyebarkan peristiwa pramuat ke aplikasi.
    • Mengizinkan perubahan waktu tunggu klien SNTP dan mencoba kembali alamat alternatif saat waktu tunggu habis (#1540).
    • Hapus MediaCodecAdapter.Configuration.flags karena kolom selalu bernilai nol.
    • Mengizinkan pengguna memilih speaker bawaan untuk pemutaran di Wear OS API 35+ (jika perangkat mengiklankan dukungan untuk ini).
    • Tunda panggilan pemblokiran ke Context.getSystemService(Context.AUDIO_SERVICE) hingga penanganan fokus audio diaktifkan. Hal ini memastikan panggilan pemblokiran tidak dilakukan jika penanganan fokus audio tidak diaktifkan (#1616).
    • Mengizinkan pemutaran terlepas dari durasi yang di-buffer saat pemuatan gagal (#1571).
    • Tambahkan AnalyticsListener.onRendererReadyChanged() untuk memberi sinyal saat perender individual mengizinkan pemutaran siap.
    • Memperbaiki MediaCodec.CryptoException yang terkadang dilaporkan sebagai "error runtime yang tidak terduga" saat MediaCodec dioperasikan dalam mode asinkron (perilaku default di API 31+).
    • Teruskan bufferedDurationUs, bukan bufferedPositionUs, dengan PreloadMediaSource.PreloadControl.onContinueLoadingRequested(). Juga mengubah DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS menjadi DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS, aplikasi kemudian perlu meneruskan nilai yang mewakili durasi tertentu dari posisi mulai default yang sumber medianya harus dipramuat dengan IntDef ini, bukan posisi.
    • Menambahkan implementasi ForwardingRenderer yang meneruskan semua panggilan metode ke perender lain (1703).
    • Menambahkan pramuat playlist untuk item berikutnya dalam playlist. Aplikasi dapat mengaktifkan pramuat dengan memanggil ExoPlayer.setPreloadConfiguration(PreloadConfiguration) sebagaimana mestinya. Secara default, pramuat dinonaktifkan. Jika diaktifkan dan agar tidak mengganggu pemutaran, DefaultLoadControl membatasi pramuat untuk memulai dan melanjutkan hanya saat pemutar tidak memuat untuk pemutaran. Aplikasi dapat mengubah perilaku ini dengan menerapkan LoadControl.shouldContinuePreloading() sebagaimana mestinya (seperti saat mengganti metode ini di DefaultLoadControl). Implementasi default LoadControl menonaktifkan pramuat jika aplikasi menggunakan implementasi kustom LoadControl.
    • Menambahkan metode MediaSourceEventListener.EventDispatcher.dispatchEvent() untuk memungkinkan pemanggilan peristiwa pemroses subclass (1736).
    • Tambahkan DefaultPreloadManager.Builder yang membangun instance DefaultPreloadManager dan ExoPlayer dengan konfigurasi bersama yang konsisten.
    • Hapus parameter Renderer[] dari LoadControl.onTracksSelected() karena implementasi DefaultLoadControl dapat mengambil jenis streaming dari ExoTrackSelection[].
    • Menghentikan penggunaan DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) dan menandai metode sebagai final untuk mencegah penggantian. Sebagai gantinya, DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]) baru harus digunakan.
    • Laporkan peristiwa MediaSourceEventListener dari sumber sekunder di MergingMediaSource. Hal ini akan menyebabkan peristiwa pemuatan dimulai/error/dibatalkan/selesai dilaporkan untuk subtitel yang di-sideload (yang ditambahkan dengan MediaItem.LocalConfiguration.subtitleConfigurations), yang mungkin muncul sebagai peristiwa pemuatan duplikat yang dikeluarkan dari AnalyticsListener.
    • Mencegah error subtitel & metadata menghentikan pemutaran sepenuhnya. Sebagai gantinya, trek yang bermasalah akan dinonaktifkan dan pemutaran trek yang tersisa akan dilanjutkan (#1722).
      • Dalam penanganan subtitel baru (selama ekstraksi), error penguraian (misalnya, data subtitel tidak valid) dan error pemuatan (misalnya, HTTP 404) yang terkait akan ditampilkan melalui callback onLoadError.
      • Dalam penanganan subtitel lama (selama rendering), hanya error pemuatan terkait yang ditampilkan melalui callback onLoadError, sedangkan error penguraian diabaikan secara otomatis (ini adalah perilaku yang sudah ada sebelumnya).
    • Memperbaiki bug saat item playlist atau periode dalam streaming DASH multi-periode dengan durasi yang tidak sesuai dengan konten sebenarnya dapat menyebabkan frame terhenti di akhir item (#1698).
    • Menambahkan setter ke SntpClient untuk menetapkan waktu berlalu maksimum sejak update terakhir setelah klien diinisialisasi ulang (#1794).
  • Transformator:
    • Tambahkan SurfaceAssetLoader, yang mendukung pengantrean data video ke Transformer melalui Surface.
    • ImageAssetLoader melaporkan input yang tidak didukung melalui AssetLoader.onError, bukan menampilkan IllegalStateException.
    • Wajibkan penetapan durasi gambar menggunakan MediaItem.Builder.setImageDurationMs untuk ekspor gambar.
    • Menambahkan dukungan ekspor untuk celah dalam urutan EditedMediaItem audio.
  • Pemilihan Trek:
    • DefaultTrackSelector: Lebih memilih audio berbasis objek daripada audio berbasis saluran jika faktor lainnya sama.
  • Ekstraktor:
    • Mengizinkan Mp4Extractor dan FragmentedMp4Extractor mengidentifikasi sampel H264 yang tidak digunakan sebagai referensi oleh sampel berikutnya.
    • Menambahkan opsi untuk mengaktifkan pencarian berbasis indeks di AmrExtractor.
    • Memperlakukan file MP3 dengan lebih dari 128 kB di antara frame yang valid sebagai terpotong (bukan tidak valid). Artinya, file dengan data non-MP3 di bagian akhir, tanpa metadata lain untuk menunjukkan panjang byte MP3, kini akan berhenti diputar di akhir data MP3, bukan gagal dengan ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
    • Memperbaiki penanganan sampel preroll untuk posisi awal media non-keyframe saat memproses daftar edit di file MP4 (#1659).
    • Peningkatan penghitungan kecepatan frame dengan menggunakan durasi media dari kotak mdhd di Mp4Extractor dan FragmentedMp4Extractor (#1531).
    • Memperbaiki penskalaan media_time yang salah dalam daftar edit MP4. Meskipun segment_duration sudah diskalakan dengan benar menggunakan skala waktu film, media_time kini diskalakan dengan benar menggunakan skala waktu trek, seperti yang ditentukan oleh standar format MP4 (#1792).
    • Menangani frame yang tidak berurutan dalam penghitungan endIndices untuk MP4 dengan daftar edit (#1797).
    • Memperbaiki penguraian durasi media dalam kotak mdhd file MP4 untuk menangani nilai -1 (#1819).
    • Menambahkan dukungan untuk mengidentifikasi kotak h263 dalam file MP4 untuk video H.263 (#1821).
    • Menambahkan dukungan format file media dasar ISO AC-4 Level-4 (#1265).
  • DataSource:
    • Mengupdate HttpEngineDataSource untuk mengizinkan penggunaan mulai dari ekstensi 7 versi S, bukan level API 34 (#1262).
    • DataSourceContractTest: Menyatakan bahwa DataSource.getUri() menampilkan URI yang di-resolve (seperti yang didokumentasikan). Jika ini berbeda dengan URI yang diminta, pengujian dapat menunjukkan hal ini menggunakan metode DataSourceContractTest.TestResource.Builder.setResolvedUri() baru.
    • DataSourceContractTest: Menegaskan bahwa DataSource.getUri() dan getResponseHeaders() menampilkan nilai 'open' setelah panggilan yang gagal ke open() (karena resource 'tidak ditemukan') dan sebelum panggilan close() berikutnya.
      • Mengganti DataSourceContractTest.getNotFoundResources() memungkinkan sub-class pengujian menyediakan beberapa resource 'tidak ditemukan', dan menyediakan header yang diharapkan juga. Hal ini memungkinkan untuk membedakan antara HTTP 404 (dengan header) dan "server tidak ditemukan" (tanpa header).
  • Audio:
    • Konfigurasikan metadata kenyaringan CTA-2075 secara otomatis pada codec jika ada di media.
    • Memastikan penurunan volume yang lancar saat mencari.
    • Memperbaiki suara letupan yang mungkin terjadi selama pencarian.
    • Memperbaiki akumulasi error pemotongan untuk algoritma peregangan waktu/pergeseran nada Sonic.
    • Memperbaiki bug di SpeedChangingAudioProcessor yang menyebabkan frame output terputus.
  • Video:
    • MediaCodecVideoRenderer menghindari pendekodean sampel yang tidak dirender atau digunakan sebagai referensi oleh sampel lain.
    • Pada API 35 dan yang lebih tinggi, MediaCodecAdapter kini dapat menerima null Surface di configure dan panggilan ke metode baru detachOutputSurface untuk menghapus Surface yang ditetapkan sebelumnya jika codec mendukung hal ini (MediaCodecInfo.detachedSurfaceSupported).
    • Menggunakan nilai rasio aspek piksel yang disediakan MediaCodecAdapter jika diberikan saat memproses onOutputFormatChanged (#1371).
    • Menambahkan solusi untuk masalah perangkat di Galaxy Tab S7 FE yang menyebabkan streaming H264 aman 60 fps ditandai sebagai tidak didukung (#1619).
    • Menambahkan solusi untuk codec yang macet setelah sampel terakhir tanpa menampilkan sinyal akhir streaming.
  • Teks:
    • Menambahkan VoiceSpan kustom dan mengisinya untuk rentang suara WebVTT (#1632).
    • Memastikan WebVTT di HLS dengan stempel waktu subtitel yang sangat besar (yang melebihi kapasitas long 64-bit saat direpresentasikan sebagai mikrodetik dan dikalikan dengan timebase MPEG 90,000) ditampilkan (#1763).
    • Mendukung subtitel CEA-608 dalam konten Dolby Vision (#1820).
    • Memperbaiki pemutaran yang berhenti di streaming multi-periode DASH saat subtitel CEA-608 diaktifkan (#1863).
  • Metadata:
    • Tetapkan jenis C.TRACK_TYPE_METADATA ke trek yang berisi konten icy atau vnd.dvb.ait.
  • Gambar:
    • Tambahkan ExternallyLoadedImageDecoder untuk integrasi yang disederhanakan dengan library pemuatan gambar eksternal seperti Glide atau Coil.
  • DataSource:
    • Menambahkan FileDescriptorDataSource, DataSource baru yang dapat digunakan untuk membaca dari FileDescriptor (#3757).
  • Efek:
    • Menambahkan solusi DefaultVideoFrameProcessor untuk penskalaan SurfaceTexture minor. SurfaceTexture dapat menyertakan penskalaan kecil yang memotong batas 1-texel di sekitar tepi buffer yang dipangkas. Hal ini sekarang ditangani sehingga output lebih mendekati yang diharapkan.
    • Percepat DefaultVideoFrameProcessor.queueInputBitmap(). Hasilnya, mengekspor gambar ke video dengan Transformer akan lebih cepat.
  • Ekstensi IMA:
    • Memperbaiki bug ketika menghapus playlist dapat menyebabkan ArrayIndexOutOfBoundsException di ImaServerSideAdInsertionMediaSource.
    • Memperbaiki bug saat streaming DAI yang disisipkan di sisi server tanpa pre-roll dapat menyebabkan ArrayIndexOutOfBoundsException saat diputar setelah mid-roll terakhir (#1741).
  • Sesi:
    • Tambahkan MediaButtonReceiver.shouldStartForegroundService(Intent) untuk mengizinkan aplikasi menyembunyikan perintah putar yang masuk untuk melanjutkan pemutaran dengan mengganti metode ini. Secara default, layanan selalu dimulai dan pemutaran tidak dapat disembunyikan tanpa sistem mengalami error pada layanan dengan ForegroundServiceDidNotStartInTimeException (#1528).
    • Memperbaiki bug yang menyebabkan perintah kustom yang dikirim dari MediaBrowser dikirim ke MediaSessionCompat.Callback, bukan varian MediaBrowserServiceCompat dari metode saat terhubung ke layanan lama. Hal ini mencegah MediaBrowser menerima nilai yang ditampilkan sebenarnya yang dikirim kembali oleh layanan lama (#1474).
    • Menangani IllegalArgumentException yang ditampilkan oleh perangkat dari produsen tertentu saat menyetel penerima siaran untuk intent tombol media (#1730).
    • Menambahkan tombol perintah untuk item media. Tindakan ini akan menambahkan Media3 API untuk hal yang sebelumnya dikenal sebagai Custom browse actions dengan library lama dengan MediaBrowserCompat. Perhatikan bahwa dengan Media3, tombol perintah untuk item media tersedia untuk MediaBrowser dan MediaController. Lihat Mengimplementasikan tindakan penjelajahan kustom. * Memperbaiki bug saat pengontrol Media3 terkadang tidak dapat mengizinkan aplikasi sesi memulai layanan latar depan setelah meminta play().
    • Batasi CommandButton.Builder.setIconUri agar hanya menerima URI konten.
    • Teruskan petunjuk koneksi browser Media3 ke MediaBrowserCompat awal saat terhubung ke MediaBrowserCompat lama. Layanan dapat menerima petunjuk koneksi yang diteruskan sebagai petunjuk root dengan panggilan pertama ke onGetRoot().
    • Memperbaiki bug saat MediaBrowser yang terhubung ke layanan browser lama, tidak menerima error yang dikirim oleh layanan setelah browser berlangganan parentid.
    • Meningkatkan perilaku interoperabilitas, sehingga browser Media3 yang terhubung ke MediaBrowserService lama tidak meminta turunan parentId dua kali saat berlangganan ke induk.
  • UI:
    • Membuat video yang direntangkan/dipangkas dalam solusi PlayerView-in-Compose-AndroidView diikutsertakan, karena masalah dengan transisi bersama berbasis XML. Aplikasi yang menggunakan PlayerView di dalam AndroidView harus memanggil PlayerView.setEnableComposeSurfaceSyncWorkaround untuk mengaktifkan (#1237, #1594).
    • Menambahkan setFullscreenButtonState ke PlayerView untuk mengizinkan update ikon tombol layar penuh sesuai permintaan, yaitu out-of-band dan tidak reaktif terhadap interaksi klik (#1590, #184).
    • Memperbaiki bug saat pilihan "None" (Tidak ada) dalam pilihan teks tidak berfungsi jika ada preferensi pilihan trek teks yang ditentukan aplikasi.
  • Ekstensi DASH:
    • Menambahkan dukungan untuk periode yang dimulai di tengah segmen (#1440).
  • Ekstensi Smooth Streaming:
    • Memperbaiki error Bad magic number for Bundle saat memutar streaming SmoothStreaming dengan trek teks (#1779).
  • Ekstensi RTSP:
    • Memperbaiki penghapusan info pengguna untuk URL yang berisi karakter @ yang dienkode (#1138).
    • Memperbaiki error saat mengurai paket RTP dengan ekstensi header (#1225).
  • Ekstensi Decoder (FFmpeg, VP9, AV1, dll.):
    • Menambahkan modul decoder IAMF, yang memberikan dukungan untuk pemutaran file MP4 yang berisi trek IAMF menggunakan library native libiamf untuk menyintesis audio.
      • Pemutaran diaktifkan dengan tata letak stereo serta 5.1 dengan spasialisasi bersama dengan pelacakan gerak kepala opsional yang diaktifkan, tetapi dukungan pemutaran binaural saat ini tidak tersedia.
    • Menambahkan dukungan halaman 16 KB untuk ekstensi dekoder di Android 15 (#1685).
  • Ekstensi Cast:
    • Berhenti membersihkan linimasa setelah CastSession terputus, sehingga aplikasi pengirim dapat melanjutkan pemutaran secara lokal setelah koneksi terputus.
    • Isi DeviceInfo CastPlayer saat Context diberikan. Hal ini memungkinkan penautan MediaSession ke RoutingSession, yang diperlukan untuk mengintegrasikan Pengalih Output (#1056).
  • Utilitas Pengujian:
    • DataSourceContractTest kini menyertakan pengujian untuk memverifikasi:
      • Streaming input read position diperbarui.
      • Buffer output offset diterapkan dengan benar.
  • Aplikasi demo
    • Mengatasi kebocoran memori di aplikasi berdurasi singkat demo (#1839).
  • Menghapus simbol yang tidak digunakan lagi:
    • Menghapus Player.hasPrevious, Player.hasPreviousWindow() yang tidak digunakan lagi. Gunakan Player.hasPreviousMediaItem() sebagai gantinya.
    • Menghapus metode Player.previous() yang tidak digunakan lagi. Sebagai gantinya, gunakan Player.seekToPreviousMediaItem().
    • Menghapus metode DrmSessionEventListener.onDrmSessionAcquired yang tidak digunakan lagi.
    • Menghapus konstruktor DefaultEncoderFactory yang tidak digunakan lagi. Sebagai gantinya, gunakan DefaultEncoderFactory.Builder.

Versi 1.5.0-rc02

19 November 2024

Gunakan versi stabil 1.5.0.

Versi 1.5.0-rc01

13 November 2024

Gunakan versi stabil 1.5.0.

Versi 1.5.0-beta01

30 Oktober 2024

Gunakan versi stabil 1.5.0.

Versi 1.5.0-alpha01

10 September 2024

Gunakan versi stabil 1.5.0.

Versi 1.4.0

Versi 1.4.1

27 Agustus 2024

androidx.media3:media3-*:1.4.1 dirilis. Versi 1.4.1 berisi commit ini.

  • ExoPlayer:
    • Menangani callback pramuat secara asinkron di PreloadMediaSource (#1568).
    • Mengizinkan pemutaran terlepas dari durasi yang di-buffer saat pemuatan gagal (#1571).
  • Ekstraktor:
    • MP3: Memperbaiki error Searched too many bytes dengan mengabaikan data non-MP3 di bagian akhir dengan benar berdasarkan kolom panjang dalam frame Info (#1480).
  • Teks:
    • TTML: Memperbaiki penanganan nilai tts:fontSize persentase untuk memastikan nilai tersebut diwarisi dengan benar dari node induk dengan nilai tts:fontSize persentase.
    • Memperbaiki IndexOutOfBoundsException di LegacySubtitleUtil karena penanganan yang salah terhadap kasus waktu mulai output yang diminta lebih besar dari atau sama dengan waktu peristiwa akhir di Subtitle (#1516).
  • DRM:
    • Memperbaiki error android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE di perangkat API 31+ yang memutar konten Widevine L1. Error ini disebabkan oleh implementasi metode MediaDrm.requiresSecureDecoder framework yang tidak lengkap (#1603).
  • Efek:
    • Tambahkan metode release() ke GlObjectsProvider.
  • Sesi:
    • Mengubah ketuk dua kali KEYCODE_HEADSETHOOK menjadi tindakan 'cari berikutnya', seperti yang didokumentasikan (#1493).
    • Menangani KEYCODE_HEADSETHOOK sebagai perintah 'putar' di MediaButtonReceiver saat memutuskan apakah akan mengabaikannya untuk menghindari ForegroundServiceDidNotStartInTimeException (#1581).
  • Ekstensi RTSP:
    • Melewati Deskripsi Media yang tidak valid dalam penguraian SDP (#1087).

Versi 1.4.0

25 Juli 2024

androidx.media3:media3-*:1.4.0 dirilis. Versi 1.4.0 berisi commit ini.

  • Library Umum:
    • Meneruskan panggilan pencarian yang dianggap tidak beroperasi ke metode BasePlayer.seekTo() dan SimpleBasePlayer.handleSeek() yang dilindungi, bukan mengabaikannya. Jika menerapkan metode ini di pemutar kustom, Anda mungkin perlu menangani panggilan tambahan ini dengan mediaItemIndex == C.INDEX_UNSET.
    • Menghapus dependensi kompilasi pada desugaring Java 8 yang ditingkatkan (#1312).
    • Pastikan durasi yang diteruskan ke MediaItem.Builder.setImageDurationMs() diabaikan untuk MediaItem non-gambar (seperti yang didokumentasikan).
    • Tambahkan Format.customData untuk menyimpan informasi kustom yang disediakan aplikasi tentang instance Format.
  • ExoPlayer:
    • Tambahkan BasePreloadManager yang mengoordinasikan pramuat untuk beberapa sumber berdasarkan prioritas yang ditentukan oleh rankingData-nya. Penyesuaian dapat dilakukan dengan memperluas class ini. Tambahkan DefaultPreloadManager yang menggunakan PreloadMediaSource untuk melakukan pramuat sampel media sumber ke dalam memori, dan menggunakan bilangan bulat rankingData yang menunjukkan indeks item di UI.
    • Menambahkan PlayerId ke sebagian besar metode LoadControl untuk memungkinkan implementasi LoadControl mendukung beberapa pemain.
    • Menghapus Buffer.isDecodeOnly() dan C.BUFFER_FLAG_DECODE_ONLY. Tidak perlu menetapkan flag ini karena perender dan dekoder akan memutuskan untuk melewati buffer berdasarkan stempel waktu. Implementasi Renderer kustom harus memeriksa apakah waktu buffering minimal BaseRenderer.getLastResetPositionUs() untuk memutuskan apakah sampel harus ditampilkan. Implementasi SimpleDecoder kustom dapat memeriksa isAtLeastOutputStartTimeUs() jika diperlukan atau menandai buffer lain dengan DecoderOutputBuffer.shouldBeSkipped untuk melewatinya.
    • Izinkan nilai null ditampilkan oleh TargetPreloadStatusControl.getTargetPreloadStatus(T) untuk menunjukkan agar tidak melakukan pramuat MediaSource dengan rankingData yang diberikan.
    • Menambahkan remove(MediaSource) ke BasePreloadManager.
    • Tambahkan reset() ke BasePreloadManager untuk merilis semua sumber penahanan sekaligus mempertahankan instance pengelola pramuat.
    • Tambahkan ExoPlayer.setPriority() (dan Builder.setPriority()) untuk menentukan nilai prioritas yang digunakan di PriorityTaskManager dan untuk kepentingan MediaCodec dari API 35.
    • Memperbaiki masalah terkait pembaruan waktu buffering ulang terakhir yang menyebabkan kunci bs (kehabisan buffer) yang salah di CMCD (#1124).
    • Tambahkan PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) untuk menunjukkan bahwa sumber telah dimuat hingga akhir. Hal ini memungkinkan DefaultPreloadManager dan implementasi PreloadMediaSource.PreloadControl kustom untuk melakukan pramuat sumber berikutnya atau melakukan tindakan lain.
    • Memperbaiki bug yang menyebabkan penghapusan bagian tanpa suara di akhir item dapat memicu pengecualian pemutaran.
    • Tambahkan clear ke PreloadMediaSource untuk menghapus periode pramuat.
    • Menambahkan kode error baru PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED yang digunakan saat resource codec diklaim kembali untuk tugas dengan prioritas lebih tinggi.
    • Mengizinkan AdsMediaSource memuat iklan pre-roll sebelum penyiapan media konten awal selesai (#1358).
    • Memperbaiki bug saat pemutaran dipindahkan ke STATE_ENDED saat menyiapkan ulang live stream DASH multi-periode setelah periode aslinya sudah dihapus dari manifes.
    • Mengganti nama onTimelineRefreshed() menjadi onSourcePrepared() dan onPrepared() menjadi onTracksSelected() di PreloadMediaSource.PreloadControl. Ganti juga nama IntDef di DefaultPreloadManager.Stage.
    • Menambahkan dukungan eksperimental untuk penjadwalan dinamis guna menyelaraskan pekerjaan dengan siklus bangun CPU dan menunda bangun hingga perender dapat melanjutkan proses. Anda dapat mengaktifkannya menggunakan experimentalSetDynamicSchedulingEnabled() saat menyiapkan instance ExoPlayer.
    • Menambahkan Renderer.getDurationToProgressUs(). Renderer dapat menerapkan metode ini untuk menampilkan durasi yang harus dimajukan oleh pemutaran ke ExoPlayer agar perender dapat melanjutkan. Jika ExoPlayer ditetapkan dengan experimentalSetDynamicSchedulingEnabled(), ExoPlayer akan memanggil metode ini saat menghitung waktu untuk menjadwalkan tugas kerjanya.
    • Tambahkan MediaCodecAdapter#OnBufferAvailableListener untuk memberi tahu saat buffer input dan output tersedia untuk digunakan oleh MediaCodecRenderer. MediaCodecRenderer akan memberi sinyal kepada ExoPlayer saat menerima callback ini dan jika ExoPlayer disetel dengan experimentalSetDynamicSchedulingEnabled(), maka ExoPlayer akan menjadwalkan loop kerjanya karena perender dapat membuat progres.
    • Gunakan class data untuk metode LoadControl, bukan parameter individual.
    • Tambahkan ExoPlayer.isReleased() untuk memeriksa apakah Exoplayer.release() telah dipanggil.
    • Menambahkan ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() untuk mengonfigurasi posisi maksimum yang dicari seekToPrevious() ke item sebelumnya (#1425).
    • Memperbaiki beberapa inkonsistensi fokus audio, misalnya tidak melaporkan kehilangan fokus penuh atau sementara saat pemutar dijeda (#1436).
    • Memperbaiki potensi IndexOutOfBoundsException yang disebabkan oleh ekstraktor yang melaporkan trek tambahan setelah langkah persiapan awal (#1476).
    • Effects di ExoPlayer.setVideoEffect() akan menerima stempel waktu dengan offset perender yang dihapus (#1098).
    • Memperbaiki potensi IllegalArgumentException saat menangani error pemutar yang terjadi saat membaca lebih lanjut item playlist lain (#1483).
  • Transformator:
    • Tambahkan audioConversionProcess dan videoConversionProcess ke ExportResult yang menunjukkan cara pembuatan trek masing-masing dalam file output.
    • Melonggarkan pemeriksaan level H.264 pengoptimalan pemangkasan.
    • Menambahkan dukungan untuk beralih antara media input SDR dan HDR dalam urutan.
    • Menambahkan dukungan untuk efek audio tingkat komposisi.
    • Menambahkan dukungan untuk melakukan transcoding gambar Ultra HDR menjadi video HDR.
    • Memperbaiki masalah saat DefaultAudioMixer tidak menghasilkan jumlah byte yang benar setelah direset dan digunakan kembali.
    • Mengatasi bug decoder yang membatasi jumlah saluran audio pada stereo saat menangani input PCM.
    • Saat memilih trek di ExoPlayerAssetLoader, abaikan batasan jumlah saluran audio karena batasan tersebut hanya berlaku untuk pemutaran.
    • Ganti antarmuka androidx.media3.transformer.Muxer dengan androidx.media3.muxer.Muxer dan hapus androidx.media3.transformer.Muxer.
    • Memperbaiki pemuatan gambar HEIC dari skema URI konten. (#1373).
    • Sesuaikan durasi trek audio di AudioGraphInput untuk meningkatkan sinkronisasi AV.
    • Hapus kolom ExportResult.processedInputs. Jika Anda menggunakan kolom ini untuk detail codec, gunakan DefaultDecoderFactory.listener. Jika terjadi pengecualian codec, detail codec akan tersedia di ExportException.codecInfo.
  • Ekstraktor:
    • MPEG-TS: Melakukan roll forward perubahan yang memastikan frame terakhir dirender dengan meneruskan unit akses terakhir streaming ke antrean sampel (#7909). Menyertakan perbaikan untuk menyelesaikan masalah yang muncul di streaming HLS khusus frame I(#1150) dan streaming HLS H.262 (#1126).
    • MP3: Lebih memilih ukuran data dari frame Info daripada ukuran yang dilaporkan oleh aliran data yang mendasarinya (misalnya, ukuran file, atau header Content-Length HTTP). Hal ini membantu mengecualikan data trailer yang tidak dapat diputar (misalnya, gambar album) dari penghitungan pencarian kecepatan bit konstan, sehingga pencarian menjadi lebih akurat (#1376).
    • MP3: Menggunakan jumlah frame dan data lainnya dalam frame Info (jika ada) untuk menghitung kecepatan bit rata-rata untuk pencarian kecepatan bit konstan, bukan mengekstrapolasi dari kecepatan bit frame setelah frame Info, yang mungkin kecil secara artifisial, misalnya frame PCUT (#1376).
    • Memperbaiki ekstraksi format audio PCM dalam container AVI.
  • Audio:
    • Memperbaiki atribut encoding DTS:X Profile 2 untuk pemutaran passthrough (#1299).
    • Untuk pemutaran yang di-offload, reset kolom pelacakan untuk penyelesaian streaming di DefaultAudioSink sebelum memanggil AudioTrack.stop() agar AudioTrack.StreamEventCallback#onPresentationEnded mengidentifikasi dengan benar kapan semua data yang tertunda telah diputar.
    • Memperbaiki bug di SilenceSkippingAudioProcessor saat transisi antara berbagai format audio (misalnya stereo ke mono) dapat menyebabkan prosesor menampilkan pengecualian (#1352).
    • Terapkan MediaCodecAudioRenderer.getDurationToProgressUs() agar ExoPlayer akan menjadwalkan loop pekerjaan utamanya secara dinamis saat MediaCodecAudioRenderer dapat membuat progres.
  • Video:
    • Memperbaiki masalah saat Listener.onRenderedFirstFrame() tiba terlalu awal saat beralih platform di tengah pemutaran.
    • Memperbaiki logika penggantian dekoder untuk Dolby Vision agar dapat menggunakan dekoder AV1 yang kompatibel jika diperlukan (#1389).
    • Memperbaiki pengecualian codec yang mungkin disebabkan oleh pengaktifan perender video di tengah pemutaran.
  • Teks:
    • Memperbaiki masalah saat subtitel yang dimulai sebelum posisi pencarian dilewati. Masalah ini hanya diperkenalkan di Media3 1.4.0-alpha01.
    • Mengubah perilaku penguraian subtitel default sehingga terjadi selama ekstraksi, bukan selama rendering (lihat diagram arsitektur ExoPlayer untuk mengetahui perbedaan antara ekstraksi dan rendering).
      • Perubahan ini dapat diganti dengan memanggil MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) dan TextRenderer.experimentalSetLegacyDecodingEnabled(true). Baca dokumentasi tentang penyesuaian untuk mengetahui cara menghubungkan komponen ini ke instance ExoPlayer. Metode ini (dan semua dukungan untuk decoding subtitel lama) akan dihapus dalam rilis mendatang.
      • Aplikasi dengan implementasi SubtitleDecoder kustom harus mengupdatenya untuk mengimplementasikan SubtitleParser (dan SubtitleParser.Factory, bukan SubtitleDecoderFactory).
    • PGS: Memperbaiki decoding run-length untuk me-resolve 0 sebagai indeks warna, bukan nilai warna literal (#1367).
    • CEA-708: Abaikan nilai rowLock. Spesifikasi CEA-708-E S-2023 menyatakan bahwa rowLock dan columnLock harus diasumsikan benar, terlepas dari nilai yang ada dalam streaming (dukungan columnLock tidak diimplementasikan, sehingga secara efektif diasumsikan selalu salah).
      • Perubahan ini awalnya disertakan dalam catatan rilis 1.3.0-alpha01, tetapi tidak sengaja dikembalikan sebelum rilis 1.3.0-rc01. Masalah ini sekarang telah diperbaiki, sehingga perubahan tersebut tersedia lagi.
    • CEA-708: Menghindari penambahan baris baru duplikat oleh penanganan naif ExoPlayer terhadap perintah 'set pen location' (#1315).
    • Memperbaiki IllegalArgumentException dari LegacySubtitleUtil saat sampel subtitel WebVTT tidak berisi tanda, misalnya sebagai bagian dari streaming DASH (#1516).
  • Metadata:
    • Memperbaiki pemetaan MP4 ke tag pengurutan ID3. Sebelumnya, tag MP4 'album sort' (soal), 'artist sort' (soar), dan 'album artist sort' (soaa) salah dipetakan ke tag ID3 TSO2, TSOA, dan TSOP (#1302).
    • Memperbaiki pembacaan tag gnre (genre) dan tmpo (tempo) numerik MP4 (/iTunes) jika nilainya lebih dari satu byte.
    • Menyebarkan frame TCON ID3 ke MediaMetadata.genre (#1305).
  • Gambar:
    • Menambahkan dukungan untuk petak thumbnail DASH non-persegi (#1300).
    • Menambahkan dukungan untuk AVIF untuk API 34+.
    • Izinkan null sebagai parameter untuk ExoPlayer.setImageOutput() guna menghapus ImageOutput yang ditetapkan sebelumnya.
  • DataSource:
    • Terapkan dukungan untuk URI resource mentah android.resource://package/id dengan package berbeda dari paket aplikasi saat ini. Hal ini sebelumnya tidak didokumentasikan untuk berfungsi, tetapi merupakan cara yang lebih efisien untuk mengakses resource dalam paket lain daripada berdasarkan nama.
    • Periksa dengan cermat apakah url bukan null di konstruktor DataSpec. Parameter ini sudah dianotasi menjadi non-null.
    • Mengizinkan ByteArrayDataSource me-resolve URI ke array byte selama open(), bukan di-hard code saat konstruksi (#1405).
  • DRM:
    • Mengizinkan penetapan LoadErrorHandlingPolicy di DefaultDrmSessionManagerProvider (#1271).
  • Efek:
    • Mendukung beberapa perubahan kecepatan dalam EditedMediaItem atau Composition yang sama di SpeedChangeEffect.
    • Dukungan untuk output HLG dan PQ dari input bitmap ultra HDR.
    • Menambahkan dukungan untuk EGL_GL_COLORSPACE_BT2020_HLG_EXT, yang meningkatkan output platform HLG di ExoPlayer.setVideoEffect dan Debug SurfaceView Transformer.
    • Memperbarui implementasi matriks Overlay agar konsisten dengan dokumentasi dengan membalik nilai x dan y yang diterapkan di setOverlayFrameAnchor(). Jika menggunakan OverlaySettings.Builder.setOverlayFrameAnchor(), balikkan nilai x dan y-nya dengan mengalikannya dengan -1.
    • Memperbaiki bug yang menyebabkan TimestampWrapper error saat digunakan dengan ExoPlayer#setVideoEffects (#821).
    • Mengubah ruang kerja warna SDR default dari warna linear menjadi video SDR BT 709 elektrik. Berikan juga opsi ketiga untuk mempertahankan ruang warna asli.
    • Mengizinkan penentuan urutan z yang tidak tentu dari EditedMediaItemSequences (#1055).
    • Mempertahankan rentang luminans yang konsisten di berbagai konten HDR (menggunakan rentang HLG).
    • Menambahkan dukungan untuk overlay Ultra HDR (bitmap) pada konten HDR.
    • Mengizinkan efek SeparableConvolution digunakan sebelum API 26.
    • Hapus OverlaySettings.useHdr yang tidak digunakan karena rentang dinamis overlay dan frame harus cocok.
    • Menambahkan dukungan HDR untuk TextOverlay. Pencahayaan overlay teks dapat disesuaikan dengan OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • Ekstensi IMA:
    • Mempromosikan API yang diperlukan aplikasi untuk memutar streaming iklan DAI ke stabil.
    • Tambahkan replaceAdTagParameters(Map <String, String>) ke ImaServerSideAdInsertionMediaSource.AdLoader yang memungkinkan penggantian parameter tag iklan saat runtime.
    • Memperbaiki bug saat VideoAdPlayer.VideoAdPlayerCallback.onError() tidak dipanggil ketika terjadi error pemutar selama pemutaran iklan (#1334).
    • Menambahkan nomor versi IMA SDK menjadi 3.33.0 untuk memperbaiki NullPointerException saat menggunakan URI tag iklan data:// (#700).
  • Sesi:
    • Ubah default CommandButton.enabled menjadi true dan pastikan nilainya dapat tetap salah untuk pengontrol meskipun perintah terkait tersedia.
    • Menambahkan konstanta ikon untuk CommandButton yang harus digunakan, bukan resource ikon kustom.
    • Menambahkan MediaSessionService.isPlaybackOngoing() untuk memungkinkan aplikasi mengkueri apakah layanan perlu dihentikan di onTaskRemoved() (#1219).
    • Tambahkan MediaSessionService.pauseAllPlayersAndStopSelf() yang memudahkan untuk menjeda pemutaran semua sesi dan panggil stopSelf() untuk menghentikan siklus proses MediaSessionService.
    • Ganti MediaSessionService.onTaskRemoved(Intent) untuk memberikan implementasi default yang aman yang membuat layanan tetap berjalan di latar depan jika pemutaran sedang berlangsung atau menghentikan layanan jika tidak.
    • Menyembunyikan seekbar di notifikasi media untuk live stream dengan tidak menetapkan durasi ke metadata sesi platform (#1256).
    • Selaraskan konversi MediaMetadata ke MediaDescriptionCompat, untuk menggunakan urutan dan logika pilihan yang sama saat memilih properti metadata seperti di media1.
    • Menambahkan MediaSession.sendError() yang memungkinkan pengiriman error non-fatal ke pengontrol Media3. Saat menggunakan pengontrol notifikasi (lihat MediaSession.getMediaNotificationControllerInfo()), error kustom digunakan untuk memperbarui PlaybackState sesi platform ke status error dengan informasi error yang diberikan (#543).
    • Tambahkan MediaSession.Callback.onPlayerInteractionFinished() untuk memberi tahu sesi saat serangkaian interaksi pemain dari pengontrol tertentu selesai.
    • Tambahkan SessionError dan gunakan di SessionResult dan LibraryResult, bukan kode error, untuk memberikan informasi selengkapnya tentang error dan cara mengatasinya jika memungkinkan.
    • Publikasikan kode untuk aplikasi pengujian pengontrol media3 yang dapat digunakan untuk menguji interaksi dengan aplikasi yang memublikasikan sesi media.
    • Menyebarkan tambahan yang diteruskan ke MediaSession[Builder].setSessionExtras() media3 ke PlaybackStateCompat.getExtras() pengontrol media1.
    • Memetakan error fatal dan non-fatal ke dan dari sesi platform. PlaybackException dipetakan ke status error fatal PlaybackStateCompat. SessionError yang dikirim ke pengontrol notifikasi media dengan MediaSession.sendError(ControllerInfo, SessionError) dipetakan ke error non-fatal di PlaybackStateCompat yang berarti kode dan pesan error ditetapkan, tetapi status sesi platform tetap berbeda dengan STATE_ERROR.
    • Mengizinkan aktivitas sesi ditetapkan per pengontrol untuk mengganti aktivitas sesi global. Aktivitas sesi dapat ditentukan untuk pengontrol pada waktu koneksi dengan membuat ConnectionResult dengan AcceptedResultBuilder.setSessionActivivty(PendingIntent). Setelah terhubung, aktivitas sesi dapat diperbarui dengan MediaSession.setSessionActivity(ControllerInfo, PendingIntent).
    • Meningkatkan replikasi error panggilan ke MediaLibrarySession.Callback. Replikasi error kini dapat dikonfigurasi menggunakan MediaLibrarySession.Builder.setLibraryErrorReplicationMode() untuk memilih jenis error atau memilih tidak menggunakan replikasi error yang aktif secara default.
  • UI:
    • Menambahkan dukungan tampilan gambar ke PlayerView saat terhubung ke ExoPlayer (#1144).
    • Menambahkan penyesuaian berbagai ikon di PlayerControlView melalui atribut xml untuk memungkinkan drawable yang berbeda per instance PlayerView, bukan penggantian global (#1200).
    • Mengatasi bug platform yang menyebabkan video direntangkan/dipangkas saat menggunakan SurfaceView di dalam AndroidView Compose pada API 34 (#1237).
  • Download:
    • Memastikan bahwa DownloadHelper tidak membocorkan instance Renderer yang belum dirilis, yang pada akhirnya dapat menyebabkan aplikasi error dengan IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Ekstensi Cronet:
    • Perbaiki SocketTimeoutException di CronetDataSource. Di beberapa versi Cronet, permintaan yang diberikan oleh callback tidak selalu sama. Hal ini menyebabkan callback tidak selesai dan waktu tunggu permintaan habis (https://issuetracker.google.com/328442628).
  • Ekstensi HLS:
    • Memperbaiki bug saat sampel EMSG tertunda yang menunggu diskontinuitas didelegasikan di HlsSampleStreamWrapper dengan offset yang salah sehingga menyebabkan IndexOutOfBoundsException atau IllegalArgumentException (#1002).
    • Memperbaiki bug yang menyebabkan playlist non-utama terus dimuat ulang untuk streaming LL-HLS (#1240).
    • Memperbaiki bug saat mengaktifkan CMCD untuk HLS dengan segmen inisialisasi yang menghasilkan Source Error dan IllegalArgumentException.
    • Memperbaiki bug yang menyebabkan playlist yang diputar non-primer tidak dimuat ulang selama pemutaran live (#1240).
    • Memperbaiki bug saat mengaktifkan CMCD untuk live stream HLS menyebabkan ArrayIndexOutOfBoundsException (#1395).
  • Ekstensi DASH:
    • Memperbaiki bug saat menyiapkan ulang live stream multi-periode dapat memunculkan IndexOutOfBoundsException (#1329).
    • Menambahkan dukungan untuk URL lisensi dashif:Laurl (#1345).
  • Ekstensi Cast:
    • Memperbaiki bug yang mengonversi judul album MediaQueueItem menjadi artis di item media Media3 (#1255).
  • Utilitas Pengujian:
    • Terapkan onInit() dan onRelease() di FakeRenderer.
    • Ubah metode TestPlayerRunHelper.runUntil()/playUntil() agar gagal pada error non-fatal (misalnya, yang dilaporkan ke AnalyticsListener.onVideoCodecError()). Gunakan rantai metode TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() baru untuk menonaktifkan perilaku ini.
  • Aplikasi demo:
    • Gunakan DefaultPreloadManager di aplikasi demo video pendek.
    • Mengizinkan setelan mode pengulangan dengan argumen Intent dari command line (#1266).
    • Gunakan HttpEngineDataSource sebagai HttpDataSource jika didukung oleh perangkat.
  • Menghapus simbol yang tidak digunakan lagi:
    • Menghapus CronetDataSourceFactory. Sebagai gantinya, gunakan CronetDataSource.Factory.
    • Menghapus beberapa konstruktor DataSpec. Sebagai gantinya, gunakan DataSpec.Builder.
    • Menghapus metode setContentTypePredicate(Predicate) dari DefaultHttpDataSource, OkHttpDataSource, dan CronetDataSource. Gunakan metode yang setara pada setiap XXXDataSource.Factory.
    • Menghapus konstruktor OkHttpDataSource dan OkHttpDataSourceFactory. Gunakan OkHttpDataSource.Factory sebagai gantinya.
    • Hapus PlayerMessage.setHandler(Handler). Sebagai gantinya, gunakan setLooper(Looper).
    • Hapus kolom Timeline.Window.isLive. Gunakan metode isLive().
    • Menghapus konstruktor DefaultHttpDataSource. Sebagai gantinya, gunakan DefaultHttpDataSource.Factory.
    • Menghapus DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS. Menggunakan DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS sebagai gantinya.
    • Hapus MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean). Sebagai gantinya, gunakan MediaCodecInfo.canReuseCodec(Format, Format).
    • Menghapus metode DrmSessionManager.DUMMY dan getDummyDrmSessionManager(). Gunakan DrmSessionManager.DRM_UNSUPPORTED sebagai gantinya.
    • Hapus AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format), VideoRendererEventListener.onVideoInputFormatChanged(Format). Gunakan overload yang menggunakan DecoderReuseEvaluation.
    • Menghapus IntDef RendererSupport.FormatSupport dan konstanta FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE, FORMAT_UNSUPPORTED_TYPE. Gunakan IntDef dan konstanta yang setara di androidx.media3.common.C sebagai gantinya (misalnya, C.FORMAT_HANDLED).
    • Hapus antarmuka Bundleable. Hal ini termasuk menghapus semua kolom konstanta Bundleable.Creator<Foo> CREATOR. Sebagai gantinya, pemanggil harus menggunakan metode Bundle toBundle() dan static Foo fromBundle(Bundle) pada setiap jenis.

Versi 1.4.0-rc01

10 Juli 2024

Gunakan versi stabil 1.4.0.

Versi 1.4.0-beta01

26 Juni 2024

Gunakan versi stabil 1.4.0.

Versi 1.4.0-alpha02

7 Juni 2024

Gunakan versi stabil 1.4.0.

Versi 1.4.0-alpha01

17 April 2024

Gunakan versi stabil 1.4.0.

Versi 1.3.0

Versi 1.3.1

11 April 2024

androidx.media3:media3-*:1.3.1 dirilis. Versi 1.3.1 berisi commit ini.

  • Library Umum:
    • Tambahkan Format.labels untuk mengizinkan label yang dilokalkan atau label alternatif lainnya.
  • ExoPlayer:
    • Memperbaiki masalah saat PreloadMediaPeriod tidak dapat mempertahankan streaming saat dimuat ulang.
    • Terapkan TrackSelectionResult yang sesuai dan benar ke periode pemutaran dalam pemilihan ulang trek.
    • Memulai perender yang diaktifkan lebih awal hanya setelah memajukan periode pemutaran saat bertransisi di antara item media (#1017).
    • Menambahkan jenis nilai yang ditampilkan yang tidak ada ke aturan -keepclasseswithmembers proguard untuk DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Transformator:
    • Menambahkan solusi untuk pengecualian yang ditampilkan karena MediaMuxer tidak mendukung stempel waktu presentasi negatif sebelum API 30.
  • Pemilihan Trek:
    • DefaultTrackSelector: Lebih memilih trek video dengan kecepatan frame 'yang wajar' (>=10 fps) daripada trek video dengan kecepatan frame yang lebih rendah atau tidak ditetapkan. Hal ini memastikan pemutar memilih trek video 'asli' dalam MP4 yang diekstrak dari foto motion (foto dengan gambar bergerak) yang dapat berisi dua trek HEVC, dengan salah satunya memiliki resolusi yang lebih tinggi, tetapi jumlah frame yang sangat kecil (#1051).
  • Ekstraktor:
    • Memperbaiki masalah saat padding tidak dilewati saat membaca potongan berukuran ganjil dari file WAV (#1117).
    • MP3: Isi Format.averageBitrate dari frame metadata seperti XING dan VBRI.
    • MPEG-TS: Mengembalikan perubahan yang bertujuan untuk memastikan frame terakhir dirender dengan meneruskan unit akses terakhir streaming ke antrean sampel (#7909). Hal ini karena perubahan tersebut menyebabkan masalah baru pada streaming HLS khusus I-frame (#1150) dan streaming HLS H.262 (#1126).
  • Audio:
    • Mengizinkan pemulihan perender dengan menonaktifkan pengurangan beban jika trek audio gagal melakukan inisialisasi dalam mode pengurangan beban.
  • Video:
    • Menambahkan solusi untuk masalah perangkat di Galaxy Tab S7 FE, Chromecast dengan Google TV, dan Lenovo M10 FHD Plus yang menyebabkan streaming H265 60 fps ditandai sebagai tidak didukung
    • Menambahkan solusi yang memastikan frame pertama selalu dirender saat tunneling meskipun perangkat tidak melakukannya secara otomatis seperti yang diwajibkan oleh API (#1169). (#966).
    • Memperbaiki masalah saat penanganan info warna HDR menyebabkan perilaku codec yang salah dan mencegah peralihan format adaptif untuk trek video SDR (#1158).
  • Teks:
    • WebVTT: Mencegah isyarat yang berurutan secara langsung membuat instance CuesWithTiming tambahan palsu dari WebvttParser.parse (#1177).
  • DRM:
    • Mengatasi NoSuchMethodError yang dapat ditampilkan oleh framework MediaDrm, bukan ResourceBusyException atau NotProvisionedException di beberapa perangkat Android 14 (#1145).
  • Efek:
    • Peningkatan pemetaan nuansa PQ ke SDR dengan mengonversi ruang warna.
  • Sesi:
    • Memperbaiki masalah saat posisi saat ini melompat kembali saat pengontrol mengganti item saat ini (#951).
    • Memperbaiki masalah saat MediaMetadata dengan extras yang tidak null tidak ditransmisikan antara pengontrol media dan sesi (#1176).
  • UI:
    • Kembali menyertakan nama bahasa trek audio jika Locale tidak dapat mengidentifikasi nama tampilan (#988).
  • Ekstensi DASH:
    • Mengisi semua elemen Label dari manifes ke Format.labels (#1054).
  • Ekstensi RTSP:
    • Melewati nilai informasi sesi kosong (i-tag) dalam penguraian SDP (#1087).
  • Ekstensi Decoder (FFmpeg, VP9, AV1, MIDI, dll.):
    • Nonaktifkan ekstensi MIDI sebagai dependensi lokal secara default karena memerlukan konfigurasi repositori Maven tambahan. Pengguna yang memerlukan modul ini dari dependensi lokal dapat mengaktifkannya kembali.

Versi 1.3.0

6 Maret 2024

androidx.media3:media3-*:1.3.0 dirilis. Versi 1.3.0 berisi commit ini.

  • Library Umum:
    • Terapkan dukungan untuk URI resource mentah android.resource://package/[type/]name dengan package berbeda dari paket aplikasi saat ini. Hal ini selalu didokumentasikan untuk berfungsi, tetapi tidak diimplementasikan dengan benar hingga sekarang.
    • Menormalisasi jenis MIME yang ditetapkan oleh kode aplikasi atau dibaca dari media agar sepenuhnya menggunakan huruf kecil.
    • Tentukan iklan dengan MediaItem lengkap, bukan satu Uri di AdPlaybackState.
    • Tingkatkan minSdk ke 19 (Android KitKat). Hal ini selaras dengan semua library AndroidX lainnya, dan diperlukan agar kami dapat mengupgrade ke versi terbaru dependensi AndroidX.
    • Mengisi artworkUri dan artworkData di MediaMetadata.Builder.populate(MediaMetadata) jika setidaknya salah satunya bukan null (#964).
  • ExoPlayer:
    • Menambahkan PreloadMediaSource dan PreloadMediaPeriod yang memungkinkan aplikasi memuat data sumber media konten di posisi awal tertentu sebelum pemutaran. PreloadMediaSource menangani penyiapan sumber media konten untuk menerima Timeline, menyiapkan dan meng-cache periode pada posisi awal yang ditentukan, memilih trek, dan memuat data media untuk periode tersebut. Aplikasi mengontrol progres pramuat dengan menerapkan PreloadMediaSource.PreloadControl dan menetapkan sumber yang dipramuat ke pemutar untuk pemutaran.
    • Menambahkan ExoPlayer.setImageOutput yang memungkinkan aplikasi menyetel ImageRenderer.ImageOutput.
    • DefaultRenderersFactory kini menyediakan ImageRenderer ke pemutar secara default dengan ImageOutput dan ImageDecoder.Factory.DEFAULT null.
    • Memunculkan peristiwa Player.Listener.onPositionDiscontinuity saat keheningan dilewati (#765).
    • Menambahkan dukungan eksperimental untuk mengurai subtitel selama ekstraksi. Anda dapat mengaktifkannya menggunakan MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Mendukung sumber media adaptif dengan PreloadMediaSource.
    • Terapkan HttpEngineDataSource, sebuah HttpDataSource menggunakan API HttpEngine.
    • Mencegah subclassing CompositeSequenceableLoader. Komponen ini sebelumnya dibuat dapat diperluas, tetapi tidak pernah dijadikan subclass dalam library. Penyesuaian dapat dilakukan dengan menggabungkan instance menggunakan pola dekorator dan mengimplementasikan CompositeSequenceableLoaderFactory kustom.
    • Memperbaiki masalah saat mengulangi waktu yang sama menyebabkan metadata dari item ini dihapus (#1007).
    • Mengganti nama metode experimentalSetSubtitleParserFactory di BundledChunkExtractor.Factory dan DefaultHlsExtractorFactory menjadi setSubtitleParserFactory dan melarang penerusan null. Gunakan metode experimentalParseSubtitlesDuringExtraction(boolean) baru untuk mengontrol perilaku penguraian.
    • Menambahkan dukungan untuk menyesuaikan SubtitleParser.Factory yang digunakan selama ekstraksi. Hal ini dapat dicapai dengan MediaSource.Factory.setSubtitleParserFactory().
    • Tambahkan awalan sumber ke semua kolom Format.id yang dihasilkan dari MergingMediaSource. Hal ini membantu mengidentifikasi sumber yang menghasilkan Format (#883).
    • Memperbaiki ekspresi reguler yang digunakan untuk memvalidasi nama kunci Common Media Client Data (CMCD) kustom dengan mengubahnya agar hanya memeriksa tanda hubung (#1028).
    • Menghentikan encoding ganda parameter kueri CMCD (#1075).
  • Transformator:
    • Menambahkan dukungan untuk meratakan video slow motion SEF H.265/HEVC.
    • Meningkatkan kecepatan transmuxing, terutama untuk pengeditan 'hapus video'.
    • Menambahkan API untuk memastikan bahwa file output dimulai pada frame video. Hal ini dapat membuat output operasi pemangkasan lebih kompatibel dengan implementasi pemutar yang tidak menampilkan frame video pertama hingga stempel waktu presentasinya (#829).
    • Menambahkan dukungan untuk mengoptimalkan operasi pemangkasan MP4 aset tunggal.
    • Tambahkan dukungan untuk memastikan frame video memiliki stempel waktu pertama dalam file output. Memperbaiki file output yang dimulai dengan frame hitam pada pemutar berbasis iOS (#829).
  • Pemilihan Trek:
    • Tambahkan DefaultTrackSelector.selectImageTrack untuk mengaktifkan pemilihan trek gambar.
    • Tambahkan TrackSelectionParameters.isPrioritizeImageOverVideoEnabled untuk menentukan apakah akan memilih trek gambar jika trek gambar dan trek video tersedia. Nilai defaultnya adalah false, yang berarti pemilihan trek video diprioritaskan.
  • Ekstraktor:
    • Menambahkan penguraian AV1C tambahan ke ekstraktor MP4 untuk mengambil nilai ColorInfo.colorSpace, ColorInfo.colorTransfer, dan ColorInfo.colorRange (#692).
    • MP3: Menggunakan pencarian kecepatan bit konstan (CBR) untuk file dengan header Info (CBR yang setara dengan header Xing). Sebelumnya, kami menggunakan tabel pencarian dari header Info, tetapi hal ini menghasilkan pencarian yang kurang akurat dibandingkan jika kami mengabaikannya dan mengasumsikan file tersebut adalah CBR.
    • MPEG2-TS: Menambahkan dukungan DTS, DTS-LBR, dan DTS:X Profile2 (#275).
    • Mengekstrak jenis audio dari deskriptor TS dan memetakannya ke flag peran, sehingga pengguna dapat membuat pilihan trek audio yang lebih tepat (#973).
  • Audio:
    • Meningkatkan algoritma lewati keheningan dengan peningkatan volume yang mulus; mempertahankan keheningan minimal dan durasi keheningan yang lebih alami (#7423).
    • Melaporkan bagian tanpa suara yang dilewati secara lebih deterministik (#1035).
  • Video:
    • Ubah konstruktor MediaCodecVideoRenderer yang menggunakan argumen VideoFrameProcessor.Factory dan ganti dengan konstruktor yang menggunakan argumen VideoSinkProvider. Aplikasi yang ingin memasukkan VideoFrameProcessor.Factory kustom dapat membuat instance CompositingVideoSinkProvider yang menggunakan VideoFrameProcessor.Factory kustom dan meneruskan penyedia sink video ke MediaCodecVideoRenderer.
  • Teks:
    • Memperbaiki serialisasi isyarat bitmap untuk mengatasi error Tried to marshall a Parcel that contained Binder objects saat menggunakan DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836).
    • CEA-708: Abaikan nilai rowLock. Spesifikasi CEA-708-E S-2023 menyatakan bahwa rowLock dan columnLock harus diasumsikan benar, terlepas dari nilai yang ada dalam streaming (dukungan columnLock tidak diimplementasikan, sehingga secara efektif diasumsikan selalu salah).
  • Gambar:
    • Menambahkan dukungan untuk thumbnail DASH. Gambar petak dipangkas dan thumbnail masing-masing disediakan untuk ImageOutput mendekati waktu presentasinya.
  • DRM:
    • Putar sampel 'clear lead' yang tidak dienkripsi dalam konten DRM secara langsung secara default, meskipun kunci untuk sampel terenkripsi berikutnya belum siap. Hal ini dapat menyebabkan penghentian di tengah pemutaran jika kunci masih belum siap saat posisi pemutaran mencapai sampel terenkripsi (tetapi sebelumnya pemutaran tidak akan dimulai sama sekali pada tahap ini). Perilaku ini dapat dinonaktifkan dengan MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey atau DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.
      • Ekstensi IMA:
    • Memperbaiki masalah saat iklan DASH dan HLS tanpa ekstensi file yang sesuai tidak dapat diputar.
  • Sesi:
    • Menonaktifkan deteksi klik dua kali untuk aplikasi TV (#962).
    • Memperbaiki masalah saat MediaItem.RequestMetadata dengan tambahan non-null saja tidak ditransmisikan antara pengontrol media dan sesi.
    • Menambahkan konstruktor ke MediaLibrarySession.Builder yang hanya menggunakan Context, bukan MediaLibraryService.
  • Ekstensi HLS:
    • Kurangi HlsMediaPeriod menjadi visibilitas paket pribadi. Jenis ini tidak boleh bergantung langsung dari luar paket HLS.
    • Menyelesaikan pencarian ke awal segmen dengan lebih efisien (#1031).
  • Ekstensi Decoder (FFmpeg, VP9, AV1, MIDI, dll.):
    • Dekoder MIDI: Mengabaikan pesan peristiwa SysEx (#710).
  • Utilitas Pengujian:
    • Jangan jeda pemutaran di TestPlayerRunHelper.playUntilPosition. Pengujian mempertahankan pemutaran dalam status pemutaran, tetapi menangguhkan progres hingga pengujian dapat menambahkan pernyataan dan tindakan lebih lanjut.
  • Aplikasi demo:
    • Menambahkan modul demo video pendek untuk mendemonstrasikan penggunaan PreloadMediaSource dengan kasus penggunaan konten video pendek.

Versi 1.3.0-rc01

22 Februari 2024

Gunakan versi stabil 1.3.0.

Versi 1.3.0-beta01

7 Februari 2024

Gunakan versi stabil 1.3.0.

Versi 1.3.0-alpha01

15 Januari 2024

Gunakan versi stabil 1.3.0.

Versi 1.2.0

Versi 1.2.1

9 Januari 2024

  • ExoPlayer:
    • Memperbaiki masalah saat pencarian manual di luar rentang LiveConfiguration.min/maxOffset terus menyesuaikan offset kembali ke min/maxOffset.
    • Memperbaiki masalah tata letak saluran OPUS dan VORBIS yang salah untuk 3, 5, 6, 7, dan 8 saluran (#8396).
    • Memperbaiki masalah saat pemilihan trek setelah pencarian ke nol dalam live stream secara tidak benar memungkinkan streaming dimulai pada posisi defaultnya (#9347).
    • Memperbaiki masalah saat instance baru CmcdData.Factory menerima nilai negatif untuk bufferedDurationUs dari sumber potongan, sehingga menghasilkan IllegalArgumentException (#888).
  • Transformator:
    • Mengatasi masalah saat encoder akan menampilkan error pada waktu konfigurasi karena menetapkan kecepatan operasi yang tinggi.
  • Ekstraktor:
    • Tandai trek HEVC sekunder (tidak dapat diputar) di foto motion (foto dengan gambar bergerak) JPEG sebagai ROLE_FLAG_ALTERNATE untuk mencegahnya dipilih secara otomatis untuk diputar karena resolusinya yang lebih tinggi.
    • Memperbaiki deteksi keyframe yang salah untuk streaming TS H264 (#864).
    • Memperbaiki estimasi durasi streaming TS yang lebih lama dari 47.721 detik (#855).
  • Audio:
    • Memperbaiki penanganan EOS untuk SilenceSkippingAudioProcessor saat dipanggil beberapa kali (#712).
  • Video:
    • Menambahkan solusi untuk masalah perangkat di Galaxy Tab S7 FE, Chromecast dengan Google TV, dan Lenovo M10 FHD Plus yang menyebabkan streaming AVC 60 fps ditandai sebagai tidak didukung (#693).
  • Metadata:
    • Memperbaiki bug saat MediaMetadata hanya diisi dari komentar Vorbis dengan kunci huruf besar (#876).
    • Menangkap OutOfMemoryError saat mengurai frame ID3 yang sangat besar, yang berarti pemutaran dapat dilanjutkan tanpa info tag, bukan pemutaran yang gagal sepenuhnya.
  • DRM:
    • Memperluas solusi untuk URL lisensi https://default.url ClearKey palsu ke API 33+ (sebelumnya solusi hanya diterapkan di API 33 persis) (#837).
    • Memperbaiki ERROR_DRM_SESSION_NOT_OPENED saat beralih dari konten terenkripsi ke konten yang tidak terenkripsi tanpa platform yang terpasang ke pemutar. Error ini terjadi karena penggunaan dekoder aman yang salah untuk memutar konten yang tidak dilindungi.
  • Sesi:
    • Menempatkan kunci dan nilai kustom di MediaMetadataCompat ke MediaMetadata.extras dan MediaMetadata.extras ke MediaMetadataCompat (#756, #802).
    • Memperbaiki penyiaran notifyChildrenChanged untuk pengontrol lama (#644).
    • Memperbaiki bug saat menyetel waktu negatif untuk timer setWhen yang dinonaktifkan pada notifikasi menyebabkan error di beberapa perangkat (#903).
    • Memperbaiki IllegalStateException saat pengontrol notifikasi media belum selesai terhubung saat update notifikasi pertama diminta (#917).
  • UI:
    • Memperbaiki masalah tombol maju dan mundur yang tidak terlihat saat digunakan dengan Desain Material di BottomSheetDialogFragment (#511).
    • Memperbaiki masalah saat angka di tombol maju cepat PlayerControlView tidak sejajar (#547).
  • Ekstensi DASH:
    • Mengurai "f800" sebagai jumlah saluran 5 untuk Dolby dalam manifes DASH (#688).
  • Ekstensi Decoder (FFmpeg, VP9, AV1, MIDI, dll.):
    • MIDI: Memperbaiki masalah saat pencarian maju melewati peristiwa Program Change (#704).
    • Bermigrasi ke FFmpeg 6.0 dan mengupdate NDK yang didukung ke r26b (#707, #867).
  • Ekstensi Cast:
    • Menyaring pembuatan Timeline agar tidak membuat aplikasi error saat pemuatan media gagal di perangkat transmisi (#708).

Versi 1.2.0

15 November 2023

  • Library Umum:
    • Tambahkan parameter @Nullable Throwable ke metode di antarmuka Log.Logger. Parameter message untuk metode ini tidak lagi berisi informasi apa pun tentang Throwable yang diteruskan ke metode Log.{d,i,w,e}(), sehingga implementasi harus menambahkan informasi ini secara manual jika diinginkan (mungkin menggunakan Logger.appendThrowableString(String, Throwable)).
    • Memperbaiki masalah kompatibilitas Kotlin saat parameter jenis generik nullable dan jenis elemen array nullable tidak terdeteksi sebagai nullable. Contohnya adalah parameter metode TrackSelectorResult dan SimpleDecoder (#6792).
    • Mengubah perilaku UI dan notifikasi default di Util.shouldShowPlayButton untuk menampilkan tombol "putar" saat pemutaran dihentikan sementara (misalnya, karena kehilangan fokus audio sementara). Perilaku lama dapat dipertahankan menggunakan PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) atau MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • Mengupgrade androidx.annotation:annotation-experimental ke 1.3.1 untuk memperbaiki https://issuetracker.google.com/251172715.
    • Memindahkan ExoPlayer.setAudioAttributes ke antarmuka Player.
  • ExoPlayer:
    • Memperbaiki masalah pencarian di streaming AC4 yang disebabkan oleh tidak mengidentifikasi sampel khusus dekode dengan benar (#11000).
    • Menambahkan penekanan pemutaran pada perangkat output audio yang tidak sesuai (misalnya, speaker bawaan di perangkat Wear OS) saat fitur ini diaktifkan melalui ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. Alasan penghentian pemutaran akan diperbarui sebagai Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT jika pemutaran dicoba saat tidak ada output audio yang sesuai, atau jika semua output yang sesuai terputus selama pemutaran. Alasan penekanan akan dihapus saat output yang sesuai terhubung.
    • Tambahkan MediaSource.canUpdateMediaItem dan MediaSource.updateMediaItem untuk menerima update MediaItem setelah pembuatan melalui Player.replaceMediaItem(s).
    • Mengizinkan update MediaItem untuk semua class MediaSource yang disediakan oleh library melalui Player.replaceMediaItem(s) (#33, #9978).
    • Mengganti nama MimeTypes.TEXT_EXOPLAYER_CUES menjadi MimeTypes.APPLICATION_MEDIA3_CUES.
    • Tambahkan PngExtractor yang mengirim dan membaca seluruh file PNG ke dalam TrackOutput sebagai satu sampel.
    • Tingkatkan metode SequenceableLoader.continueLoading(long) di antarmuka SequenceableLoader menjadi SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo berisi parameter tambahan, termasuk playbackSpeed dan lastRebufferRealtimeMs selain playbackPositionUs yang sudah ada.
    • Tingkatkan metode ChunkSource.getNextChunk(long, long, List, ChunkHolder) di antarmuka ChunkSource menjadi ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Menambahkan kolom tambahan ke logging Common Media Client Data (CMCD): kekurangan buffer (bs), batas waktu (dl), laju pemutaran (pr), dan startup (su) (#8699).
    • Menambahkan kedalaman bit luma dan chroma ke ColorInfo (#491).
    • Menambahkan kolom tambahan ke logging Common Media Client Data (CMCD): permintaan objek berikutnya (nor) dan permintaan rentang berikutnya (nrr) (#8699).
    • Menambahkan fungsi untuk mengirimkan data Common Media Client Data (CMCD) menggunakan parameter kueri (#553).
    • Memperbaiki ConcurrentModificationException di ExperimentalBandwidthMeter (#612).
    • Menambahkan parameter MediaPeriodId ke CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Mendukung ClippingMediaSource (dan sumber lain dengan selisih waktu periode/jendela) di ConcatenatingMediaSource2 (#11226).
    • Ubah BaseRenderer.onStreamChanged() agar juga menerima argumen MediaPeriodId.
  • Transformator:
    • Mengurai data rotasi EXIF untuk input gambar.
    • Menghapus jenis anotasi TransformationRequest.HdrMode dan konstanta terkaitnya. Sebagai gantinya, gunakan Composition.HdrMode dan konstanta terkaitnya.
    • Sederhanakan OverlaySettings untuk memperbaiki masalah rotasi.
    • Mengubah parameter frameRate dan durationUs dari SampleConsumer.queueInputBitmap menjadi TimestampIterator.
  • Pemilihan Trek:
    • Tambahkan DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness untuk secara eksplisit mengizinkan atau melarang adaptasi yang tidak lancar. Default-nya tetap pada perilaku saat ini, yaitu true.
  • Ekstraktor:
    • MPEG-TS: Memastikan frame terakhir dirender dengan meneruskan unit akses terakhir dari streaming ke antrean sampel (#7909).
    • Memperbaiki kesalahan ketik saat menentukan rotationDegrees. Mengubah projectionPosePitch menjadi projectionPoseRoll (#461).
    • Menghapus asumsi bahwa instance Extractor dapat langsung diperiksa dengan instanceof. Jika Anda ingin akses runtime ke detail implementasi Extractor, Anda harus memanggil Extractor.getUnderlyingInstance terlebih dahulu.
    • Menambahkan BmpExtractor.
    • Menambahkan WebpExtractor.
    • Menambahkan HeifExtractor.
    • Menambahkan dukungan QuickTime klasik ke Mp4Extractor.
  • Audio:
    • Menambahkan dukungan untuk PCM big-endian 24/32-bit di MP4 dan Matroska, serta mengurai encoding PCM untuk lpcm di MP4.
    • Menambahkan dukungan untuk mengekstrak audio Vorbis di MP4.
    • Tambahkan AudioSink.getFormatOffloadSupport(Format) yang mengambil tingkat dukungan offload yang dapat diberikan sink untuk format melalui DefaultAudioOffloadSupportProvider. Metode ini menampilkan AudioOffloadSupport baru yang berisi isFormatSupported, isGaplessSupported, dan isSpeedChangeSupported.
    • Tambahkan AudioSink.setOffloadMode() yang digunakan untuk mengonfigurasi konfigurasi offload pada sink audio. Default-nya adalah AudioSink.OFFLOAD_MODE_DISABLED.
    • Offload dapat diaktifkan melalui setAudioOffloadPreference di TrackSelectionParameters. Jika preferensi yang ditetapkan adalah mengaktifkan, perangkat mendukung offload untuk format, dan pemilihan trek adalah trek audio tunggal, maka offload audio akan diaktifkan.
    • Jika audioOffloadModePreference ditetapkan ke AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, DefaultTrackSelector hanya akan memilih trek audio dan hanya jika format trek tersebut didukung dalam offload. Jika tidak ada trek audio yang didukung dalam offload, tidak ada trek yang akan dipilih.
    • Menonaktifkan dukungan gapless untuk offload saat level pra-API 33 karena masalah posisi pemutaran setelah transisi trek.
    • Menghapus parameter enableOffload dari tanda tangan metode DefaultRenderersFactory.buildAudioSink.
    • Hapus metode DefaultAudioSink.Builder.setOffloadMode.
    • Hapus nilai intdef DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Menambahkan dukungan untuk metadata gapless Opus selama pemutaran offload.
    • Mengizinkan pemulihan perender dengan menonaktifkan offload jika gagal pada penulisan pertama (#627).
    • Aktifkan Penjadwalan Offload secara default untuk pemutaran yang di-offload khusus audio.
    • Hapus ExoPlayer.experimentalSetOffloadSchedulingEnabled dan AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • Mengganti nama onExperimentalSleepingForOffloadChanged menjadi onSleepingForOffloadChanged dan onExperimentalOffloadedPlayback menjadi onOffloadedPlayback.
    • Memindahkan antarmuka dan definisi TrackSelectionParameters terkait mode offload audio ke class AudioOffloadPreferences dalam.
    • Tambahkan callback onAudioTrackInitialized dan onAudioTrackReleased ke AnalyticsListener, AudioRendererEventListener, dan AudioSink.Listener.
    • Memperbaiki masalah underflow buffer audio DTS Express (#650).
    • Memperbaiki bug saat pemeriksaan kemampuan untuk E-AC3-JOC menampilkan IllegalArgumentException (#677).
  • Video:
    • Izinkan MediaCodecVideoRenderer menggunakan VideoFrameProcessor.Factory kustom.
    • Memperbaiki bug yang menyebabkan frame pertama tidak dapat dirender jika streaming audio dimulai dengan stempel waktu negatif (#291).
  • Teks:
    • Hapus ExoplayerCuesDecoder. Trek teks dengan sampleMimeType = application/x-media3-cues kini ditangani langsung oleh TextRenderer tanpa memerlukan instance SubtitleDecoder.
  • Metadata:
    • MetadataDecoder.decode tidak akan lagi dipanggil untuk sampel "hanya dekode" karena implementasinya harus menampilkan null.
  • Efek:
    • Tambahkan VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) yang mengantrekan input bitmap berdasarkan stempel waktu.
    • Ubah VideoFrameProcessor.registerInputStream() menjadi non-pemblokiran. Aplikasi harus menerapkan VideoFrameProcessor.Listener#onInputStreamRegistered().
    • Mengubah parameter frameRate dan durationUs dari VideoFrameProcessor.queueInputBitmap menjadi TimestampIterator.
  • Ekstensi IMA:
    • Memperbaiki bug saat live stream DASH multi-periode yang bukan item pertama dalam playlist dapat menampilkan pengecualian (#571).
    • Merilis StreamManager sebelum memanggil AdsLoader.destroy()
    • Menambahkan nomor versi IMA SDK menjadi 3.31.0.
  • Sesi:
    • Menetapkan perilaku layanan latar depan notifikasi ke FOREGROUND_SERVICE_IMMEDIATE di DefaultMediaNotificationProvider (#167).
    • Hanya gunakan android.media.session.MediaSession.setMediaButtonBroadcastReceiver() di atas API 31 untuk menghindari masalah dengan API yang tidak digunakan lagi di perangkat Samsung (#167).
    • Gunakan pengontrol notifikasi media sebagai proxy untuk menetapkan perintah yang tersedia dan tata letak kustom yang digunakan untuk mengisi notifikasi dan sesi platform.
    • Mengonversi peristiwa tombol media yang diterima oleh MediaSessionService.onStartCommand() dalam Media3, bukan merutekannya ke sesi platform dan kembali ke Media3. Dengan demikian, pengontrol penelepon selalu menjadi pengontrol notifikasi media dan aplikasi dapat dengan mudah mengenali panggilan yang berasal dari notifikasi dengan cara yang sama di semua level API yang didukung.
    • Memperbaiki bug saat MediaController.getCurrentPosition() tidak maju saat terhubung ke MediaSessionCompat lama.
    • Tambahkan MediaLibrarySession.getSubscribedControllers(mediaId) untuk memudahkan.
    • Ganti MediaLibrarySession.Callback.onSubscribe() untuk menyatakan ketersediaan ID induk yang berlangganan pengontrol. Jika berhasil, langganan akan diterima dan notifyChildrenChanged() akan segera dipanggil untuk memberi tahu browser (#561).
    • Menambahkan modul demo sesi untuk Automotive OS dan mengaktifkan demo sesi untuk Android Auto.
    • Jangan tetapkan antrean sesi framework jika COMMAND_GET_TIMELINE tidak tersedia untuk pengontrol notifikasi media. Dengan Android Auto sebagai pengontrol klien yang membaca dari sesi framework, hal ini menyebabkan tombol queue di UI Android Auto tidak ditampilkan (#339).
    • Menggunakan DataSourceBitmapLoader secara default, bukan SimpleBitmapLoader (#271, #327).
    • Menambahkan MediaSession.Callback.onMediaButtonEvent(Intent) yang memungkinkan aplikasi mengganti penanganan peristiwa tombol media default.
  • UI:
    • Tambahkan implementasi Player.Listener untuk perangkat Wear OS yang menangani penekanan pemutaran karena Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT dengan meluncurkan dialog sistem agar pengguna dapat menghubungkan output audio yang sesuai (misalnya, headphone bluetooth). Pemroses akan otomatis melanjutkan pemutaran jika perangkat yang sesuai terhubung dalam waktu tunggu yang dapat dikonfigurasi (defaultnya adalah 5 menit).
  • Download:
    • Menyatakan jenis layanan latar depan "sinkronisasi data" untuk DownloadService untuk kompatibilitas Android 14. Saat menggunakan layanan ini, aplikasi juga perlu menambahkan dataSync sebagai foregroundServiceType dalam manifes dan menambahkan izin FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • Ekstensi HLS:
    • Memuat ulang playlist live HLS dengan interval yang dihitung dari waktu mulai pemuatan terakhir, bukan waktu penyelesaian pemuatan terakhir (#663).
  • Ekstensi DASH:
    • Mengizinkan beberapa ID DASH yang sama di URL template segmen.
    • Menambahkan dukungan eksperimental untuk mengurai subtitel selama ekstraksi. Versi ini memiliki dukungan yang lebih baik untuk menggabungkan subtitel yang tumpang-tindih, termasuk menyelesaikan kedipan saat bertransisi di antara segmen subtitel. Anda dapat mengaktifkannya menggunakan DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Ekstensi RTSP:
    • Memperbaiki kondisi race yang dapat menyebabkan IndexOutOfBoundsException saat kembali ke TCP, atau pemutaran berhenti dalam beberapa situasi.
    • Memeriksa status dalam penyiapan RTSP saat menampilkan status pemuatan RtspMediaPeriod (#577).
    • Mengabaikan metode permintaan Rtsp kustom di header publik respons Options (#613).
    • Menggunakan nilai waktu tunggu Respons Penyiapan RTSP dalam interval waktu pengiriman permintaan Opsi RTSP keep-alive (#662).
  • Ekstensi Decoder (FFmpeg, VP9, AV1, MIDI, dll.):
    • Merilis modul dekoder MIDI, yang memberikan dukungan untuk pemutaran file MIDI standar menggunakan library Jsyn untuk menyintesis audio.
    • Menambahkan DecoderOutputBuffer.shouldBeSkipped untuk langsung menandai buffer output yang tidak perlu ditampilkan. Opsi ini lebih disukai daripada C.BUFFER_FLAG_DECODE_ONLY yang tidak akan digunakan lagi.
    • Menambahkan Decoder.setOutputStartTimeUs dan SimpleDecoder.isAtLeastOutputStartTimeUs untuk memungkinkan dekoder menghapus sampel khusus dekode sebelum waktu mulai. Ini harus lebih diutamakan daripada Buffer.isDecodeOnly yang tidak akan digunakan lagi.
    • Memperbaiki bug saat memublikasikan artefak dekoder MIDI ke repositori Maven. Artefak diganti namanya menjadi media3-exoplayer-midi (#734).
  • Ekstensi Leanback:
    • Memperbaiki bug saat menonaktifkan platform dapat menyebabkan ArithmeticException dalam kode Leanback (#617).
  • Utilitas Pengujian:
    • Membuat TestExoPlayerBuilder dan FakeClock kompatibel dengan pengujian UI Espresso dan pengujian UI Compose. Hal ini memperbaiki bug saat pemutaran berjalan secara non-deterministik selama interaksi tampilan Espresso atau Compose.
  • Menghapus simbol yang tidak digunakan lagi:
    • Hapus TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) dan TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Gunakan Composition.Builder.setHdrMode(int) dan teruskan Composition ke Transformer.start(Composition, String).
    • Hapus metode DownloadNotificationHelper.buildProgressNotification yang tidak digunakan lagi, gunakan metode yang tidak digunakan lagi yang menggunakan parameter notMetRequirements.

Versi 1.2.0-rc01

1 November 2023

Gunakan versi stabil 1.2.0.

Versi 1.2.0-beta01

19 Oktober 2023

Gunakan versi stabil 1.2.0.

Versi 1.2.0-alpha02

29 September 2023

Gunakan versi stabil 1.2.0.

Versi 1.2.0-alpha01

17 Agustus 2023

Gunakan versi stabil 1.2.0.

Versi 1.1.0

Versi 1.1.1

16 Agustus 2023

  • Library Umum:
    • Menghapus dependensi multidex yang tidak sengaja ditambahkan dari semua modul (#499).
  • ExoPlayer:
    • Memperbaiki masalah di PlaybackStatsListener saat PlaybackStats palsu dibuat setelah playlist dihapus.
    • Menambahkan kolom tambahan ke logging Common Media Client Data (CMCD): format streaming (sf), jenis streaming (st), versi (v), kecepatan bit teratas (tb), durasi objek (d), throughput terukur (mtp), dan jenis objek (ot) (#8699).
  • Audio:
    • Memperbaiki bug yang menyebabkan Player.getState() tidak pernah bertransisi ke STATE_ENDED saat memutar file yang sangat pendek (#538).
  • Offload Audio:
    • Menambahkan Halaman Header ID Ogg dan Header Komentar ke bitstream untuk pemutaran Opus yang di-offload sesuai dengan RFC 7845.
  • Video:
    • H.265/HEVC: Memperbaiki penguraian info gambar referensi jangka pendek dan panjang SPS.
  • Teks:
    • CEA-608: Mengubah logika pemotongan isyarat agar hanya mempertimbangkan teks yang terlihat. Sebelumnya, indentasi dan offset tab disertakan saat membatasi panjang petunjuk menjadi 32 karakter (yang secara teknis benar menurut spesifikasi) (#11019).
  • Ekstensi IMA:
    • Menambahkan nomor versi IMA SDK menjadi 3.30.3.
  • Sesi:
    • Tambahkan tata letak kustom ke status pengontrol dan sediakan pengambil untuk mengaksesnya. Saat tata letak kustom berubah, MediaController.Listener.onCustomLayoutChanged akan dipanggil. Aplikasi yang ingin mengirim tata letak kustom yang berbeda ke pengontrol Media3 yang berbeda dapat melakukannya di MediaSession.Callback.onConnect menggunakan AcceptedResultBuilder untuk memastikan tata letak kustom tersedia untuk pengontrol saat koneksi selesai.
    • Memperbaiki kasus saat MediaLibraryServiceLegacyStub mengirim error ke Result yang tidak mendukung hal ini, sehingga menghasilkan UnsupportedOperationException (#78).
    • Memperbaiki cara PlayerWrapper membuat VolumeProviderCompat dengan menentukan volumeControlType melalui perintah lama (COMMAND_ADJUST_DEVICE_VOLUME dan COMMAND_SET_DEVICE_VOLUME) dan perintah baru (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS dan COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).

Versi 1.1.0

5 Juli 2023

  • Library Umum:
    • Menambahkan alasan penghentian untuk rute audio yang tidak sesuai dan memutar saat siap mengubah alasan penghentian yang terlalu lama. (#15).
    • Menambahkan perintah ke Pemutar:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Tambahkan metode overload ke Player yang memungkinkan pengguna menentukan flag volume:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Menambahkan Builder untuk DeviceInfo dan menghentikan penggunaan konstruktor yang ada.
    • Tambahkan DeviceInfo.routingControllerId untuk menentukan ID pengontrol pemilihan rute untuk pemutaran jarak jauh.
    • Menambahkan Player.replaceMediaItem(s) sebagai pintasan untuk menambahkan dan menghapus item di posisi yang sama (#8046).
  • ExoPlayer:
    • Izinkan ExoPlayer mengontrol metode volume perangkat hanya jika diaktifkan secara eksplisit. Gunakan ExoPlayer.Builder.setDeviceVolumeControlEnabled untuk memiliki akses ke:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) dan setDeviceVolume(int, int)
      • increaseDeviceVolume(int) dan increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) dan decreaseDeviceVolume(int, int)
    • Menambahkan FilteringMediaSource yang memungkinkan pemfilteran jenis trek yang tersedia dari MediaSource.
    • Menambahkan dukungan untuk menyertakan Common Media Client Data (CMCD) dalam permintaan keluar format streaming adaptif DASH, HLS, dan SmoothStreaming. Kolom berikut, br, bl, cid, rtp, dan sid, telah digabungkan (#8699). Struktur API dan metode API:
      • Logging CMCD dinonaktifkan secara default, gunakan MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) untuk mengaktifkannya.
      • Semua kunci diaktifkan secara default, ganti CmcdConfiguration.RequestConfig.isKeyAllowed(String key) untuk memfilter kunci mana yang dicatat ke dalam log.
      • Ganti CmcdConfiguration.RequestConfig.getCustomData() untuk mengaktifkan logging kunci kustom.
    • Menambahkan tindakan tambahan ke manifes demo utama untuk mempermudah memulai aplikasi demo dengan file *.exolist.json kustom (#439).
    • Tambahkan ExoPlayer.setVideoEffects() untuk menggunakan Effect selama pemutaran video.
    • Perbarui SampleQueue untuk menyimpan sourceId sebagai long, bukan int. Tindakan ini akan mengubah tanda tangan metode publik SampleQueue.sourceId dan SampleQueue.peekSourceId.
    • Tambahkan parameter ke metode LoadControl shouldStartPlayback dan onTracksSelected yang memungkinkan pengaitan metode ini dengan MediaPeriod yang relevan.
    • Ubah tanda tangan ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) dengan menambahkan parameter linimasa yang berisi periode dengan UID yang digunakan sebagai kunci dalam peta. Hal ini diperlukan untuk menghindari masalah serentak dengan live stream multi-periode.
    • Menghentikan penggunaan EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) dan BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). Sebagai gantinya, varian metode tanpa mediaTimeOffsetUs dapat dipanggil. Perhatikan bahwa bahkan untuk varian yang tidak digunakan lagi, offset tidak lagi ditambahkan ke startTimeUs dan endTimeUs objek MediaLoadData yang dikirim oleh dispatcher.
    • Mengganti nama ExoTrackSelection.blacklist menjadi excludeTrack dan isBlacklisted menjadi isTrackExcluded.
    • Memperbaiki perilaku yang tidak konsisten antara ExoPlayer.setMediaItem(s) dan addMediaItem(s) saat dipanggil di playlist kosong.
  • Transformator:
    • Hapus Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Sebagai gantinya, gunakan ExoPlayerAssetLoader.Factory(MediaSource.Factory) dan Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory).
    • Hapus Transformer.startTransformation(MediaItem, ParcelFileDescriptor).
    • Memperbaiki bug yang menyebabkan transformasi macet (menyebabkan waktu tunggu muxer habis) jika akhir streaming video diberi sinyal saat frame input sedang menunggu pemrosesan.
    • Buat kueri codec melalui MediaCodecList, bukan menggunakan utilitas findDecoder/EncoderForFormat, untuk memperluas dukungan.
    • Hapus konfigurasi B-frame di DefaultEncoderFactory karena tidak berfungsi di beberapa perangkat.
  • Pemilihan trek:
    • Menambahkan DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange yang dinonaktifkan secara default. Jika diaktifkan, DefaultTrackSelector akan memicu pemilihan trek baru saat kemampuan perender berubah.
  • Ekstraktor:
    • Ogg: Memperbaiki bug saat melakukan pencarian dalam file dengan durasi panjang (#391).
    • FMP4: Memperbaiki masalah ketika TimestampAdjuster menginisialisasi offset stempel waktu yang salah dengan waktu sampel metadata dari atom emsg (#356).
  • Audio:
    • Memperbaiki bug yang menyebabkan beberapa pemutaran gagal saat tunneling diaktifkan dan AudioProcessors aktif, misalnya untuk pemangkasan tanpa jeda (#10847).
    • Mengenkapsulasi frame Opus dalam paket Ogg dalam pemutaran langsung (offload).
    • Ekstrapolasi posisi saat ini selama mode tidur dengan penjadwalan offload.
    • Tambahkan Renderer.release() dan AudioSink.release() untuk merilis resource di akhir siklus proses pemutar.
    • Memproses perubahan kemampuan audio di DefaultAudioSink. Tambahkan parameter yang diperlukan context di konstruktor DefaultAudioSink, yang akan digunakan DefaultAudioSink untuk mendaftar sebagai pemroses ke AudioCapabilitiesReceiver dan memperbarui properti audioCapabilities-nya saat diberi tahu tentang perubahan kemampuan.
    • Menyebarkan perubahan kemampuan audio melalui peristiwa baru onAudioCapabilitiesChanged di antarmuka AudioSink.Listener, dan antarmuka baru RendererCapabilities.Listener yang memicu peristiwa onRendererCapabilitiesChanged.
    • Tambahkan ChannelMixingAudioProcessor untuk menerapkan penskalaan/pencampuran ke saluran audio.
    • Menambahkan nilai int baru DISCARD_REASON_AUDIO_BYPASS_POSSIBLE ke DecoderDiscardReasons untuk menghapus dekoder audio saat mode pengabaian memungkinkan setelah kemampuan audio berubah.
    • Menambahkan dukungan pemutaran langsung untuk DTS Express dan DTS:X (#335).
  • Video:
    • Membuat MediaCodecVideoRenderer melaporkan VideoSize dengan lebar dan tinggi 0 saat perender dinonaktifkan. Player.Listener.onVideoSizeChanged dipanggil saat Player.getVideoSize() berubah. Dengan perubahan ini, ukuran video ExoPlayer dengan MediaCodecVideoRenderer memiliki lebar dan tinggi 0 jika Player.getCurrentTracks tidak mendukung video, atau ukuran trek video yang didukung belum ditentukan.
  • DRM:
    • Mengurangi visibilitas beberapa metode khusus internal di DefaultDrmSession yang tidak diharapkan untuk dipanggil dari luar paket DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • Menambahkan library muxer baru yang dapat digunakan untuk membuat file penampung MP4.
  • Ekstensi IMA:
    • Mengaktifkan streaming DASH live multi-periode untuk DAI. Perlu diperhatikan bahwa implementasi saat ini belum mendukung pencarian di live stream (#10912).
    • Memperbaiki bug yang menyebabkan grup iklan baru disisipkan dalam live stream karena posisi konten yang dihitung dalam linimasa berturut-turut sedikit bervariasi.
  • Sesi:
    • Tambahkan metode bantuan MediaSession.getControllerForCurrentRequest untuk mendapatkan informasi tentang pengontrol yang saat ini memanggil metode Player.
    • Menambahkan androidx.media3.session.MediaButtonReceiver untuk memungkinkan aplikasi mengimplementasikan kelanjutan pemutaran dengan peristiwa tombol media yang dikirim, misalnya, oleh headset Bluetooth (#167).
    • Menambahkan implementasi default ke MediaSession.Callback.onAddMediaItems untuk memungkinkan MediaItems yang diminta diteruskan ke Player jika memiliki LocalConfiguration (misalnya URI) (#282).
    • Menambahkan tombol perintah "cari ke sebelumnya" dan "cari ke berikutnya" pada tampilan notifikasi media ringkas secara default untuk Android 12 dan yang lebih lama (#410).
    • Menambahkan implementasi default ke MediaSession.Callback.onAddMediaItems untuk memungkinkan MediaItems yang diminta diteruskan ke Player jika memiliki LocalConfiguration (misalnya URI) (#282).
    • Menambahkan tombol perintah "cari ke sebelumnya" dan "cari ke berikutnya" pada tampilan notifikasi media ringkas secara default untuk Android 12 dan yang lebih lama (#410).
  • UI:
    • Tambahkan metode Util shouldShowPlayButton dan handlePlayPauseButtonAction untuk menulis elemen UI kustom dengan tombol putar/jeda.
  • Ekstensi RTSP:
    • Untuk MPEG4-LATM, gunakan nilai profile-level-id default jika tidak ada dalam pesan SDP Describe Response (#302).
    • Menggunakan Uri dasar untuk resolusi jalur relatif dari sesi RTSP jika ada di header respons DESCRIBE (#11160).
  • Ekstensi DASH:
    • Menghapus selisih waktu media dari MediaLoadData.startTimeMs dan MediaLoadData.endTimeMs untuk streaming DASH multi-periode.
    • Memperbaiki bug saat menyiapkan ulang sumber media Dash live multi-periode menghasilkan IndexOutOfBoundsException (#10838).
  • Ekstensi HLS:
    • Tambahkan HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) untuk menetapkan waktu tunggu bagi thread pemuatan agar menunggu TimestampAdjuster melakukan inisialisasi. Jika inisialisasi tidak selesai sebelum waktu tunggu habis, PlaybackException akan ditampilkan untuk menghindari pemutaran berhenti tanpa henti. Waktu tunggu ditetapkan ke nol secara default (#323).
  • Utilitas Pengujian:
    • Periksa ketidakpekaan skema URI terhadap huruf besar/kecil di DataSourceContractTest.
  • Menghapus simbol yang tidak digunakan lagi:
    • Menghapus konstruktor DefaultAudioSink, menggunakan DefaultAudioSink.Builder sebagai gantinya.
    • Hapus HlsMasterPlaylist, gunakan HlsMultivariantPlaylist sebagai gantinya.
    • Hapus Player.stop(boolean). Sebagai gantinya, gunakan Player.stop() dan Player.clearMediaItems() (jika reset adalah true).
    • Menghapus dua konstruktor SimpleCache yang tidak digunakan lagi, menggunakan konstruktor yang tidak digunakan lagi yang menggunakan DatabaseProvider untuk performa yang lebih baik.
    • Menghapus konstruktor DefaultBandwidthMeter, menggunakan DefaultBandwidthMeter.Builder sebagai gantinya.
    • Menghapus konstruktor DefaultDrmSessionManager, menggunakan DefaultDrmSessionManager.Builder sebagai gantinya.
    • Menghapus dua konstruktor HttpDataSource.InvalidResponseCodeException yang tidak digunakan lagi, menggunakan konstruktor yang tidak digunakan lagi yang menerima kolom tambahan(cause, responseBody) untuk meningkatkan logging error.
    • Hapus DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash, dan DownloadHelper.forSmoothStreaming, gunakan DownloadHelper.forMediaItem sebagai gantinya.
    • Menghapus konstruktor DownloadService yang tidak digunakan lagi, menggunakan konstruktor yang tidak digunakan lagi yang menyertakan opsi untuk memberikan parameter channelDescriptionResourceId.
    • Menghapus konstanta String yang tidak digunakan lagi untuk Charset (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME, dan UTF16LE_NAME), menggunakan Kotlin Charset dari paket kotlin.text, java.nio.charset.StandardCharsets, atau com.google.common.base.Charsets.
    • Menghapus konstruktor WorkManagerScheduler yang tidak digunakan lagi, menggunakan konstruktor yang tidak digunakan lagi yang menyertakan opsi untuk memberikan parameter Context.
    • Menghapus metode yang tidak digunakan lagi, yaitu createVideoSampleFormat, createAudioSampleFormat, createContainerFormat, dan createSampleFormat, yang digunakan untuk membuat instance class Format. Sebagai gantinya, gunakan Format.Builder untuk membuat instance Format.
    • Menghapus metode yang tidak digunakan lagi copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate, dan copyWithVideoSize, gunakan Format.buildUpon() dan metode penyetel sebagai gantinya.
    • Hapus ExoPlayer.retry() yang tidak digunakan lagi, gunakan prepare() sebagai gantinya.
    • Menghapus konstruktor DefaultTrackSelector tanpa argumen yang tidak digunakan lagi, gunakan DefaultTrackSelector(Context) sebagai gantinya.
    • Menghapus konstruktor OfflineLicenseHelper yang tidak digunakan lagi, dan menggunakan OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher) sebagai gantinya.
    • Menghapus konstruktor DownloadManager yang tidak digunakan lagi, gunakan konstruktor yang menggunakan Executor sebagai gantinya.
    • Menghapus konstruktor Cue yang tidak digunakan lagi, dan menggunakan Cue.Builder sebagai gantinya.
    • Menghapus konstruktor OfflineLicenseHelper yang tidak digunakan lagi, dan menggunakan OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher) sebagai gantinya.
    • Menghapus empat metode AnalyticsListener yang tidak digunakan lagi:
      • onDecoderEnabled, gunakan onAudioEnabled dan/atau onVideoEnabled sebagai gantinya.
      • onDecoderInitialized, gunakan onAudioDecoderInitialized dan/atau onVideoDecoderInitialized.
      • onDecoderInputFormatChanged, gunakan onAudioInputFormatChanged dan/atau onVideoInputFormatChanged.
      • onDecoderDisabled, gunakan onAudioDisabled dan/atau onVideoDisabled sebagai gantinya.
    • Hapus Player.Listener.onSeekProcessed dan AnalyticsListener.onSeekProcessed yang tidak digunakan lagi, gunakan onPositionDiscontinuity dengan DISCONTINUITY_REASON_SEEK sebagai gantinya.
    • Hapus ExoPlayer.setHandleWakeLock(boolean), gunakan setWakeMode(int) sebagai gantinya.
    • Hapus DefaultLoadControl.Builder.createDefaultLoadControl() yang tidak digunakan lagi, gunakan build() sebagai gantinya.
    • Hapus MediaItem.PlaybackProperties yang tidak digunakan lagi, gunakan MediaItem.LocalConfiguration sebagai gantinya. Kolom yang tidak digunakan lagi MediaItem.playbackProperties kini berjenis MediaItem.LocalConfiguration.

Versi 1.1.0-rc01

21 Juni 2023

Gunakan versi stabil 1.1.0.

Versi 1.1.0-beta01

7 Juni 2023

Gunakan versi stabil 1.1.0.

Versi 1.1.0-alpha01

10 Mei 2023

Gunakan versi stabil 1.1.0.

Versi 1.0.0

Versi 1.0.2

18 Mei 2023

androidx.media3:media3-*:1.0.2 dirilis. Versi 1.0.2 berisi commit ini.

Rilis ini sesuai dengan rilis ExoPlayer 2.18.7.

Rilis ini berisi perubahan berikut sejak rilis 1.0.1:

  • Library Core:
    • Tambahkan Buffer.isLastSample() yang menunjukkan apakah Buffer berisi flag C.BUFFER_FLAG_LAST_SAMPLE.
    • Memperbaiki masalah saat frame terakhir mungkin tidak dirender jika sampel terakhir dengan frame dikeluarkan dari antrean tanpa membaca sampel 'akhir streaming'. (#11079).
  • Ekstraktor:
    • Memperbaiki penguraian H.265 SPS dalam file MPEG-TS dengan menggunakan kembali logika penguraian yang sudah digunakan oleh ekstraktor RTSP dan MP4 (#303).
  • Teks:
    • SSA: Menambahkan dukungan untuk file UTF-16 jika dimulai dengan tanda urutan byte (#319).
  • Sesi:
    • Memperbaiki masalah saat MediaController tidak memperbarui perintah yang tersedia saat terhubung ke MediaSessionCompat lama yang memperbarui tindakannya.
    • Memperbaiki bug yang mencegah MediaLibraryService menampilkan null untuk panggilan dari UI Sistem ke Callback.onGetLibraryRoot dengan params.isRecent == true di API 30 (#355).
    • Memperbaiki kebocoran memori MediaSessionService atau MediaLibraryService (#346).
    • Memperbaiki bug saat update Timeline dan posisi gabungan di MediaSession dapat menyebabkan MediaController menampilkan IllegalStateException.

Versi 1.0.1

18 April 2023

androidx.media3:media3-*:1.0.1 dirilis. Versi 1.0.1 berisi commit ini.

Rilis ini sesuai dengan rilis ExoPlayer 2.18.6.

  • Library Core:
    • Mereset penggantian live stream target saat mencari ke posisi default (#11051).
    • Memperbaiki bug yang menyebabkan streaming sampel kosong di media dapat menyebabkan pemutaran macet.
  • Sesi:
    • Memperbaiki bug saat beberapa item antrean identik yang dipublikasikan oleh MediaSessionCompat lama menghasilkan pengecualian di MediaController (#290).
    • Menambahkan penerusan MediaSession.broadcastCustomCommand yang tidak ada ke MediaControllerCompat.Callback.onSessionEvent lama (#293).
    • Memperbaiki bug yang menyebabkan pemanggilan MediaSession.setPlayer tidak mengupdate perintah yang tersedia.
    • Memperbaiki masalah saat instance TrackSelectionOverride yang dikirim dari MediaController diabaikan jika mereferensikan grup dengan Format.metadata (#296).
    • Memperbaiki masalah saat Player.COMMAND_GET_CURRENT_MEDIA_ITEM harus tersedia untuk mengakses metadata melalui MediaSessionCompat lama.
    • Memperbaiki masalah saat instance MediaSession di thread latar belakang menyebabkan error saat digunakan di MediaSessionService (#318).
    • Memperbaiki masalah saat penerima tombol media dideklarasikan oleh library tanpa dimaksudkan oleh aplikasi (#314).
  • DASH:
    • Memperbaiki penanganan linimasa segmen kosong (#11014).
  • RTSP:
    • Mencoba lagi dengan TCP jika Penyiapan RTSP dengan UDP gagal dengan Error RTSP 461 UnsupportedTransport (#11069).

Versi 1.0.0

22 Maret 2023

androidx.media3:media3-*:1.0.0 dirilis. Versi 1.0.0 berisi commit ini.

Rilis ini sesuai dengan rilis ExoPlayer 2.18.5.

Tidak ada perubahan sejak 1.0.0-rc02.

Versi 1.0.0-rc02

2 Maret 2023

androidx.media3:media3-*:1.0.0-rc02 dirilis. Versi 1.0.0-rc02 berisi commit ini.

Rilis ini sesuai dengan rilis ExoPlayer 2.18.4.

  • Library Core:
    • Memperbaiki deteksi jenis jaringan di API 33 (#10970).
    • Memperbaiki NullPointerException saat memanggil ExoPlayer.isTunnelingEnabled (#10977).
  • Download:
    • Membuat perbedaan maksimum waktu mulai dua segmen yang akan digabungkan dapat dikonfigurasi di SegmentDownloader dan subclass (#248).
  • Audio:
    • Memperbaiki pemutaran MP3 tanpa jeda yang rusak di perangkat Samsung (#8594).
    • Memperbaiki bug saat kecepatan pemutaran yang ditetapkan segera setelah menonaktifkan audio dapat diganti oleh perubahan kecepatan sebelumnya (#10882).
  • Video:
    • Memetakan format HEVC HDR10 ke HEVCProfileMain10HDR10, bukan HEVCProfileMain10.
    • Menambahkan solusi untuk masalah perangkat di Chromecast dengan Google TV dan Lenovo M10 FHD Plus yang menyebabkan streaming AVC 60 fps ditandai sebagai tidak didukung (#10898).
    • Memperbaiki masalah performa rilis frame saat memutar media dengan kecepatan frame yang jauh lebih tinggi daripada kecepatan refresh layar.
  • Cast:
    • Memperbaiki STATE_IDLE sementara saat bertransisi di antara item media (#245).
  • RTSP:
    • Menangkap IllegalArgumentException yang ditampilkan dalam penguraian pesan respons Describe RTSP yang tidak valid (#10971).
  • Sesi:
    • Memperbaiki bug saat tombol putar/jeda notifikasi tidak diupdate dengan status pemutar (#192).
  • Ekstensi IMA:
    • Memperbaiki bug yang mencegah streaming DAI tanpa iklan dimulai karena peristiwa LOADED pertama (dan satu-satunya dalam kasus tanpa iklan) tidak diterima.

Versi 1.0.0-rc01

16 Februari 2023

androidx.media3:media3-*:1.0.0-rc01 dirilis. Versi 1.0.0-rc01 berisi commit ini.

Rilis ini sesuai dengan rilis ExoPlayer 2.18.3.

  • Library Core:
    • Menyesuaikan logika pengurutan dekoder perender untuk mempertahankan preferensi MediaCodecSelector, meskipun dekoder melaporkan bahwa dekoder mungkin tidak dapat memutar media secara optimal. Misalnya, dengan pemilih default, dekoder hardware dengan hanya dukungan fungsi akan lebih diutamakan daripada dekoder software yang sepenuhnya mendukung format (#10604).
    • Menambahkan ExoPlayer.Builder.setPlaybackLooper yang menetapkan thread pemutaran yang sudah ada sebelumnya untuk instance ExoPlayer baru.
    • Mengizinkan helper pengelola download dihapus (#10776).
    • Menambahkan parameter ke BasePlayer.seekTo untuk menunjukkan perintah yang digunakan untuk melakukan pencarian.
    • Menggunakan tema saat memuat drawable pada API 21+ (#220).
    • Menambahkan ConcatenatingMediaSource2 yang memungkinkan penggabungan beberapa item media menjadi satu jendela (#247).
  • Ekstraktor:
    • Menampilkan ParserException, bukan NullPointerException jika tabel contoh (stbl) tidak memiliki deskripsi contoh yang diperlukan (stsd) saat mengurai atom trek.
    • Melewati contoh dengan benar saat melakukan pencarian langsung ke frame sinkronisasi di fMP4 (#10941).
  • Audio:
    • Menggunakan kecepatan bit format audio terkompresi untuk menghitung ukuran buffer minimum untuk AudioTrack dalam pemutaran langsung (passthrough).
  • Teks:
    • Memperbaiki TextRenderer yang meneruskan indeks tidak valid (negatif) ke Subtitle.getEventTime jika file subtitel tidak berisi tanda.
    • SubRip: Menambahkan dukungan untuk file UTF-16 jika dimulai dengan tanda urutan byte.
  • Metadata:
    • Mengurai beberapa nilai yang dipisahkan null dari frame ID3, seperti yang diizinkan oleh ID3 v2.4.
    • Menambahkan MediaMetadata.mediaType untuk menunjukkan jenis konten atau jenis folder yang dijelaskan oleh metadata.
    • Menambahkan MediaMetadata.isBrowsable sebagai pengganti MediaMetadata.folderType. Jenis folder tidak akan digunakan lagi dalam rilis berikutnya.
  • DASH:
    • Menambahkan penguraian lengkap untuk kumpulan adaptasi gambar, termasuk jumlah kartu (#3752).
  • UI:
    • Memperbaiki PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) yang tidak digunakan lagi untuk memastikan perubahan visibilitas diteruskan ke pemroses yang terdaftar (#229).
    • Memperbaiki urutan kontrol pemutar tengah di PlayerView saat menggunakan tata letak kanan ke kiri (RTL) (#227).
  • Sesi:
    • Menambahkan SimpleBasePlayer abstrak untuk membantu menerapkan antarmuka Player untuk pemutar kustom.
    • Menambahkan metode helper untuk mengonversi token sesi platform ke Media3 SessionToken (#171).
    • Menggunakan onMediaMetadataChanged untuk memicu update sesi media platform (#219).
    • Menambahkan sesi media sebagai argumen getMediaButtons() dari DefaultMediaNotificationProvider dan menggunakan daftar yang tidak dapat diubah untuk kejelasan (#216).
    • Menambahkan pemroses callback onSetMediaItems untuk memberikan cara mengubah/menetapkan daftar MediaItem, indeks awal, dan posisi berdasarkan sesi sebelum menyetel ke Pemutar (#156).
    • Menghindari deteksi ketuk dua kali untuk peristiwa tombol media non-Bluetooth (#233).
    • Membuat QueueTimeline menjadi lebih andal jika status sesi lama mencurigakan (#241).
  • Metadata:
    • Mengurai beberapa nilai yang dipisahkan null dari frame ID3, seperti yang diizinkan oleh ID3 v2.4.
    • Menambahkan MediaMetadata.mediaType untuk menunjukkan jenis konten atau jenis folder yang dijelaskan oleh metadata.
    • Menambahkan MediaMetadata.isBrowsable sebagai pengganti MediaMetadata.folderType. Jenis folder tidak akan digunakan lagi dalam rilis berikutnya.
  • Ektensi Cast:
    • Menambahkan nomor versi Cast SDK menjadi 21.2.0.
  • Ekstensi IMA:
    • Menghapus pemroses pemutar ImaServerSideAdInsertionMediaSource di thread aplikasi untuk menghindari masalah threading.
    • Menambahkan properti focusSkipButtonWhenAvailable ke ImaServerSideAdInsertionMediaSource.AdsLoader.Builder untuk meminta tombol lewati difokuskan pada perangkat TV dan menyetelnya ke benar (true) secara default.
    • Menambahkan metode focusSkipButton() ke ImaServerSideAdInsertionMediaSource.AdsLoader untuk secara terprogram meminta tombol lewati difokuskan.
    • Menambahkan nomor vers IMA SDK menjadi 3.29.0.
  • Aplikasi demo:
    • Meminta izin notifikasi untuk notifikasi download saat runtime (#10884).

Versi 1.0.0-beta03

22 November 2022

androidx.media3:media3-*:1.0.0-beta03 dirilis. Versi 1.0.0-beta03 berisi commit ini.

Rilis ini sesuai dengan rilis ExoPlayer 2.18.2.

  • Library Core:
    • Menambahkan ExoPlayer.isTunnelingEnabled untuk memeriksa apakah tunnel diaktifkan untuk jalur yang saat ini dipilih (#2518).
    • Menambahkan WrappingMediaSource untuk menyederhanakan penggabungan satu MediaSource (#7279).
    • Menghapus buffer kembali sebelum pemutaran macet karena memori yang tersedia tidak mencukupi.
    • Menutup blok Pelacakan "doSomeWork" saat offload diaktifkan.
    • Memperbaiki masalah pelacakan sesi dengan pencarian cepat di PlaybackStatsListener (#180).
    • Mengirim callback onMediaItemTransition yang hilang saat memanggil seekToNext atau seekToPrevious dalam playlist item tunggal (#10667).
    • Menambahkan Player.getSurfaceSize yang menampilkan ukuran platform tempat video dirender.
    • Memperbaiki bug saat menghapus pemroses selama rilis pemutar dapat menyebabkan IllegalStateException (#10758).
  • Build:
    • Menerapkan compileSdkVersion minimum untuk menghindari error kompilasi (#10684).
    • Menghindari pemblokiran publikasi jika disertakan dalam build gradle lain.
  • Pemilihan trek:
    • Memilih trek lain ke Dolby Vision jika layar tidak mendukungnya. (#8944).
  • Download:
    • Memperbaiki potensi loop tanpa batas di ProgressiveDownloader yang disebabkan oleh download dan pemutaran serentak dengan PriorityTaskManager yang sama (#10570).
    • Membuat notifikasi download segera muncul (#183).
    • Membatasi penghapusan download paralel menjadi 1 untuk menghindari pembuatan thread yang berlebihan (#10458).
  • Video:
    • Mencoba dekoder alternatif untuk Dolby Vision jika layar tidak mendukungnya. (#9794).
  • Audio:
    • Menggunakan SingleThreadExecutor untuk merilis instance AudioTrack guna menghindari error OutOfMemory saat merilis beberapa pemutar secara bersamaan (#10057).
    • Menambahkan AudioOffloadListener.onExperimentalOffloadedPlayback untuk status offload AudioTrack. (#134).
    • Menjadikan AudioTrackBufferSizeProvider sebagai antarmuka publik.
    • Menambahkan ExoPlayer.setPreferredAudioDevice untuk menyetel perangkat output audio yang diinginkan (#135).
    • Mengganti nama androidx.media3.exoplayer.audio.AudioProcessor menjadi androidx.media3.common.audio.AudioProcessor.
    • Memetakan audio 8-channel dan 12-channel ke mask saluran 7.1 dan 7.1.4 di semua versi Android (#10701).
  • Metadata:
    • MetadataRenderer sekarang dapat dikonfigurasi untuk merender metadata segera setelah tersedia. Membuat instance dengan MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean) untuk menentukan apakah perender akan menampilkan metadata lebih awal atau menyinkronkan dengan posisi pemutar.
  • DRM:
    • Memperbaiki bug dalam implementasi ClearKey Android 13 yang menampilkan URL lisensi yang tidak kosong tetapi tidak valid.
    • Memperbaiki error setMediaDrmSession failed: session not opened saat beralih antara skema DRM dalam playlist (misalnya, Widevine ke ClearKey).
  • Teks:
    • CEA-608: Memastikan perintah tombol layanan pada kolom 2 ditangani dengan benar (#10666).
  • DASH:
    • Menguraikan EventStream.presentationTimeOffset dari manifes (#10460).
  • UI:
    • Menggunakan penggantian pemutar saat ini sebagai preset di TrackSelectionDialogBuilder (#10429).
  • Sesi:
    • Memastikan perintah selalu dijalankan dalam urutan yang benar meskipun beberapa perintah memerlukan resolusi asinkron (#85).
    • Menambahkan DefaultMediaNotificationProvider.Builder untuk mem-build instance DefaultMediaNotificationProvider. Builder dapat mengonfigurasi ID notifikasi, ID saluran notifikasi, dan nama saluran notifikasi yang digunakan oleh penyedia. Selain itu, tambahkan metode DefaultMediaNotificationProvider.setSmallIcon(int) untuk menyetel ikon kecil notifikasi. (#104).
    • Memastikan perintah yang dikirim sebelum MediaController.release() tidak dihapus (#99).
    • SimpleBitmapLoader dapat memuat bitmap dari URI file:// (#108).
    • Memperbaiki pernyataan yang mencegah MediaController mencari iklan dalam periode (#122).
    • Saat pemutaran berakhir, MediaSessionService akan dihentikan dari latar depan dan notifikasi akan ditampilkan untuk memulai ulang pemutaran item media yang terakhir diputar (#112).
    • Jangan memulai layanan latar depan dengan intent tertunda untuk dijeda (#167).
    • Sembunyikan 'badge' secara manual yang terkait dengan notifikasi yang dibuat oleh DefaultNotificationProvider pada API 26 dan API 27 (badge secara otomatis disembunyikan di API 28+) (#131 ).
    • Memperbaiki bug saat koneksi pengikat kedua dari MediaSession lama ke Media3 MediaController menyebabkan IllegalStateExceptions (#49).
  • RTSP:
    • Menambahkan penanganan paket terpisah-pisah H263 (#119).
    • Menambahkan dukungan untuk MP4A-LATM (#162).
  • IMA:
    • Menambahkan waktu tunggu untuk memuat informasi iklan guna menangani kasus saat IMA SDK berhenti memuat iklan (#10510).
    • Mencegah iklan mid-roll dilewati saat melakukan pencarian di akhir konten (#10685).
    • Menghitung durasi periode dengan benar untuk live stream dengan iklan yang disisipkan sisi server, misalnya IMA DAI (#10764).
  • Ekstensi FFmpeg:
    • Menambahkan flag yang baru diperlukan untuk menautkan library FFmpeg dengan NDK 23.1.7779620 dan yang lebih baru (#9933).
  • Ekstensi AV1:
    • Mengupdate versi CMake untuk menghindari ketidaksesuaian dengan rilis Android Studio terbaru (#9933).
  • Ektensi Cast:
    • Mengimplementasikan getDeviceInfo() agar dapat mengidentifikasi CastPlayer saat mengontrol pemutaran dengan MediaController (#142).
  • Transformator:
    • Menambahkan timer watchdog muxer untuk mendeteksi kapan pembuatan sampel output terlalu lambat.
  • Menghapus simbol yang tidak digunakan lagi:
    • Menghapus Transformer.Builder.setOutputMimeType(String). Fitur ini telah dihapus. Jenis MIME akan selalu berupa MP4 saat muxer default digunakan.

Versi 1.0.0-beta02

21 Juli 2022

androidx.media3:media3-*:1.0.0-beta02 dirilis. Versi 1.0.0-beta02 berisi commit ini.

Rilis ini sesuai dengan rilis ExoPlayer 2.18.1.

  • Library Core:
    • Memastikan bahwa mengubah ShuffleOrder dengan ExoPlayer.setShuffleOrder akan menghasilkan panggilan ke Player.Listener#onTimelineChanged dengan reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • Untuk media progresif, hanya sertakan lagu yang dipilih dalam posisi buffering (#10361).
    • Mengizinkan logger kustom untuk semua output log ExoPlayer (#9752).
    • Memperbaiki implementasi setDataSourceFactory di DefaultMediaSourceFactory, yang dalam kasus tertentu tidak berfungsi (#116).
  • Ekstraktor:
    • Memperbaiki penguraian kumpulan gambar referensi jangka pendek H265 (#10316).
    • Memperbaiki penguraian kecepatan bit dari kotak esds (#10381).
  • DASH:
    • Menguraikan URL lisensi ClearKey dari manifes (#10246).
  • UI:
    • Memastikan TalkBack mengumumkan opsi kecepatan yang saat ini aktif di menu kontrol pemutaran (#10298).
  • RTSP:
    • Menambahkan penanganan paket terpisah-pisah VP8 (#110).
  • Ekstensi Leanback:
    • Memproses perubahan playWhenReady di LeanbackAdapter (10420).
  • Cast:
    • Menggunakan MediaItem yang telah diteruskan ke metode playlist sebagai Window.mediaItem di CastTimeline (#25, #8212).
    • Mendukung Player.getMetadata() dan Listener.onMediaMetadataChanged() dengan CastPlayer (#25).

Versi 1.0.0-beta01

16 Juni 2022

androidx.media3:media3-*:1.0.0-beta01 dirilis. Versi 1.0.0-beta01 berisi commit ini.

Ini sama dengan rilis ExoPlayer 2.18.0.

  • Library Core:
    • Mengaktifkan dukungan untuk diagnostik platform Android melalui MediaMetricsManager. ExoPlayer akan meneruskan peristiwa pemutaran dan data performa ke platform, yang membantu memberikan informasi performa dan proses debug sistem di perangkat. Data ini juga dapat dikumpulkan oleh Google jika berbagi data penggunaan dan diagnostik diaktifkan oleh pengguna perangkat. Aplikasi dapat memilih untuk tidak berkontribusi pada diagnostik platform untuk ExoPlayer dengan ExoPlayer.Builder.setUsePlatformDiagnostics(false).
    • Memperbaiki bug yang menyebabkan trek terlalu sering direset saat menggunakan MergingMediaSource, misalnya saat melakukan sideload subtitel dan mengubah subtitel yang dipilih di tengah pemutaran (#10248).
    • Menghentikan deteksi jenis jaringan 5G-NSA di API 29 dan 30. Pemutaran ini akan menggunakan jaringan 4G.
    • Tidak mengizinkan penerusan null ke MediaSource.Factory.setDrmSessionManagerProvider dan MediaSource.Factory.setLoadErrorHandlingPolicy. Instance DefaultDrmSessionManagerProvider dan DefaultLoadErrorHandlingPolicy dapat diteruskan secara eksplisit jika diperlukan.
    • Menambahkan MediaItem.RequestMetadata untuk merepresentasikan metadata yang diperlukan untuk memutar media saat LocalConfiguration yang tepat tidak diketahui. Juga menghapus MediaMetadata.mediaUrl karena kini telah disertakan dalam RequestMetadata.
    • Menambahkan Player.Command.COMMAND_SET_MEDIA_ITEM agar pemutar dapat mengizinkan penyetelan satu item.
  • Pemilihan trek:
    • Menggabungkan class TrackSelectionOverrides ke dalam TrackSelectionParameters, dan mempromosikan TrackSelectionOverride ke class level atas.
    • Mengganti nama TracksInfo menjadi Tracks dan TracksInfo.TrackGroupInfo menjadi Tracks.Group. Player.getCurrentTracksInfo dan Player.Listener.onTracksInfoChanged juga diganti namanya menjadi Player.getCurrentTracks dan Player.Listener.onTracksChanged. Ini termasuk 'un-deprecating' (membatalkan penghentian penggunaan) nama metode Player.Listener.onTracksChanged, tetapi dengan jenis parameter yang berbeda.
    • Mengubah DefaultTrackSelector.buildUponParameters dan DefaultTrackSelector.Parameters.buildUpon untuk menampilkan DefaultTrackSelector.Parameters.Builder, bukan DefaultTrackSelector.ParametersBuilder yang tidak digunakan lagi.
    • Menambahkan DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities yang diaktifkan secara default. Jika diaktifkan, DefaultTrackSelector akan memilih trek audio yang jumlah salurannya tidak melebihi kemampuan output perangkat. Pada perangkat genggam, DefaultTrackSelector akan lebih memilih stereo/mono dibandingkan format audio multisaluran, kecuali jika format multisaluran dapat Dispasialisasi (Android 12L+) atau berupa format suara surround Dolby. Selain itu, pada perangkat yang mendukung spasialisasi audio, DefaultTrackSelector akan memantau perubahan di properti Spatializer dan memicu pemilihan trek baru berdasarkan perubahan tersebut. Perangkat dengan mode UI television dikecualikan dari batasan ini dan format dengan jumlah saluran tertinggi akan diutamakan. Untuk mengaktifkan fitur ini, instance DefaultTrackSelector harus dibuat dengan Context.
  • Video:
    • Mengganti nama DummySurface menjadi PlaceholderSurface.
    • Menambahkan dukungan AV1 ke MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Audio:
    • Menggunakan dekoder audio LG AC3 yang mengiklankan jenis MIME non-standar.
    • Mengubah jenis nilai yang ditampilkan AudioAttributes.getAudioAttributesV21() dari android.media.AudioAttributes ke class wrapper AudioAttributesV21 baru, untuk mencegah verifikasi ART yang lambat di API <21.
    • Melakukan kueri platform (API 29+) atau mengasumsikan jumlah saluran encoding audio untuk passthrough audio saat jumlah saluran audio format tidak ditetapkan, yang terjadi dengan persiapan tanpa potongan HLS (10204).
    • Mengonfigurasi AudioTrack dengan mask saluran AudioFormat.CHANNEL_OUT_7POINT1POINT4 jika decoder menghasilkan 12 saluran audio PCM (#10322.
  • DRM
    • Memastikan sesi DRM selalu diperbarui dengan benar saat melakukan pencarian segera setelah perubahan format (10274).
  • Teks:
    • Mengubah Player.getCurrentCues() agar menampilkan CueGroup, bukan List<Cue>.
    • SSA: Mendukung setelan gaya OutlineColour saat BorderStyle == 3 (yaitu OutlineColour menetapkan latar belakang tanda) (#8435).
    • CEA-708: Mengurai data menjadi beberapa blok layanan dan mengabaikan blok yang tidak terkait dengan nomor layanan yang saat ini dipilih.
    • Menghapus RawCcExtractor, yang hanya digunakan untuk menangani format subtitel internal Google.
  • Ekstraktor:
    • Menambahkan dukungan untuk AVI (#2092).
    • Matroska: Mengurai DiscardPadding untuk trek Opus.
    • MP4: Mengurai kecepatan bit dari kotak esds.
    • Ogg: Mengizinkan ID Opus duplikat dan header komentar (#10038).
  • UI:
    • Memperbaiki pengiriman peristiwa ke OnClickListener yang ditetapkan pada PlayerView jika useController=false (#9605). Juga memperbaiki pengiriman peristiwa ke OnLongClickListener untuk semua konfigurasi tampilan.
    • Memperbaiki salah perlakuan pada urutan peristiwa sentuh yang keluar dari batas PlayerView sebelum ACTION_UP sebagai sebuah klik (#9861).
    • Memperbaiki masalah aksesibilitas PlayerView saat mengetuk dapat mengalihkan pemutaran, bukan menyembunyikan kontrol (#8627).
    • Menulis ulang TrackSelectionView dan TrackSelectionDialogBuilder agar berfungsi dengan antarmuka Player, bukan ExoPlayer. Dengan begitu, tampilan dapat digunakan dengan implementasi Player lainnya, dan menghapus dependensi dari modul UI ke modul ExoPlayer. Perubahan ini merupakan perubahan yang dapat menyebabkan gangguan.
    • Tidak menampilkan trek teks paksa dalam pemilih trek PlayerView, dan mempertahankan trek teks paksa yang sesuai tetap dipilih jika "None" (Tidak ada) dipilih (#9432).
  • DASH:
    • Mengurai jumlah saluran dari elemen AudioChannelConfiguration DTS. Tindakan ini akan mengaktifkan kembali passthrough audio untuk streaming DTS (#10159).
    • Tidak mengizinkan penerusan null ke DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. Instance DefaultCompositeSequenceableLoaderFactory dapat diteruskan secara eksplisit jika diperlukan.
  • HLS:
    • Kembali ke persiapan dengan potongan jika atribut CODECS playlist tidak berisi codec audio (#10065).
    • Tidak mengizinkan penerusan null ke HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory, dan HlsMediaSource.Factory.setPlaylistTrackerFactory. Instance DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory, atau referensi ke DefaultHlsPlaylistTracker.FACTORY dapat diteruskan secara eksplisit jika diperlukan.
  • Streaming Lancar:
    • Tidak mengizinkan penerusan null ke SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. Instance DefaultCompositeSequenceableLoaderFactory dapat diteruskan secara eksplisit jika diperlukan.
  • RTSP:
    • Menambahkan pembaca RTP untuk H263 (#63).
    • Menambahkan pembaca RTP untuk MPEG4 (#35).
    • Menambahkan pembaca RTP untuk HEVC (#36).
    • Menambahkan pembaca RTP untuk AMR. Saat ini hanya mendukung streaming AMR saluran mono yang tidak berselang-seling. Payload RTP AMR gabungan tidak didukung. (#46)
    • Menambahkan pembaca RTP untuk VP8 (#47).
    • Menambahkan pembaca RTP untuk WAV (#56).
    • Memperbaiki header otorisasi dasar RTSP. (#9544).
    • Menghentikan pemeriksaan kolom SDP wajib karena ExoPlayer tidak memerlukannya (#10049).
    • Menampilkan pengecualian yang dicentang saat menguraikan waktu RTSP (#10165).
    • Menambahkan pembaca RTP untuk VP9 (#47).
    • Menambahkan pembaca RTP untuk OPUS (#53).
  • Sumber data:
    • Mengganti nama DummyDataSource menjadi PlaceholderDataSource.
    • Mengatasi penanganan gangguan OkHttp.
  • Sesi:
    • Mengganti MediaSession.MediaItemFiller dengan MediaSession.Callback.onAddMediaItems untuk memungkinkan penyelesaian permintaan asinkron.
    • Mendukung metode setMediaItems(s) saat MediaController terhubung ke sesi media lama.
    • Menghapus MediaController.setMediaUri dan MediaSession.Callback.onSetMediaUri. Fungsi yang sama dapat dicapai dengan menggunakan MediaController.setMediaItem dan MediaSession.Callback.onAddMediaItems.
    • Meneruskan panggilan MediaController lama untuk memutar media ke MediaSession.Callback.onAddMediaItems, bukan onSetMediaUri.
    • Menambahkan MediaNotification.Provider dan DefaultMediaNotificationProvider untuk memberikan penyesuaian notifikasi.
    • Menambahkan BitmapLoader dan SimpleBitmapLoader untuk mendownload gambar karya seni.
    • Menambahkan MediaSession.setCustomLayout() untuk memberikan kompatibilitas mundur dengan sesi lama.
    • Menambahkan MediaSession.setSessionExtras() untuk memberikan kesamaan fitur dengan sesi lama.
    • Mengganti nama MediaSession.MediaSessionCallback menjadi MediaSession.Callback, MediaLibrarySession.MediaLibrarySessionCallback menjadi MediaLibrarySession.Callback, dan MediaSession.Builder.setSessionCallback menjadi setCallback.
    • Memperbaiki NPE di MediaControllerImplLegacy (#59).
    • Memperbarui info posisi sesi tentang perubahan linimasa (#51).
    • Memperbaiki NPE di MediaControllerImplBase setelah merilis pengontrol (#74).
  • Pemutaran iklan/IMA:
    • Menurunkan kecepatan polling iklan dari setiap 100 md menjadi setiap 200 md, untuk menyesuaikan dengan rekomendasi Media Rating Council (MRC).
  • Ekstensi FFmpeg:
    • Mengupdate versi CMake ke 3.21.0+ untuk menghindari bug CMake yang menyebabkan sinkronisasi gradle AndroidStudio gagal (#9933).
  • Menghapus simbol yang tidak digunakan lagi:
    • Menghapus Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Sebagai gantinya, gunakan Player.Listener.onTracksChanged(Tracks).
    • Menghapus Player.getCurrentTrackGroups dan Player.getCurrentTrackSelections. Sebagai gantinya, gunakan Player.getCurrentTracks. Anda juga dapat terus menggunakan ExoPlayer.getCurrentTrackGroups dan ExoPlayer.getCurrentTrackSelections, meskipun metode ini tetap tidak digunakan lagi.
    • Menghapus konstanta DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT dan DEFAULT_TRACK_SELECTOR_PARAMETERS DownloadHelper. Gunakan getDefaultTrackSelectorParameters(Context) jika memungkinkan, dan DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT jika sebaliknya.
    • Menghapus konstruktor DefaultTrackSelector(ExoTrackSelection.Factory). Sebagai gantinya, gunakan DefaultTrackSelector(Context, ExoTrackSelection.Factory).
    • Menghapus Transformer.Builder.setContext. Sebagai gantinya, Context harus diteruskan ke konstruktor Transformer.Builder.

Versi 1.0.0-alpha03

14 Maret 2022

androidx.media3:media3-*:1.0.0-alpha03 dirilis. Versi 1.0.0-alpha03 berisi commit ini.

Ini sama dengan rilis ExoPlayer 2.17.1.

  • Audio:
    • Memperbaiki error saat memeriksa kemampuan audio untuk Dolby Atmos (E-AC3-JOC) di HLS.
  • Ekstraktor:
    • FMP4: Memperbaiki masalah ketika metadata contoh emsg dapat dihasilkan dalam urutan yang salah untuk streaming yang berisi atom emsg v0 dan v1 (#9996).
  • Teks:
    • Memperbaiki interaksi SingleSampleMediaSource.Factory.setTrackId dan MediaItem.SubtitleConfiguration.Builder.setId untuk memprioritaskan kolom SubtitleConfiguration dan kembali ke nilai Factory jika belum ditetapkan (#10016).
  • Pemutaran iklan:
    • Memperbaiki underrun audio di antara periode iklan dalam streaming SSAI HLS live.

Versi 1.0.0-alpha02

2 Maret 2022

androidx.media3:media3-*:1.0.0-alpha02 dirilis. Versi 1.0.0-alpha02 berisi commit berikut.

Ini sama dengan rilis ExoPlayer 2.17.0.

  • Library Core:
    • Menambahkan metode DefaultRenderersFactory.getCodecAdapterFactory() yang dilindungi sehingga subclass DefaultRenderersFactory yang mengganti buildVideoRenderers() atau buildAudioRenderers() dapat mengakses factory adaptor codec dan meneruskannya ke instance MediaCodecRenderer yang mereka buat.
    • Memperluas kolom header ICY name dan genre masing-masing ke MediaMetadata.station dan MediaMetadata.genre agar mencapai aplikasi melalui Player.Listener.onMediaMetadataChanged() (#9677).
    • Menghapus kunci null dari DefaultHttpDataSource#getResponseHeaders.
    • Melakukan sleep dan mencoba lagi saat gagal membuat instance MediaCodec. Ini mengatasi masalah yang terjadi di beberapa perangkat saat beralih platform dari codec aman ke codec lain (#8696).
    • Menambahkan MediaCodecAdapter.getMetrics() untuk memungkinkan pengguna mendapatkan data metrik dari MediaCodec. (#9766).
    • Memperbaiki resolusi dependensi Maven (#8353).
    • Menonaktifkan penyesuaian kecepatan otomatis untuk live stream yang tidak memiliki fitur latensi rendah atau permintaan pengguna yang menyetel kecepatan (#9329).
    • Mengganti nama DecoderCounters#inputBufferCount menjadi queuedInputBufferCount.
    • Menjadikan SimpleExoPlayer.renderers pribadi. Perender dapat diakses melalui ExoPlayer.getRenderer.
    • Memperbarui beberapa nilai konstanta AnalyticsListener.EventFlags agar cocok dengan nilai di Player.EventFlags.
    • Membagi AnalyticsCollector menjadi antarmuka dan implementasi default untuk memungkinkannya dihilangkan oleh R8 jika aplikasi tidak memerlukannya.
  • Pemilihan trek:
    • Mendukung flag peran video pilihan dalam pemilihan trek (#9402).
    • Mengupdate logika pemilihan trek video untuk mempertimbangkan jenis MIME dan flag peran yang diinginkan saat memilih beberapa trek video untuk adaptasi (#9519).
    • Mengupdate logika pemilihan trek video dan audio agar hanya memilih format untuk pilihan adaptif yang memiliki tingkat dukungan dekoder dan hardware yang sama (#9565).
    • Mengupdate logika pemilihan trek video untuk memilih codec yang lebih efisien jika beberapa codec didukung oleh dekoder utama dengan akselerasi hardware (#4835).
    • Memilih preferensi konten audio (misalnya, trek audio "default" atau trek yang cocok dengan bahasa lokalitas sistem) daripada batasan pemilihan trek teknis (misalnya, jenis MIME yang disukai, atau jumlah channel maksimum).
    • Memperbaiki masalah pemilihan trek saat penggantian satu grup trek tidak menonaktifkan grup trek lain dengan jenis yang sama (#9675).
    • Memperbaiki masalah pemilihan trek saat campuran penggantian trek yang kosong dan tidak kosong tidak diterapkan dengan benar (#9649).
    • Melarang TrackGroup duplikat di TrackGroupArray. TrackGroup dapat selalu dibedakan dengan menetapkan id dalam konstruktor TrackGroup. Tindakan ini akan memperbaiki error saat melanjutkan pemutaran setelah memindahkan aplikasi ke latar belakang dengan penggantian trek aktif (#9718).
    • Mengubah logika di AdaptiveTrackSelection untuk memungkinkan peningkatan kualitas pada bandwidth jaringan yang memadai meskipun pemutaran sangat dekat dengan edge live (#9784).
  • Video:
    • Memperbaiki logika penggantian dekoder untuk Dolby Vision agar dapat menggunakan dekoder H264/H265 yang kompatibel jika diperlukan.
  • Audio:
    • Memperbaiki logika penggantian dekoder untuk Dolby Atmos (E-AC3-JOC) agar dapat menggunakan dekoder E-AC3 yang kompatibel jika diperlukan.
    • Mengubah AudioCapabilities API untuk mewajibkan penerusan AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES secara eksplisit, bukan null.
    • Mengizinkan penyesuaian penghitungan ukuran buffer AudioTrack dengan memasukkan AudioTrackBufferSizeProvider ke DefaultAudioSink. (#8891).
    • Mencoba lagi pembuatan AudioTrack jika ukuran buffer yang diminta > 1 MB. (#9712).
  • Ekstraktor:
    • WAV: Menambahkan dukungan untuk streaming RF64 (#9543).
    • Memperbaiki penguraian unit H.265 SPS NAL yang salah (#9719).
    • Menguraikan Komentar Vorbis (termasuk METADATA_BLOCK_PICTURE) di file Ogg Opus dan Ogg Vorbis.
  • Teks:
    • Menambahkan kolom MediaItem.SubtitleConfiguration.id yang diperluas ke kolom Format.id pada trek subtitel yang dibuat dari konfigurasi (#9673).
    • Menambahkan dukungan dasar untuk subtitel WebVTT di penampung Matroska (#9886).
    • Mencegah Cea708Decoder membaca lebih dari ukuran blok layanan yang dideklarasikan.
  • DRM:
    • Menghapus playbackLooper dari DrmSessionManager.(pre)acquireSession. Saat DrmSessionManager digunakan oleh aplikasi di MediaSource kustom, playbackLooper harus diteruskan ke DrmSessionManager.setPlayer.
  • Pemutaran iklan/IMA:
    • Menambahkan dukungan untuk Penyisipan Iklan Dinamis (DAI) IMA (#8213).
    • Menambahkan metode ke AdPlaybackState untuk mengizinkan reset grup iklan agar dapat diputar lagi (#9615).
    • Menerapkan kecepatan pemutaran 1,0 selama pemutaran iklan (#9018).
    • Memperbaiki masalah saat grup iklan yang gagal dimuat menyebabkan reset pemutaran langsung (#9929).
  • UI:
    • Memperbaiki warna angka di tombol mundur dan maju StyledPlayerView saat menggunakan tema tertentu (#9765).
    • Menerjemahkan string kecepatan pemutaran dengan benar (#9811).
  • DASH:
    • Menambahkan properti penting dan tambahan yang diuraikan ke Representation (#9579).
    • Mendukung peran trek forced-subtitle (#9727).
    • Berhenti menafsirkan peran trek main sebagai C.SELECTION_FLAG_DEFAULT.
    • Memperbaiki logika pengecualian URL dasar untuk manifes yang tidak mendeklarasikan namespace DVB (#9856).
    • Mendukung URL MPD.Location relatif (#9939).
  • HLS:
    • Mengisi Format.label dengan benar untuk streaming HLS khusus audio (#9608).
    • Menggunakan persiapan tanpa potongan secara default untuk meningkatkan waktu mulai. Jika tampilan Anda berisi trek teks tertutup yang digabungkan secara multipleks dan tidak dideklarasikan di playlist utama, Anda harus menambahkannya ke playlist utama agar dapat diputar, atau menonaktifkan persiapan tanpa potongan dengan HlsMediaSource.Factory.setAllowChunklessPreparation(false).
    • Mendukung pencarian akurat frame utama di HLS (#2882).
  • RTSP:
    • Menyediakan API klien untuk mengganti SocketFactory yang digunakan untuk semua koneksi server (#9606).
    • Memilih metode autentikasi DIGEST daripada BASIC jika keduanya ada (#9800).
    • Menangani saat pengaturan waktu trek RTSP tidak tersedia (#9775).
    • Mengabaikan nilai header RTP-Info yang tidak valid (#9619).
  • Transformator:
    • Meningkatkan versi API minimum yang diperlukan ke versi 21.
    • TransformationException kini digunakan untuk mendeskripsikan error yang terjadi selama transformasi.
    • Menambahkan TransformationRequest untuk menentukan opsi transformasi.
    • Mengizinkan beberapa pemroses untuk didaftarkan.
    • Memperbaiki Transformator yang macet saat output codec dibaca sebagian.
    • Memperbaiki NPE potensial di Transformer.getProgress saat merilis muxer throw.
    • Menambahkan aplikasi demo untuk menerapkan transformasi.
  • Ekstensi MediaSession:
    • Secara default, MediaSessionConnector kini menghapus playlist saat berhenti. Aplikasi yang ingin mempertahankan playlist dapat memanggil setClearMediaItemsOnStop(false) di konektor.
  • Ektensi transmisi:
    • Memperbaiki bug yang mencegah CastPlayer memanggil onIsPlayingChanged dengan benar (#9792).
    • Mendukung metadata audio termasuk karya seni dengan DefaultMediaItemConverter (#9663).
  • Ekstensi FFmpeg:
    • Membuat build_ffmpeg.sh bergantung pada bin utils LLVM, bukan GNU (#9933).
  • Kompatibilitas Android 12:
    • Mengupgrade ekstensi Transmisi agar bergantung pada com.google.android.gms:play-services-cast-framework:20.1.0. Versi play-services-cast-framework sebelumnya tidak kompatibel dengan aplikasi yang menargetkan Android 12, dan akan error dengan IllegalArgumentException saat membuat PendingIntent (#9528).
  • Menghapus simbol yang tidak digunakan lagi:
    • Menghapus Player.EventListener. Menggunakan Player.Listener sebagai gantinya.
    • Menghapus MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactory, dan MediaSourceFactory#setDrmUserAgent. Menggunakan MediaSourceFactory#setDrmSessionManagerProvider sebagai gantinya.
    • Menghapus MediaSourceFactory#setStreamKeys. Menggunakan MediaItem.Builder#setStreamKeys sebagai gantinya.
    • Menghapus MediaSourceFactory#createMediaSource(Uri). Menggunakan MediaSourceFactory#createMediaSource(MediaItem) sebagai gantinya.
    • Menghapus setTag dari DashMediaSource, HlsMediaSource dan SsMediaSource. Menggunakan MediaItem.Builder#setTag sebagai gantinya.
    • Menghapus DashMediaSource#setLivePresentationDelayMs(long, boolean). Menggunakan MediaItem.Builder#setLiveConfiguration dan MediaItem.LiveConfiguration.Builder#setTargetOffsetMs untuk mengganti manifes, atau DashMediaSource#setFallbackTargetLiveOffsetMs untuk memberikan nilai penggantian.
    • Menghapus (Simple)ExoPlayer.setThrowsWhenUsingWrongThread. Anda tidak lagi dapat memilih untuk tidak menerapkan thread.
    • Menghapus ActionFile dan ActionFileUpgradeUtil. Menggunakan ExoPlayer 2.16.1 atau sebelum menggunakan ActionFileUpgradeUtil untuk menggabungkan file tindakan lama ke DefaultDownloadIndex.
    • Menghapus ProgressiveMediaSource#setExtractorsFactory. Menggunakan konstruktor ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory) sebagai gantinya.
    • Menghapus ProgressiveMediaSource.Factory#setTag dan ProgressiveMediaSource.Factory#setCustomCacheKey. Menggunakan MediaItem.Builder#setTag dan MediaItem.Builder#setCustomCacheKey sebagai gantinya.
    • Menghapus konstruktor DefaultRenderersFactory(Context, @ExtensionRendererMode int) dan DefaultRenderersFactory(Context, @ExtensionRendererMode int, long). Menggunakan konstruktor DefaultRenderersFactory(Context), DefaultRenderersFactory#setExtensionRendererMode, dan DefaultRenderersFactory#setAllowedVideoJoiningTimeMs sebagai gantinya.
    • Menghapus semua konstruktor CronetDataSource publik. Sebagai gantinya, gunakan CronetDataSource.Factory.
  • Mengubah IntDefs berikut menjadi @Target(TYPE_USE) saja. Hal ini dapat merusak kompilasi penggunaan di Kotlin, yang dapat diperbaiki dengan memindahkan anotasi ke anotasi jenis (Int).
    • @AacAudioObjectType
    • @Ac3Util.SyncFrameInfo.StreamType
    • @AdLoadException.Type
    • @AdtsExtractor.Flags
    • @AmrExtractor.Flags
    • @AspectRatioFrameLayout.ResizeMode
    • @AudioFocusManager.PlayerCommand
    • @AudioSink.SinkFormatSupport
    • @BinarySearchSeeker.TimestampSearchResult.Type
    • @BufferReplacementMode
    • @C.BufferFlags
    • @C.ColorRange
    • @C.ColorSpace
    • @C.ColorTransfer
    • @C.CryptoMode
    • @C.Encoding
    • @C.PcmEncoding
    • @C.Projection
    • @C.SelectionReason
    • @C.StereoMode
    • @C.VideoOutputMode
    • @CacheDataSource.Flags
    • @CaptionStyleCompat.EdgeType
    • @DataSpec.Flags
    • @DataSpec.HttpMethods
    • @DecoderDiscardReasons
    • @DecoderReuseResult
    • @DefaultAudioSink.OutputMode
    • @DefaultDrmSessionManager.Mode
    • @DefaultTrackSelector.SelectionEligibility
    • @DefaultTsPayloadReaderFactory.Flags
    • @EGLSurfaceTexture.SecureMode
    • @EbmlProcessor.ElementType
    • @ExoMediaDrm.KeyRequest.RequestType
    • @ExtensionRendererMode
    • @Extractor.ReadResult
    • @FileTypes.Type
    • @FlacExtractor.Flags (dalam paket com.google.android.exoplayer2.ext.flac)
    • @FlacExtractor.Flags (dalam paket com.google.android.exoplayer2.extractor.flac)
    • @FragmentedMp4Extractor.Flags
    • @HlsMediaPlaylist.PlaylistType
    • @HttpDataSourceException.Type
    • @IllegalClippingException.Reason
    • @IllegalMergeException.Reason
    • @LoadErrorHandlingPolicy.FallbackType
    • @MatroskaExtractor.Flags
    • @Mp3Extractor.Flags
    • @Mp4Extractor.Flags
    • @NotificationUtil.Importance
    • @PlaybackException.FieldNumber
    • @PlayerNotificationManager.Priority
    • @PlayerNotificationManager.Visibility
    • @PlayerView.ShowBuffering
    • @Renderer.State
    • @RendererCapabilities.AdaptiveSupport
    • @RendererCapabilities.Capabilities
    • @RendererCapabilities.DecoderSupport
    • @RendererCapabilities.FormatSupport
    • @RendererCapabilities.HardwareAccelerationSupport
    • @RendererCapabilities.TunnelingSupport
    • @SampleStream.ReadDataResult
    • @SampleStream.ReadFlags
    • @StyledPlayerView.ShowBuffering
    • @SubtitleView.ViewType
    • @TextAnnotation.Position
    • @TextEmphasisSpan.MarkFill
    • @TextEmphasisSpan.MarkShape
    • @Track.Transformation
    • @TrackOutput.SampleDataPart
    • @Transformer.ProgressState
    • @TsExtractor.Mode
    • @TsPayloadReader.Flags
    • @WebvttCssStyle.FontSizeUnit

Versi 1.0.0-alpha01

27 Oktober 2021

androidx.media3:media3-*:1.0.0-alpha01 dirilis. Versi 1.0.0-alpha01 berisi commit ini.

Fitur baru

Media3 adalah tempat baru untuk support library media, termasuk ExoPlayer. Alfa pertama berisi implementasi library awal yang fungsional untuk mengimplementasikan kasus penggunaan media, seperti:

  • ExoPlayer, pemutar media tingkat aplikasi untuk Android yang mudah disesuaikan dan diperluas.
  • Fungsi sesi media, untuk mengekspos dan mengontrol pemutaran. Modul sesi baru ini menggunakan antarmuka Player yang sama dengan ExoPlayer.
  • Komponen UI untuk mem-build antarmuka pengguna pemutaran media.
  • Modul yang menggabungkan fungsi di library lain untuk digunakan dengan ExoPlayer, misalnya, penyisipan iklan melalui IMA SDK.

Untuk mengetahui informasi selengkapnya, lihat project GitHub Media3.

ExoPlayer sebelumnya dihosting di project GitHub ExoPlayer terpisah. Di Media3, nama paketnya adalah androidx.media3.exoplayer. Kami berencana untuk terus mengelola dan merilis project GitHub ExoPlayer selama beberapa waktu untuk memberi aplikasi waktu bermigrasi ke Media3. Media3 memiliki pengganti untuk semua modul ExoPlayer, kecuali untuk ekstensi media2 dan mediasession lama, yang digantikan oleh modul media3-session baru. Hal ini memberikan integrasi langsung antara pemutar dan sesi media tanpa perlu menggunakan class adaptor/konektor.