Media3
| อัปเดตล่าสุด | รุ่นที่เสถียร | รุ่นที่อาจได้รับการเผยแพร่ | รุ่นเบต้า | รุ่นอัลฟ่า |
|---|---|---|---|---|
| 21 ตุลาคม 2569 | 1.11.1 | - | - | 1.12.0-alpha01 |
การประกาศทรัพยากร Dependency
หากต้องการเพิ่มทรัพยากร Dependency ใน Media3 คุณต้องเพิ่มที่เก็บ Maven ของ Google ลงในโปรเจ็กต์ อ่านข้อมูลเพิ่มเติมได้ที่ที่เก็บ Maven ของ Google
เพิ่มทรัพยากร Dependency สำหรับอาร์ติแฟกต์ที่ต้องการในไฟล์ build.gradle สำหรับแอปหรือโมดูล ดังนี้
ดึงดูด
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") }
ดูข้อมูลเพิ่มเติมเกี่ยวกับการขึ้นต่อกันได้ที่เพิ่มการขึ้นต่อกันของบิลด์
ความคิดเห็น
ความคิดเห็นของคุณช่วยเราปรับปรุง Jetpack ให้ดียิ่งขึ้น คุณสามารถใช้เครื่องมือติดตามปัญหาของ Media3 เพื่อค้นหาคำตอบสำหรับคำถาม ปัญหาที่ทราบ และคำขอฟีเจอร์ รวมถึงเพื่อรายงานปัญหาใหม่
เวอร์ชัน 1.12.0
เวอร์ชัน 1.12.0-alpha01
21 ตุลาคม 2569
เวอร์ชัน 1.12.0-alpha01 มีคอมมิตต่อไปนี้
- Common Library:
- เพิ่ม
C.COLOR_SPACE_DISPLAY_P3และรองรับขอบเขตสี Display P3 ในการแมปสี ISOMediaFormatUtilและColorInfo - เพิ่มรีจิสทรี
Flagsส่วนกลางเพื่อจัดการแฟล็กฟีเจอร์ทดลองและการเปิดตัวแบบทีละขั้น (Flags.setCanaryModeEnabled) ย้ายข้อมูลเมธอด@ExperimentalApiที่มีอยู่จำนวนมากเพื่อใช้ API แฟล็กใหม่ - เพิ่ม
MediaMetadata.playlistId,MediaMetadata.Builder.setPlaylistId(String),MediaMetadata.categoriesและMediaMetadata.Builder.setCategories(List<String>) - แทนที่
androidx.media3.common.util.NonNullApiด้วย JSpecifyorg.jspecify.annotations.NullMarked
- เพิ่ม
- ExoPlayer:
- แก้ไขปัญหาที่การเล่นแบบหลายช่วงเวลาของ DASH ค้างเมื่อข้อมูลส่วนแรกของช่วงเวลาถัดไปโหลดไม่สำเร็จ (#3396)
- รายงาน
wasCanceled = trueในAnalyticsListener.onLoadErrorและMediaSourceEventListener.onLoadErrorเมื่อลองโหลดซ้ำจนครบจำนวนครั้งแล้ว - รองรับการลงทะเบียนอินสแตนซ์
VideoFrameMetadataListenerหลายรายการโดยใช้ExoPlayer.addVideoFrameMetadataListenerและExoPlayer.removeVideoFrameMetadataListener, เลิกใช้งานExoPlayer.setVideoFrameMetadataListenerและExoPlayer.clearVideoFrameMetadataListener - เพิ่มการรองรับโฆษณาในเนื้อหาแบบหลายช่วงเวลา (เช่น DASH) โดยการแยกและชดเชย
AdPlaybackStateสำหรับแต่ละช่วงเวลา - แก้ไขภาวะแข่งขันใน
PreCacheHelperซึ่งการยกเลิกคำขอการเตรียมที่กำลังดำเนินอยู่อาจยังคงเริ่มการดาวน์โหลดในเบื้องหลัง - จำกัด
setLoadOnlySelectedTracks(true)ในProgressiveMediaSourceและDefaultMediaSourceFactoryเพื่อกรองเฉพาะแทร็กวิดีโอและรูปภาพที่ไม่ได้เลือกออก ระบบจะโหลดแทร็กเสียงและข้อความเสมอเพื่อให้สลับแทร็กได้อย่างราบรื่นโดยไม่ต้องบัฟเฟอร์ซ้ำ - เปิดใช้
setLoadOnlySelectedTracks(true)โดยค่าเริ่มต้นในProgressiveMediaSourceและDefaultMediaSourceFactoryซึ่งจะช่วยประหยัดหน่วยความจำและช่วยให้การคำนวณการจัดสรรบัฟเฟอร์DefaultLoadControlทำงานได้แม่นยำยิ่งขึ้นเมื่อไม่ได้เลือกแทร็กทั้งหมด โปรดทราบว่าการดำเนินการนี้อาจทำให้เกิดการบัฟเฟอร์เพิ่มเติมหากมีการเปิดใช้แทร็กวิดีโอหรือรูปภาพที่ไม่ได้เลือกใหม่ระหว่างการเล่น - แก้ไขปัญหาที่
Player.getCurrentPosition()อาจแสดงผลค่าที่ล้าสมัย (อัปเดตเพียงไม่กี่ครั้งต่อวินาที) เมื่อเปิดใช้การกำหนดเวลาแบบไดนามิก (#3286) - แก้ไขปัญหาที่การลดลงหรือการรีเซ็ตตำแหน่งส่วนหัวของการเล่น
AudioTrackที่ไม่คาดคิดอาจได้รับการปฏิบัติอย่างไม่ถูกต้องว่าเป็นจำนวนเต็มที่ล้น ซึ่งทำให้การเล่นหยุดชะงักในการบัฟเฟอร์ (#3407) - นำ
DefaultMediaCodecAdapterFactory.setAsyncCryptoSynchronizationEnabled(boolean)เวอร์ชันทดลองออก - หลีกเลี่ยงการเปิดใช้โปรแกรมแสดงผลอีกครั้งโดยไม่จำเป็นและข้อบกพร่องเมื่อกลับจากโฆษณาคั่นระหว่างหน้าหรือโฆษณาไปยังเนื้อหาที่ถูกตัดที่ส่วนท้าย (#3371)
- แก้ไขปัญหาที่ข้อผิดพลาดของโปรแกรมแสดงผลในรายการเพลย์ลิสต์ที่กำลังจะเล่นอาจขัดจังหวะการเล่นปัจจุบันก่อนเวลาอันควรเมื่อเปิดใช้
Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION - แก้ไข
NullPointerExceptionที่อาจเกิดขึ้นหากExoPlayerเปลี่ยนตัวแสดงผลเป็นระยะเวลาสื่อที่ไม่ได้เตรียมไว้เมื่อเปิดใช้Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION - แก้ไขปัญหาที่เฟรมวิดีโออาจถูกข้ามหรือหลุดโดยไม่คาดคิดระหว่างการกำหนดเวลาแบบไดนามิกเมื่อเปิดใช้
Flags.FLAG_VIDEO_RENDERER_DURATION_TO_PROGRESS - แก้ไข
ArrayIndexOutOfBoundsExceptionใน Listener ของ Analytics เมื่อหยุดเล่นระหว่างโฆษณาในไลฟ์สด (#3423) - แก้ไขปัญหาที่
PreloadMediaSourceอาจโพสต์เหตุการณ์โหลดล่วงหน้าโดยไม่คาดคิดเมื่อไม่มีการเรียกใช้preload()(#3408) - แก้ไขปัญหาที่ระบบละเว้น
Format.subsampleOffsetUsสำหรับแทร็กข้อมูลเมตา ซึ่งทำให้การประทับเวลาการเล่นไม่ถูกต้องในคำสั่งเชื่อมต่อ SCTE-35 ที่ถอดรหัสแล้ว (#3413) - แก้ไขหน่วยความจำรั่วไหลใน
PreloadMediaSourceและDefaultPreloadManagerเมื่อมีการเรียกpreload()หลายครั้งในแหล่งที่มาเดียวกัน (#3445) - แก้ไข
NullPointerExceptionเมื่อปล่อยAdsMediaSourceขณะที่การรีเฟรชไทม์ไลน์เนื้อหารอดำเนินการ (#3442) - แก้ไขปัญหาที่การเล่นสื่อแบบโปรเกรสซีฟอาจข้ามไปยังตำแหน่งที่ไม่ถูกต้องเมื่อการโหลดหลังจากกรอ (หรือเมื่อเริ่มเล่นที่ตำแหน่งที่ไม่ใช่ 0) ล้มเหลวและมีการลองใหม่ (#3440)
- เพิ่มวิธีแก้ปัญหาสำหรับตัวถอดรหัส H.264 ของ Xiaomi TV Stick 4K (MiTV-AYFR0) ที่ค้างเมื่อเปลี่ยนความละเอียดแบบราบรื่น (#3457)
- แก้ไข
NullPointerExceptionในSteeringManifestTrackerเมื่อเครื่องมือติดตามหยุดทำงานก่อนที่จะมีการเรียกใช้การเรียกกลับข้อผิดพลาดหรือการโหลดที่โพสต์เสร็จสมบูรณ์ (#3443) - รองรับการเล่นข้อมูลเมตาที่กำหนดเวลาของ HAGC (ST 2094-50) จากแทร็กข้อมูลเมตาที่จัดกลุ่ม
mebxในไฟล์ MP4 - แก้ไขปัญหาที่ระบบอาจข้ามช่วงเวลาของสื่อที่เตรียมช้าในเพลย์ลิสต์
- CompositionPlayer:
- รองรับการกำหนดค่าอัตราเฟรมของการรวมเฟรมวิดีโอโดยใช้
Composition.Builder.setVideoFrameAggregationParametersสำหรับเวิร์กโฟลว์การเล่น - แก้ไขเฟรมที่หายไปในองค์ประกอบแบบหลายลำดับที่เกิดจากการควอนไทเซชันของการประทับเวลาหรือความไม่ตรงกันของการปัดเศษ โดยเลือกเฟรมที่มีการประทับเวลาที่ใกล้เคียงที่สุดในระหว่างการรวมเฟรม ซึ่งจะเปิดใช้จาก API 29 เท่านั้น เนื่องจากต้องเก็บเฟรมเพิ่มเติม 1 เฟรมในระหว่างการประมวลผลต่อลำดับวิดีโอ
- รองรับการกำหนดค่าอัตราเฟรมของการรวมเฟรมวิดีโอโดยใช้
- Transformer:
- รองรับการกำหนดค่าอัตราเฟรมของการรวมเฟรมวิดีโอโดยใช้
Composition.Builder.setVideoFrameAggregationParametersสำหรับเวิร์กโฟลว์การส่งออก - แก้ไขเฟรมที่หายไปในองค์ประกอบแบบหลายลำดับที่เกิดจากการประทับเวลา การควอนไทซ์หรือการปัดเศษที่ไม่ตรงกัน โดยเลือกเฟรมที่มีการประทับเวลาที่ใกล้เคียงที่สุดในระหว่างการรวมเฟรม ซึ่งจะเปิดใช้จาก API 29 เท่านั้น เนื่องจากต้องเก็บเฟรมเพิ่มเติม 1 เฟรมในระหว่างการประมวลผลต่อลำดับวิดีโอ
- เคารพ
Transformer#setAudioMimeType(AUDIO_RAW)เมื่อมีการใช้AudioProcessorsก่อนการแก้ไขนี้ การขอMimeTypes.AUDIO_RAWและการใช้AudioProcessorส่งผลให้เอาต์พุตถูกบีบอัด
- รองรับการกำหนดค่าอัตราเฟรมของการรวมเฟรมวิดีโอโดยใช้
- การเลือกแทร็ก
- แก้ไขปัญหาที่ระบบเลือกแทร็ก SDR แทนแทร็ก Dolby Vision ที่รองรับอย่างไม่ถูกต้องในอุปกรณ์บางรุ่น (#3135)
- เครื่องสกัดน้ำผลไม้
- Mp4Extractor: แก้ไขการแยกวิเคราะห์กล่อง
dOpsสำหรับ Opus ใน MP4 ที่ไม่มีการแปลงPreSkip,InputSampleRateและOutputGainจาก Big-Endian เป็น Little-Endian ซึ่งทำให้เสียง ~299 มิลลิวินาทีแรกถูกตัดออกเมื่อไม่มีรายการแก้ไข (#3431) - นำ
Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES,Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265,FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIESและFragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265ออกเนื่องจากระบบจะเปิดใช้การแยกวิเคราะห์การขึ้นต่อกันของตัวอย่างภายใน GOP สำหรับ H.264 และ H.265 โดยค่าเริ่มต้น - Mp4Extractor: แก้ไขการแยกวิเคราะห์ข้อมูลเมตาตำแหน่งจากกล่อง
xyzที่มีพิกัดระดับความสูงเพื่อป้อนข้อมูลMp4LocationData - เพิ่ม
ExtractorUtil.getFramesPerEncodedSampleเพื่อคำนวณจำนวนเฟรมเสียงต่อตัวอย่างสำหรับรูปแบบเสียงที่เข้ารหัส (#3367) - เพิ่ม
FLAG_READ_XMP_METADATAลงในMp4Extractorเพื่อดึงข้อมูลเมตา XMP จากกล่อง UUID ระดับบนสุด - แก้ไขเสียง AC-3, DTS และ LPCM ที่เสียหายเมื่อเล่นเนื้อหา MPEG-PS แบบ DVD โดยการตัดส่วนหัวของสตรีมย่อย
private_stream_1ออกจากแพ็กเก็ต PES แต่ละรายการในPsExtractorก่อนที่จะส่งเพย์โหลดไปยังโปรแกรมอ่านเสียง (#3327) - แก้ไขข้อผิดพลาดใน
FragmentedMp4Extractorเมื่อกล่องtfdtเวอร์ชัน 1 เข้ารหัสbaseMediaDecodeTimeเชิงลบ (#3412) - MPEG-TS: รองรับการแยกวิเคราะห์ข้อความ SEI ของการจัดเรียงแพ็กเฟรม H.264 และ H.265 เพื่อป้อนข้อมูล
Format.stereoMode(#3419) - แยกวิเคราะห์ข้อมูลการกำหนดค่า Dolby Vision Profile 20 และปฏิเสธโปรไฟล์ Dolby Vision ที่ไม่รองรับแทนการเล่นเป็น HEVC มาตรฐานที่มีสีไม่ถูกต้อง (#3427)
- MP3: เปลี่ยนกลับการปรับแต่งข้อมูลเมตาการหน่วงเวลาและการเสริมของโปรแกรมเปลี่ยนไฟล์ LAME/Xing เนื่องจากใช้ร่วมกับโปรแกรมถอดรหัส MP3
MediaCodecจำนวนมากไม่ได้ (#3425) - Matroska: แก้ไข
NullPointerExceptionเมื่อแยกวิเคราะห์องค์ประกอบChapterAtomที่ฝัง (#3438) - Ogg: แก้ไขข้อบกพร่องที่แพ็กเก็ตซึ่งมีขนาดเป็นจำนวนเท่าของ 255 ไบต์และสิ้นสุดที่ขอบเขตหน้าเว็บถูกผสานรวมกับแพ็กเก็ตต่อไปนี้
- MP4: แยกวิเคราะห์แทร็กข้อมูลเมตาที่กำหนดเวลาไว้ในกล่อง
mebxในMp4ExtractorและFragmentedMp4Extractorแทร็กที่มีคีย์it35จะแสดงเป็นMimeTypes.APPLICATION_ITUT_T35(เปิดใช้การเล่น HAGC) ระบบจะไม่สนใจแทร็กmebxอื่นๆ เว้นแต่จะตั้งค่าFLAG_EMIT_RAW_MEBX_DATAไว้ ซึ่งในกรณีนี้ ระบบจะส่งแทร็กmebxทั้งหมดเป็นMimeTypes.APPLICATION_MEBXดิบ - Ogg: รองรับการแยก Padding ส่วนท้ายของ Opus สำหรับการเล่นแบบไม่มีช่องว่าง (#2576) และแก้ไขการประทับเวลาตัวอย่างหลังจากกรอไปยังหน้าเว็บที่เริ่มต้นด้วยแพ็กเก็ตต่อเนื่อง
- Ogg: แก้ไขข้อผิดพลาดในการถอดรหัสและการข้ามการประทับเวลาประมาณ 1 วินาทีในสตรีม Ogg Opus แบบเชนโดยละเว้นแพ็กเก็ตส่วนหัวของความคิดเห็นและรหัส Opus กลางสตรีม
- Mp4Extractor: แก้ไขการแยกวิเคราะห์กล่อง
- ผู้ตรวจสอบ
- รองรับการดึงข้อมูลเมตา XMP จากไฟล์ MP4 โดยใช้
MetadataRetriever - รองรับการแยกแทร็กข้อมูลเมตาแบบกำหนดเวลาที่จัดกลุ่ม
mebxในMediaExtractorCompatเป็นMimeTypes.APPLICATION_MEBX
- รองรับการดึงข้อมูลเมตา XMP จากไฟล์ MP4 โดยใช้
- เฟรมเครื่องมือตรวจสอบ
- แก้ไขการคลิปสี BT.2020 ที่มีขอบเขตกว้างในรูปภาพฐาน SDR เมื่อดึงเฟรม Ultra HDR ด้วย
FrameExtractorตอนนี้สีที่อยู่นอกขอบเขตจะถูกบีบอัดให้เข้ากับขอบเขต sRGB อย่างนุ่มนวลแทนที่จะถูกจำกัด
- แก้ไขการคลิปสี BT.2020 ที่มีขอบเขตกว้างในรูปภาพฐาน SDR เมื่อดึงเฟรม Ultra HDR ด้วย
- เสียง
- เพิ่มวิธีแก้ปัญหาสำหรับอุปกรณ์ที่เรียกใช้
android.media.AudioDeviceCallbackในชุดข้อความที่ไม่ถูกต้อง (#3386) - แก้ไขปัญหาการเล่นที่อาจค้างหลังจากเปลี่ยนแทร็กด้วยการออฟโหลดที่บีบอัด
- แก้ปัญหาใน Amazon Fire TV Stick ที่เสียง AC-3 อาจค้างระหว่างการเปลี่ยนช่วงเวลา (#3448)
- รองรับการตัดส่วนเสริมของโปรแกรมเปลี่ยนไฟล์ที่ส่วนท้ายของสตรีมสำหรับการเล่นแบบไม่มีช่องว่างของ Ogg และ WebM/Matroska Opus (#2576)
- แก้ไขการอัปเดตการหน่วงเวลาและระยะห่างภายในแบบไร้ช่องว่างของการลดภาระแบบไดนามิกระหว่างการเปลี่ยนแทร็ก เพื่อให้มีผลกับแทร็กที่กำลังจะเล่นแทนแทร็กที่กำลังเล่นอยู่
- ตัดส่วนเสริมท้ายของโปรแกรมเปลี่ยนไฟล์ในสตรีมเดี่ยวและสตรีมสุดท้ายในเพลย์ลิสต์ นอกเหนือจากการเปลี่ยนแบบไร้รอยต่อตรงกลางเพลย์ลิสต์ (#2576)
- หลีกเลี่ยงการคัดลอกบัฟเฟอร์เสียงที่ไม่จำเป็นใน
TrimmingAudioProcessorหลังจากที่การตัดความล่าช้าของโปรแกรมเปลี่ยนไฟล์ที่จุดเริ่มต้นของสตรีมเสร็จสมบูรณ์แล้ว และไม่จำเป็นต้องตัดการเติมที่จุดสิ้นสุดของสตรีม
- เพิ่มวิธีแก้ปัญหาสำหรับอุปกรณ์ที่เรียกใช้
- วิดีโอ:
- แก้ไขการรายงานเฟรมวิดีโอที่ล่าช้าซึ่งมีการประทับเวลาการเผยแพร่ที่เหมือนกัน เพื่อให้ระบบรายงานว่าเฟรมถูกข้ามแทนที่จะถูกข้าม
- ข้อความ
- เพิ่ม
MediaItem.SubtitleConfiguration.timeOffsetUsเพื่อเลื่อนการประทับเวลาของคำบรรยายที่ไซด์โหลดซึ่งเกี่ยวข้องกับสื่อ คุณสามารถเปลี่ยนออฟเซ็ตระหว่างการเล่นด้วยPlayer.replaceMediaItem(int, MediaItem)ได้โดยไม่รบกวนการเล่น (#1976) - SubRip: เพิ่มการรองรับการแทรก
CharsetDetectorลงในDefaultSubtitleParserFactoryเพื่อตรวจหาการเข้ารหัสอักขระของคำบรรยาย SubRip แบบสแตนด์อโลนที่ไม่มีเครื่องหมายลำดับไบต์ (#2247)
- เพิ่ม
- ผลกระทบ
- ใช้
SoundSeparationAudioProcessorสำหรับการแยกแหล่งที่มาของเสียงโดยใช้โมดูล StudioSound GMSCore
- ใช้
- Muxer:
- แก้ไขการเขียนกล่อง
dOpsสำหรับ Opus ในMp4MuxerและFragmentedMp4Muxerซึ่งมีการเขียนPreSkip,InputSampleRateและOutputGainในแบบ Little-Endian แทนที่จะเป็น Big-Endian (#3431) - รองรับการเขียนระดับความสูง GPS ใน
Mp4LocationDataโดยใช้Mp4Muxer - เพิ่ม
Muxer.Factory.create(ParcelFileDescriptor)เพื่ออนุญาตให้มัลติเพล็กซ์ไปยังParcelFileDescriptorโดยตรง - เขียนกล่อง
tfdt(Track Fragment Base Media Decode Time) โดยค่าเริ่มต้นในกล่องtrafของไฟล์ MP4 ที่แยกส่วนเพื่อระบุการประทับเวลาการถอดรหัสสื่อ - รองรับการเขียนกล่องคอนเทนเนอร์
dec3ของ E-AC-3 และ E-AC-3 JOC (Dolby Atmos) ในMp4Muxer - เพิ่มการรองรับรูปแบบ WebM ใน
MediaMuxerCompat - เขียนกล่อง
mfra(Movie Fragment Random Access) ที่ส่วนท้ายของไฟล์ MP4 ที่แยกส่วนเพื่ออนุญาตให้กรอในFragmentedMp4Extractorโดยใช้FLAG_READ_MFRA_FOR_SEEK_MAP - แก้ไขข้อขัดข้องใน
Mp4WriterและFragmentedMp4Writerเมื่อเขียนตัวอย่าง EOS ก่อนที่จะเขียนตัวอย่างอื่นๆ - แก้ไขความสอดคล้องของคอนเทนเนอร์เมื่อมัลติเพล็กซ์เนื้อหา Dolby เป็นไฟล์ MP4 หรือ Fragmented MP4 โดยการโฆษณาแบรนด์ที่เข้ากันได้กับ
dby1ในส่วนหัวของคอนเทนเนอร์ (#3369) - รองรับแทร็กเสียง PCM แบบ 32 บิตโฟลตใน
Mp4MuxerและFragmentedMp4Muxer(#3389) - ปฏิเสธโปรไฟล์ Dolby Vision ที่ไม่รองรับใน
Mp4MuxerและFragmentedMp4Muxerเมื่อเพิ่มแทร็ก - รองรับแทร็กเสียง PCM จำนวนเต็ม 24 บิตและ 32 บิตใน
Mp4MuxerและFragmentedMp4Muxer
- แก้ไขการเขียนกล่อง
- ส่วนขยาย IMA:
- ส่งต่อเหตุการณ์การหยุดชั่วคราวและการเล่นต่อของโปรแกรมเล่นไปยัง IMA SDK ใน
ImaServerSideAdInsertionMediaSource
- ส่งต่อเหตุการณ์การหยุดชั่วคราวและการเล่นต่อของโปรแกรมเล่นไปยัง IMA SDK ใน
- เซสชัน:
- เพิ่ม
MediaConstants.EXTRAS_KEY_PLAYLIST_ID,MediaConstants.EXTRAS_KEY_PLAYLIST_TITLE,MediaConstants.EXTRAS_KEY_PLAYLIST_ARTWORK_URIและMediaConstants.EXTRAS_KEY_CATEGORIESเพื่อป้อนข้อมูลเมตาของเพลย์ลิสต์และรายการจากข้อมูลเมตาและคำอธิบายเดิม รวมถึงMediaConstants.EXTRAS_KEY_SUGGESTED_TYPEและMediaConstants.EXTRAS_KEY_TTL_SECONDSสำหรับLibraryParams.extrasคำแนะนำ - แก้ไขข้อขัดข้องของ
SecurityExceptionเมื่อสร้างหรือเผยแพร่MediaSessionในอุปกรณ์ที่บังคับใช้ขีดจำกัดPendingIntentที่เข้มงวด - แก้ไขปัญหาที่
MediaSession.getControllerForCurrentRequest()แสดงผลnullระหว่างคำขอเล่นใน Android 12 (API 31 และ 32) เมื่อMediaSessionServiceยังไม่ได้อยู่ในเบื้องหน้า - แก้ไขข้อขัดข้องของ
IllegalArgumentExceptionเมื่อMediaControllerเชื่อมต่อกับเซสชันเดิมที่รายงานระดับเสียงสูงสุดเป็นค่าลบ - แก้ไขปัญหาที่การเรียก
MediaController.setMediaItemหรือsetMediaItemsตามด้วยplay()ในMediaSessionCompatเดิมที่หยุดชั่วคราวอาจส่ง CallbackonPrepareFrom*ที่ไม่รองรับแทนonPlayFrom*หรือส่งonPlay()โดยไม่เริ่มต้นรายการสื่อที่ขออีกครั้ง - แก้ไข
NullPointerExceptionในMediaBrowserเดิมเมื่อได้รับการตอบกลับคำสั่งที่กำหนดเอง (#3432) - แก้ไขข้อขัดข้องของ
IllegalArgumentExceptionเมื่อได้รับข้อมูลเมตาเดิมที่มีคีย์ซ้ำกันในBundleที่เกี่ยวข้อง - รวมการเรียก
MediaControllerCompat.TransportControlsขาออกที่ทำขึ้นภายในการทำซ้ำLooperเดียวกันเมื่อควบคุมMediaSessionCompatเดิม (เช่น การเรียกsetMediaItem,prepareและplayพร้อมกันจะส่ง CallbackonPlayFrom*รายการเดียว)
- เพิ่ม
- UI:
- แก้ไขการวางตำแหน่งเครื่องหมายวรรคตอนของคำบรรยายแบบ RTL และการคงช่วงของ Span เมื่อเปิดใช้การตัดข้อความแบบ 2 ทิศทาง (#3454, #3455)
- เพิ่มคลาส
TrackSelectionStateและTrackSelectionParametersStateและฟังก์ชัน remember ของสถานะ Composable ที่เกี่ยวข้องลงในโมดูลmedia3-ui-compose - แนะนำ
PresentationState.videoAspectRatioและทำให้Modifier.resizeWithContentScaleใช้aspectRatio: Float?แทนsourceSizeDp: Size? - เพิ่มคลาส
CuesStateและ ComposablerememberCuesStateลงในโมดูลmedia3-ui-composeเพื่อฟังคิวปัจจุบันของเพลเยอร์ - เพิ่มการรองรับโหมดการสครับไปยัง
ProgressSliderหากอิงตามExoPlayerหรือCompositionPlayer - เพิ่มการรองรับ
showArtworkไปยังPresentationStateและใช้เพื่อจับเวลาการแสดงผลของ Composableartworkที่ไม่บังคับซึ่งระบุไว้ในContentFrameและPlayerเพิ่มArtworkComposable เพื่อใช้เป็น ค่าเริ่มต้นสำหรับช่องartwork - เพิ่มช่องใหม่ลงใน
PlayPauseButtonState(showBuffering,showRetry,showReplay) และใช้ช่องเหล่านั้นในPlayPauseButtonเพื่อแสดงผลไอคอนเพิ่มเติมและสัญญาณบอกสถานะการบัฟเฟอร์ - เพิ่มคลาส
PlaybackStateเพื่ออนุญาตให้สังเกตสถานะการเล่นที่กำหนดเอง และเปิดตัวBufferingIndicatorเป็นคอมโพเนนต์ที่ไม่ขึ้นอยู่กับปุ่ม - แก้ไขปัญหาที่
PlayerViewและPlayerControlViewแสดงตัวทำเครื่องหมายโฆษณาที่ขอบเขตของช่วงเวลาสำหรับตัวยึดตำแหน่งโฆษณาตอนท้ายแบบสดในไลฟ์สดแบบหลายช่วงเวลา - ช่องที่ประกอบได้ของ
Player,ContentFrame,PlayerDefaultsและMiniControllerจะไม่ได้รับเพลเยอร์หรือระดับการเข้าถึงตัวควบคุมเป็นพารามิเตอร์อีกต่อไป ให้บันทึกจากขอบเขตการเรียกแทน (เช่นtopControlsเป็น@Composable BoxScope.() -> Unit) การเปลี่ยนแปลงนี้เป็นการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบบน API ที่ไม่เสถียร - เพิ่มพารามิเตอร์
alignmentลงในContentFrame,PlayerและModifier.resizeWithContentScaleเพื่อจัดตำแหน่งเนื้อหาที่ปรับขนาดภายในคอนเทนเนอร์ และตัดเนื้อหาของContentFrameให้อยู่ภายในขอบเขต เพื่อให้วิดีโอที่ปรับขนาดด้วยContentScale.Cropไม่แสดงผลนอกขอบเขตอีกต่อไป - เพิ่มการรองรับ UI ของไลฟ์สดไปยัง
ProgressSlider,ProgressStateWithTickCountและProgressStateWithTickIntervalโดย แสดงisLiveและliveOffsetMsเพิ่มLiveButtonComposable ลงในmedia3-ui-compose-material3(#2213)
- ส่วนขยาย Ktor:
- แก้ไขปัญหาที่
KtorDataSourceอาจถือว่าการเชื่อมต่อที่ล้มเหลวระหว่างสตรีมเป็นจุดสิ้นสุดของอินพุตแทนที่จะแสดงHttpDataSourceException(#3460)
- แก้ไขปัญหาที่
- ส่วนขยาย HLS
- แยกวิเคราะห์
VIDEO-RANGE(PQและHLG) ในEXT-X-STREAM-INFและEXT-X-I-FRAME-STREAM-INFเป็นFormat.colorInfo(#3441) - แก้ไข
NullPointerExceptionเมื่อแยกวิเคราะห์กลุ่มการเริ่มต้น MPEG-TSEXT-X-MAPที่มีตัวอย่างสื่อ PES (#3456) - แก้ไขการถดถอยที่
Format.idและFormat.metadataเป็นnullสำหรับแทร็ก HLS ที่เปิดเผย (#3402) - ตัดโฆษณาในรายการเนื้อหาให้เหลือ
X-PLAYOUT-LIMITและข้ามโฆษณาที่เกินขีดจำกัดทั้งหมด และตั้งค่าออฟเซ็ตการกลับมาเล่นเนื้อหาต่อเป็น 0 โดยค่าเริ่มต้นเมื่อโฆษณาคั่นระหว่างหน้าละเว้นX-RESUME-OFFSETและไม่ทราบระยะเวลาของโฆษณา แม้ว่าจะตั้งค่าX-PLAYOUT-LIMITไว้ก็ตาม - แก้ไขปัญหาที่การแก้ไขโฆษณาคั่นระหว่างหน้า
X-ASSET-LISTเขียนทับการมีส่วนร่วมของออฟเซ็ตการกลับมาทำงานอีกครั้งของเนื้อหาของโฆษณาคั่นระหว่างหน้าอื่นๆ ในกลุ่มโฆษณาเดียวกัน
- แยกวิเคราะห์
- ส่วนขยาย DASH
- รองรับการแยกวิเคราะห์เหตุการณ์การแทรก MPD ทางเลือก (
urn:mpeg:dash:event:alternativeMPD:insert:2025) และการแทนที่ (urn:mpeg:dash:event:alternativeMPD:replace:2025) ในDashManifestParserและแสดงเป็นอินสแตนซ์AlternativeMpdEventในPeriod.alternativeMpdEventsการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบสำหรับแอปที่เป็นคลาสย่อยของDashManifestParser: ตอนนี้DashManifestParser.buildPeriodจะใช้พารามิเตอร์List<AlternativeMpdEvent>เพิ่มเติม และระบบได้นำโอเวอร์โหลดก่อนหน้านี้ออกแล้ว แอปที่ลบล้างDashManifestParser.parseEventStream(XmlPullParser)ต้องลบล้างDashManifestParser.parseEventStream(XmlPullParser, String)แทน เนื่องจากเมธอดแรกเลิกใช้งานแล้วและจะทำให้เป็นแบบส่วนตัวในรุ่นต่อๆ ไป - แยกวิเคราะห์ข้อมูลสี CICP (
ColourPrimaries,TransferCharacteristics,MatrixCoefficientsและVideoFullRangeFlag) จากข้อบ่งชี้EssentialPropertyและSupplementalPropertyเป็นFormat.colorInfo(#3426) - รองรับรายการค่า
@idที่คั่นด้วยช่องว่างในแอตทริบิวต์@valueของข้อบ่งชี้โหมดทริก (http://dashif.org/guidelines/trickmode) (#3315) - รองรับการแยกวิเคราะห์
<ProducerReferenceTime>ในDashManifestParser, แสดงในAdaptationSet.producerReferenceTimesและใช้เพื่อสร้างTimeline.Window.presentationStartTimeMsและTimeline.Window.windowStartTimeMsสำหรับสตรีม VOD - เพิ่มการรองรับการควบคุมเนื้อหา DASH (#1689)
- แก้ไข
NullPointerExceptionที่อาจเกิดขึ้นเมื่อแยกวิเคราะห์ไฟล์ Manifest ของ DASH ที่มีแอตทริบิวต์ขาดหายไปในองค์ประกอบ<UTCTiming>(#3436)
- รองรับการแยกวิเคราะห์เหตุการณ์การแทรก MPD ทางเลือก (
- ส่วนขยาย RTSP:
- แก้ไขข้อขัดข้องของ
IllegalStateExceptionที่เกิดขึ้นเมื่อประมวลผลการตอบสนองของเครือข่ายที่ล่าช้าหลังจากปิดไคลเอ็นต์ RTSP - แก้ไขปัญหาที่การกรอวิดีโออย่างรวดเร็วอาจทริกเกอร์กลไกสำรองของโปรโตคอล TCP อย่างไม่ถูกต้อง
- แก้ไขข้อขัดข้องของ
IllegalStateExceptionที่อาจเกิดขึ้นเมื่อประมวลผลการตอบกลับเครือข่ายที่ล่าช้าหลังจากไคลเอ็นต์ RTSP รีเซ็ตสถานะระหว่างการเลือกแทร็กใหม่ การแยกเซสชัน หรือการเปลี่ยนเส้นทาง URI - แก้ไขปัญหาที่การกรอวิดีโออีกครั้งก่อนที่การเล่นจะเริ่มใหม่ทำให้
IllegalStateExceptionขัดข้อง - แก้ไขปัญหาที่การกรอกลับขณะที่การกรอวิดีโอยังรอดำเนินการอยู่ อาจทำให้เสียงขาดหายและวิดีโอหยุดเล่นชั่วคราว
- แก้ไขปัญหาที่หน่วยการเข้าถึงคีย์เฟรม H.264 และ H.265 ที่ลงท้ายด้วยแพ็กเก็ตการรวมหรือแพ็กเก็ตที่ไม่ใช่ IDR ไม่ได้รับการแจ้งว่าเป็นคีย์เฟรม ซึ่งทำให้การเล่นค้างอยู่ที่การบัฟเฟอร์ (#3434)
- แก้ไขข้อขัดข้องของ
- ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
- ส่วนขยาย Opus: แก้ไขข้อขัดข้องของ JNI เมื่อถอดรหัสข้อมูล Opus ที่ไม่ถูกต้อง
- ส่วนขยาย Opus: แก้ไขการละเว้นการเติมข้อมูลเมื่อการข้ามล่วงหน้าและการเติมข้อมูลที่ละเว้นอยู่ในแพ็กเก็ตเดียวกัน (#2576)
- ส่วนขยาย Cast:
- เปิดตัว
SessionAvailabilityListener.SessionUnavailableReasonเพื่อแสดงเหตุผลที่เซสชันไม่พร้อมใช้งาน และระบุเมธอดที่โอเวอร์โหลดสำหรับSessionAvailabilityListener.onCastSessionUnavailableเพื่อแสดงเหตุผลดังกล่าว - แก้ไขปัญหาที่การเล่นจะกลับมาทำงานในเครื่องโดยไม่คาดคิดหลังจากหยุดเซสชันการแคสต์
- บันทึกข้อผิดพลาดเมื่อการดำเนินการ
RemoteMediaClient(เช่น เล่น หยุดชั่วคราว เปลี่ยนความเร็ว โหมดเล่นซ้ำ ระดับเสียง ปิดเสียง หรือเลือกแทร็ก) ไม่สำเร็จในRemoteCastPlayer(#3373) - แก้ไข
ArrayIndexOutOfBoundsExceptionในRemoteCastPlayerเมื่อคิวของตัวรับสัญญาณ Cast เปลี่ยนแปลงหรือลดลงขณะที่การดำเนินการค้นหารอดำเนินการอยู่ (#3372) - แก้ไขปัญหาเกี่ยวกับตัวรับ Cast เริ่มต้นที่ไทม์ไลน์แสดงเฉพาะรายการสื่อที่อยู่ติดกับรายการที่กำลังเล่นอยู่เท่านั้น แทนที่จะแสดงเพลย์ลิสต์ทั้งหมด (#3129)
- อัปเดตไทม์ไลน์และตำแหน่งการเล่นทันทีเมื่อแก้ไขเพลย์ลิสต์ (
setMediaItems,addMediaItems,moveMediaItems,removeMediaItems) หรือกรอในRemoteCastPlayerและจัดคิวการดำเนินการเพลย์ลิสต์ที่ต่อเนื่องกันเพื่อให้ทำงานตามลำดับได้อย่างน่าเชื่อถือ (#2639, #3272) - แก้ไขปัญหาที่การเรียก
addMediaItemsในคิวว่างในRemoteCastPlayerโหลดรายการสื่อในตัวรับสัญญาณ Cast ไม่สำเร็จ (#2402) - แก้ไขปัญหาใน
RemoteCastPlayerที่เมื่อถึงจุดสิ้นสุดของคิวตัวรับสัญญาณ Cast ระบบจะล้างไทม์ไลน์แทนที่จะเก็บเพลย์ลิสต์ไว้ - แก้ไขปัญหาที่ไม่มีการโอนหรือใช้
playWhenReady,repeatModeและplaybackParametersเมื่อตั้งค่าในRemoteCastPlayerก่อนโหลดรายการสื่อ (เช่น ระหว่างการโอนการเล่นจากอุปกรณ์ในเครื่องไปยังอุปกรณ์ระยะไกลในCastPlayer) (#889)
- เปิดตัว
- แอปสาธิต:
- เพิ่มการรองรับรายการสื่อที่ได้รับการคุ้มครองด้วย DRM และสตรีมตัวอย่าง HLS เพิ่มเติมลงในแคตตาล็อกแอปเดโมของเซสชัน
- กำหนดค่า
RemoteCastPlayerด้วยCastTrackSelectorในแอปเดโมเซสชันเพื่อเปิดใช้การเลือกคำบรรยายและแทร็กเสียงขณะแคสต์
- นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
- นำ
DashUtil.buildDataSpec(Representation, RangedUri, int)และDashUtil.buildDataSpec(Representation, String, RangedUri, int)ออก โปรดใช้DashUtil.buildDataSpec(Representation, BaseUrl, RangedUri, int, Map<String, String>)แทน
- นำ
- สร้าง:
- เพิ่ม Gradle
minSdkเป็น 24
- เพิ่ม Gradle
เวอร์ชัน 1.11.0
1.11.1
10 กันยายน 2569
- ExoPlayer:
- ย้ายแฟล็กเพื่อเปิด/ปิดใช้ข้อมูลเมตา HAGC สำหรับสื่อแบบโปรเกรสซีฟจาก
MediaSource.Factoryเป็นExtractorsFactoryระบบจะนำวิธีการsetExperimentalEnableHagcPlaybackก่อนหน้าออกและแทนที่ด้วยExtractorsFactory.setParseHagcMetadataนอกจากนี้ยังช่วยแก้ไขปัญหาที่การปิดใช้ไม่ทำงานสำหรับคอนเทนเนอร์ Matroska/WebM ด้วย - แก้ไขปัญหาการหยุดเล่นชั่วคราวที่เกิดขึ้นเมื่อเตรียมการแสดงผลรองที่ไม่ใช่การเปลี่ยนผ่านล่วงหน้า
- แก้ไขปัญหาการอุ่นเครื่องล่วงหน้าซึ่งควรส่งคืน
Surfaceไปยังโปรแกรมแสดงผลหลักเมื่อการกรอรีเซ็ตและปิดใช้โปรแกรมแสดงผลทั้ง 2 รายการ - แก้ไข
ArrayIndexOutOfBoundsExceptionเมื่อการรีเฟรชไทม์ไลน์แบบสดเลื่อนตำแหน่งเริ่มต้นผ่านโฆษณาที่แทรกฝั่งเซิร์ฟเวอร์ซึ่งกำลังเล่นอยู่ (#3348) - แก้ไขปัญหาโหมดการสครับที่เฟรมวิดีโอเก่าอาจแสดงขึ้นมาสั้นๆ เมื่อกรอวิดีโอโดยเปิดใช้
ScrubbingModeParameters.allowSkippingMediaCodecFlush
- ย้ายแฟล็กเพื่อเปิด/ปิดใช้ข้อมูลเมตา HAGC สำหรับสื่อแบบโปรเกรสซีฟจาก
- เครื่องสกัดน้ำผลไม้
- Matroska: แก้ไขปัญหาที่แทร็กซึ่งวางไว้หลังคลัสเตอร์ไม่ส่งผลให้เกิดไทม์ไลน์ที่ค้นหาได้ (#3377)
- เสียง
- แก้ไขการคำนวณขนาดบัฟเฟอร์ใน
SilenceSkippingAudioProcessorเพื่อไม่ให้ขนาดเฟรมลดระยะเวลาความเงียบขั้นต่ำลงอย่างไม่ถูกต้อง (#3271) - แก้ไขการจัดการ PCM แบบ 8 บิตใน
PcmAudioUtilเพื่อจัดการตัวอย่างเป็นแบบไม่มีเครื่องหมายตามที่ Android กำหนด (#3271) - แก้ไขปัญหาการถ่ายโอนข้อมูลซึ่งการเล่นอาจหยุดชะงักระหว่างโฆษณาตอนต้นหรือการเปลี่ยนแบบไม่มีช่องว่างเนื่องจากขนาดบัฟเฟอร์ของฮาร์ดแวร์มีจำกัด
- แก้ไขข้อบกพร่องใน
DefaultAudioSinkที่จำนวนการเผยแพร่ไม่ลดลงเมื่อเทรดการเล่นไม่ทำงานแล้ว (#3338)
- แก้ไขการคำนวณขนาดบัฟเฟอร์ใน
- เซสชัน:
- ส่วนขยาย HLS
- ส่วนขยาย DASH
- แก้ไขการคำนวณการประทับเวลาตัวอย่างที่ไม่ถูกต้องสำหรับแทร็กรูปภาพที่มี
presentationTimeOffset(#3334)
- แก้ไขการคำนวณการประทับเวลาตัวอย่างที่ไม่ถูกต้องสำหรับแทร็กรูปภาพที่มี
- ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
- Opus: แก้ไขความเสียหายของหน่วยความจำเมื่อมีการเริ่มต้นอินสแตนซ์
OpusDecoderหลายรายการพร้อมกัน - MPEG-H: แก้ไขหน่วยความจำรั่วไหล การตัดอักขระที่ไม่ใช่ ASCII และการขัดข้องของระบบที่อาจเกิดขึ้นในสภาวะหน่วยความจำเหลือน้อยเมื่อส่งคำสั่งไปยัง
MpeghUiManager(#3365)
- Opus: แก้ไขความเสียหายของหน่วยความจำเมื่อมีการเริ่มต้นอินสแตนซ์
เวอร์ชัน 1.11.0
5 สิงหาคม 2026
- ไลบรารีทั่วไป
- เพิ่ม
Format.channelMaskเพื่อแสดงมาสก์ช่องเสียงอย่างชัดเจน และเพิ่มโอเวอร์โหลดUtil.getAudioTrackChannelConfig(Format)ใหม่เพื่อแก้ไขอย่างปลอดภัย - อัปเกรด Kotlin จาก 2.0.20 เป็น 2.2.0
- เพิ่ม
- ExoPlayer:
- แก้ไขข้อบกพร่องที่เกิดขึ้นพร้อมกันซึ่งขึ้นอยู่กับเวลา ซึ่งอาจทำให้เกิด
IllegalStateExceptionหรือIndexOutOfBoundsExceptionใน ExoPlayer - ผ่อนปรนการตรวจสอบจำนวนกลุ่มโฆษณาใน
AdsMediaSourceเพื่ออนุญาตให้จำนวนกลุ่มโฆษณาลดลงเมื่อประมวลผลกลุ่มโฆษณาเสร็จสมบูรณ์ (hasUnplayedAds()คือfalse) เพื่อรองรับการปรับขนาดกลุ่มโฆษณาแบบไดนามิกระหว่างเวิร์กโฟลว์การรีเซ็ต - เพิ่ม
getFlags()และFLAG_STRICT_DURATIONลงในSampleStreamเพื่ออนุญาตให้สตรีมรายงานแฟล็ก และอัปเดตโปรแกรมแสดงผลเพื่อตรวจสอบแฟล็กเหล่านี้แบบไดนามิก - ใช้เครื่องมือประมาณอัตราเฟรมใน
MediaCodecVideoRendererและใช้รูปแบบเอาต์พุตของตัวแปลงรหัสในMediaCodecAudioRendererเพื่อคำนวณอัตราการทำงานของตัวแปลงรหัสเมื่อรูปแบบสตรีมไม่มีค่าที่ถูกต้อง และหลีกเลี่ยงการรีเซ็ตตัวแปลงรหัสโดยไม่จำเป็น - นำการตัดเนื้อหาสำหรับโฆษณาที่แทรกฝั่งไคลเอ็นต์ในเพลเยอร์หลักออก แต่
AdsMediaSourceจะดูแลตรรกะการตัดคลิปแทน แหล่งที่มาของโฆษณาที่แทรกฝั่งไคลเอ็นต์ที่กำหนดเองต้องได้รับการอัปเดตเพื่อใช้การตัดคลิปเนื้อหาภายใน - ทำเครื่องหมายแทร็กที่มีโปรไฟล์หรือระดับตัวแปลงรหัสที่ถูกต้องแต่ไม่รู้จักเป็น
supported=NO_EXCEEDS_CAPABILITIESแทนsupported=YES(ซึ่งเป็นวิธีทำเครื่องหมายแทร็กที่มีข้อมูลโปรไฟล์หรือระดับที่ขาดหายไปหรือมีรูปแบบไม่ถูกต้อง) ซึ่งจะช่วยให้มั่นใจได้ว่าระบบจะไม่เลือกแทร็กเหล่านี้ (ซึ่งอุปกรณ์ไม่น่าจะรองรับ) เมื่อมีทางเลือกอื่นที่รองรับได้ดีกว่า - เพิ่ม
DefaultPreloadManager.SimpleRankingDataComparatorซึ่งเป็นRankingDataComparatorที่เปรียบเทียบอันดับของรายการสื่อตามระยะห่างจากดัชนีของรายการสื่อที่กำลังเล่นอยู่ แอปสามารถลบล้างเมธอดcompare(Integer, Integer)ได้หากต้องการตรรกะการเปรียบเทียบที่ปรับแต่งละเอียดยิ่งขึ้น คุณสามารถแทรกSimpleRankingDataComparatorที่กำหนดเองผ่านตัวสร้างใหม่ของDefaultPreloadManager.Builderได้ - ลดความเสี่ยง OOM ของ
DefaultLoadControl.prioritizeTimeOverSizeThresholdsโดยเปลี่ยนกลับไปใช้ขีดจำกัดขนาดไบต์ของบัฟเฟอร์หากหน่วยความจำฮีปที่ใช้ได้ดูเหมือนจะเหลือน้อย - ปรับการจัดการภาพนิ่งเมื่อไม่ได้ตั้งค่า
MediaItem.imageDurationUs: ตอนนี้ภาพนิ่ง JPEG และ HEIC จะ "เล่น" โดยมีระยะเวลาเริ่มต้นสั้นมาก (เช่นเดียวกับที่ PNG และรูปภาพอื่นๆ เคยทำงานก่อนหน้านี้) - เพิ่ม
MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter)เพื่อตั้งฉากBandwidthMeterกับMediaSourceระบบจะยังคงเรียกใช้เมธอดที่เลิกใช้งานแล้วซึ่งมีการติดตั้งใช้งานที่กำหนดเองโดยค่าเริ่มต้น แต่เราขอแนะนำให้ติดตั้งใช้งานเมธอดใหม่และใช้BandwidthMeter.getTransferListener()เพื่อให้มีความเท่าเทียมกับเมธอดเดิม - ใน
DefaultBandwidthMeterให้เพิ่มการรองรับInitialBitrateSupplierที่กำหนดเอง ซึ่งจะช่วยให้แอปสามารถระบุตรรกะของตนเองในการกำหนดค่าประมาณอัตราบิตเริ่มต้น ซึ่งจะใช้ในการสร้างDefaultBandwidthMeterและการเปลี่ยนแปลงประเภทเครือข่าย คุณตั้งค่าซัพพลายเออร์ได้ผ่านDefaultBandwidthMeter.Builder.setInitialBitrateSupplier() - เปิดใช้การจัดกำหนดการแบบไดนามิกโดยค่าเริ่มต้น ลูปการทำงานของการเล่น
ExoPlayerจะทำงานแบบไดนามิก ไม่ใช่ตามช่วงเวลาคงที่ - นำการรีเซ็ตที่ไม่จำเป็นซึ่งอาจเกิดขึ้นเมื่อรวมแทร็กที่มีตัวอย่างโฆษณาก่อนแสดงวิดีโอเข้ากับการเล่นที่ใช้งานอยู่ออก
- ใน
DefaultBandwidthMeterให้เพิ่มประสิทธิภาพgetInitialBitrateCountryGroupAssignmentเพื่อแสดงผลการกำหนดกลุ่มประเทศที่รวมไว้ในจำนวนเต็ม 32 บิตแทนอาร์เรย์ ซึ่งจะช่วยลดขนาดโค้ดและหลีกเลี่ยงการจัดสรร - แก้ไขข้อผิดพลาดในการเริ่มต้น
AudioTrackในอุปกรณ์บางเครื่องโดยตรวจสอบว่าตรรกะการลองใหม่จะพยายามใช้ขนาดบัฟเฟอร์อย่างน้อย 1 วินาทีเสมอ หากการลองใหม่อื่นๆ (โดยลดขนาดบัฟเฟอร์ลงครึ่งหนึ่ง) ไม่สำเร็จ (#3207) - แก้ไขปัญหาเกี่ยวกับตัวแปลงรหัสในอุปกรณ์บางเครื่องที่ตัวแปลงรหัสกลืนตัวอย่างทั้งหมดหากมีการล้างข้อมูลก่อนหน้านี้ก่อนที่จะได้รับบัฟเฟอร์อินพุต
- เพิ่ม
ExoPlayer.Builder.enablePerStreamMediaProgression()เวอร์ชันทดลองเพื่ออนุญาตให้ประมวลผลสื่อขั้นสูงแบบต่อสตรีม ซึ่งจะช่วยลดเวลาในการตอบสนองเมื่อเริ่มเล่นระหว่างรายการในเพลย์ลิสต์และป้องกันไม่ให้การเล่น "ค้าง" เมื่อเล่นเนื้อหาที่สั้นมาก (#3122) - แก้ไขภาวะแข่งขันที่เกี่ยวข้องกับการใช้รหัสเซสชันเสียง โดยจะใช้รหัสเซสชันเสียงเริ่มต้นที่
ExoPlayerสร้างขึ้นโดยอัตโนมัติแทนค่าที่setAudioSessionIdกำหนด (#3241) - เพิ่มการรองรับการเล่นข้อมูลเมตาที่กำหนดเวลาของ HAGC (ST 2094-50) เวอร์ชันทดลองสำหรับสื่อแบบโปรเกรสซีฟ (เช่น MP4, Matroska) เพลเยอร์จะผสานแทร็กข้อมูลเมตา HAGC กับแทร็กวิดีโอที่เกี่ยวข้องโดยอัตโนมัติ และส่งข้อมูลเมตานอกแบนด์ไปยังตัวถอดรหัสในอุปกรณ์ API 37 ขึ้นไป ลักษณะการทำงานนี้
ปิดใช้ได้ผ่าน
DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false) - เพิ่ม
Format.selectionPriorityที่แสดงถึงค่ากำหนดที่เกี่ยวข้องของFormatในการเลือกแทร็ก (#3236) - แก้ไขปัญหาที่อาจเกิดขึ้นในโหมดสครับ ซึ่งการสครับอาจหยุดชะงักเมื่อกรอไปยัง "จุดสิ้นสุดของสตรีม"
- แก้ไขข้อบกพร่องที่เกิดขึ้นพร้อมกันซึ่งขึ้นอยู่กับเวลา ซึ่งอาจทำให้เกิด
- CompositionPlayer:
- แก้ไขปัญหาที่ไม่มีการเผยแพร่อินสแตนซ์
TrackSelector
- แก้ไขปัญหาที่ไม่มีการเผยแพร่อินสแตนซ์
- Transformer:
- แก้ไขปัญหาที่อาจมีการรายงาน
ExportResult.fileSizeBytesมากเกินไป
- แก้ไขปัญหาที่อาจมีการรายงาน
- การเลือกแทร็ก
- แสดง
BaseTrackSelection.DEFAULT_FORMAT_COMPARATORและเพิ่มAdaptiveTrackSelection.Factory.setTrackFormatComparatorเพื่ออนุญาตการจัดลำดับรูปแบบที่กำหนดเองและลำดับความสำคัญในการเลือก ABR นอกเหนือจากการจัดลำดับตามอัตราบิตเท่านั้น - แก้ไขปัญหาการเกิดขึ้นพร้อมกันที่ขึ้นอยู่กับเวลา ซึ่งการอัปเดตพารามิเตอร์การเลือกแทร็กตามลำดับอย่างรวดเร็วอาจส่งผลให้การอัปเดตบางรายการสูญหายหรือถูกเขียนทับ
- แสดง
- เครื่องสกัดน้ำผลไม้
- MP4, MP3 และ FLAC: เพิ่ม
FLAG_DISABLE_ARTWORK_METADATAเพื่ออนุญาตให้ทิ้งรูปภาพที่แนบมาและข้อมูลเมตาของภาพหน้าปกในระหว่างการแยกวิเคราะห์คอนเทนเนอร์เพื่อลดการใช้หน่วยความจำรันไทม์ (#2077) นอกจากนี้ คุณยังเปิดใช้ฟีเจอร์นี้จากส่วนกลางผ่านDefaultExtractorsFactory.setDisableArtworkMetadataได้ด้วย - MP4: เพิ่มการรองรับการดึงข้อมูลแทร็กข้อมูลเมตาแบบกำหนดเวลา ITU-T T.35 (
it35) - MP4: เพิ่มการรองรับการดึงข้อมูลเมตาของบท (ทั้งรูปแบบ Nero และ QuickTime) หากมีทั้ง 2 อย่าง ระบบจะเลือกใช้บทของ QuickTime ข้อมูลบทที่แยกออกมาจะแสดงเป็นรายการ
ChapterภายในMetadataของแทร็ก ซึ่งช่วยให้ไปยังส่วนต่างๆ ของบทได้โดยตรงในไฟล์ MP4, M4A และ M4B (เช่น หนังสือเสียงและพอดแคสต์) (#2803) - WAV, Matroska และ MP4: เพิ่มการรองรับเสียง PCM แบบจุดลอยตัว 64 บิต (#3090)
- Matroska: ใช้ข้อมูลเมตาบิตสตรีมของตัวแปลงรหัสเพื่อสร้าง
ColorInfoที่ถูกต้อง - MP4: เพิ่มการรองรับการกรอในไฟล์ MP4 ที่มีการกระจาย Fragment โดยใช้กล่อง
mfraเมื่อไม่มีกล่องsidxหากต้องการเปิดใช้ ให้ระบุFLAG_READ_MFRA_FOR_SEEK_MAPไปยังFragmentedMp4Extractorซึ่งตอนนี้ดำเนินการโดยค่าเริ่มต้นในDefaultExtractorsFactory(#3088) - ละเว้นข้อมูล
av1Cที่มีเวอร์ชันที่ไม่รองรับ - MP4: เพิ่มการรองรับ PCM จุดลอยตัวแบบ Big-Endian ในกล่อง
fpcm - Matroska: แยกวิเคราะห์ข้อมูลบทเป็นรายการ
ChapterรายการในMetadataของแทร็ก - MPEG-TS: ปรับปรุงการแยกสตรีม DTS-HD และ DTS Express โดยรวมสตรีมย่อย Core และ Extension เข้าเป็นตัวอย่างเดียว ซึ่งจะช่วยแก้ไขปัญหาการเล่นที่ก่อนหน้านี้ทั้ง 2 สตรีมแสดงผลเป็นตัวอย่างแยกกัน (#3147)
- MP4: ป้องกันการวนซ้ำไม่สิ้นสุดและการอ่านที่อยู่นอกขอบเขตเมื่อแยกวิเคราะห์รายการแท็กข้อมูลเมตา
ilstที่ว่างเปล่า (#3191) - MPEG-TS: ตรวจสอบว่าเฟรมสุดท้ายได้รับการแสดงผลสำหรับสตรีมที่แพ็กเก็ต PES สุดท้ายมีความยาวที่ทราบ (#3206)
- MP3: แก้ไขการรายงานอัตราบิตสำหรับไฟล์ที่มีส่วนหัว Xing และ VBRI
- Matroska: จัดการแทร็กที่กำหนดไว้ในคลัสเตอร์สุดท้าย (#3250)
- Matroska: เพิ่มการรองรับ ALAC (#3268)
- MP4: อนุญาตให้ใช้กล่อง
sgpdที่มีความยาวแปรผันในไฟล์ MP4 ที่มีการแบ่งส่วน (#3243) - AVI: แก้ไขปัญหาที่การเล่นไฟล์ที่ไม่มีแฟล็กคีย์เฟรมในแทร็กเสียงทำให้เสียงหายไปและเกิดข้อผิดพลาด
OutOfMemoryError - MP3: ใช้ระยะเวลาที่รับรู้แบบไม่มีช่องว่างจากส่วนหัว Xing/Info (#3183)
- MP3: ปรับความล่าช้าของโปรแกรมเปลี่ยนไฟล์ LAME/Xing และข้อมูลเมตาการเติมให้ตรงกับการตัดแต่ง PCM ที่ถอดรหัสแล้ว (#3200)
- MP4, MP3 และ FLAC: เพิ่ม
- เสียง
- เพิ่มระยะเวลาผ่อนผัน 100 มิลลิวินาทีในโปรแกรมแสดงผลเสียงของ ExoPlayer เมื่อเปลี่ยนจากสถานะพร้อมเป็นไม่พร้อม เพื่อลดการเกิดบัฟเฟอร์ขาดพร่องชั่วคราวและหลีกเลี่ยงสถานะการบัฟเฟอร์ที่ไม่คาดคิดระหว่างการเล่นที่ใช้งานอยู่ (#3210)
- เปลี่ยนตรรกะขนาดบัฟเฟอร์ PCM เริ่มต้นใน
DefaultAudioTrackBufferSizeProviderเพื่อใช้บัฟเฟอร์ 500 มิลลิวินาทีแบบคงที่เพื่อลดการพึ่งพาอุปกรณ์ - อัปเดต
MediaCodecAudioRendererเพื่อดึงข้อมูล channelMask เชิงพื้นที่จากตัวถอดรหัสแพลตฟอร์ม ซึ่งจะช่วยให้DefaultAudioSinkใช้มาสก์ที่ชัดเจนนี้แทนการอนุมานจากจำนวนช่องได้ - แปลงพารามิเตอร์ของ
AudioSink.configureเป็นคลาสข้อมูล ต้องย้ายข้อมูลการลบล้างForwardingAudioSink.configureที่กำหนดเองไปยังซิกเนเจอร์เมธอดใหม่ - เพิ่มการรองรับการคงระดับเสียงเมื่อยืดเวลาสตรีมเสียงด้วย
EditedMediaItem.Builder#setSpeed(SpeedParameters) - ปรับปรุง
ToFloatPcmAudioProcessorเพื่อรองรับการแปลง PCM 8 บิต, PCM แบบ Big-Endian 16 บิต และ PCM แบบจุดลอยตัว 64 บิตเป็น PCM แบบจุดลอยตัว 32 บิต (#3090) - เปลี่ยนมูลค่าผลตอบแทนของ
DecoderAudioRenderer.getChannelMappingเป็นImmutableIntArray - แก้ไขข้อบกพร่องที่ทำให้การเล่นค้างเมื่อเล่นเพลย์ลิสต์เสียงแบบไม่มีช่องว่างในโหมดการลดภาระการประมวลผลที่บีบอัด
- ส่งต่อ
Timelineและ UID ของระยะเวลาไปยังAudioSink.configureและAudioProcessor.StreamMetadataเพื่อให้บริบทของเพลย์ลิสต์แก่ตัวประมวลผลเสียง (#418) - ตั้งค่า
AudioProcessor.StreamMetadata.positionOffsetUsให้ถูกต้องเพื่ออนุญาตการประมวลผลเสียงตามเวลา (#418) - เพิ่มการรองรับ PCM แบบจุดลอยตัว 32 บิตและ 64 บิตแบบ Big Endian
- นำเส้นทางสำรองของ EAC3-JOC ไปยัง EAC3 สำหรับการเล่นบนอุปกรณ์ Google Pixel ออก เนื่องจากตัวถอดรหัส EAC3 มาตรฐานไม่สามารถถอดรหัสสตรีม EAC3-JOC ได้ (#3257)
- วิดีโอ:
- แก้ไขตรรกะการเข้าร่วมวิดีโอเพื่อนับบัฟเฟอร์ที่ถูกทิ้งระหว่างการเข้าร่วมว่าข้ามไปแทนที่จะถูกทิ้ง
- แก้ไขการตัดสินใจแสดงผลทันทีเมื่อตั้งค่า Surface ใหม่เพื่อหลีกเลี่ยงเฟรมดรอปในอุปกรณ์ที่ไม่รองรับ Surface ตัวยึดตำแหน่ง
- แก้ไขการประมาณอัตราเฟรมใน
MediaCodecVideoRendererให้แม่นยำยิ่งขึ้นโดยพิจารณาเฟรมที่ถูกข้ามหรือถูกละทิ้ง - อนุญาตให้กำหนดค่าเกณฑ์ที่ใช้ในการกำหนดเวลาเฟรมล่วงหน้า ค่าเริ่มต้นคือ 50 มิลลิวินาที แต่คุณสามารถปรับแต่งค่าได้ผ่าน
MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold() - แก้ไขข้อบกพร่องใน
VideoFrameReleaseHelperซึ่งการเปลี่ยนแปลงการแสดงผลอาจทริกเกอร์ Callback ของChoreographerที่ซ้ำซ้อนและการปลุก CPU มากเกินไปในเทรดหลัก
- ข้อความ
- ข้อมูลเมตา
- เพิ่มช่อง
MediaMetadata.discSubtitleและแยกวิเคราะห์จากข้อมูล ID3v2.4TSSTและ VorbisDISCSUBTITLE - แยกวิเคราะห์หมายเลขและจำนวนแผ่นดิสก์จากเฟรม ID3
TPOS
- เพิ่มช่อง
- ผลกระทบ
- ล้างสถานะการวาดใหม่ใน
FinalShaderProgramWrapperเมื่อล้างข้อมูลเพื่อป้องกันไม่ให้โปรแกรมเล่นค้างเมื่อกรอวิดีโอ
- ล้างสถานะการวาดใหม่ใน
- Muxer:
- เพิ่มการรองรับการอ้างอิงแทร็ก (กล่อง
tref) ในMp4Muxerผ่าน APIaddTrackReferenceใหม่ ซึ่งจะช่วยสร้างความสัมพันธ์ระหว่างแทร็กต่างๆ เช่น การลิงก์แทร็กข้อมูลเมตากับแทร็กวิดีโอที่อธิบาย - เพิ่ม
OggMuxerเพื่ออนุญาตให้มัลติเพล็กซ์สตรีมสื่อOPUSหรือVORBISเป็นรูปแบบไฟล์ogg - เพิ่ม
WavMuxerสำหรับการสร้างไฟล์ WAV (รองรับ PCM จำนวนเต็มและจุดลอยตัว) - เพิ่ม
setAttemptStreamableOutputEnabledลงในInAppMp4Muxer.Factoryเพื่ออนุญาตให้เขียนไฟล์ขนาดเล็กที่สตรีมไม่ได้โดยไม่ต้องมีพื้นที่ที่สงวนไว้ - เพิ่มการรองรับเสียง IAMF ใน
Mp4MuxerและFragmentedMp4Muxer
- เพิ่มการรองรับการอ้างอิงแทร็ก (กล่อง
- ส่วนขยาย IMA:
- เพิ่ม
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlotเพื่ออนุญาตให้ระบุช่องโฆษณาที่จะใช้สำหรับโฆษณาช่วงวิดีโอหยุดเล่น - แก้ไขข้อบกพร่องที่โฆษณา VAST แบบข้ามได้ที่แสดงต่อกันแสดงปุ่มข้ามทันทีในโฆษณาที่ 2 (#3165)
- เพิ่ม
- เซสชัน:
- แก้ไขปัญหาการหยุดชะงักที่อาจเกิดขึ้นและข้อขัดข้องของ
IllegalStateExceptionภายในMediaNotificationManagerเมื่อใช้เซสชันกับโปรแกรมเล่นที่ใช้เทรดเบื้องหลัง - บังคับใช้ข้อกำหนดการทำเธรดที่เข้มงวดขึ้นสำหรับเมธอด
MediaSessionตอนนี้เมธอด Void จะโพสต์การดำเนินการไปยังเทรด Looper ของแอปพลิเคชันโดยอัตโนมัติ และตัวช่วยเข้าถึงสถานะ (Getter) จะแสดงIllegalStateExceptionอย่างชัดเจนหากเรียกจากเทรดอื่นที่ไม่ใช่ Looper ของแอปพลิเคชัน - แก้ไขข้อขัดข้องในการผสานไทม์ไลน์ที่อยู่นอกขอบเขต (
IllegalStateExceptionในMediaUtils.mergePlayerInfo) โดยการติดตามความสอดคล้องของสถานะต่อตัวควบคุมในฝั่งเซสชัน - เพิ่ม
androidx.media3.session.MediaSessionManagerเพื่อรองรับการค้นหาเซสชันสื่อที่ใช้งานอยู่และแสดงผลอินสแตนซ์SessionTokenของ Media3 - เปลี่ยนลักษณะการทำงานเริ่มต้นของ
MediaSession.Callback.onConnectหากไม่มีการลบล้างเมธอดเพื่อให้สิทธิ์อ่านแก่ตัวควบคุมที่ไม่น่าเชื่อถือเท่านั้น - เพิ่มการรองรับเพื่อลบล้างชื่อแพ็กเกจขณะสร้าง
MediaSessionผ่าน API ใหม่MediaSession.Builder#setPackageNameOverrideผู้โทรต้องมีสิทธิ์android.permission.OVERRIDE_MEDIA_SESSION_OWNERเพื่อลบล้างชื่อแพ็กเกจของเซสชัน - เพิ่ม
MediaSession.Callback.onConnectAsync()วิธีการใหม่นี้ช่วยให้ประมวลผลการพยายามเชื่อมต่อของตัวควบคุมแบบอะซิงโครนัสได้ แอปสามารถแสดงผลFutureทันทีด้วยFutures.immediateFuture(ConnectionResult)เพื่อให้ได้ลักษณะการทำงานก่อนหน้า เราขอแนะนำให้เปลี่ยนไปใช้วิธีใหม่เนื่องจากCallback.onConnectเป็นตัวเลือกที่เลิกใช้งานแล้ว - แก้ไขปัญหาที่การเรียกดู AVRCP ของบลูทูธไม่รู้จัก
MediaLibraryServiceใน API 36 และ 37 - แก้ไขการลดขนาดอาร์ตเวิร์กซ้ำใน
MediaSessionเมื่อขนาดรูปภาพใกล้ถึงขีดจำกัดของแพลตฟอร์ม ซึ่งช่วยแก้ปัญหาภาพเบลอในการแจ้งเตือน (#3134) - แก้ไขข้อขัดข้อง
ForegroundServiceStartNotAllowedExceptionในMediaNotificationManagerเมื่อ Callback การโหลดบิตแมปอาร์ตเวิร์กแบบอะซิงโครนัสพยายามเริ่มบริการที่ทำงานอยู่เบื้องหน้าขณะที่แอปอยู่ในเบื้องหลัง (#3270) - แก้ไขปัญหาที่ออบเจ็กต์
PositionInfoที่MediaControllerได้รับไม่มี UIDTimelineเดิม ตอนนี้เซสชันจะแปลและเผยแพร่ UID เหล่านี้อย่างน่าเชื่อถือในระหว่างการอัปเดตสถานะ - แก้ไขข้อขัดข้องโดยการตรวจจับ
ForegroundServiceStartNotAllowedExceptionในMediaSessionService.stopSelfSafely()(#3310) - แก้ไข Callback
onMediaItemTransition()ที่ไม่คาดคิดในMediaControllerเมื่อกรอภายในรายการสื่อเดียวกัน (#3248)
- แก้ไขปัญหาการหยุดชะงักที่อาจเกิดขึ้นและข้อขัดข้องของ
- UI:
- แก้ไขการแสดงผลเฟรมแรกในขนาดที่ไม่ถูกต้องเมื่อมีการจัดองค์ประกอบ
ContentFrameใหม่ระหว่างการเล่น (#3238) - เพิ่มคลาส
CurrentMediaItemStateและrememberCurrentMediaItemStateComposable ที่เกี่ยวข้องลงในโมดูลmedia3-ui-composeตัวเก็บสถานะนี้ใช้ในdemo-composeเพื่อแสดงข้อมูลเมตาต่างๆ เกี่ยวกับMediaItemที่กำลังเล่นอยู่ - เพิ่มคลาส
PlaylistStateและ ComposablerememberPlaylistStateที่เกี่ยวข้องลงในโมดูลmedia3-ui-composeตัวเก็บสถานะนี้ใช้ในdemo-composeเพื่อแสดงข้อมูลเมตาต่างๆ เกี่ยวกับMediaItemsที่ตั้งค่าไว้ในเพลเยอร์ - เพิ่ม API การกรอไปข้างหน้า/สโลว์โมชันลงใน
PlaybackSpeedStateใช้ฟังก์ชันนี้ในdemo-composeเพื่อแสดงการกรอไปข้างหน้าด้วยการกดค้าง - เพิ่ม
MiniControllerComposable ลงในโมดูลmedia3-ui-compose-material3โดยจะแสดงแผงควบคุมขนาดกะทัดรัดเพื่อควบคุมPlayerพร้อมแสดงชื่อ ศิลปิน อาร์ตเวิร์ก และความคืบหน้าของรายการสื่อปัจจุบัน - เพิ่มคลาส
ErrorStateและ ComposablerememberErrorStateที่เกี่ยวข้องลงในโมดูลmedia3-ui-composeเพิ่ม ComposableErrorTextลงในmedia3-ui-compose-material3และทำให้เป็นภาพซ้อนทับเริ่มต้นในPlayer - เผยแพร่ออบเจ็กต์
PlayerDefaultsที่มี Composable สำหรับTopControls,CenterControls,BottomControlsและErrorOverlay - เพิ่ม
FocusRequesterไปยัง ComposablePlayerและช่องเนื้อหา - เผยแพร่
PlayerPool(common-ktx) และrememberPooledPlayer(ui-compose) เพื่อรองรับการโหลดMediaItemsล่วงหน้าในสภาพแวดล้อม UI ของหน้าต่างแบบเลื่อน แสดงฟังก์ชันการทำงานนี้ในdemo-composeด้วยShortFormPlayerScreenใหม่ - แก้ไขข้อบกพร่องการระงับชัตเตอร์ใน
PlayerViewและ ComposePresentationStateที่ทำให้เกิดข้อขัดข้องในไทม์ไลน์ที่ไม่รองรับ การค้นหา UID ของระยะเวลา (#3264)
- แก้ไขการแสดงผลเฟรมแรกในขนาดที่ไม่ถูกต้องเมื่อมีการจัดองค์ประกอบ
- ดาวน์โหลด:
- แก้ไขตัวแปร HLS ในเพลย์ลิสต์สื่อเมื่อดึงข้อมูลเพื่อดาวน์โหลด (#3258)
- ส่วนขยาย Ktor:
- ส่วนขยาย HLS
- เพิ่มการรองรับการควบคุมเนื้อหา HLS และการโคลนเส้นทาง (#1689)
- เพิ่ม
setWithAssetListResetลงในHlsInterstitialsAdsLoaderเพื่ออนุญาตให้แอปรีเซ็ตโฆษณาคั่นระหว่างหน้าของรายการเนื้อหาที่ประมวลผลเสร็จสมบูรณ์แล้วกลับไปเป็นสถานะไม่พร้อมใช้งานสำหรับการแก้ไขความละเอียดอีกครั้งแบบออนดีมานด์ - แยกวิเคราะห์แอตทริบิวต์
SCOREของEXT-X-STREAM-INFและEXT-X-I-FRAME-STREAM-INFแล้วป้อนข้อมูลลงในFormat.selectionPriority(#3236) - แก้ไขข้อบกพร่องที่การรีเฟรชเพลย์ลิสต์ HLS ที่กำหนดเวลายังคงทำงานต่อไปแม้ว่าเพลย์ลิสต์จะไม่ใช่เพลย์ลิสต์หลักหรือไม่มีการใช้งานแล้วก็ตาม (#3254)
- แก้ไขการคำนวณออฟเซ็ตการเล่นเนื้อหาต่อเมื่อแก้ไขรายการชิ้นงานโฆษณาคั่นระหว่างหน้า (#3322)
- แก้ไขการประทับเวลาของแทร็กเสียงที่ไม่ต่อเนื่องโดยไม่คาดคิดเมื่อกลับมาเล่นไลฟ์สดที่มีเวลาในการตอบสนองต่ำอีกครั้งหลังจากคำขอเพลย์ลิสต์ไม่สำเร็จ (#3311)
- แก้ไขข้อบกพร่องใน
HlsMediaPeriod.getStreamKeys()ที่ระบบถือว่าแทร็ก ID3 ในการแสดงผลเสียงเป็นคำบรรยาย (#3333)
- ส่วนขยาย DASH
- แยกคำบรรยาย CEA ออกเป็น
TrackGroupต่างๆ ตามภาษา (#3113) - เพิ่มการรองรับการแยกวิเคราะห์องค์ประกอบ
Locationหลายรายการจากไฟล์ Manifest (MPD) และดำเนินการสำรองตำแหน่งในDashMediaSourceเมื่อโหลดไฟล์ Manifest ไม่สำเร็จ - แก้ไขข้อขัดข้อง (
IndexOutOfBoundsException) เมื่อเปิดไฟล์ Manifest ที่มีองค์ประกอบ<SegmentTimeline/>ที่ว่างเปล่า (#3326)
- แยกคำบรรยาย CEA ออกเป็น
- ส่วนขยาย RTSP:
- แก้ไขปัญหาการหยุดชะงักหรือความล้มเหลวในการเล่นชั่วคราวระหว่างการเตรียมการเล่น RTSP ที่เกิดจากข้อผิดพลาดในการเชื่อมโยงพอร์ต UDP
- ส่วนขยาย Cast:
- เพิ่มคลาส
CastParamsใหม่เพื่ออนุญาตการกำหนดค่า Cast โดยเรียกใช้Cast.initialize(CastParams) - เพิ่มตัวเลือก
CastParams.getShowSystemOutputSwitcherOnCastIconClick()ใหม่ ซึ่งจะทริกเกอร์การใช้ตัวสลับเอาต์พุต SystemUI แทนตัวเลือกอุปกรณ์แคสต์ในแอปเมื่อพร้อมใช้งาน - เพิ่ม
MediaRouteButtonStateและrememberMediaRouteButtonStateเพื่อรองรับการสังเกตสถานะระดับการเข้าถึงของเครื่องมือเลือกเส้นทางสื่อ และเพิ่มพารามิเตอร์stateลงในMediaRouteButton(#3172) - แก้ไขข้อบกพร่องที่
RemoteCastPlayerอาจติดอยู่ในสถานะการมาสก์แทร็กอย่างถาวรหลังจากเลือกแทร็ก ซึ่งทำให้ละเว้นการอัปเดตแทร็กที่ตามมาจากตัวรับ Cast (#3237) - แก้ไขข้อบกพร่องที่
DefaultMediaItemConverterแสดงNullPointerExceptionเมื่อพยายามเข้าร่วมเซสชันการแคสต์ที่เริ่มจากผู้ส่งที่ไม่ใช่ Media3 - ป้องกันไม่ให้
CastPlayerโอนMediaItemsที่เล่นไม่ได้เมื่อเปลี่ยนเพลเยอร์ที่ใช้งานอยู่ (#3199) - แก้ไขข้อบกพร่องที่ไลฟ์สดที่ไม่ได้กำหนดค่า (
liveConfiguration == UNSET) อยู่ในคิวเป็นSTREAM_TYPE_BUFFERED(#3318)
- เพิ่มคลาส
- ยูทิลิตีการทดสอบ
- ขยาย
DataSourceContractTestเพื่อรวมการรองรับคำขอPOSTที่มีส่วนหัวและเนื้อหา เพิ่มทรัพยากรPOSTบางส่วนลงในHttpDataSourceTestEnvและเพิ่มการยืนยันสำหรับเมธอด HTTP, ส่วนหัว และเนื้อหาที่คาดไว้ในWebServerDispatcher - เพิ่มความเข้มงวดในการยืนยันสิทธิ์ใน
DataSourceContractTestสำหรับความยาวที่แสดงผลจากDataSource.open()แหล่งข้อมูลที่อาจส่งผลให้เกิดC.LENGTH_UNSETควรระบุสิ่งนี้โดยใช้TestResource.Builder.setMayResolveToUnknownLength(boolean) - เพิ่ม
setPlaybackLooperไปยังTestExoPlayerBuilder
- ขยาย
- นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
- นำ
androidx.media3.exoplayer.MetadataRetrieverออก โปรดใช้androidx.media3.inspector.MetadataRetrieverแทน - นำ
androidx.media3.exoplayer.MediaExtractorCompatออก โปรดใช้androidx.media3.inspector.MediaExtractorCompatแทน - นำ
Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATAออก ใช้HeifExtractorเพื่อดึงข้อมูลเมตาของรูปภาพเคลื่อนไหวจากไฟล์ HEIC แทน - นำ
androidx.media3.extractor.metadata.mp4.MotionPhotoMetadataออก โปรดใช้androidx.media3.extractor.metadata.MotionPhotoMetadataแทน - นำ
androidx.media3.extractor.DummyTrackOutputออก โปรดใช้androidx.media3.extractor.DiscardingTrackOutputแทน - นำ
androidx.media3.extractor.DummyExtractorOutputออก โปรดใช้androidx.media3.extractor.NoOpExtractorOutputแทน - นำ
androidx.media3.common.C.generateAudioSessionIdV21ออก โปรดใช้androidx.media3.common.util.Util.generateAudioSessionIdแทน
- นำ
- สร้าง
- อัปเดตวิธีการ
README.mdสำหรับการใช้ Media3 ในเครื่องเพื่อใช้ Gradle Composite Builds (includeBuild) นำสคริปต์core_settings.gradleออกแล้ว และไม่ได้ใช้พร็อพเพอร์ตี้androidxMediaModulePrefixและandroidxMediaEnableMidiModuleอีกต่อไป
- อัปเดตวิธีการ
1.11.0-rc01
ใช้เวอร์ชันเสถียร 1.11.0
1.11.0-beta01
7 กรกฎาคม 2569
ใช้เวอร์ชันเสถียร 1.11.0
1.11.0-alpha01
24 มิถุนายน 2026
ใช้เวอร์ชันเสถียร 1.11.0
เวอร์ชัน 1.10.0
1.10.1
12 พฤษภาคม 2026
- ไลบรารีทั่วไป
- แก้ไขการจัดการ
onAudioSessionIdChangedในSimpleBasePlayerและForwardingSimpleBasePlayer
- แก้ไขการจัดการ
- ExoPlayer:
- แก้ไขภาวะแข่งขันที่เกี่ยวข้องกับการสร้างรหัสเซสชันเสียงซึ่งอาจทำให้เกิด
IllegalStateExceptionด้วยโหมด Tunneling (#3099) - แก้ไขปัญหาแอปขัดข้องที่อาจเกิดขึ้นเมื่อกู้คืนจากข้อผิดพลาดของโปรแกรมถอดรหัสด้วยการอุ่นเครื่องโปรแกรมแสดงผล
- แก้ไขปัญหาที่อาร์ติแฟกต์วิดีโอเกิดจากการระบุข้อมูลการเริ่มต้นเมื่อใช้ตัวแปลงรหัส Dolby Vision ที่ใช้ AV1 (#3153)
- แก้ไขภาวะแข่งขันที่เกี่ยวข้องกับการสร้างรหัสเซสชันเสียงซึ่งอาจทำให้เกิด
- การเลือกแทร็ก
- ปรับตรรกะการเลือกแทร็กใน
VideoTrackInfoเพื่อแก้ไขประเภท MIME สำรอง และย้ายค่ากำหนดคะแนน HDR และตัวแปลงรหัสไปยังค่ากำหนดคุณภาพ (#3135)
- ปรับตรรกะการเลือกแทร็กใน
- เครื่องสกัดน้ำผลไม้
- MP3: ละเว้นความยาวข้อมูล Xing หากยาวกว่าความยาวสตรีมที่ทราบ (#3117)
- แก้ไข
ArrayIndexOutOfBoundsExceptionในMp4Extractorเมื่อมีการตั้งค่าFLAG_OMIT_TRACK_SAMPLE_TABLEและแทร็กไม่มีกล่องตัวอย่างการซิงค์ (stss)
- เสียง
- แก้ไขข้อบกพร่องที่อาจทำให้เหตุการณ์เสียงได้รับการกำหนดเส้นทางอย่างไม่ถูกต้องหากมีการเพิ่มโปรแกรมแสดงผลเสียงหลายรายการลงในเพลเยอร์
- วิดีโอ:
- ปรับตรรกะสำหรับการนำตัวแปลงรหัสมาใช้ซ้ำเมื่ออัตราเฟรมเปลี่ยนแปลงใน API ที่ต่ำกว่า 30 เพื่อหลีกเลี่ยงการรีเซ็ตตัวแปลงรหัสในกรณีที่ไม่มีประโยชน์ (#3120)
- ปิดใช้การแก้ปัญหาชั่วคราวสำหรับการบังคับให้ซิงค์ข้อมูลใน
queueSecureInputBufferสำหรับ API 31 ขึ้นไป การแก้ปัญหาชั่วคราวนี้เป็นคอขวดเทียมที่บังคับให้การถอดรหัสทำงานแบบต่อเนื่อง ซึ่งช่วยป้องกันไม่ให้วิดีโอมีภาพบิดเบี้ยวเนื่องจากปัญหาเกี่ยวกับเฟรมเวิร์กที่มีอยู่ก่อน API 31
- รูปภาพ:
- แก้ไขปัญหาในโหมดสครับที่การอัปเดตรูปภาพจะมีผลก็ต่อเมื่อผู้ใช้ "หยุดสครับ" (#2815)
- เซสชัน:
- แก้ไขข้อบกพร่องที่
ForegroundServiceStartNotAllowedExceptionไม่ได้เผยแพร่ข้ามขอบเขตเทรดในกรณีที่เทรดแอปพลิเคชันไม่ใช่เทรดหลัก (#2499) - แก้ไขข้อบกพร่องที่
COMMAND_SEEK_TO_MEDIA_ITEMไม่พร้อมใช้งานในMediaControllerเมื่อเชื่อมต่อกับเซสชันเฉพาะแพลตฟอร์มที่รองรับการกรอไปยังรายการอื่นๆ แต่ไม่มีการแก้ไขเพลย์ลิสต์ - แก้ไขปัญหาที่
MediaControllerไม่สามารถตั้งค่ารายการสื่อในเซสชันสื่อของแพลตฟอร์มที่ไม่อนุญาตการดำเนินการPREPARE_FROM - แก้ไขข้อบกพร่องที่กระบวนการของตัวเองไม่ได้ทำเครื่องหมายด้วย
Controller.isTrusted()ใน API 27 หรือก่อนหน้านั้นเมื่อเชื่อมต่อผ่านตัวควบคุมแพลตฟอร์ม
- แก้ไขข้อบกพร่องที่
- ส่วนขยาย HLS
- ส่วนขยาย DASH
- แก้ไขข้อขัดข้องใน
SampleQueueเมื่อกรอไปยังส่วนที่กำลังยกเลิกอยู่
- แก้ไขข้อขัดข้องใน
1.10.0
26 มีนาคม 2026
- ไลบรารีทั่วไป
- โปรโมต
Player.mute()และPlayer.unmute()จากUnstableApiเป็นเวอร์ชันเสถียร - โปรโมต
Format.pcmEncodingและC.PcmEncodingจากUnstableApiเป็นเวอร์ชันเสถียร - เพิ่ม
Format.primaryTrackGroupIdเพื่อระบุกลุ่มหลักของอินสแตนซ์Formatที่ฝัง (#294)
- โปรโมต
- ExoPlayer:
- เพิ่มความสามารถในการตัดคลิปให้กับ
AdsMediaSource - เพิ่มการรองรับการจัดกำหนดการแบบไดนามิกใน
MediaCodecVideoRendererเพื่อให้สอดคล้องกับงานจัดกำหนดการและรอบการทำงานของ CPU ได้ดียิ่งขึ้นเมื่อสามารถประมวลผลเฟรมวิดีโอได้ คุณเปิดใช้ฟีเจอร์นี้ได้โดยใช้experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs()ในDefaultRenderersFactory - อนุญาตให้ตั้งค่า
DataSource.Factoryที่กำหนดเองในDefaultPreloadManager.Builder - อนุญาตให้จำลอง
ExoPlayerโดยไม่ต้องใช้ Robolectric โดยย้ายค่าคงที่เริ่มต้นบางค่าไปยังExoPlayer.Builderโดยทั่วไปแล้ว เราไม่แนะนำให้จำลองอินเทอร์เฟซที่ซับซ้อนนี้ เว้นแต่ว่าการใช้งานจะน้อย/เรียบง่าย/เกิดขึ้นเอง (#2985)- ซึ่งจำเป็นต้องย้าย
DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MSจากExoPlayerไปยังExoPlayer.Builder(โดยไม่มีการเลิกใช้งาน)
- ซึ่งจำเป็นต้องย้าย
- แก้ไขข้อบกพร่องที่
ProgressiveMediaSourceเผยแพร่ข้อมูลไทม์ไลน์ที่ล้าสมัยไปยังเพลเยอร์ และระยะเวลาที่อยู่ในคิวถูกนำออกโดยไม่คาดคิด (#3016) - แก้ไขปัญหาที่ ExoPlayer ไม่ขอโฟกัสเสียงที่ล่าช้าเมื่อมีการขอให้เล่นระหว่างการโทร
- แก้ไขข้อบกพร่องที่การเปลี่ยนจากเนื้อหาแบบออนดีมานด์เป็นเนื้อหาสดอาจทำให้เกิดการบัฟเฟอร์ซ้ำที่ส่วนท้ายของเนื้อหาแบบออนดีมานด์ (#3052)
- เพิ่มการรองรับ Dolby Vision Profile 10 (#2830)
- แก้ไขข้อบกพร่องที่โฆษณาตอนต้นที่ไม่ได้เริ่มต้นสร้าง
ArrayIndexOutOfBoundsException(#3125)
- เพิ่มความสามารถในการตัดคลิปให้กับ
- CompositionPlayer:
- เพิ่มการรองรับ
EditedMediaItem.removeVideo
- เพิ่มการรองรับ
- Transformer:
- ตอนนี้
EditedMediaItem.Builder.setFrameRate()สามารถตั้งค่าอัตราเฟรมเอาต์พุตสูงสุดสำหรับวิดีโอได้แล้ว ซึ่งจะเป็นประโยชน์อย่างยิ่งเมื่อเพิ่มความเร็วของสื่อด้วยsetSpeed()
- ตอนนี้
- การเลือกแทร็ก
- เปลี่ยนลายเซ็นของ
DefaultTrackSelector.selectAllTracksเพื่อรวมอาร์เรย์เอาต์พุตเป็นพารามิเตอร์ ซึ่งป้อนข้อมูลล่วงหน้าด้วยการลบล้างแทร็ก - แก้ไขปัญหาที่มีการเลือกแทร็กข้อมูลเมตาที่ฝังไว้ไม่ว่าแทร็กหลักที่เกี่ยวข้องจะถูกเลือกหรือไม่ (#294)
- ตัวเลือกการรักษาเสถียรภาพ
TrackSelectionParametersสำหรับpreferredVideoLanguages,preferredVideoLabels,preferredAudioLabels,preferredTextLabelsและselectTextByDefault
- เปลี่ยนลายเซ็นของ
- เครื่องสกัดน้ำผลไม้
- MP4: รองรับไฟล์ที่มีกล่อง
uuidขนาดใหญ่ก่อนกล่องอื่นๆ เช่นmoov(#3046) - MP4: เพิ่มการรองรับแทร็ก Versatile Video Coding (VVC) ในคอนเทนเนอร์ MP4
- MP4: รองรับไฟล์ที่มีกล่อง
- ผู้ตรวจสอบ
- การเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบ: นำ
FrameExtractorออก ตอนนี้ผู้ใช้ควรใช้โมดูล:media3-inspector-frameใหม่และอัปเดตการนำเข้าเป็นandroidx.media3.inspector.frame.FrameExtractor - เปิดตัวโมดูลใหม่สำหรับการแยกและประมวลผลเฟรมวิดีโอที่ถอดรหัสแล้ว
- การเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบ: นำ
- เสียง
- เปลี่ยนไลบรารีการถอดรหัสที่สำคัญสำหรับส่วนขยายตัวถอดรหัส IAMF จาก
libiamfเป็นiamf_tools - การถอดรหัส IAMF รองรับเอาต์พุตแบบ Binaural ผ่านตัวถอดรหัส (เมื่อใช้ส่วนขยายตัวถอดรหัส IAMF) หรือผ่าน Android Spatializer
- นำการรองรับ
AC4Profile22และโปรไฟล์เดิมอื่นๆ ออกอย่างถูกต้องเมื่อประเมินการรองรับตัวถอดรหัส AC-4 ในสถานการณ์ที่เกี่ยวข้องกับยานยนต์ (#2609) - ปรับปรุงตรรกะการลองใหม่ของการเริ่มต้น
AudioOutputในDefaultAudioSink(#2905) - พยายามจับคู่เลย์เอาต์เอาต์พุตของลำโพง (หรือ Spatializer หากมี) เมื่อถอดรหัส IAMF ทั้งด้วยส่วนขยาย IAMF และตัวถอดรหัสตัวแปลงรหัสสื่อ ซึ่งรองรับโดยช่องและตรรกะใหม่ใน AudioCapabilities และ AudioCapabilitiesReceiver
- แก้ไขข้อบกพร่องที่ทำให้การเล่นค้างเมื่อเล่นเพลย์ลิสต์เสียงแบบไม่มีช่องว่างในโหมดการลดภาระการประมวลผลที่บีบอัด
- เปลี่ยนไลบรารีการถอดรหัสที่สำคัญสำหรับส่วนขยายตัวถอดรหัส IAMF จาก
- ข้อความ
- VobSub: ใช้คำสั่งควบคุม SPU
STARTและSTOPเพื่อรับระยะเวลาของคิวแทนที่จะใช้ค่าเริ่มต้น 5 วินาทีเสมอ (#2935)
- VobSub: ใช้คำสั่งควบคุม SPU
- ข้อมูลเมตา
- เพิ่มจำนวนเริ่มต้นของโปรแกรมแสดงผลข้อมูลเมตาเป็น 4 เพื่อให้ครอบคลุมแทร็กข้อมูลเมตาที่เป็นไปได้ทั้งหมดที่เผยแพร่โดยตัวแปรและการแสดงผล HLS (#3043)
- ผลกระทบ
- ย้าย
LottieOverlayไปยังโมดูล:media3-effect-lottieใหม่ (ซึ่งรวมถึงการเปลี่ยนชื่อจากandroidx.media3.effect.LottieOverlayเป็นandroidx.media3.effect.lottie.LottieOverlayด้วย)
- ย้าย
- Effect Lottie:
- เปิดตัวโมดูล
:media3-effect-lottieใหม่ซึ่งมีฟังก์ชันการทำงานสำหรับการใช้เอฟเฟกต์ Lottie กับเฟรมวิดีโอ
- เปิดตัวโมดูล
- ส่วนขยาย IMA:
- อัปเดต IMA SDK เป็นเวอร์ชัน 3.39.0 เพื่อให้เข้าถึง API ข้อมูลสื่อโฆษณาล่าสุดได้
- แก้ไขข้อบกพร่องที่ประเภท MIME ของโฆษณาไม่ตรงกับประเภท MIME ที่ระบุในเหตุการณ์ IMA LOADED การแก้ไขนี้จะแมปประเภท MIME ของโฆษณาโดยใช้ข้อมูลสื่อของโฆษณาที่ IMA ระบุ
- เพิ่ม
setEnableCustomTabsลงในImaAdsLoaderและImaServerSideAdInsertionMediaSourceเพื่อให้ผู้ใช้ควบคุมได้ว่าจะเปิด URL การคลิกผ่านโฆษณาโดยใช้แท็บที่กำหนดเองหรือไม่ - เพิ่ม
ImaAdTagUriBuilderซึ่งเป็นคลาสที่เสนอวิธีอื่นในการสร้างadTagUriซึ่งมีsetPreferredLinearOrientationAPI นี่คือ API ในการทดสอบอัลฟ่าที่จะช่วยให้คุณตั้งค่าการวางแนวที่ต้องการสำหรับโฆษณาเชิงเส้นได้ หากต้องการเข้าร่วมกลุ่มทดสอบเวอร์ชันอัลฟ่า โปรดติดต่อพาร์ทเนอร์บัญชีของคุณ
- เซสชัน:
- แก้ไขข้อบกพร่องที่อาร์เรย์ขนาดใหญ่ใน
MediaMetadata.artworkDataอาจทำให้แอปขัดข้อง - ใช้อาร์กิวเมนต์ประเภท int สำหรับ
@Player.Commandในอินเทอร์เฟซActionFactory(#2933) - ทำให้
MediaSessionServiceและMediaLibraryServiceเป็นLifecycleServiceซึ่งช่วยให้แนบการดำเนินการที่รับรู้วงจรกับวงจรของบริการได้ (#187) - หยุดรองรับคำสั่งเปลี่ยนระดับเสียงของอุปกรณ์จาก
MediaControllerและMediaBrowserสำหรับการเล่นในเครื่อง แอปไม่ควรเปลี่ยนระดับเสียงของอุปกรณ์ในเครื่อง และหากจำเป็น ให้ใช้ APIAudioManagerเพื่อวัตถุประสงค์นี้ - ตรวจหาอินสแตนซ์
Intentที่ไม่มีการใช้งานซึ่งเริ่มบริการเป็นบริการที่ทำงานอยู่เบื้องหน้า ซึ่งจะป้องกันไม่ให้ระบบแสดงข้อผิดพลาดForegroundServiceDidNotStartInTimeExceptionนี่เป็นการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบบน API ที่ไม่เสถียรสำหรับแอปที่ใช้MediaNotification.Providerที่กำหนดเองเนื่องจากมีเมธอดใหม่ที่จำเป็น - เพิ่มเครื่องมือสร้างสำหรับอินสแตนซ์
PendingIntentเพื่อใช้กับวิดเจ็ตบนหน้าจอหลัก (#2933) - เพิ่มเมธอดแบบคงที่สำหรับการสร้างอินสแตนซ์
Intentสำหรับวิดเจ็ตหน้าจอหลักที่ใช้ Compose (#2933) - แก้ไขข้อบกพร่องที่ระบบไม่รายงานการเปลี่ยนรายการสื่อไปยังตัวควบคุมเมื่อการเล่นเปลี่ยนจากดัชนีรายการสื่อหนึ่งไปยังอีกดัชนีหนึ่งที่มีรายการสื่อเดียวกันเนื่องจากความไม่ต่อเนื่อง "AUTO" และ "SEEK" (#2997)
- แก้ไขปัญหาที่วิธีแก้ปัญหาชั่วคราวสำหรับการวางปุ่ม UI ของระบบส่งผลเสียต่อแพลตฟอร์ม UI อื่นๆ เช่น Android Auto หรือผู้ผลิตที่ไม่ต้องการวิธีแก้ปัญหาชั่วคราว (#3041)
- แก้ไขปัญหาที่ระบบไม่ซิงค์ข้อมูลการเข้าถึงการสมัครใช้บริการ (#3056)
- แก้ไขข้อบกพร่อง SysUI ใน API 29 ซึ่งอาร์ตเวิร์กของเซสชันสื่อที่มีขนาดหนึ่งๆ อาจทำให้ SysUI ขัดข้องและบังคับให้อุปกรณ์รีบูต (#3118)
- แก้ไขการปรับขนาดไอคอนอาร์ตเวิร์กของการแจ้งเตือนใน Android Q (#3084)
- แก้ไขข้อบกพร่องที่อาร์เรย์ขนาดใหญ่ใน
- UI:
- เพิ่ม
PlaybackSpeedControlComposable ลงในmedia3-ui-composeเพื่อแสดงและแก้ไขความเร็วในการเล่น - เพิ่ม
PlaybackSpeedToggleButtonComposable ลงในmedia3-ui-compose-material3เพื่อควบคุมความเร็วในการเล่น - เพิ่ม
ProgressSliderComposable ลงในmedia3-ui-compose-material3เพื่อแสดงความคืบหน้าของเพลเยอร์และทำการกรอโดยใช้การลากและการแตะ (#2288) - หลีกเลี่ยงบัฟเฟอร์นอกหน้าจอขนาดใหญ่ใน PlayerControlView แบบเคลื่อนไหว
- เพิ่ม Composable
Playerลงในmedia3-ui-compose-material3ซึ่งรวมContentFrameเข้ากับการควบคุมที่ปรับแต่งได้ซึ่งจัดแนวไว้ด้านบน ตรงกลาง และด้านล่าง - ซ่อนตำแหน่งการเล่นจากบริการการช่วยเหลือพิเศษเพื่อป้องกันการอัปเดตการประกาศอย่างต่อเนื่องเมื่อ
PlayerControlViewปรากฏขึ้น
- เพิ่ม
- ส่วนขยาย HLS
- รองรับ X-PLAYOUT-LIMIT ด้วยโฆษณาคั่นระหว่างหน้า HLS (#2484)
- รองรับแอตทริบิวต์
QUERYPARAMด้วย#EXT-X-DEFINE(#1854) - เพิ่มประสิทธิภาพการแยกวิเคราะห์เพลย์ลิสต์ HLS โดยการแคชตัวจับคู่นิพจน์ทั่วไป (#3008)
- แสดงแทร็กข้อมูลเมตา ID3 (EMSG) ในการแสดงผลเสียง (#3043)
- อนุญาตให้ใช้ตำแหน่งสำรองเมื่อพบข้อผิดพลาดในการโหลด หากมีสตรีมสำรองจากตำแหน่งอื่น (#1988)
- แก้ไขลักษณะการทำงานของ X-SNAP สำหรับโฆษณาคั่นระหว่างหน้า HLS เพื่อคำนวณตำแหน่งเริ่มต้นและตำแหน่งที่เล่นต่อได้อย่างถูกต้อง (#3013)
- ส่วนขยาย DASH
- ส่วนขยาย RTSP:
- แก้ไขการถดถอยในการสตรีม H.264 และ H.265 ซึ่งจะแยกวิเคราะห์ตัวอย่างของหน่วยการเข้าถึงเดียวกันที่ครอบคลุมแพ็กเก็ต RTP หลายรายการอย่างไม่ถูกต้อง ซึ่งส่งผลให้เกิดข้อบกพร่องด้านภาพและความเสียหายในวิดีโอ (#3121)
- ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
- เพิ่มการรองรับตัวจัดการ UI ของ MPEG-H ลงในส่วนขยายตัวถอดรหัส MPEG-H (#3066)
- ส่วนขยาย Cast:
- เพิ่มเมธอด
RemoteCastPlayer.Builder#setTrackSelectorที่ช่วยให้สามารถใช้การเลือกแทร็กสำหรับการเล่น Cast ได้
- เพิ่มเมธอด
- นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
- นำ
ExperimentalFrameExtractorออก โปรดใช้androidx.media3.inspector.frame.FrameExtractorแทน - นำ
ChannelMixingMatrix.create()ออก โปรดใช้ChannelMixingMatrix.createForConstantGain()แทน - นำ
androidx.media3.extractor.metadata.flac.VorbisCommentออก โปรดใช้androidx.media3.extractor.metadata.vorbis.VorbisCommentแทน - นำ
MediaSource.prepareSource(MediaSourceCaller, TransferListener)ออก โปรดใช้MediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId)แทน
- นำ
1.10.0-rc03
25 มีนาคม 2026
ใช้เวอร์ชันเสถียร 1.10.0
1.10.0-rc02
16 มีนาคม 2026
ใช้เวอร์ชันเสถียร 1.10.0
1.10.0-rc01
10 มีนาคม 2026
ใช้เวอร์ชันเสถียร 1.10.0
1.10.0-beta01
25 กุมภาพันธ์ 2026
ใช้เวอร์ชันเสถียร 1.10.0
1.10.0-alpha01
6 กุมภาพันธ์ 2026
ใช้เวอร์ชันเสถียร 1.10.0
เวอร์ชัน 1.9.0
1.9.4
16 พฤษภาคม 2026
เวอร์ชัน 1.9.4 มี Commit ต่อไปนี้
- ผลกระทบ
- ตั้งค่า
GL_DRAW_BUFFERและGL_READ_BUFFERอย่างชัดเจนเมื่อเปลี่ยนจากบริบทที่ไม่มีแพลตฟอร์ม
- ตั้งค่า
1.9.3
16 มีนาคม 2026
เวอร์ชัน 1.9.3 มีคอมมิตต่อไปนี้
- เสียง
- แก้ไขข้อบกพร่องที่ทำให้การเล่นค้างเมื่อเล่นเพลย์ลิสต์เสียงแบบไม่มีช่องว่างในโหมดการลดภาระการประมวลผลที่บีบอัด
1.9.2
6 กุมภาพันธ์ 2026
เวอร์ชัน 1.9.2 มี Commit ต่อไปนี้
- ExoPlayer:
- แก้ไขข้อบกพร่องที่
ProgressiveMediaSourceเผยแพร่ข้อมูลไทม์ไลน์ที่ล้าสมัยไปยังเพลเยอร์และระยะเวลาที่อยู่ในคิวถูกนำออกโดยไม่คาดคิด (#3016)
- แก้ไขข้อบกพร่องที่
- เซสชัน:
- แก้ไขปัญหาที่วิธีแก้ปัญหาชั่วคราวสำหรับการวางปุ่ม UI ของระบบส่งผลเสียต่อแพลตฟอร์ม UI อื่นๆ เช่น Android Auto หรือผู้ผลิตที่ไม่ต้องการวิธีแก้ปัญหาชั่วคราว (#3041)
- ส่วนขยาย Cast:
- แก้ไขข้อบกพร่องที่ทำให้การโอนจากการแคสต์ไปยังการเล่นในเครื่องใช้งานไม่ได้
1.9.1
26 มกราคม 2026
เวอร์ชัน 1.9.1 มี คอมมิตเหล่านี้
- Common Library:
- รองรับสตริงวันที่และเวลาที่มีเฉพาะชั่วโมงในการชดเชยเขตเวลา (#2929)
- ExoPlayer:
- อนุญาตให้การจัดกำหนดการแบบไดนามิกชะลอช่วงเวลา
doSomeWorkหลังจากที่เสียงเริ่มรองรับการซิงค์เสียง/วิดีโอที่ราบรื่นยิ่งขึ้นเมื่อเริ่มเล่นเท่านั้น - แก้ไขข้อบกพร่องใน
DefaultLoadErrorHandlingPolicyที่มีการลองใหม่หลายครั้งเมื่อเกิดFileNotFoundExceptionและข้อยกเว้นประเภทที่คล้ายกัน - แก้ไขข้อบกพร่องเกี่ยวกับการกำหนดเวลาแบบไดนามิกซึ่งเวลาที่คำนวณสำหรับ
doSomeWorkถัดไปลดลงอย่างไม่ถูกต้องตามเวลาที่ผ่านไปของการทำซ้ำdoSomeWorkปัจจุบัน การแก้ไขปัญหานี้จะช่วยยืดเวลาที่ CPU ไม่ทำงานและประหยัดพลังงานได้ - แก้ไขปัญหาที่การเล่นไฟล์ Dolby Vision บางไฟล์ล้มเหลวเมื่อพยายามใช้ตัวแปลงรหัส AVC หรือ HEVC สำรอง
- แก้ไขข้อบกพร่องที่การโหลดดำเนินต่อไปหลังจากที่การเล่นสิ้นสุดลงเมื่อนำรายการที่กำลังเล่นออกจากเพลย์ลิสต์ (#2873)
- หลีกเลี่ยงการรั่วไหลของอินสแตนซ์
MediaItemเมื่อใช้ExoPlayer.replaceMediaItemซ้ำๆ กับรายการเดียวกัน (#2993) - ป้องกัน ANR ที่อาจเกิดขึ้นจากการปล่อย Wake Lock ฉุกเฉิน (#2979)
- อนุญาตให้การจัดกำหนดการแบบไดนามิกชะลอช่วงเวลา
- เครื่องสกัดน้ำผลไม้
- MP3: แยกวิเคราะห์ข้อมูล ReplayGain ของ LAME (#2840)
- เสียง
- นำการรองรับ
AC4Profile22และโปรไฟล์เดิมอื่นๆ ออกอย่างถูกต้องเมื่อประเมินการรองรับตัวถอดรหัส AC-4 ในสถานการณ์ที่เกี่ยวข้องกับยานยนต์ (#2609)
- นำการรองรับ
- วิดีโอ:
- ทิ้งตัวแปลงรหัสวิดีโอในอุปกรณ์ที่ต่ำกว่า API 30 เมื่ออัตราเฟรมของเนื้อหาเปลี่ยนแปลงเพื่อหลีกเลี่ยงการเล่นที่กระตุก (#2941)
- ข้อความ
- VobSub: แก้ไขคำบรรยายที่ขาดหายไปบางส่วนด้วยการจัดการ SPU อย่างถูกต้อง ซึ่งมีเฉพาะลำดับการควบคุมเดียวหรือมีข้อมูลสำคัญที่แยกออกเป็นลำดับการควบคุมหลายรายการ (#2935)
- ส่วนขยาย IMA:
- การแก้ไขข้อบกพร่อง: แก้ไขปัญหาที่ประเภท MIME ของโฆษณาไม่ตรงกับประเภท MIME ที่ระบุในเหตุการณ์ IMA LOADED การแก้ไขนี้จะแมปประเภท MIME ของโฆษณาโดยใช้ดัชนีพ็อดโฆษณาและอันดับโฆษณา
- เพิ่มการตรวจสอบค่า Null ก่อนเข้าถึงผลลัพธ์ของ
getAdsManager()และAdEvent.getAd()
- เซสชัน:
- แก้ไขข้อบกพร่องที่การหยุด
MediaControllerที่เชื่อมต่อกับเซสชันแพลตฟอร์มทำให้แอปขัดข้องหากการหยุดเกิดขึ้นระหว่างการเล่นโฆษณา (#2948) - เพิ่มการยืนยันเพิ่มเติมในอินสแตนซ์
extrasBundleในคลาสต่างๆ เพื่อป้องกันอินสแตนซ์Bundleที่มีรูปแบบไม่ถูกต้องซึ่งส่งมาจากกระบวนการอื่นๆ - แก้ไขปัญหาที่คำสั่งที่ขาดหายไปสำหรับ
COMMAND_SEEK_NEXTหรือCOMMAND_SEEK_BACKอาจทำให้เกิดช่องว่างในการแจ้งเตือนสื่อของระบบ (#2976) - ย้ายการปรับขนาดบิตแมปสำหรับไอคอนการแจ้งเตือนออกจากเทรดหลัก (#2829)
- แก้ไขข้อบกพร่องที่ไม่ได้ใช้ผู้แต่ง ผู้เขียน และนักแต่งเพลงเป็นทางเลือกสำรองเมื่อแปลงจาก
MediaMetadataCompatและMediaDescriptionCompatเดิม (#3018)
- แก้ไขข้อบกพร่องที่การหยุด
- ดาวน์โหลด:
- แก้ไขลูปที่อาจไม่มีที่สิ้นสุดเมื่อ
PriorityTooLowExceptionได้รับการจัดการโดยSegmentDownloader(สำหรับ DASH, HLS และ SmoothStreaming) การลบล้างSegmentDownloaderที่กำหนดเองโดยใช้เมธอดexecuteที่ได้รับการปกป้องต้องระบุงานที่รวมอยู่ในSupplierเพื่อให้สามารถสร้างใหม่ได้ (#2931)
- แก้ไขลูปที่อาจไม่มีที่สิ้นสุดเมื่อ
- ส่วนขยาย HLS
- ส่งเอกสาร JSON ของรายการเนื้อหาดิบไปยัง Callback
Listener.onAssetListLoadCompletedนี่เป็นการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบใน API ที่ไม่เสถียร ซึ่งกำหนดให้แอปที่ใช้ Callback นี้ต้องเพิ่มอาร์กิวเมนต์เพิ่มเติมประเภทJSONObject(#2950)
- ส่งเอกสาร JSON ของรายการเนื้อหาดิบไปยัง Callback
- ส่วนขยาย RTSP:
- จัดการแพ็กเก็ต RTP ที่มีการประทับเวลาที่รวมไว้ได้อย่างถูกต้อง (#2930)
- ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
- แก้ไข
NullPointerExceptionที่อาจเกิดขึ้นเมื่อกรอก่อนประมวลผลเฟรมวิดีโอแรก (#2965)
- แก้ไข
- ส่วนขยาย Cast:
- แก้ไขข้อบกพร่องที่ทำให้ไทม์ไลน์
RemoteCastPlayerไม่อัปเดตอย่างถูกต้องเมื่อแทนที่เพลย์ลิสต์
- แก้ไขข้อบกพร่องที่ทำให้ไทม์ไลน์
1.9.0
17 ธันวาคม 2025
- Common Library:
- อัปเดต
minSdkเป็น23ให้สอดคล้องกับไลบรารี AndroidX อื่นๆ - เพิ่ม
PlayerTransferStateซึ่งช่วยให้โอนสถานะการเล่นข้ามอินสแตนซ์Playerได้ - เพิ่มเมธอด
void mute()และvoid unmute()ลงใน Player ที่คงระดับเสียงไว้และคืนค่าระดับเสียงของ Player ก่อนและหลังการตั้งค่าเป็น 0 - เผยแพร่คลาสยูทิลิตี
WakeLockManager,WifiLockManager,AudioFocusManager,AudioBecomingNoisyManagerและStuckPlayerDetectorที่ExoPlayerเคยใช้ภายในเพื่อให้โปรแกรมเล่นอื่นๆ นำมาใช้ซ้ำได้ (#1893) - แก้ไขการจัดการ Listener
ForwardingPlayerเมื่อเพลเยอร์ที่ได้รับมอบสิทธิ์ที่เกี่ยวข้องใช้ความเท่ากันของการอ้างอิงเพื่อเปรียบเทียบอินสแตนซ์ Listener (#2675) - เพิ่มฟังก์ชันส่วนขยาย
Player.listenToที่ระงับไว้ในไลบรารีmedia3-common-ktxซึ่งระบุPlayer.Eventsที่ควรดำเนินการ - แก้ไขข้อขัดข้องใน
BasePlayer.getBufferedPercentageที่เกิดจากจำนวนเต็มล้นเมื่อตำแหน่งที่บัฟเฟอร์ที่รายงานมีขนาดใหญ่กว่าระยะเวลาที่รายงานอย่างไม่น่าเชื่อ (#2750) - แก้ไขการตรวจหาประเภทแทร็ก
TrackGroupโดยอัตโนมัติโดยไม่ละเว้นประเภท MIME ตัวอย่างที่กำหนดเอง และกลับไปใช้ประเภทแทร็กที่อาจไม่ถูกต้องจากประเภท MIME ของคอนเทนเนอร์ (#2860)
- อัปเดต
- ExoPlayer:
- เพิ่มการตรวจจับโปรแกรมเล่นที่ค้างซึ่งจะทริกเกอร์ข้อผิดพลาดของโปรแกรมเล่น
StuckPlayerExceptionหากโปรแกรมเล่นดูเหมือนจะค้าง ซึ่งจะเกิดขึ้นในกรณีต่อไปนี้ โดยคุณสามารถกำหนดค่าระยะหมดเวลาเริ่มต้นแต่ละรายการได้ในExoPlayer.Builderหากจำเป็น- หลังจาก
STATE_BUFFERINGเป็นเวลา 10 นาทีขณะพยายามเล่นและไม่มีความคืบหน้าในการบัฟเฟอร์ - หลังจาก
STATE_READYเป็นเวลา 10 วินาทีขณะพยายามเล่นและไม่มีความคืบหน้าในการเล่น - หลังจาก
STATE_READYเกินระยะเวลาที่ประกาศไว้ 1 นาทีโดยไม่ถึงจุดสิ้นสุดของรายการ - หลังจากผ่านไป 10 นาทีพร้อมเหตุผลในการระงับการเล่นขณะพยายามเล่น
- หลังจาก
- เปิดใช้การจัดการ Wake Lock โดยค่าเริ่มต้นเพื่อแก้ไขปัญหาการบัฟเฟอร์ระหว่างการเล่นขณะล็อกหน้าจอ ซึ่งเทียบเท่ากับการตั้งค่า
ExoPlayer.Builder.setWakeModeเป็นC.WAKE_MODE_LOCAL - เพิ่มตรรกะการฟังเพื่ออัปเดตรหัสอุปกรณ์เสมือนจริงโดยอัตโนมัติเมื่อมีการรายงานการเปลี่ยนแปลงไปยัง
Contextที่ส่งไปยังExoPlayer.Builderในตอนแรก - เพิ่ม
ExoPlayer.setVirtualDeviceIdเพื่ออัปเดตรหัสอุปกรณ์เสมือนจริงที่ได้จากContextซึ่งส่งไปยังExoPlayer.Builderด้วยตนเอง - ตรวจสอบว่าโปรแกรมแสดงผลไม่ใช้ข้อมูลจากรายการเพลย์ลิสต์ถัดไปก่อนที่รายการปัจจุบันจะจบลงเกิน 10 วินาที
- เพิ่ม
setSeekBackIncrementMs,setSeekForwardIncrementMsและsetMaxSeekToPreviousPositionMsลงในExoPlayerเพื่ออัปเดตการตั้งค่าเหล่านี้หลังจากการสร้าง (#2736) - เพิ่มฟังก์ชันการแคชล่วงหน้าใน
DefaultPreloadManagerตอนนี้แอปสามารถแสดงผลDefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs)หรือDefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs)ผ่านTargetPreloadStatusControl.getTargetPreloadStatus(T rankingData)เพื่อระบุว่าต้องแคชรายการสื่อล่วงหน้า - ใช้ฟังก์ชันการแคชล่วงหน้าของ
DefaultPreloadManagerในแอปสาธิตแบบสั้น - เพิ่มตัวตั้งค่า
DefaultLoadControl.Builderสำหรับการเล่นในเครื่องและปรับค่าเริ่มต้นของDefaultLoadControlให้ทำงานได้ดีกับไฟล์ในเครื่องที่หลากหลาย - แก้ไขข้อบกพร่องที่การตั้งค่าเพลย์ลิสต์ว่างเปล่าอาจทำให้เพลเยอร์อยู่ในสถานะ
STATE_READYหรือSTATE_BUFFERING - ปรับปรุง API ของเครื่องมือจัดการการโหลดล่วงหน้าดังนี้
- เพิ่ม
addMediaItems(List<MediaItem>, List<T>)และaddMediaSources(List<MediaSource>, List<T>)ที่เพิ่มรายการสื่อหรือแหล่งที่มาของสื่อเป็นกลุ่ม และเรียกใช้invalidate()โดยอัตโนมัติหลังจากนั้น - เพิ่ม
removeMediaItems((List<MediaItem>)และremoveMediaSources(List<MediaSource>)ที่นำรายการสื่อหรือแหล่งที่มาของสื่อออกเป็นกลุ่ม และตรวจสอบว่าเครื่องมือจัดการการโหลดล่วงหน้าไม่ได้เริ่มโหลดล่วงหน้าหรือโหลดรายการสื่อหรือแหล่งที่มาของสื่อเหล่านั้นล่วงหน้าต่อหลังจากนำออกแล้ว - อนุญาตให้
DefaultPreloadManager.setCurrentPlayingIndex(int)ยกเลิกการตรวจสอบตัวเองโดยอัตโนมัติ แอปไม่จำเป็นต้องเรียกใช้invalidate()อย่างชัดแจ้งอีกต่อไปหลังจากอัปเดตดัชนีการเล่นปัจจุบัน
- เพิ่ม
- เพิ่มความสามารถในการข้ามการรีเซ็ตคีย์เฟรมสำหรับการกรอไปข้างหน้าภายในกลุ่มภาพเดียวกันขณะอยู่ในโหมดสครับ
- เพิ่ม
DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)สำหรับแอปเพื่อตั้งค่าไบต์บัฟเฟอร์เป้าหมายสำหรับเพลเยอร์ที่มีplayerNameที่ระบุ ตอนนี้DefaultLoadControlสามารถตัดสินใจเกี่ยวกับเพลเยอร์แต่ละรายแยกกันได้ตามไบต์ที่จัดสรรและไบต์บัฟเฟอร์เป้าหมายของเพลเยอร์นั้นๆ - เพิ่ม
SkipInfoลงในAdPlaybackState.AdGroupเพื่อส่งข้อมูลการข้ามสำหรับโฆษณาแต่ละรายการในกลุ่มโฆษณา - แก้ไขข้อบกพร่องที่การเรียกใช้
removeMediaItems(List)ระหว่างการเล่นโฆษณาตอนท้ายทำให้เกิดข้อขัดข้อง (#2746) - แก้ไขปัญหาการกระตุกในการเล่นเพลย์ลิสต์ซึ่งเฟรมถูกตั้งค่าเป็นตัวอย่างสุดท้ายและแสดงผลอย่างไม่ถูกต้องเสมอ
- เปิดใช้เส้นทางการลองใหม่หากเพลเยอร์สร้างรหัสเซสชันเสียงไม่สำเร็จ (#2382, #2678)
- เพิ่มการรองรับเพื่อควบคุมไบต์บัฟเฟอร์ทั้งหมดสำหรับแหล่งที่มาใน
DefaultPreloadManagerเพื่อหลีกเลี่ยงไม่ให้ไบต์บัฟเฟอร์ทั้งหมดสำหรับการโหลดล่วงหน้าเพิ่มขึ้นตามอำเภอใจ หากต้องการใช้ตรรกะการควบคุมเริ่มต้น แอปสามารถตั้งค่าไบต์บัฟเฟอร์เป้าหมายสำหรับการโหลดล่วงหน้าผ่านDefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)สำหรับplayerNameของPlayerId.Preload.name("preload") และแทรกDefaultLoadControlที่สร้างขึ้นผ่านDefaultPreloadManager.Builder.setLoadControl(LoadControl) - เพิ่ม
cloneAndSet(int, int)ลงในShuffleOrderด้วยการติดตั้งใช้งานเริ่มต้น (#2834) - เพิ่มออฟเซ็ตการเล่นเนื้อหาต่อเมื่อข้ามการเล่นโฆษณาหลังจากการปรับการกรอหรือการเปลี่ยนอัตโนมัติ (#2484)
- เพิ่ม API เพื่อตั้งค่าและสังเกตพารามิเตอร์ตัวแปลงสัญญาณสำหรับแทร็กเสียงและวิดีโอ
ฟีเจอร์นี้ใช้กับโปรแกรมแสดงผลที่ใช้
MediaCodecและต้องใช้ API 29 ขึ้นไป- ใช้
ExoPlayer.setAudioCodecParameters()และExoPlayer.setVideoCodecParameters()เพื่อใช้พารามิเตอร์ - ใช้
ExoPlayer.addAudioCodecParametersChangeListener()และExoPlayer.addVideoCodecParametersChangeListener()เพื่อฟังการเปลี่ยนแปลง การสังเกตคีย์เฉพาะของผู้ให้บริการต้องใช้ API 31 ขึ้นไป
- ใช้
- แก้ไข
IllegalStateExceptionที่เกิดจากการตั้งค่าแหล่งที่มาของสื่อที่ว่างเปล่าหลังจากกรอไปยังตำแหน่งที่ไม่ใช่ 0 แล้วเตรียมเพลเยอร์ด้วยแหล่งที่มาของสื่อที่ไม่ว่างเปล่า - แก้ไขข้อบกพร่องที่การกรอไปยังรายการสื่ออื่นๆ ขณะอยู่ในโหมดสครับอาจทำให้เกิด
IllegalStateException - แก้ไข
NullPointerExceptionที่อาจเกิดขึ้นในDefaultPlaybackSessionManager(#2885) - เปิดใช้การปรับปรุงประสิทธิภาพการกรอวิดีโอสำหรับวิดีโอที่มีสิทธิ์
- เปิดใช้การถอดรหัสแบบไม่พร้อมกันใน MediaCodec อีกครั้งใน API 36 ขึ้นไป ซึ่งปัญหาการหมดเวลาเกี่ยวกับ API ของแพลตฟอร์มนี้ได้รับการแก้ไขแล้ว (#1641)
- เปลี่ยนค่าเริ่มต้นของ
MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUsเป็น 15 มิลลิวินาที และเปิดใช้การทิ้งเฟรมวิดีโอที่มีประสิทธิภาพมากขึ้นก่อนการถอดรหัสสำหรับวิดีโอที่มีสิทธิ์ - เพิ่มขีดจำกัดหน่วยความจำสูงสุดในการคำนวณหน่วยความจำอัตโนมัติใน
DefaultLoadControlซึ่งควรมีผลก็ต่อเมื่อมีการเลือกแทร็กมากเกินไปเท่านั้น (#2860) - แก้ไขข้อบกพร่องที่หากเล่นในเพลย์ลิสต์หรือโหมดเล่นซ้ำ การกรอในโหมดกรอใกล้กับตอนจบอาจทำให้กรอไปยังรายการสื่อถัดไป
- เพิ่มการตรวจจับโปรแกรมเล่นที่ค้างซึ่งจะทริกเกอร์ข้อผิดพลาดของโปรแกรมเล่น
- CompositionPlayer:
- เผยแพร่
CompositionPlayerภายใต้คำอธิบายประกอบ@ExperimentalApiใหม่เพื่อระบุว่าพร้อมให้ทดลองใช้ แต่ยังอยู่ระหว่างการพัฒนา API บางรายการอาจมีการเปลี่ยนแปลงอย่างมากในรุ่นต่อๆ ไป และมีปัญหาและข้อจำกัดที่ทราบเกี่ยวกับ Use Case บางอย่าง (บางรายการไม่มีเอกสารประกอบ) - เพิ่มการรองรับ
COMMAND_SET_AUDIO_ATTRIBUTESและการจัดการโฟกัสเสียงในCompositionPlayer - เพิ่มการรองรับการเปลี่ยนความเร็วในลำดับรองใน
CompositionPlayer - เพิ่มการรองรับ
EditedMediaItem.removeVideo
- เผยแพร่
- Transformer:
- ใช้
InAppMp4Muxerเป็น Muxer เริ่มต้น - เพิ่ม
EditedMediaItem.Builder#setSpeed()และเลิกใช้งานEffects#createExperimentalSpeedChangingEffects() - แทนที่
forceAudioTrackและforceVideoTrackด้วยtrackTypesในEditedMediaItemSequence
- ใช้
- การเลือกแทร็ก
- เพิ่ม
TrackSelectionParameters.selectTextByDefaultเพื่อเลือกแทร็กข้อความใดก็ได้โดยไม่ต้องระบุค่ากำหนดอื่นๆ ที่เจาะจงกว่า - เพิ่ม
preferredVideoLabels,preferredAudioLabelsและpreferredTextLabelsในTrackSelectionParametersเพื่อระบุค่ากำหนดสำหรับแทร็กที่มีป้ายกำกับเฉพาะ เช่น แทร็กที่อ่านจากแท็ก HLS NAME (#1666)
- เพิ่ม
- เครื่องสกัดน้ำผลไม้
- FLAC: ปรับปรุงการตรวจจับส่วนหัวให้เข้มงวดขึ้นเพื่อลดโอกาสที่จะพบส่วนหัวปลอมในข้อมูล FLAC ที่เข้ารหัส ซึ่งส่งผลให้เกิดข้อผิดพลาดในการถอดรหัส (#558)
- MP3: อนุญาตให้มีช่องว่างระหว่าง (และก่อน) แท็ก ID3 ที่จุดเริ่มต้นของไฟล์ MP3 (#811, #5718)
- MP3: เพิ่มขีดจำกัดการตรวจหาเป็น 128 kB เพื่อให้ตรงกับขีดจำกัดการค้นหาที่มีอยู่สำหรับไบต์การซิงค์ (#2713)
- MP3: เปลี่ยน
FLAG_ENABLE_INDEX_SEEKINGให้เลือกค้นหาข้อมูลจากส่วนหัวของข้อมูลเมตา (เช่น Xing และ VBRI) หากมี โดยจะเปลี่ยนกลับไปใช้การค้นหาตามดัชนีหากไม่มีข้อมูลการค้นหาอื่นๆ ซึ่งจะช่วยปรับปรุงประสิทธิภาพสำหรับไฟล์ที่มีข้อมูลเมตาการกรอ (#2839) - MP3: เปลี่ยน
Mp3Extractorเป็นค่าเริ่มต้นเป็นสมมติฐานอัตราบิตคงที่ (CBR) เมื่อไม่พบข้อมูลเมตาการค้นหา (เช่น Xing, VBRI) แม้ว่าจะตั้งค่าFLAG_ENABLE_INDEX_SEEKINGไว้ก็ตาม ซึ่งอิงตามประวัติข้อกำหนดของ MP3 โดยที่ CBR เป็นมาตรฐานและ VBR ต้องใช้ส่วนหัวที่ชัดเจน ซึ่งจะช่วยปรับปรุงความสามารถในการค้นหาไฟล์ที่ไม่มีข้อมูลเมตาได้ทันที โดยแลกกับความแม่นยำที่อาจเกิดขึ้นสำหรับไฟล์ VBR ที่ไม่มีส่วนหัว ตอนนี้ระบบจะใช้การค้นหาดัชนีเป็นทางเลือกสำรองหากสมมติฐาน CBR ไม่สามารถค้นหาได้ (เช่น สำหรับสตรีมที่มีความยาวไม่ทราบแน่ชัด) (#2848) - MP4: แก้ไขความกำกวมระหว่างประเภท MIME
audio/mpeg(MP3),audio/mpeg-L1และaudio/mpeg-L2โดยดูค่าเลเยอร์ของตัวอย่างแรกก่อนที่จะปล่อยรูปแบบแทร็กจากเครื่องมือแยก (#2683) - MP4: ปรับปรุงประสิทธิภาพการดมกลิ่นของไฟล์ขนาดใหญ่มากโดยสมมติว่ากล่อง
stblที่มีขนาดใหญ่กว่า 1 MB หมายความว่าไฟล์ต้องไม่กระจัดกระจาย (#2650) - MP4: เพิ่มการรองรับข้อมูลเมตา
©mvn(ชื่อการเคลื่อนไหว) และ©mvi(ดัชนีการเคลื่อนไหว) ซึ่งตอนนี้จะแสดงเป็นออบเจ็กต์TextInformationFrameในFormat.metadataโดยมีรหัสเป็นMVNMและMVINตามลำดับ (#2754) - MP4: ละเว้นแทร็กที่ไม่มีกล่อง
stsd(แทนที่จะแยกวิเคราะห์ทั้งไฟล์ไม่สำเร็จ) - Matroska: เพิ่มการรองรับการตรวจหา DTS-HD (#6225)
- แก้ไขปัญหาใน
MatroskaExtractorที่การกรออาจไม่แม่นยำสำหรับไฟล์ที่มีหลายแทร็ก ตอนนี้จุดเริ่มโฆษณาจะเชื่อมโยงกับแทร็กที่เกี่ยวข้องอย่างถูกต้องแล้ว ซึ่งจะช่วยให้การกรอวิดีโออย่างละเอียดมีความแม่นยำมากขึ้น - MPEG-TS: แก้ไข
IllegalArgumentExceptionจากReorderingBufferQueueที่เกิดจากแพ็กเก็ต PES ที่ไม่มีการประทับเวลา (#2764) - เพิ่มการรองรับการแยกรูปภาพเคลื่อนไหว HEIC ตอนนี้
HeifExtractorสามารถแยกวิเคราะห์ไฟล์ HEIC ที่มีแทร็กวิดีโอและเสียงที่ฝังอยู่ได้แล้ว
- ผู้ตรวจสอบ
- เปิดตัวโมดูล
:media3-inspectorใหม่เพื่อทำหน้าที่เป็นศูนย์กลางเฉพาะสำหรับยูทิลิตีการตรวจสอบสื่อ ตอนนี้โมดูลนี้มีandroidx.media3.inspector.MetadataRetrieverใหม่ ซึ่งจะให้ API แบบรวมสำหรับทั้งข้อมูลเมตาและการดึงเฟรมandroidx.media3.exoplayer.MetadataRetrieverที่มีอยู่จะเลิกใช้งานแล้วเพื่อเปลี่ยนไปใช้เวอร์ชันใหม่นี้ - เปิดตัว
androidx.media3.inspector.FrameExtractorซึ่งเป็น API สาธารณะใหม่สำหรับการดึงข้อมูลเฟรม คลาสAutoCloseableนี้มีวิธีดึงเฟรมที่รองรับวิดีโอ HDR, เอฟเฟกต์วิดีโอ และการเลือกตัวถอดรหัสที่กำหนดเอง คุณควรสร้างผ่านBuilderสำหรับMediaItemที่เฉพาะเจาะจง - FrameExtractor: เพิ่ม
getThumbnail()เพื่อดึงเฟรมภาพปกที่เป็นตัวแทนจากไฟล์สื่อโดยไม่ต้องระบุการประทับเวลาที่เฉพาะเจาะจง - เพิ่ม
androidx.media3.inspector.MediaExtractorCompatซึ่งเป็นตัวแทนแบบดรอปอินสำหรับandroid.media.MediaExtractorของแพลตฟอร์มที่ให้วิธีแยกตัวอย่างสื่อที่เข้ารหัสแบบข้อมูลดิบจากไฟล์สื่อandroidx.media3.exoplayer.MediaExtractorCompatที่มีอยู่เลิกใช้งานแล้วเพื่อใช้คลาสใหม่นี้แทน
- เปิดตัวโมดูล
- เสียง
- ทำให้
AudioProcessorอินสแตนซ์รับรู้ถึงการกรอวิดีโอ - อนุญาตให้แทรกอินเทอร์เฟซ
AudioOutputProviderใหม่ลงในDefaultAudioSink.Builderเพื่อรองรับเส้นทางเอาต์พุตเสียงที่กำหนดเอง ค่าเริ่มต้นคือAudioTrackAudioOutputProvider - จัดการการกรอใน
GainProcessor - ใช้ความสามารถของโปรไฟล์และระดับตัวถอดรหัส AC-4 ในการประเมินการรองรับรูปแบบแทร็ก (#2580)
- หลีกเลี่ยงความล่าช้าที่อาจเกิดขึ้นจากการจัดการ Callback การเปลี่ยนแปลงการกำหนดเส้นทางเมื่อเริ่มเล่น (#2646)
- อนุญาตให้ใช้ตัวแปลงรหัสซ้ำสำหรับรูปแบบ EAC3, EAC3-JOC และ AC-4 (#1346)
- เพิ่มการรองรับตัวอย่าง PCM แบบ Float ใน
Sonic - เพิ่มการรองรับตัวอย่าง PCM แบบ 16 บิตใน
ToFloatPcmAudioProcessor
- ทำให้
- วิดีโอ:
- ปิดใช้การนำตัวแปลงรหัสมาใช้ซ้ำสำหรับเนื้อหา Dolby-Vision ที่มีโปรไฟล์ต่างกัน
- เปิดใช้การแก้ปัญหาอีกครั้งสำหรับคะแนนประสิทธิภาพที่รายงานไม่ถูกต้องสำหรับตัวแปลงรหัสที่ปลอดภัย (#2856)
- ข้อความ
- แก้ไขการแยกวิเคราะห์คำบรรยาย CEA-6/708 ในเนื้อหา Dolby Vision (#2775)
- รูปภาพ:
- แก้ไขปัญหา ScrubbingMode ที่เพลเยอร์ค้างขณะสครับแทร็กภาพขนาดย่อ DASH (#2815)
- DRM:
- เปลี่ยนประเภทการแสดงผลของเมธอด
MediaDrmCallbackจากbyte[]เป็นประเภทMediaDrmCallback.Responseใหม่ เพื่ออนุญาตให้แสดงผลข้อมูลเสริมที่ไม่บังคับ การเปลี่ยนแปลงนี้เป็นการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบของแหล่งที่มา แต่สามารถแก้ไขความเสียหายได้ง่ายๆ โดยการรวมค่าที่แสดงผลbyte[]ก่อนหน้าด้วยnew Responseก่อนแสดงผล - เพิ่มข้อมูลคำขอที่สำคัญ เช่น URL และเวลาในการตอบสนองไปยัง
AnalyticsListener.onDrmKeysLoaded(#1001) - ย้ายข้อมูลคำขอการจัดสรรจากพารามิเตอร์ของ URL ไปยังเนื้อหา POST
- เปลี่ยนประเภทการแสดงผลของเมธอด
- ผลกระทบ
- เพิ่ม
Presentation.copyWithUnsetSideRoundedToเพื่อปัดเศษด้านเอาต์พุตที่ไม่ได้ตั้งค่าเมื่อสร้างPresentationด้วยความยาวด้านเดียว
- เพิ่ม
- Muxer:
- เพิ่ม
MediaMuxerCompatซึ่งเป็นตัวแทนแบบดรอปอินสำหรับเฟรมเวิร์กMediaMuxer - เพิ่ม
MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo()เพื่ออนุญาตให้สร้างรูปภาพเคลื่อนไหว - เพิ่ม
WebmMuxerเพื่ออนุญาตให้รวมสตรีมสื่อOPUS,VORBIS,VP8และVP9เป็นรูปแบบไฟล์webm
- เพิ่ม
- ส่วนขยาย IMA:
- การนำกฎ ProGuard ที่กำหนดเองออก เพื่อให้แอปใช้กฎที่เผยแพร่ในที่เก็บถาวร Android ของ IMA แทนได้
- เพิ่ม
ImaServerSideAdInsertionUriBuilder.setNetworkCodeซึ่งเป็น API ใหม่สำหรับตั้งค่ารหัสเครือข่าย Ad Manager ของ Google สำหรับ IMA SDK เพื่อจัดการตัวระบุโฆษณาตามที่ระบุไว้ในการตั้งค่า Ad Manager ของ Google รหัสเครือข่ายเป็นตัวเลือกที่ไม่บังคับ แต่แนะนำให้ใช้สำหรับคำขอสตรีมแบบฟูลเซอร์วิส หากต้องการค้นหารหัสเครือข่าย โปรดดูบทความนี้ - เพิ่มทรัพยากร Dependency ของ IMA เป็น 3.37.0 ซึ่งต้องเปิดใช้กระบวนการ Desugaring ของไลบรารีหลัก แอปที่เกี่ยวข้องต้องเปิดใช้ฟีเจอร์นี้ด้วย ดูหมายเหตุการกำหนดค่าของ IMA * รองรับตัวเลือก UI ที่กำหนดเองของ IMA DAI ในเครื่องมือสร้าง URI ของ SSAI ตัวเลือก UI ที่กำหนดเองสำหรับการแทรกโฆษณาฝั่งเซิร์ฟเวอร์ ได้แก่ การรองรับการแสดงผล "ข้ามได้" และ "เกี่ยวกับโฆษณานี้" ปัจจุบันฟีเจอร์นี้พร้อมให้บริการแก่ผู้เผยแพร่โฆษณาบางรายที่อยู่ในรายการที่อนุญาต การเปลี่ยนแปลงนี้ยังอัปเกรดเวอร์ชัน IMA SDK เป็น 3.38.0 (บันทึกประจำรุ่น) เพื่อเข้าถึง API ตัวเลือก UI ที่กำหนดเองด้วย
- แก้ไขปัญหาที่ข้อผิดพลาดในการเตรียมเนื้อหาสำหรับเนื้อหาหลังโฆษณาจะได้รับการรายงานอย่างไม่ถูกต้องว่าเป็นข้อผิดพลาดในการเล่นโฆษณา (#2656)
- เซสชัน:
- เพิ่มพารามิเตอร์ใหม่ลงใน
MediaSession.Callback.onPlaybackResumptionเพื่อระบุว่าการเรียกใช้เกิดขึ้นเพื่อรวบรวมข้อมูลเท่านั้นหรือเพื่อเริ่มการเล่น (#1764) - อัปเดต
MediaSession.ControllerInfo.isTrustedเพื่อประกาศตัวควบคุมจากแอปของตนเองว่าเชื่อถือได้ด้วย (#2542) - เพิ่ม
MediaSessionService.triggerNotificationUpdateเพื่อทริกเกอร์การอัปเดตการแจ้งเตือนด้วยตนเอง (#1833) - เพิ่ม
ProgressListenerไปยังเมธอดคำสั่งที่กำหนดเอง - เปลี่ยนค่าเริ่มต้นของ
MediaLibrarySession.Builder.setLibraryErrorReplicationModeเป็นไม่ร้ายแรง - เพิ่มพารามิเตอร์
ContextลงในMediaButtonReceiver.onForegroundServiceStartNotAllowedException(#2625) - อ่านรหัสการควบคุมระดับเสียงจากแพลตฟอร์ม
PlaybackInfoแทนการดึงข้อมูลผ่าน Binder ซึ่งช่วยให้มั่นใจว่าระบบจะอ่านประเภทการเล่นและรหัสการควบคุมระดับเสียงแบบอะตอมและตรงกัน - แก้ไขข้อบกพร่องที่เหตุการณ์สำคัญ
ACTION_UPถูกกรองออกก่อนที่จะส่งไปยัง Callback เพื่อการจัดการที่กำหนดเอง ซึ่งจะทำให้มีความเท่าเทียมกับสิ่งที่ media1 ทำและสิ่งที่แพลตฟอร์มทำ (#2637) - แก้ไขข้อบกพร่องที่
getCurrentTimeline()ถูกเรียกโดยPlayerWrapperแม้ว่าคำสั่งจะไม่พร้อมใช้งาน (#2665) - แก้ไขข้อบกพร่องที่ข้อความค้างอยู่ในคิวข้อความของ Looper หลัก ซึ่งทำให้หน่วยความจำรั่วไหลหลังจากบริการสิ้นสุดลง (#2692)
- เมื่อเชื่อมต่อกับแอปเซสชันเดิมด้วย
MediaBrowserระบบจะส่งคำสั่งที่กำหนดเองไปยังเซสชันก็ต่อเมื่อมีการโฆษณาการกระทำที่กำหนดเองเป็นการกระทำที่กำหนดเองในPlaybackStateCompatของเซสชันเดิม ระบบจะส่งการดำเนินการที่กำหนดเองอื่นๆ ทั้งหมดไปยังบริการ - ใช้
onAudioSessionIdChangedเพื่อแจ้งเตือนตัวควบคุมสื่อเมื่อมีการตั้งค่ารหัสเซสชันเสียงโดยเซสชัน (#244) - แก้ไขข้อบกพร่องที่
KEYCODE_HEADSETHOOKไม่เริ่มโปรแกรมเล่นเมื่อมีเหตุการณ์คีย์สื่อIntentเข้ามาในonStartCommand()ปัญหานี้ได้รับการแก้ไขโดยการจัดการ "KEYCODE_HEADSETHOOK" เช่นเดียวกับKEYCODE_MEDIA_PLAY_PAUSE(#2816) - แก้ไขข้อบกพร่องที่ไม่มีการสื่อสารขนาดของ Surface ระหว่างเซสชันกับตัวควบคุม ซึ่งส่งผลให้ใช้เอฟเฟกต์วิดีโอในเซสชันสาธิตไม่สำเร็จ หากคุณใช้ตัวควบคุม การเปลี่ยนแปลงนี้อาจส่งผลกับส่วนอื่นในระบบหากโปรแกรมเล่นของคุณไม่สามารถจัดการการเรียก
setVideoSurfaceHolderได้ - แก้ไขการเผยแพร่ค่าข้อมูลเมตาที่ไม่ใช่
StringCharSequenceเช่น สตริงที่มีสไตล์ span (#2853) - เพิ่ม
CommandButton.executeActionเพื่อให้ตัวควบคุมเรียกใช้การดำเนินการที่ต้องการได้ง่ายขึ้น นอกจากนี้ยังอนุญาตให้ระบุพารามิเตอร์สำหรับคำสั่งบางอย่างของเพลเยอร์และเซสชันเพื่อกำหนดการดำเนินการที่จะทริกเกอร์ - เพิ่มความเข้ากันได้แบบย้อนหลังสำหรับอินสแตนซ์
CommandButtonโดยใช้Player.CommandหรือSessionCommandที่ไม่ใช่แบบกำหนดเองเพื่อกำหนดการดำเนินการ ตอนนี้ข้อมูลเหล่านี้จะแสดงอย่างถูกต้องในเซสชันสื่อของแพลตฟอร์ม เช่น สำหรับ UI ของระบบหรือ Android Auto - แก้ไขปัญหาที่
Bitmapเดียวกันถูกบีบอัดหลายครั้งเมื่อเชื่อมต่อMediaControllerกับเซสชันสื่อของแพลตฟอร์ม
- เพิ่มพารามิเตอร์ใหม่ลงใน
- UI:
- เพิ่มคลาส
ProgressStateWithTickIntervalและ ComposablerememberProgressStateWithTickIntervalที่เกี่ยวข้องลงในโมดูลmedia3-ui-composeตัวเก็บสถานะนี้ใช้ในdemo-composeเพื่อแสดงตำแหน่งและระยะเวลาปัจจุบันในรูปแบบข้อความ - เพิ่ม
MuteButtonStateลงในui-composeซึ่งจะจัดการการปิดเสียงของระดับเสียงPlayerตัวเก็บสถานะนี้ใช้ในdemo-composeเพื่อแสดงปุ่มเปิด/ปิดเสียง - เพิ่มคลาส
ProgressStateWithTickCountและrememberProgressStateWithTickCountComposable ที่เกี่ยวข้องลงในโมดูลmedia3-ui-composeตัวเก็บสถานะนี้ใช้ในdemo-composeเพื่อแสดงความคืบหน้าเป็นแถบความคืบหน้าแนวนอนแบบอ่านอย่างเดียว - เพิ่ม
ContentFrameComposable ลงในmedia3-ui-composeซึ่งรวมการจัดการPlayerSurfaceเข้ากับการปรับขนาดสัดส่วนภาพและการปิดด้วยชัตเตอร์ - แก้ปัญหาข้อบกพร่องที่ทราบของแพลตฟอร์ม API 34 ซึ่งทำให้วิดีโอถูกยืด/ครอบตัดเมื่อใช้
SurfaceViewภายใน ComposeAndroidViewจึงส่งผลต่อ ComposableContentFrameและPlayerSurfaceที่มีSURFACE_TYPE_SURFACE_VIEW(#1237, #2811) - สร้างโมดูล
media3-ui-compose-material3ใหม่และเพิ่ม Composable ที่มีธีม Material3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton) ลงในโมดูล - เพิ่ม
TimeTextComposable ลงในmedia3-ui-compose-material3เพื่อแสดงความคืบหน้าของโปรแกรมเล่นในรูปแบบข้อความ โดยสามารถกำหนดค่าให้แสดงตำแหน่งปัจจุบัน ระยะเวลา หรือเวลาที่เหลือได้ - เพิ่มการรองรับการวางปุ่มเส้นทางสื่อใน
PlayerView - ใช้
BidiFormatterเพื่อแสดงเครื่องหมายวรรคตอนในคำบรรยายที่เป็นข้อความแบบ RTL อย่างถูกต้อง (#11214)
- เพิ่มคลาส
- ส่วนขยาย HLS
- แยกวิเคราะห์แอตทริบิวต์การข้ามโฆษณาคั่นระหว่างหน้าของ HLS
- แมปแอตทริบิวต์การควบคุมการข้ามจากเพลย์ลิสต์ HLS และเอกสารรายการเนื้อหาลงใน
AdPlaybackStateสำหรับการเข้าถึงแบบสาธารณะ - แก้ไขข้อบกพร่องที่เวลาเริ่มต้นของเพลย์ลิสต์หายไปเมื่อนำแท็ก EXT-X-PROGRAM-START-DATE ที่กำหนดเวลาเริ่มต้นออกจากเพลย์ลิสต์ (#2760)
- ใช้การค้นหาแบบไบนารีเพื่อค้นหาดัชนีกลุ่มของตำแหน่งที่ระบุในเพลย์ลิสต์ (#2826)
- เพิ่ม
HlsInterstitialsAdsLoader.skipCurrentAd()และskipCurrentAdGroup()และเมธอดที่เกี่ยวข้องเพื่อข้ามโฆษณาและกลุ่มโฆษณาตามดัชนี - เพิ่ม
HlsInterstitialsAdsLoader.Listener.onAdStartedเพื่อรายงานจุดเริ่มต้นของระยะเวลาโฆษณา (#2859) - ยอมรับการเว้นวรรคเป็นตัวคั่นวันที่/เวลาในสตริงวันที่และเวลา ISO 8601
- จัดการการดึงข้อมูลกลุ่มถัดไปสำหรับ
HlsMediaPlaylistที่ไม่มีกลุ่มอย่างเหมาะสม (#2821) - ใช้ตำแหน่งเริ่มต้นตามค่าเริ่มต้นสำหรับโฆษณาตอนต้นที่มีไลฟ์สด
- ส่วนขยาย DASH
- แก้ไข
UnsupportedOperationExceptionเมื่อเล่นสตรีม DASH ด้วยไฟล์ Manifest ของ URIdata:ที่ไม่ใช่แบบลำดับชั้น (#2688) - รีเซ็ต
LiveConfigurationเป็นค่าที่ระบุโดยMediaItemของDashMediaSourceเมื่อเผยแพร่และเมื่อผู้ใช้อัปเดตรายการสื่อ (#2606) - หลีกเลี่ยงการขัดข้องที่เกิดจากการอัปเดตไฟล์ Manifest ที่ไม่ถูกต้องซึ่งไม่ได้รายงานว่าเป็นข้อผิดพลาดของเพลเยอร์ (#2805)
- แก้ไข
- ส่วนขยาย RTSP:
- จัดการข้อผิดพลาดของแพ็กเก็ต RTP ที่ขาดหายไปเมื่อประมวลผลหน่วย NAL ที่แยกส่วนสำหรับ H264 และ H265 (#2613)
- ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
- ส่วนขยาย AV1: ตอนนี้ตัวถอดรหัสซอฟต์แวร์ AV1 ใช้ไลบรารี
dav1dประสิทธิภาพสูงแทนการใช้งานlibgav1ก่อนหน้านี้เพื่อเพิ่มความเร็วในการถอดรหัส - ส่วนขยาย FFmpeg: แก้ไขปัญหาที่ทำให้ไฟล์ FLAC บางไฟล์เล่นไม่ได้โดยตรวจสอบว่าบล็อก
STREAMINFOได้รับการแยกวิเคราะห์อย่างถูกต้องและส่งไปยังตัวถอดรหัส (#2887)
- ส่วนขยาย AV1: ตอนนี้ตัวถอดรหัสซอฟต์แวร์ AV1 ใช้ไลบรารี
- ส่วนขยาย Cast:
- เพิ่ม
CastPlayer.Builderซึ่งช่วยให้CastPlayerเล่นได้ทั้งในเครื่องและผ่าน Cast หากต้องการคงลักษณะการทำงานแบบเก่าของCastPlayerที่รองรับเฉพาะการเล่นผ่าน Cast ให้ใช้RemoteCastPlayerตัวสร้างCastPlayerที่มีอยู่ก่อนแล้วจะยังคงทำงานเหมือนเดิม แต่จะเลิกใช้งานเพื่อเปลี่ยนไปใช้เครื่องมือสร้างCastPlayerหรือRemoteCastPlayerแทน - หยุดบังคับใช้ประเภท MIME ที่ไม่ใช่ค่า Null ใน
DefaultMediaItemConverter - ใช้
MediaItem.mediaMetadata.mediaTypeเพื่ออนุมาน MEDIA_TYPE ของ Cast เพื่อใช้ในDefaultCastOptionsProvider#toMediaQueueItem(หากมี) - เปิดใช้การโอนเข้าจากระยะไกลไปยังอุปกรณ์ในเครื่องใน
DefaultCastOptionsProvider - เพิ่มการรองรับ Cast ในการสาธิตเซสชัน
- เพิ่มการรองรับการแสดงปุ่มเส้นทางสื่อใน Composable UI
- เพิ่มการรองรับการแสดงปุ่มเส้นทางสื่อในเมนูแถบการดำเนินการ
- เพิ่มการรองรับการแสดงปุ่มเส้นทางสื่อเป็น UI ของมุมมอง
- เพิ่ม
- ยูทิลิตีการทดสอบ
- เพิ่มความแตกต่างของเวลาสูงสุดสำหรับลักษณะการทำงานของการเลื่อนหัวข้ออัตโนมัติของ
FakeClockโดยค่าเริ่มต้นจะอยู่ที่ 1 วินาที แต่สามารถกำหนดค่าได้ผ่านFakeClock.Builder - เพิ่มความแตกต่างของเวลาสูงสุดระหว่างข้อความสำหรับ
RobolectricUtil.runMainLooperUntil(และrunLooperUntil) โดยค่าเริ่มต้นคือ 1 วินาที แต่สามารถกำหนดค่าได้ผ่านการโอเวอร์โหลดใหม่ของเมธอดเหล่านี้ - ย้าย
CapturingRenderersFactoryจากtest-utilsไปtest-utils-robolectric
- เพิ่มความแตกต่างของเวลาสูงสุดสำหรับลักษณะการทำงานของการเลื่อนหัวข้ออัตโนมัติของ
- นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
- นำคอนสตรักเตอร์
DefaultPreloadManagerที่เลิกใช้งานแล้วออก โปรดใช้DefaultPreloadManager.Builderแทน - นำคอนสตรัคเตอร์
EditedMediaItemSequenceที่เลิกใช้งานแล้วออก โปรดใช้EditedMediaItemSequence.Builderแทน - นำ
BitmapFactoryImageDecoder.BitmapDecoderออก โปรดใช้ExternallyLoadedImageDecoderแทน - นำ
ShadowMediaCodecConfig.forAllSupportedMimeTypes()ที่เลิกใช้งานแล้วออก โปรดใช้ShadowMediaCodecConfig.withAllDefaultSupportedCodecs()แทน - นำ
ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes()ที่เลิกใช้งานแล้วออก โปรดใช้ShadowMediaCodecConfig.withNoDefaultSupportedCodecs()แทน
- นำคอนสตรักเตอร์
1.9.0-rc01
1 ธันวาคม 2025
ใช้เวอร์ชันเสถียร 1.9.0
1.9.0-beta01
20 พฤศจิกายน 2025
ใช้เวอร์ชันเสถียร 1.9.0
1.9.0-alpha01
22 ตุลาคม 2025
ใช้เวอร์ชันเสถียร 1.9.0
เวอร์ชัน 1.8.0
1.8.1
21 พฤษภาคม 2026
เวอร์ชัน 1.8.1 มี Commit ต่อไปนี้
- ผลกระทบ
- ตั้งค่า
GL_DRAW_BUFFERและGL_READ_BUFFERอย่างชัดเจนเมื่อเปลี่ยนจากบริบทที่ไม่มีแพลตฟอร์ม
- ตั้งค่า
เวอร์ชัน 1.8.0
30 กรกฎาคม 2025
เวอร์ชัน 1.8.0 มี คอมมิตเหล่านี้
- Common Library:
- เพิ่มการรองรับการแทนที่เพลเยอร์ใน
ForwardingSimpleBasePlayer
- เพิ่มการรองรับการแทนที่เพลเยอร์ใน
- ExoPlayer:
- เพิ่ม Getter สำหรับโหมดสุ่มเพลงไปยังอินเทอร์เฟซ
ExoPlayer(#2522) - แสดงข้อยกเว้นอย่างชัดเจนยิ่งขึ้นหากมีการเข้าถึง
DefaultAudioSinkจากหลายชุดข้อความ หากปัญหานี้เกิดขึ้นเนื่องจากการเรียกใช้RendererCapabilities.getFormatSupportนอกเพลเยอร์ ให้ตรวจสอบว่าได้เรียกใช้เมธอดนี้ในชุดข้อความเดียวกับชุดข้อความการเล่นของ ExoPlayer หรือใช้อินสแตนซ์อื่นนอกเหนือจากที่ใช้สำหรับการเล่น (#1191) - แก้ไขข้อบกพร่องที่ทำให้
DefaultTrackSelectorอาจทำเครื่องหมายรูปแบบเสียงที่ไม่ใช่สเตอริโอบนทีวีว่าไม่รองรับ - ตรวจสอบว่าเฟรมสุดท้ายแสดงผลอย่างถูกต้องเมื่อใช้แฟล็ก
DECODE_ONLYของ MediaCodec (ซึ่งเปิดใช้โดยค่าเริ่มต้นในโหมดสครับ) - เพิ่มการรองรับการใช้รหัสอุปกรณ์เสมือนจริงจาก
Contextที่ส่งไปยังExoPlayer.Builder - เปิดใช้การจัดกำหนดการแบบไดนามิกโดยค่าเริ่มต้นในโหมดการสครับ
- หลีกเลี่ยงการโหลดแหล่งที่มาซ้ำโดยไม่จำเป็นเมื่อกรอไปยังส่วนท้ายของรายการ
- ใช้
MediaCodec.BUFFER_FLAG_DECODE_ONLYโดยค่าเริ่มต้นในโหมดสครับบิง - แสดง
IllegalStateExceptionเมื่อPreloadMediaSourceเล่นโดยExoPlayerที่มีชุดข้อความการเล่นที่แตกต่างจากชุดข้อความการโหลดล่วงหน้า (#2495) - เพิ่ม
cloneAndMoveไปยังShuffleModeด้วยการติดตั้งใช้งานเริ่มต้น (#2226) - เปลี่ยนลักษณะการทำงานเริ่มต้นของ
Renderer.getMinDurationToProgressUsเพื่อแสดงผลค่าที่มากขึ้นหากไม่จำเป็นต้องเรียกใช้render - แก้ไขข้อบกพร่องที่การกำหนดเวลาภายในทำให้เฟรมสุดท้ายล่าช้าเมื่อกรอไปยังตอนท้ายขณะหยุดชั่วคราว ในตอนนี้ การแก้ไขข้อบกพร่องจะมีผลก็ต่อเมื่อเปิดใช้
ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabledเท่านั้น - เพิ่มวิธีการ
ExoPlayer.setScrubbingModeEnabled(boolean)ซึ่งจะเพิ่มประสิทธิภาพเพลเยอร์สำหรับการกรอวิดีโอบ่อยๆ (เช่น จากการที่ผู้ใช้ลากแถบเลื่อนไปมา) คุณปรับแต่งลักษณะการทำงานของโหมดการสครับได้ด้วยsetScrubbingModeParameters(..)ในExoPlayerและExoPlayer.Builder - อนุญาตให้ปรับแต่งค่าความคลาดเคลื่อนของการกรอแบบเศษส่วนในโหมดการสครับ
- เพิ่มอัตราการทำงานของตัวแปลงรหัสในโหมดการสครับ
- แก้ไขข้อบกพร่องที่ข้อผิดพลาดในการเตรียมเนื้อหาของ
AdsMediaSourceอาจไม่ได้รับการรายงาน (#2337) - แก้ไขหน่วยความจำรั่วไหลใน
MergingMediaSourceเช่น ใช้เมื่อไซด์โหลดคำบรรยาย (#2338) - อนุญาตให้
CmcdConfiguration.Factoryแสดงผลnullเพื่อปิดใช้การบันทึก CMCD สำหรับรายการสื่อที่เฉพาะเจาะจง (#2386) - เพิ่มขนาดบัฟเฟอร์รูปภาพเริ่มต้นจาก 128kB (ข้อผิดพลาดในการคัดลอกและวางจากแทร็กข้อความ) เป็น 26MB ซึ่งใหญ่พอสำหรับรูปภาพ Ultra HDR ขนาด 50 ล้านพิกเซล (#2417)
- เพิ่ม
PreCacheHelperที่อนุญาตให้แอปแคชสื่อรายการเดียวล่วงหน้าด้วยตำแหน่งเริ่มต้นและระยะเวลาที่ระบุ - เพิ่มการรองรับการโหลดล่วงหน้าจากตำแหน่งที่ระบุใน
DefaultPreloadManager
- เพิ่ม Getter สำหรับโหมดสุ่มเพลงไปยังอินเทอร์เฟซ
- Transformer:
- เพิ่ม
CodecDbLiteที่ช่วยให้สามารถเพิ่มประสิทธิภาพการตั้งค่าการเข้ารหัสวิดีโอเฉพาะชิปเซ็ตได้ - เพิ่มแฟล็ก
setEnableCodecDbLiteลงในDefaultEncoderFactoryเพื่อเปิดใช้การเพิ่มประสิทธิภาพการตั้งค่า CodecDB Lite โดยค่าเริ่มต้น แฟล็กนี้จะตั้งค่าเป็น false - ตอนนี้การเติมช่องว่างเริ่มต้น (เพิ่มผ่าน
addGap()) ด้วยเสียงที่ไม่มีเสียงต้องตั้งค่าexperimentalSetForceAudioTrack(true)ในEditedMediaItemSequence.Builderอย่างชัดเจน หากช่องว่างอยู่ตรงกลางของลำดับ ก็ไม่จำเป็นต้องใช้แฟล็กนี้ - ย้ายอินเทอร์เฟซ
Muxerจากmedia3-transformerไปยังmedia3-muxer - กำหนดให้ต้องตั้งค่า
MediaItem.Builder().setImageDuration(long)เพื่อนำเข้ารายการสื่อเป็นรูปภาพ - เพิ่ม
Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean)ซึ่งรวมถึงรายการแก้ไข MP4 เมื่อตัดเพื่อสั่งให้โปรแกรมเล่นละเว้นตัวอย่างระหว่างคีย์เฟรมก่อนจุดเริ่มต้นการตัดและจุดเริ่มต้นการตัด - อัปเดตแอป Composition Demo ให้ใช้ Kotlin และ Jetpack Compose และเพิ่ม
VideoCompositorSettingsที่กำหนดเองเพื่อจัดเรียงลำดับเป็นเลย์เอาต์ 2x2 หรือ PiP
- เพิ่ม
- เครื่องสกัดน้ำผลไม้
- แยกวิเคราะห์ข้อมูลเมตาจากไฟล์ MP4 ที่แยกส่วน (#2084)
- JPEG: รองรับรูปภาพเคลื่อนไหวที่ไม่มีกลุ่ม Exif ที่จุดเริ่มต้น (#2552)
- เพิ่มการรองรับการกรอใน MP4 ที่แยกส่วนซึ่งมีอะตอม
sidxหลายรายการ คุณเปิดใช้ลักษณะการทำงานนี้ได้โดยใช้แฟล็กFLAG_MERGE_FRAGMENTED_SIDXในFragmentedMp4Extractor(#9373) - ละเว้นตารางการกรอที่ว่างเปล่าในไฟล์ FLAC (รวมถึงตารางที่มีเฉพาะจุดกรอที่เป็นตัวยึดตำแหน่ง) และกลับไปใช้การกรอแบบค้นหาไบนารีหากทราบระยะเวลาของไฟล์ (#2327)
- แก้ไขการแยกวิเคราะห์หน่วย SEI ของ H.265 เพื่อข้ามประเภท SEI ที่ไม่รู้จักโดยสมบูรณ์ (#2456)
- อัปเดต
WavExtractorให้ใช้ข้อมูล SubFormat ของส่วนขยายส่วนหัวสำหรับรูปแบบเสียงเมื่อแยกวิเคราะห์ไฟล์ประเภทWAVE_FORMAT_EXTENSIBLE - MP4: เพิ่มการรองรับกล่อง
ipcmและfpcmที่กำหนดแทร็กเสียง PCM ดิบ (ไม่รองรับ PCM จุดลอยตัว 64 บิต) - MP4: จัดการส่วนการหมุนของเมทริกซ์การเปลี่ยนรูปแบบ
tkhdที่ทั้งหมุนและสะท้อนวิดีโอ ซึ่งจะช่วยให้วิดีโอที่สะท้อนซึ่งถ่ายโดยกล้องหน้าของ iPhone แสดงในแนวที่ถูกต้อง แต่สะท้อนในแกน Y ไม่ถูกต้อง (#2012) - MP3: ใช้ระยะเวลาและขนาดข้อมูลจาก Xing, VBRI และข้อมูลเมตาอัตราบิตแบบแปรผันที่คล้ายกันซึ่งกรอไม่ได้เมื่อกลับไปใช้การกรออัตราบิตคงที่เนื่องจาก
FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS)(#2194)
- เสียง
- แก้ไขข้อบกพร่องที่ไม่มีการเรียก
AnalyticsListener.onAudioPositionAdvancingเมื่อการเล่นเสียงเริ่มขึ้นใกล้กับตอนจบของสื่อมาก - เพิ่มการรองรับรูปแบบตัวอย่าง PCM เชิงเส้นทั้งหมดใน
ChannelMappingAudioProcessorและTrimmingAudioProcessor - เพิ่มการรองรับช่องว่างของเสียงใน
CompositionPlayer - นำการเรียกใช้
BaseAudioProcessor#flush()ที่ไม่ถูกต้องออกจากBaseAudioProcessor#reset() - อนุญาตให้ทำการอัปมิกซ์/ดาวน์มิกซ์กำลังคงที่ใน DefaultAudioMixer
- ทำให้
ChannelMappingAudioProcessor,TrimmingAudioProcessorและToFloatPcmAudioProcessorเป็นแบบสาธารณะ (#2339) - ใช้
AudioTrack#getUnderrunCount()ในAudioTrackPositionTrackerเพื่อตรวจหาการแสดงผลต่ำกว่าเป้าหมายในDefaultAudioSinkแทนการประมาณการแบบพยายามอย่างเต็มที่ - ปรับปรุงการปรับการประทับเวลาของเสียงให้ราบรื่นขึ้นสำหรับตำแหน่งที่คลาดเคลื่อนโดยไม่คาดคิดจากอุปกรณ์เอาต์พุตเสียง
- แก้ไขข้อบกพร่องที่ทำให้การซิงค์เสียง/วิดีโอไม่ทำงานในช่วง 10 วินาทีแรกหลังจากกลับมาเล่นต่อจากการหยุดชั่วคราวเมื่อเชื่อมต่อกับอุปกรณ์บลูทูธ
- แก้ไขข้อบกพร่องที่
AnalyticsListener.onAudioPositionAdvancingไม่ได้รายงานเวลาที่เสียงเริ่มเล่น แต่รายงานเวลาของการวัดครั้งแรก - แก้ไขการกู้คืนเป็นเสียงแบบหลายช่องทางหลังจากเปลี่ยนกลับไปเป็นเสียงสเตอริโอในอุปกรณ์บางรุ่น (#2258)
- แก้ไขข้อบกพร่องที่ไม่มีการเรียก
- วิดีโอ:
- ขยายวิธีแก้ปัญหาชั่วคราวสำหรับแพลตฟอร์มที่แยกออกจากกันไปยังอุปกรณ์ "lenovo" และ "motorola" (#2059)
- ปรับปรุงการแสดงเฟรมวิดีโอที่ราบรื่นเมื่อเริ่มต้นเมื่อตัวอย่างเสียงไม่เริ่มที่ตำแหน่งที่ขออย่างถูกต้อง
- ขยายวิธีแก้ปัญหาชั่วคราวสำหรับแพลตฟอร์มที่แยกออกจากกันไปยังอุปกรณ์ "realme" (#2059)
- เพิ่ม
ExoPlayerAPI เวอร์ชันทดลองเพื่อรวมแฟล็กMediaCodec.BUFFER_FLAG_DECODE_ONLYเมื่อจัดคิวบัฟเฟอร์อินพุตแบบถอดรหัสเท่านั้น แฟล็กนี้จะส่งสัญญาณให้ตัวถอดรหัสข้ามบัฟเฟอร์ที่ถอดรหัสเท่านั้น ซึ่งจะส่งผลให้การค้นหาเร็วขึ้น เปิดใช้ด้วยDefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag* ปรับปรุงการตรวจสอบประสิทธิภาพของตัวแปลงรหัสสำหรับตัวแปลงรหัสวิดีโอแบบซอฟต์แวร์ ซึ่งอาจทำให้แทร็กเพิ่มเติมบางแทร็กได้รับการทำเครื่องหมายเป็นEXCEEDS_CAPABILITIES - แก้ไขข้อผิดพลาดในการเล่น VP9 Widevine ในอุปกรณ์บางรุ่น (#2408)
- ข้อความ
- เพิ่มการรองรับแทร็ก VobSub ในไฟล์ MP4 (#2510)
- แก้ไขปัญหาการหยุดเล่นชั่วคราวเมื่อโหลดส่วนคำบรรยายไม่สำเร็จในตอนแรกและโหลดสำเร็จในภายหลัง ตามด้วยส่วนคำบรรยายที่ว่างเปล่าหลายส่วน (#2517)
- แก้ไข SSA และ SubRip เพื่อแสดงคิวที่กำลังดำเนินการเมื่อเปิดใช้คำบรรยาย (#2309)
- แก้ไขการเล่นค้างเมื่อเปลี่ยนจากสตรีมที่มีข้อผิดพลาดเกี่ยวกับคำบรรยายเป็นไลฟ์สดที่มีแทร็กคำบรรยายว่างเปล่า (#2328)
- แก้ไขคำบรรยาย CEA-608 ที่อ่านไม่ออกเมื่อเล่นสตรีม H.262 ที่มี B-frame (#2372)
- เพิ่มการรองรับคำบรรยาย SSA ด้วย
CodecId = S_TEXT/SSAในไฟล์ Matroska ก่อนหน้านี้MatroskaExtractorรองรับเฉพาะCodecId = S_TEXT/ASSซึ่งมีไว้เพื่อแสดงตัวแปร "ขั้นสูง" (v4+) ของคำบรรยาย SubStation Alpha (แต่ตรรกะการแยกวิเคราะห์ของ ExoPlayer จะเหมือนกันสำหรับทั้ง 2 ตัวแปร) (#2384) - เพิ่มการรองรับพร็อพเพอร์ตี้
layerในไฟล์คำบรรยาย SubStation Alpha (SSA) ซึ่งใช้เพื่อกำหนดลำดับ Z ของคิวเมื่อมีคิวมากกว่า 1 รายการแสดงบนหน้าจอพร้อมกัน (#2124)
- ข้อมูลเมตา
- เพิ่มการรองรับการดึงข้อมูลระยะเวลาของสื่อและ
TimelineไปยังMetadataRetrieverและย้ายข้อมูลไปยัง APIAutoCloseableที่อิงตามอินสแตนซ์ ใช้Builderใหม่เพื่อสร้างอินสแตนซ์สำหรับMediaItemจากนั้นเรียกใช้retrieveTrackGroups(),retrieveTimeline()และretrieveDurationUs()เพื่อรับListenableFutureสำหรับข้อมูลเมตา เลิกใช้เมธอดแบบคงที่ก่อนหน้านี้แล้ว (#2462)
- เพิ่มการรองรับการดึงข้อมูลระยะเวลาของสื่อและ
- รูปภาพ:
- จำกัดบิตแมปที่ถอดรหัสแล้วให้มีขนาดเท่ากับขนาดที่แสดงใน
BitmapFactoryImageDecoderเพื่อหลีกเลี่ยงไม่ให้แอปขัดข้องด้วยCanvas: trying to draw too large bitmap.จากPlayerViewเมื่อพยายามแสดงรูปภาพขนาดใหญ่มาก (เช่น 50 ล้านพิกเซล) - เปลี่ยนซิกเนเจอร์ของ
DefaultRenderersFactory.getImageDecoderFactory()เพื่อรับพารามิเตอร์Context - ปรับขนาดเอาต์พุตบิตแมปสูงสุดที่ใช้ใน
CompositionPlayerให้สอดคล้องกับขนาดที่ใช้ในTransformerอยู่แล้ว (หมายความว่าCompositionPlayerจะไม่พิจารณาขนาดการแสดงผลเมื่อถอดรหัสบิตแมป ซึ่งต่างจากExoPlayer)
- จำกัดบิตแมปที่ถอดรหัสแล้วให้มีขนาดเท่ากับขนาดที่แสดงใน
- DRM:
- เพิ่มโอเวอร์โหลดใหม่ของ
OfflineLicenseHelper.newWidevineInstanceที่ยอมรับMediaItem.DrmConfigurationเพื่อให้ใช้ส่วนหัวของคำขอ HTTP ได้อย่างถูกต้อง (#2169)
- เพิ่มโอเวอร์โหลดใหม่ของ
- ผลกระทบ
- เพิ่ม
Presentation.createForShortSide(int)ที่สร้างPresentationซึ่งช่วยให้มั่นใจว่าด้านที่สั้นที่สุดจะตรงกับค่าที่ระบุเสมอ ไม่ว่าการวางแนวอินพุตจะเป็นอย่างไร
- เพิ่ม
- Muxer:
- แก้ไขข้อบกพร่องที่ระบบไม่ได้ตั้งค่าแฟล็กตัวอย่างที่ถูกต้องสำหรับตัวอย่างเสียงใน MP4 ที่แยกส่วน
- ตอนนี้ API
writeSampleData()ใช้คลาสBufferInfoที่เจาะจงสำหรับ Muxer แทนMediaCodec.BufferInfo - เพิ่ม
Muxer.Factory#supportsWritingNegativeTimestampsInEditListซึ่งค่าเริ่มต้นเป็น "เท็จ"
- ส่วนขยาย IMA:
- แก้ไขข้อบกพร่องที่ข้อผิดพลาดในการโหลดในโฆษณาหนึ่งอาจทำให้กลุ่มโฆษณาอื่นใช้งานไม่ได้โดยไม่ตั้งใจ
- แก้ไขข้อบกพร่องที่กลุ่มโฆษณาหลังจากสิ้นสุดกรอบเวลา VOD ทำให้การเล่นหยุดชะงัก
กลุ่มโฆษณาที่มีเวลาเริ่มต้นหลังจากกรอบเวลาจะไม่เข้าคิวใน
MediaPeriodQueueอีกต่อไป (#2215)
- เซสชัน:
- แก้ไขข้อบกพร่องที่ระบบละเว้นการเชื่อมต่อจากตัวควบคุม Media3 ของบุคคลที่สามที่ไม่มีสิทธิ์
- นำการตรวจสอบคำสั่งที่ใช้ได้ออกเมื่อส่งคำสั่งที่กำหนดเองไปยัง
MediaBrowserServiceCompatเดิม ซึ่งสอดคล้องกับลักษณะการทำงานของตัวควบคุม/เบราว์เซอร์เดิมเมื่อเชื่อมต่อกับแอปเดิม - แก้ไขข้อบกพร่องที่ทำให้ข้อผิดพลาดในการเล่นครั้งแรกของเพลเยอร์ได้รับการจัดการอย่างไม่ถูกต้องเป็นข้อยกเว้นที่กำหนดเองแบบถาวร ซึ่งจะทำให้แอปพลิเคชันกู้คืนไม่ได้
- แก้ไขข้อบกพร่องที่การเปลี่ยนแปลงตัวควบคุมบางอย่างที่เซสชันไม่ได้จัดการอาจทำให้เกิด
IllegalStateExceptions - แก้ไขข้อบกพร่องที่การดำเนินการของตัวควบคุมซึ่งไม่ได้จัดการโดยเซสชันอาจทำให้ตัวควบคุมอยู่ในสถานะไม่ถูกต้อง
- แก้ไขคำเตือนการละเมิดการเปิดใช้งานที่ไม่ปลอดภัยของ StrictMode (#2330)
- แก้ไขข้อบกพร่องที่การเรียก
setSessionExtrasจากเทรดหลักเมื่อเรียกใช้เพลเยอร์จากเทรดแอปพลิเคชันอื่นที่ไม่ใช่เทรดหลักทำให้เกิดIllegalStateException(#2265) - ไม่แสดงการแจ้งเตือนโดยอัตโนมัติหากมีการตั้งค่าเพลเยอร์ด้วยรายการสื่อโดยไม่ต้องเตรียมหรือเล่นรายการสื่อ (#2423https://github.com/androidx/media/issues/2423) คุณสามารถกำหนดค่าลักษณะการทำงานนี้ได้ผ่าน
MediaSessionService.setShowNotificationForIdlePlayer - เพิ่ม
PlaybackExceptionที่กำหนดเองสำหรับตัวควบคุมทั้งหมดหรือตัวควบคุมที่เลือก - แก้ไขข้อบกพร่องที่การกรอในไลฟ์สดบน
MediaControllerอาจทำให้เกิดIllegalArgumentException - สำหรับไลฟ์สด ให้หยุดเผยแพร่ตำแหน่งการเล่นและความสามารถในการกรอในรายการปัจจุบันสำหรับตัวควบคุมสื่อของแพลตฟอร์ม เพื่อหลีกเลี่ยงอาร์ติแฟกต์ตำแหน่งใน UI ของ Android Auto (และตัวควบคุมอื่นๆ ที่ใช้ข้อมูลนี้จากเซสชันสื่อของแพลตฟอร์ม) (#1758)
- แก้ไขข้อบกพร่องที่การส่งค่า Null ไปยัง
getLibraryRootของMediaBrowserที่เชื่อมต่อกับMediaBrowserServiceCompatเดิมทำให้เกิดNullPointerException - แก้ไขข้อบกพร่องที่การส่งการกระทำที่กำหนดเอง ผลการค้นหา หรือคำขอ getItem ทำให้แอปเซสชันเดิมขัดข้องด้วย
ClassNotFoundException - แก้ไขข้อบกพร่องที่ทำให้มีการแชร์
MediaItem.LocalConfiguration.uriไปยังMediaMetadataของเซสชันแพลตฟอร์ม หากต้องการแชร์ URI โดยเจตนาเพื่อให้ตัวควบคุมขอสื่ออีกครั้งได้ ให้ตั้งค่าMediaItem.RequestMetadata.mediaUriแทน
- UI:
- แก้ไขข้อบกพร่องที่
PlayerSurfaceภายในคอมโพเนนต์ที่นำกลับมาใช้ซ้ำได้ เช่นLazyColumnทำงานไม่ถูกต้อง (#2493) - แก้ไขข้อบกพร่องของ Compose ซึ่งส่งผลให้เกิดช่องว่างระหว่างการตั้งค่าสถานะปุ่มเริ่มต้นและการสังเกตการเปลี่ยนแปลงสถานะ (เช่น รูปร่างไอคอนหรือการเปิดใช้) ตอนนี้ระบบจะตรวจจับการเปลี่ยนแปลงที่เกิดขึ้นกับเพลเยอร์นอกระยะเวลาการสังเกตการณ์ (#2313)
- เพิ่มตัวเก็บสถานะและ Composable ลงในโมดูล
media3-ui-composeสำหรับSeekBackButtonStateและSeekForwardButtonState - เพิ่มการรองรับโหมดการสครับของ ExoPlayer ไปยัง
PlayerControlViewเมื่อเปิดใช้ ตัวเลือกนี้จะทำให้เพลเยอร์เข้าสู่โหมดการสครับเมื่อผู้ใช้เริ่มลากแถบสครับ โดยจะเรียกใช้player.seekToสำหรับการเคลื่อนไหวทุกครั้ง แล้วออกจากโหมดการสครับเมื่อผู้ใช้ยกนิ้วออกจากหน้าจอ คุณเปิดใช้การผสานรวมนี้ได้ด้วยtime_bar_scrubbing_enabled = trueใน XML หรือเมธอดsetTimeBarScrubbingEnabled(boolean)จาก Java/Kotlin - ทำให้
PlayerSurfaceยอมรับอาร์กิวเมนต์Playerที่เป็นค่า Null ได้
- แก้ไขข้อบกพร่องที่
- ดาวน์โหลด:
- เพิ่มการรองรับการดาวน์โหลดบางส่วนสำหรับสตรีมแบบโปรเกรสซีฟ แอปสามารถเตรียมสตรีมแบบโปรเกรสซีฟด้วย
DownloadHelperและขอDownloadRequestจากตัวช่วยโดยระบุตำแหน่งเริ่มต้นและสิ้นสุดของสื่อตามเวลาที่การดาวน์โหลดควรครอบคลุมDownloadRequestที่แสดงผลจะมีช่วงไบต์ที่ได้รับการแก้ไข ซึ่งสามารถใช้สร้างProgressiveDownloaderและดาวน์โหลดเนื้อหาที่เกี่ยวข้องได้ - เพิ่ม
DownloadHelper.Factoryซึ่งจะแทนที่เมธอดแบบคงที่DownloadHelper.forMediaItem() - เพิ่ม
Factoryสำหรับการติดตั้งใช้งานSegmentDownloaderรายการ - เพิ่มการรองรับการดาวน์โหลดบางส่วนสำหรับสตรีมแบบปรับอัตโนมัติ แอปสามารถเตรียมสตรีมแบบปรับอัตโนมัติด้วย
DownloadHelperและขอDownloadRequestจากตัวช่วยโดยระบุตำแหน่งเริ่มต้นและสิ้นสุดของสื่อตามเวลาที่การดาวน์โหลดควรครอบคลุมDownloadRequestที่แสดงผลจะมีช่วงเวลาที่ได้รับการแก้ไข ซึ่งสามารถใช้สร้างSegmentDownloaderที่เป็นรูปธรรมและดาวน์โหลดเนื้อหาที่เกี่ยวข้องได้
- เพิ่มการรองรับการดาวน์โหลดบางส่วนสำหรับสตรีมแบบโปรเกรสซีฟ แอปสามารถเตรียมสตรีมแบบโปรเกรสซีฟด้วย
- ส่วนขยาย Cronet:
- เพิ่มการจัดการคุกกี้อัตโนมัติ (#5975)
- ส่วนขยาย HLS
- แก้ไขข้อบกพร่องที่
HlsSampleStreamWrapperพยายามค้นหาภายในบัฟเฟอร์เมื่อไม่มีกลุ่มข้อมูลที่พร้อมใช้งานในบัฟเฟอร์ #2598 - แก้ไขข้อบกพร่องที่การเปลี่ยนแปลงการเลือกแทร็กหลังจากโหลดส่วนที่มีเวลาในการตอบสนองต่ำและคำแนะนำการโหลดล่วงหน้าอาจทำให้การเล่นค้างหรือหยุดนิ่ง (#2299)
- ป้องกันการโหลดซ้ำมากเกินไปโดยรอเป็นเวลาครึ่งหนึ่งของระยะเวลาเป้าหมายเมื่อเซิร์ฟเวอร์ไม่ยอมรับ
CAN-BLOCK-RELOAD=YES(#2317) - แก้ไขข้อบกพร่องที่การเล่นหยุดชะงักเมื่อเริ่มสตรีมโฆษณาคั่นระหว่างหน้าก่อนโฆษณาตอนกลาง และพยายามแก้ไขรายการชิ้นงานสำหรับโฆษณาที่ไม่ถูกต้อง (#2558)
- แก้ไขการแยกวิเคราะห์เพลย์ลิสต์เพื่อยอมรับ
\f(ฟีดแบบฟอร์ม) ในค่าแอตทริบิวต์สตริงที่ยกมา (#2420) - รองรับการอัปเดตโฆษณาคั่นระหว่างหน้าที่มีรหัสเดียวกัน (#2427)
- แก้ไขข้อบกพร่องที่บางครั้งข้อผิดพลาดในการโหลดเพลย์ลิสต์ไม่ได้รับการเผยแพร่เมื่อไลฟ์สดไม่มีกลุ่มให้โหลดแล้ว (#2401https://github.com/androidx/media/issues/2401)
- จัดกลุ่มการแสดงผลคำบรรยายตามแท็ก NAME คล้ายกับการจัดกลุ่มการแสดงผลเสียง (#1666)
- รองรับ X-ASSET-LIST และไลฟ์สดด้วย
HlsInterstitialsAdsLoader
- แก้ไขข้อบกพร่องที่
- ส่วนขยาย DASH
- แก้ไขปัญหาที่ชุดการปรับเปลี่ยนการเล่นแบบทริกเพลย์ผสานรวมกับชุดการปรับเปลี่ยนหลักเพื่อสร้าง
TrackGroupที่ไม่ถูกต้อง (#2148) - แก้ไขข้อบกพร่องที่การลดระยะเวลาของ DASH อาจทำให้เกิดข้อยกเว้นเมื่อไปป์ไลน์การแสดงผลอ่านตัวอย่างที่เกินระยะเวลาใหม่ไปแล้ว (#2440)
- แก้ไขข้อบกพร่องที่ระบบไม่ทำตามการเปลี่ยนเส้นทางเมื่อใช้พารามิเตอร์การค้นหา CMCD (#2475)
- แก้ไขปัญหาที่ชุดการปรับเปลี่ยนการเล่นแบบทริกเพลย์ผสานรวมกับชุดการปรับเปลี่ยนหลักเพื่อสร้าง
- ส่วนขยาย RTSP:
- ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
- แก้ไขข้อบกพร่องที่
DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChangeไม่มีผลกับส่วนขยายตัวถอดรหัสเสียง (#2258)
- แก้ไขข้อบกพร่องที่
- ส่วนขยาย Cast:
- ยูทิลิตีการทดสอบ
- เพิ่ม
advance(player).untilPositionAtLeastและuntilMediaItemIndexลงในTestPlayerRunHelperเพื่อเลื่อนโปรแกรมเล่นไปข้างหน้าจนกว่าจะถึงตำแหน่งที่ระบุ ในกรณีส่วนใหญ่ วิธีการเหล่านี้มีความน่าเชื่อถือมากกว่าวิธีการuntilPositionและuntilStartOfMediaItemที่มีอยู่ - ย้าย
FakeDownloaderไปยังโมดูลtest-utils-robolectricเพื่อนำกลับมาใช้ใหม่ในการทดสอบอื่นๆ - นำ
transformer.TestUtil.addAudioDecoders(String...),transformer.TestUtil.addAudioEncoders(String...)และtransformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...)ออกแล้ว โปรดใช้ShadowMediaCodecConfigเพื่อกำหนดค่าโปรแกรมเปลี่ยนไฟล์และโปรแกรมถอดรหัสแชโดว์แทน - แทนที่คำนำหน้า "exotest" ด้วย "media3" ในชื่อตัวแปลงรหัสที่รายงานโดย
ShadowMediaCodecConfig
- เพิ่ม
- นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
- นำคอนสตรัคเตอร์
SegmentDownloaderที่เลิกใช้งานแล้วออกSegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor)และคอนสตรัคเตอร์ที่เกี่ยวข้องในคลาสย่อยDashDownloader,HlsDownloaderและSsDownloader - นำ
Player.hasNext()และPlayer.hasNextWindow()ที่เลิกใช้งานแล้วออก โปรดใช้Player.hasNextMediaItem()แทน - นำ
Player.next()ที่เลิกใช้งานแล้วออก โปรดใช้Player.seekToNextMediaItem()แทน - นำ
Player.seekToPreviousWindow()ที่เลิกใช้งานแล้วออก โปรดใช้Player.seekToPreviousMediaItem()แทน - นำ
Player.seekToNextWindow()ที่เลิกใช้งานแล้วออก โปรดใช้Player.seekToNextMediaItem()แทน - นำ
BaseAudioProcessorที่เลิกใช้งานแล้วในโมดูลexoplayerออก ใช้BaseAudioProcessorในโมดูลcommon - นำคอนสตรัคเตอร์
MediaCodecVideoRendererที่เลิกใช้งานแล้วออกMediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider)
- นำคอนสตรัคเตอร์
เวอร์ชัน 1.8.0-rc02
24 กรกฎาคม 2025
ใช้เวอร์ชันเสถียร 1.8.0
เวอร์ชัน 1.8.0-rc01
16 กรกฎาคม 2025
ใช้เวอร์ชันเสถียร 1.8.0
เวอร์ชัน 1.8.0-beta01
2 กรกฎาคม 2025
ใช้เวอร์ชันเสถียร 1.8.0
เวอร์ชัน 1.8.0-alpha01
19 พฤษภาคม 2025
ใช้เวอร์ชันเสถียร 1.8.0
เวอร์ชัน 1.7.0
เวอร์ชัน 1.7.1
16 พฤษภาคม 2025
รุ่นนี้มีโค้ดเดียวกับ 1.6.1 และเผยแพร่เพื่อให้แน่ใจว่าจะปรากฏเป็นรุ่นที่ "ใหม่กว่า" 1.7.0 ซึ่งเป็นรุ่นอัลฟ่าที่ติดแท็กเป็นเวอร์ชันเสถียรโดยไม่ตั้งใจ (ดูด้านล่าง)
เวอร์ชัน 1.7.0
16 พฤษภาคม 2025
รุ่นนี้ควรเป็น 1.7.0-alpha01 แต่มีการติดแท็ก 1.7.0 (เช่น เสถียร) โดยไม่ตั้งใจใน maven.google.com โปรดอย่าใช้ ใช้ 1.6.1 ต่อไปหรืออัปเกรดเป็น 1.7.1 (ซึ่งมีโค้ดเดียวกับ 1.6.1)
เวอร์ชัน 1.6.0
1.6.1
14 เมษายน 2025
androidx.media3:media3-*:1.6.1 เผยแพร่แล้ว เวอร์ชัน 1.6.1 มีคอมมิตเหล่านี้
- Common Library:
- เพิ่มเมธอด
PlaybackParameters.withPitch(float)เพื่อให้คัดลอกPlaybackParametersที่มีค่าpitchใหม่ได้ง่ายๆ (#2257)
- เพิ่มเมธอด
- ExoPlayer:
- แก้ไขปัญหาที่การเปลี่ยนรายการสื่อไม่สำเร็จเนื่องจากข้อผิดพลาดของโปรแกรมแสดงผลที่กู้คืนได้ระหว่างการเริ่มต้นรายการสื่อถัดไป (#2229)
- แก้ไขปัญหาที่
ProgressiveMediaPeriodแสดงIllegalStateExceptionเนื่องจากPreloadMediaSourceพยายามเรียกใช้getBufferedDurationUs()ก่อนที่จะเตรียมพร้อม (#2315) - แก้ไขการส่ง
CmcdDataในคำขอไฟล์ Manifest สำหรับ DASH, HLS และ SmoothStreaming (#2253) - ตรวจสอบว่าสามารถใช้
AdPlaybackState.withAdDurationsUs(long[][])ได้หลังจากนำกลุ่มโฆษณาออกแล้ว ผู้ใช้ยังคงต้องส่งอาร์เรย์ของระยะเวลาสำหรับกลุ่มโฆษณาที่นำออก ซึ่งอาจเป็นค่าว่างหรือค่า Null (#2267)
- เครื่องสกัดน้ำผลไม้
- MP4: แยกวิเคราะห์
alternate_groupจากช่องtkhdและแสดงเป็นรายการMp4AlternateGroupDataในFormat.metadataของแต่ละแทร็ก (#2242)
- MP4: แยกวิเคราะห์
- เสียง
- แก้ไขปัญหาการออฟโหลดที่ตำแหน่งอาจค้างเมื่อเล่นเพลย์ลิสต์เนื้อหาสั้น (#1920)
- เซสชัน:
- ลดระยะหมดเวลาการรวมสำหรับ Callback ของแพลตฟอร์ม
MediaSessionจาก 500 เป็น 100 มิลลิวินาที และเพิ่ม Setter ทดลองเพื่อให้แอปกำหนดค่านี้ได้ - แก้ไขปัญหาที่การแจ้งเตือนปรากฏขึ้นอีกครั้งหลังจากที่ผู้ใช้ปิดไปแล้ว (#2302)
- แก้ไขข้อบกพร่องที่เซสชันแสดงไทม์ไลน์รายการเดียวเมื่อเพลเยอร์ที่รวมไว้ว่างเปล่าจริงๆ กรณีนี้เกิดขึ้นเมื่อเพลเยอร์ที่รวมไว้ไม่มี
COMMAND_GET_TIMELINEพร้อมใช้งานขณะที่COMMAND_GET_CURRENT_MEDIA_ITEMพร้อมใช้งานและเพลเยอร์ที่รวมไว้ว่างเปล่า (#2320) - แก้ไขข้อบกพร่องที่ระบบละเว้นการเรียกใช้
MediaSessionService.setMediaNotificationProviderโดยไม่มีการแจ้งเตือนหลังจากมีการโต้ตอบอื่นๆ กับบริการ เช่นsetForegroundServiceTimeoutMs(#2305)
- ลดระยะหมดเวลาการรวมสำหรับ Callback ของแพลตฟอร์ม
- UI:
- เปิดใช้
PlayerSurfaceเพื่อทำงานร่วมกับExoPlayer.setVideoEffectsและCompositionPlayer - แก้ไขข้อบกพร่องที่
PlayerSurfaceไม่สามารถจัดองค์ประกอบใหม่ด้วยPlayerใหม่
- เปิดใช้
- ส่วนขยาย HLS
- แก้ไขปัญหาที่ไม่ได้ตั้งค่าระยะเวลาของกลุ่มข้อมูลใน
CmcdDataสำหรับสื่อ HLS ซึ่งทำให้การยืนยันไม่สำเร็จเมื่อประมวลผลกลุ่มสื่อที่เข้ารหัส (#2312)
- แก้ไขปัญหาที่ไม่ได้ตั้งค่าระยะเวลาของกลุ่มข้อมูลใน
- ส่วนขยาย RTSP:
- เพิ่มการรองรับ URI ที่มีรูปแบบ RTSPT เป็นวิธีกำหนดค่าเซสชัน RTSP ให้ใช้ TCP (#1484)
- ส่วนขยาย Cast:
- เพิ่มการรองรับข้อมูลเมตาของเพลย์ลิสต์ (#2235)
1.6.0
26 มีนาคม 2025
androidx.media3:media3-*:1.6.0 เผยแพร่แล้ว เวอร์ชัน 1.6.0 มี คอมมิตเหล่านี้
- Common Library:
- เพิ่ม
AudioManagerCompatและAudioFocusRequestCompatเพื่อแทนที่คลาสที่เทียบเท่าในandroidx.media - อัปเกรด Kotlin จาก 1.9.20 เป็น 2.0.20 และใช้ปลั๊กอิน Compose Compiler Gradle อัปเกรดไลบรารี KotlinX Coroutines จาก 1.8.1 เป็น 1.9.0
- นำเมธอด
Format.toBundle(boolean excludeMetadata)ออก แล้วใช้Format.toBundle()แทน - แก้ไขข้อบกพร่องใน
SimpleBasePlayerซึ่งการตั้งค่าcurrentMediaItemIndexใหม่ในStateหลังจากsetPlaylistด้วยnullMediaMetadataไม่ประเมินข้อมูลเมตาอีกครั้ง (#1940) - เปลี่ยนการเข้าถึง
SimpleBasePlayer.Stateจากแบบมีการป้องกันเป็นแบบสาธารณะเพื่อให้จัดการการอัปเดตในคลาสอื่นๆ ได้ง่ายขึ้น (#2128)
- เพิ่ม
- ExoPlayer:
- เพิ่ม
MediaExtractorCompatซึ่งเป็นคลาสใหม่ที่มีฟีเจอร์เทียบเท่ากับแพลตฟอร์มMediaExtractor - เพิ่มการรองรับการเตรียมพร้อมล่วงหน้า "ExoPlayer" เวอร์ชันทดลองสำหรับการเล่นโดยใช้
MediaCodecVideoRendererคุณสามารถกำหนดค่าDefaultRenderersFactoryผ่านexperimentalSetEnableMediaCodecVideoRendererPrewarmingเพื่อระบุMediaCodecVideoRendererสำรองให้กับExoPlayerได้ หากเปิดใช้ExoPlayerจะประมวลผลวิดีโอของรายการสื่อที่ต่อเนื่องกันล่วงหน้าในระหว่างการเล่นเพื่อลดเวลาในการตอบสนองของการเปลี่ยนรายการสื่อ - ลดค่าเริ่มต้นสำหรับ
bufferForPlaybackMsและbufferForPlaybackAfterRebufferMsในDefaultLoadControlเป็น 1,000 และ 2,000 มิลลิวินาทีตามลำดับ - เริ่มต้น
DeviceInfoและระดับเสียงของอุปกรณ์แบบอะซิงโครนัส (หากเปิดใช้โดยใช้setDeviceVolumeControlEnabled) ค่าเหล่านี้จะไม่พร้อมใช้งานทันทีหลังจากExoPlayer.Builder.build()และPlayer.Listenerจะแจ้งการเปลี่ยนแปลงผ่านonDeviceInfoChangedและonDeviceVolumeChanged - รหัสเซสชันเสียงเริ่มต้นจะไม่พร้อมใช้งานทันทีหลังจากสร้างเพลเยอร์อีกต่อไป คุณสามารถใช้
AnalyticsListener.onAudioSessionIdChangedเพื่อฟังข้อมูลอัปเดตเบื้องต้นได้หากต้องการ - พิจารณาภาษาเมื่อเลือกแทร็กวิดีโอ โดยค่าเริ่มต้น ให้เลือกแทร็กวิดีโอ "หลัก" ที่ตรงกับภาษาของแทร็กเสียงที่เลือก (หากมี) คุณสามารถแสดงค่ากำหนดภาษาของวิดีโอที่ชัดเจนได้ด้วย
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s) - เพิ่มพารามิเตอร์
selectedAudioLanguageลงในเมธอดDefaultTrackSelector.selectVideoTrack() - เพิ่มพารามิเตอร์
retryCountลงในMediaSourceEventListener.onLoadStartedและเมธอดMediaSourceEventListener.EventDispatcherที่เกี่ยวข้อง - แก้ไขข้อบกพร่องที่รายการเพลย์ลิสต์หรือระยะเวลาในสตรีม DASH แบบหลายระยะเวลาที่มีระยะเวลาไม่ตรงกับเนื้อหาจริงอาจทำให้เฟรมค้างที่ส่วนท้ายของรายการ (#1698)
- ย้าย
BasePreloadManager.ListenerไปยังPreloadManagerListenerระดับบนสุด - คุณสามารถใช้
RenderersFactory.createSecondaryRendererเพื่อจัดเตรียมโปรแกรมแสดงผลรองสำหรับการเตรียมพร้อมล่วงหน้า การเตรียมพร้อมล่วงหน้าช่วยให้การเปลี่ยนรายการสื่อระหว่างการเล่นทำได้เร็วขึ้น - เปิดใช้การส่ง
CmcdDataสำหรับคำขอไฟล์ Manifest ในรูปแบบสตรีมมิงแบบปรับอัตราบิต DASH, HLS และ SmoothStreaming (#1951) - ระบุ
MediaCodecInfoของตัวแปลงรหัสที่จะเริ่มต้นในMediaCodecRenderer.onReadyToInitializeCodec(#1963) - เปลี่ยน
AdsMediaSourceเพื่อให้AdPlaybackStatesเติบโตโดยการเพิ่มกลุ่มโฆษณา ระบบจะตรวจพบการแก้ไขที่ไม่ถูกต้องและแสดงข้อยกเว้น - แก้ไขปัญหาที่อาจมีการแสดงเฟรมแบบถอดรหัสเท่านั้นเพิ่มเติมอย่างรวดเร็วเมื่อเปลี่ยนไปใช้สื่อเนื้อหาหลังจากโฆษณาตอนกลาง
- กำหนดให้
DefaultRenderersFactoryเพิ่มอินสแตนซ์MetadataRenderer2 รายการเพื่อเปิดใช้แอปให้รับสคีมาข้อมูลเมตาที่แตกต่างกัน 2 รายการโดยค่าเริ่มต้น - ประเมินอีกครั้งว่าควรยกเลิกการโหลดกลุ่มที่กำลังดำเนินอยู่หรือไม่เมื่อหยุดเล่นชั่วคราว (#1785)
- เพิ่มตัวเลือกใน
ClippingMediaSourceเพื่ออนุญาตให้ตัดคลิปในสื่อที่กรอไม่ได้ - แก้ไขข้อบกพร่องที่การกรอวิดีโอด้วยการอุ่นเครื่องล่วงหน้าอาจบล็อกการเปลี่ยนรายการสื่อที่ตามมา
- แก้ไขข้อบกพร่องที่
ExoPlayer.isLoading()ยังคงเป็นtrueขณะที่เปลี่ยนเป็นSTATE_IDLEหรือSTATE_ENDED(#2133) - เพิ่ม
lastRebufferRealtimeMsไปยังLoadControl.Parameter(#2113)
- เพิ่ม
- Transformer:
- เพิ่มการรองรับการแปลงมัลติเพล็กซ์เป็นรูปแบบที่เข้ากันได้แบบย้อนหลังอื่นๆ
- เพิ่มการรองรับการแปลงและการแปลงมัลติเพล็กซ์รูปแบบ Dolby Vision (โปรไฟล์ 8)
- อัปเดตพารามิเตอร์ของ
VideoFrameProcessor.registerInputStreamและVideoFrameProcessor.Listener.onInputStreamRegisteredเพื่อใช้Format - สร้างข้อมูลเมตาแบบคงที่ของ HDR เมื่อใช้
DefaultEncoderFactory - เปิดใช้การรองรับการวินิจฉัยแพลตฟอร์ม Android โดยใช้
MediaMetricsManagerTransformer จะส่งต่อเหตุการณ์การแก้ไขและข้อมูลประสิทธิภาพไปยังแพลตฟอร์ม ซึ่งจะช่วยให้ข้อมูลประสิทธิภาพของระบบและข้อมูลการแก้ไขข้อบกพร่องในอุปกรณ์ นอกจากนี้ Google อาจรวบรวมข้อมูลนี้ด้วยหากผู้ใช้อุปกรณ์เปิดใช้การแชร์ข้อมูลการใช้งานและการวินิจฉัย แอปสามารถเลือกไม่ให้ข้อมูลการวินิจฉัยแพลตฟอร์มสำหรับ Transformer ได้โดยใช้Transformer.Builder.setUsePlatformDiagnostics(false) - แยก
InAppMuxerเป็นInAppMp4MuxerและInAppFragmentedMp4Muxerคุณใช้InAppMp4Muxerเพื่อสร้างไฟล์ MP4 ที่ไม่มีการกระจาย Fragment ส่วนInAppFragmentedMp4Muxerใช้เพื่อสร้างไฟล์ MP4 ที่มีการกระจาย Fragment - ย้ายอินเทอร์เฟซ
Muxerจากmedia3-muxerไปยังmedia3-transformer - เพิ่ม
MediaProjectionAssetLoaderซึ่งให้สื่อจากMediaProjectionสำหรับการบันทึกหน้าจอ และเพิ่มการรองรับการบันทึกหน้าจอลงในแอปสาธิต Transformer - เพิ่ม
#getInputFormat()ไปยังอินเทอร์เฟซCodec - เปลี่ยนความรับผิดชอบในการปล่อย
GlObjectsProviderไปยังผู้เรียกในDefaultVideoFrameProcessorและDefaultVideoCompositorเมื่อเป็นไปได้
- เครื่องสกัดน้ำผลไม้
- AVI: แก้ไขการจัดการไฟล์ที่มีเสียงบีบอัดอัตราบิตคงที่ซึ่งส่วนหัวของสตรีมจัดเก็บจำนวนไบต์แทนจำนวนกลุ่ม
- แก้ไขการจัดการหน่วย NAL ที่มีความยาวแสดงเป็น 1 หรือ 2 ไบต์ (แทนที่จะเป็น 4)
- แก้ไข
ArrayIndexOutOfBoundsExceptionในรายการแก้ไข MP4 เมื่อรายการแก้ไขเริ่มต้นที่เฟรมที่ไม่ซิงค์โดยไม่มีเฟรมซิงค์ก่อนหน้า (#2062) - แก้ไขปัญหาที่สตรีม TS อาจค้างในอุปกรณ์บางเครื่อง (#2069)
- FLAC: เพิ่มการรองรับไฟล์ FLAC แบบ 32 บิต ก่อนหน้านี้ การดำเนินการเหล่านี้จะเล่นไม่สำเร็จพร้อมข้อผิดพลาด
IllegalStateException: Playback stuck buffering and not loading(#2197)
- เสียง
- แก้ไข
onAudioPositionAdvancingให้มีการเรียกใช้เมื่อการเล่นกลับมาทำงานอีกครั้ง (ก่อนหน้านี้มีการเรียกใช้เมื่อการเล่นหยุดชั่วคราว) - อย่าข้าม
SonicAudioProcessorเมื่อกำหนดค่าSpeedChangingAudioProcessorด้วยพารามิเตอร์เริ่มต้น - แก้ไขปัญหาบัฟเฟอร์อันเดอร์โฟลว์ใน
Sonic#getOutputSize()ที่อาจทำให้DefaultAudioSinkหยุดชะงัก - แก้ไข
MediaCodecAudioRenderer.getDurationToProgressUs()และDecoderAudioRenderer.getDurationToProgressUs()เพื่อให้การกรอวิดีโอรีเซ็ตระยะเวลาที่ระบุได้อย่างถูกต้อง - ทำให้
androidx.media3.common.audio.SonicAudioProcessorเป็นเวอร์ชันสุดท้าย - เพิ่มการรองรับ PCM แบบ Float ไปยัง
ChannelMappingAudioProcessorและTrimmingAudioProcessor
- แก้ไข
- วิดีโอ:
- เปลี่ยน
MediaCodecVideoRenderer.shouldUsePlaceholderSurfaceเป็น Protected เพื่อให้แอปพลิเคชันสามารถลบล้างเพื่อบล็อกการใช้พื้นผิวตัวยึดตำแหน่ง (#1905) - เพิ่มการแยกวิเคราะห์ทรัพยากร Dependency ของตัวอย่าง AV1
ExoPlayerเวอร์ชันทดลองเพื่อเร่งความเร็วในการกรอวิดีโอ เปิดใช้ด้วย API ใหม่ของDefaultRenderersFactory.experimentalSetParseAv1SampleDependencies - เพิ่ม
ExoPlayerAPI เวอร์ชันทดลองเพื่อทิ้งบัฟเฟอร์อินพุตของตัวถอดรหัสMediaCodecVideoRendererที่ล่าช้าซึ่งไม่ได้ใช้ เปิดใช้ด้วยDefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs* แก้ไขปัญหาที่เพลเยอร์ที่ไม่มี Surface พร้อมใช้งานทันทีและถอดรหัสเฟรมที่รอดำเนินการช้ามาก (#1973) - ยกเว้นอุปกรณ์ Xiaomi และ OPPO จากโหมดพื้นผิวที่แยกออกเพื่อหลีกเลี่ยงการกะพริบของหน้าจอ (#2059)
- เปลี่ยน
- ข้อความ
- เพิ่มการรองรับคำบรรยาย VobSub (#8260)
- หยุดโหลดไฟล์คำบรรยายทั้งหมดที่กำหนดค่าด้วย
MediaItem.Builder.setSubtitleConfigurationsอย่างกระตือรือร้น และโหลดเพียงไฟล์เดียวแทนหากเลือกโดยการเลือกแทร็ก (#1721) - TTML: เพิ่มการรองรับการอ้างอิง
tts:originและtts:extentโดยใช้style(#2953) - จำกัดการประทับเวลา WebVTT และ SubRip ให้มีทศนิยม 3 ตำแหน่งพอดี ก่อนหน้านี้เราแยกวิเคราะห์ทศนิยมจำนวนใดๆ อย่างไม่ถูกต้อง แต่จะถือว่าค่าเป็นมิลลิวินาทีเสมอ ซึ่งทำให้การประทับเวลาไม่ถูกต้อง (#1997)
- แก้ไขปัญหาการเล่นค้างเมื่อเพลย์ลิสต์มีรายการที่ตัดคลิปซึ่งมีคำบรรยาย CEA-608 หรือ CEA-708
- แก้ไข
IllegalStateExceptionเมื่อไฟล์ SSA มีคิวที่มีระยะเวลาเป็น 0 (เวลาเริ่มต้นและเวลาสิ้นสุดเท่ากัน) (#2052) - ระงับ (และบันทึก) ข้อผิดพลาดในการแยกวิเคราะห์คำบรรยายเมื่อมีการรวมคำบรรยายไว้ในคอนเทนเนอร์เดียวกับเสียงและวิดีโอ (#2052)
- แก้ไขการจัดการอักขระ UTF-8 แบบหลายไบต์ในไฟล์ WebVTT โดยใช้การสิ้นสุดบรรทัด CR (#2167)
- DRM:
- แก้ไขข้อผิดพลาด
MediaCodec$CryptoException: Operation not supported in this configurationเมื่อเล่นเนื้อหา ClearKey ในอุปกรณ์ API < 27 (#1732)
- แก้ไขข้อผิดพลาด
- ผลกระทบ
- ย้ายฟังก์ชันการทำงานของ
OverlaySettingsไปยังStaticOverlaySettingsแล้วOverlaySettingsสามารถเป็นคลาสย่อยเพื่ออนุญาตการตั้งค่าการวางซ้อนแบบไดนามิก
- ย้ายฟังก์ชันการทำงานของ
- Muxer:
- ย้าย
MuxerExceptionออกจากอินเทอร์เฟซMuxerเพื่อหลีกเลี่ยงชื่อที่สมบูรณ์ ซึ่งยาวมาก - เปลี่ยนชื่อเมธอด
setSampleCopyEnabled()เป็นsetSampleCopyingEnabled()ทั้งในMp4Muxer.BuilderและFragmentedMp4Muxer.Builder - ตอนนี้
Mp4Muxer.addTrack()และFragmentedMp4Muxer.addTrack()จะแสดงผลรหัสติดตามintแทนTrackToken Mp4MuxerและFragmentedMp4Muxerไม่ใช้อินเทอร์เฟซMuxerอีกต่อไป- ปิดใช้การจัดกลุ่มและการคัดลอกตัวอย่าง
Mp4Muxerโดยค่าเริ่มต้น - แก้ไขข้อบกพร่องใน
FragmentedMp4Muxerที่สร้างส่วนย่อยจำนวนมากเมื่อเขียนเฉพาะแทร็กเสียง
- ย้าย
- เซสชัน:
- คงสถานะบริการที่ทำงานอยู่เบื้องหน้าไว้อีก 10 นาทีเมื่อการเล่นหยุดชั่วคราว หยุด หรือไม่สำเร็จ ซึ่งช่วยให้ผู้ใช้เล่นต่อได้ภายในระยะหมดเวลานี้โดยไม่ต้องเสี่ยงต่อการจำกัดบริการที่ทำงานอยู่เบื้องหน้าในอุปกรณ์ต่างๆ โปรดทราบว่าคุณไม่สามารถเรียกใช้
player.pause()เพื่อหยุดบริการที่ทำงานอยู่เบื้องหน้าก่อนstopSelf()ได้อีกต่อไป เมื่อลบล้างonTaskRemovedให้ใช้MediaSessionService.pauseAllPlayersAndStopSelf()แทน - แสดงการแจ้งเตือนไว้เมื่อการเล่นเข้าสู่สถานะข้อผิดพลาดหรือหยุดลง ระบบจะนำการแจ้งเตือนออกก็ต่อเมื่อล้างเพลย์ลิสต์หรือปิดเพลเยอร์เท่านั้น
- ปรับปรุงการจัดการการดำเนินการ ACTION_PLAY และ ACTION_PAUSE ของ MediaSession ในแพลตฟอร์ม Android ให้ตั้งค่าเพียงรายการเดียวตามคำสั่งที่ใช้ได้ และยอมรับด้วยหากตั้งค่าเพียงรายการเดียว
- เพิ่ม
Contextเป็นพารามิเตอร์ในMediaButtonReceiver.shouldStartForegroundService(#1887) - แก้ไขข้อบกพร่องที่การเรียกใช้เมธอด
PlayerในMediaControllerที่เชื่อมต่อกับเซสชันเดิมทำให้การเปลี่ยนแปลงจากการอัปเดตที่รอดำเนินการถูกยกเลิก - ทำให้
MediaSession.setSessionActivity(PendingIntent)ยอมรับค่า Null (#2109) - แก้ไขข้อบกพร่องที่การแจ้งเตือนเก่าจะยังคงปรากฏอยู่เมื่อล้างเพลย์ลิสต์ (#2211)
- คงสถานะบริการที่ทำงานอยู่เบื้องหน้าไว้อีก 10 นาทีเมื่อการเล่นหยุดชั่วคราว หยุด หรือไม่สำเร็จ ซึ่งช่วยให้ผู้ใช้เล่นต่อได้ภายในระยะหมดเวลานี้โดยไม่ต้องเสี่ยงต่อการจำกัดบริการที่ทำงานอยู่เบื้องหน้าในอุปกรณ์ต่างๆ โปรดทราบว่าคุณไม่สามารถเรียกใช้
- UI:
- เพิ่มตัวเก็บสถานะและ Composable ลงในโมดูล
media3-ui-composeสำหรับPlayerSurface,PresentationState,PlayPauseButtonState,NextButtonState,PreviousButtonState,RepeatButtonState,ShuffleButtonStateและPlaybackSpeedState
- เพิ่มตัวเก็บสถานะและ Composable ลงในโมดูล
- ดาวน์โหลด:
- แก้ไขข้อบกพร่องใน
CacheWriterที่ทำให้แหล่งข้อมูลเปิดอยู่และพื้นที่แคชถูกล็อกในกรณีที่แหล่งข้อมูลแสดงExceptionนอกเหนือจากIOException(#9760)
- แก้ไขข้อบกพร่องใน
- ส่วนขยาย HLS
- เพิ่ม
HlsInterstitialsAdsLoaderเวอร์ชันแรก ตัวโหลดโฆษณาจะอ่านโฆษณาคั่นระหว่างหน้า HLS ของเพลย์ลิสต์สื่อ HLS และจับคู่กับAdPlaybackStateที่ส่งไปยังAdsMediaSourceเวอร์ชันเริ่มต้นนี้รองรับเฉพาะสตรีม HLS VOD ที่มีแอตทริบิวต์X-ASSET-URIเท่านั้น - เพิ่ม
HlsInterstitialsAdsLoader.AdsMediaSourceFactoryแอปสามารถใช้ API นี้เพื่อสร้างอินสแตนซ์AdsMediaSourceที่ใช้HlsInterstitialsAdsLoaderได้อย่างสะดวกและปลอดภัย - แยกวิเคราะห์แท็ก
SUPPLEMENTAL-CODECSจากเพลย์ลิสต์ HLS เพื่อตรวจหารูปแบบ Dolby Vision (#1785) - ผ่อนคลายเงื่อนไขในการกรอเพื่อซิงค์ตำแหน่งในสตรีม HLS (#2209)
- เพิ่ม
- ส่วนขยาย DASH
- เพิ่มการรองรับรูปแบบ AC-4 ระดับ 4 สำหรับ DASH (#1898)
- แก้ไขปัญหาเมื่อคำนวณช่วงเวลาอัปเดตสำหรับการแทรกโฆษณาในไลฟ์สดแบบหลายช่วงเวลา (#1698)
- แยกวิเคราะห์แอตทริบิวต์
scte214:supplementalCodecsจากไฟล์ Manifest ของ DASH เพื่อตรวจหารูปแบบ Dolby Vision (#1785) - ปรับปรุงการจัดการการเปลี่ยนระยะเวลาในไลฟ์สดที่ระยะเวลามีตัวอย่างสื่อที่เกินระยะเวลาที่ประกาศไว้ (#1698)
- แก้ไขปัญหาที่ชุดการปรับเปลี่ยนที่มีการทำเครื่องหมายด้วย
adaptation-set-switchingแต่มีภาษาหรือแฟล็กบทบาทที่แตกต่างกันถูกผสานรวมเข้าด้วยกัน (#2222)
- ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
- เพิ่มโมดูลตัวถอดรหัส MPEG-H ซึ่งใช้ตัวถอดรหัส MPEG-H ในตัวเพื่อถอดรหัสเสียง MPEG-H (#1826)
- ส่วนขยาย MIDI
- เชื่อมต่ออินสแตนซ์
AudioSinkและAudioRendererEventListenerที่กำหนดเองเข้ากับMidiRenderer
- เชื่อมต่ออินสแตนซ์
- ส่วนขยาย Cast:
- เพิ่มทรัพยากร Dependency ของ
play-services-cast-frameworkเป็น 21.5.0 เพื่อแก้ไขข้อขัดข้องของFLAG_MUTABLEในแอปที่กำหนดเป้าหมายเป็น API 34 ขึ้นไปในอุปกรณ์ที่ติดตั้งบริการ Google Play แต่ปิดใช้ (#2178)
- เพิ่มทรัพยากร Dependency ของ
- แอปสาธิต:
- ขยาย
demo-composeด้วยปุ่มเพิ่มเติมและปรับปรุงการผสานรวมPlayerSurfaceด้วยการรองรับการปรับขนาดและชัตเตอร์
- ขยาย
- นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
- นำเมธอด
AudioMixer.create()ที่เลิกใช้งานแล้วออก โปรดใช้DefaultAudioMixer.Factory().create()แทน - นำเมธอด
Transformer.Builderที่เลิกใช้งานแล้วต่อไปนี้ออกsetTransformationRequest()โปรดใช้setAudioMimeType(),setVideoMimeType()และsetHdrMode()แทนsetAudioProcessors()ให้ตั้งค่าโปรเซสเซอร์เสียงในEditedMediaItem.Builder.setEffects()แล้วส่งไปยังTransformer.start()แทนsetVideoEffects()ให้ตั้งค่าเอฟเฟกต์วิดีโอในEditedMediaItem.Builder.setEffects()แล้วส่งไปยังTransformer.start()แทนsetRemoveAudio()ให้ใช้EditedMediaItem.Builder.setRemoveAudio()เพื่อนำเสียงออกจากEditedMediaItemที่ส่งไปยังTransformer.start()แทนsetRemoveVideo()ให้ใช้EditedMediaItem.Builder.setRemoveVideo()เพื่อนำวิดีโอออกจากEditedMediaItemที่ส่งไปยังTransformer.start()แทนsetFlattenForSlowMotion()ให้ใช้EditedMediaItem.Builder.setFlattenForSlowMotion()เพื่อทำให้EditedMediaItemที่ส่งไปยังTransformer.start()เป็นแบบแบนราบแทนsetListener()โปรดใช้addListener(),removeListener()หรือremoveAllListeners()แทน
- นำเมธอด
Transformer.Listenerที่เลิกใช้งานแล้วต่อไปนี้ออกonTransformationCompleted(MediaItem)โปรดใช้onCompleted(Composition, ExportResult)แทนonTransformationCompleted(MediaItem, TransformationResult)โปรดใช้onCompleted(Composition, ExportResult)แทนonTransformationError(MediaItem, Exception)โปรดใช้onError(Composition, ExportResult, ExportException)แทนonTransformationError(MediaItem, TransformationException)โปรดใช้onError(Composition, ExportResult, ExportException)แทนonTransformationError(MediaItem, TransformationResult, TransformationException)โปรดใช้onError(Composition, ExportResult, ExportException)แทนonFallbackApplied(MediaItem, TransformationRequest, TransformationRequest)โปรดใช้onFallbackApplied(Composition, TransformationRequest, TransformationRequest)แทน
- นำคลาส
TransformationResultที่เลิกใช้งานแล้วออก โปรดใช้ExportResultแทน - นำคลาส
TransformationExceptionที่เลิกใช้งานแล้วออก โปรดใช้ExportExceptionแทน - นำ
Transformer.PROGRESS_STATE_NO_TRANSFORMATIONที่เลิกใช้งานแล้วออก โปรดใช้Transformer.PROGRESS_STATE_NOT_STARTEDแทน - นำ
Transformer.setListener()ที่เลิกใช้งานแล้วออก โปรดใช้Transformer.addListener(),Transformer.removeListener()หรือTransformer.removeAllListeners()แทน - นำ
Transformer.startTransformation()ที่เลิกใช้งานแล้วออก โปรดใช้Transformer.start(MediaItem, String)แทน - นำ
SingleFrameGlShaderProgramที่เลิกใช้งานแล้วออก โปรดใช้BaseGlShaderProgramแทน - นำ
Transformer.flattenForSlowMotionออก โปรดใช้EditedMediaItem.flattenForSlowMotionแทน - นำ
ExoPlayer.VideoComponent,ExoPlayer.AudioComponent,ExoPlayer.TextComponentและExoPlayer.DeviceComponentออกแล้ว - นำ
androidx.media3.exoplayer.audio.SonicAudioProcessorออกแล้ว - นำเมธอด
DownloadHelperที่เลิกใช้งานแล้วต่อไปนี้ออก- ตัวสร้าง
DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[])ให้ใช้DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList)แทน getRendererCapabilities(RenderersFactory)คุณสามารถใช้ฟังก์ชันการทำงานที่เทียบเท่าได้โดยการสร้างDefaultRendererCapabilitiesListด้วยRenderersFactoryและเรียกใช้DefaultRendererCapabilitiesList.getRendererCapabilities()- นำวิธีการชำระเงิน
PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat)ออกแล้ว ใช้PlayerNotificationManager.setMediaSessionToken(MediaSession.Token)และส่ง(MediaSession.Token) compatToken.getToken()แทน
- ตัวสร้าง
- นำเมธอด
1.6.0-rc02
19 มีนาคม 2025
ใช้เวอร์ชันเสถียร 1.6.0
1.6.0-rc01
12 มีนาคม 2025
ใช้เวอร์ชันเสถียร 1.6.0
1.6.0-beta01
26 กุมภาพันธ์ 2025
ใช้เวอร์ชันเสถียร 1.6.0
เวอร์ชัน 1.6.0-alpha03
6 กุมภาพันธ์ 2025
ใช้เวอร์ชันเสถียร 1.6.0
เวอร์ชัน 1.6.0-alpha02
30 มกราคม 2025
ใช้เวอร์ชันเสถียร 1.6.0
เวอร์ชัน 1.6.0-alpha01
20 ธันวาคม 2024
ใช้เวอร์ชันเสถียร 1.6.0
รุ่น 1.5
รุ่น 1.5.1
19 ธันวาคม 2024
androidx.media3:media3-*:1.5.1 เผยแพร่แล้ว เวอร์ชัน 1.5.1 มี คอมมิตเหล่านี้
- ExoPlayer:
- ปิดใช้การถอดรหัสแบบอะซิงโครนัสใน MediaCodec เพื่อหลีกเลี่ยงปัญหาการหมดเวลาของตัวแปลงรหัสที่รายงานด้วย API แพลตฟอร์มนี้ (#1641)
- เครื่องสกัดน้ำผลไม้
- MP3: อย่าหยุดการเล่นก่อนเวลาเมื่อสารบัญของเฟรม
VBRIไม่ครอบคลุมข้อมูล MP3 ทั้งหมดในไฟล์ (#1904)
- MP3: อย่าหยุดการเล่นก่อนเวลาเมื่อสารบัญของเฟรม
- วิดีโอ:
- ย้อนกลับการใช้ค่าสัดส่วนภาพพิกเซลที่ระบุ
MediaCodecAdapterเมื่อระบุขณะประมวลผลonOutputFormatChanged(#1371)
- ย้อนกลับการใช้ค่าสัดส่วนภาพพิกเซลที่ระบุ
- ข้อความ
- แก้ไขข้อบกพร่องใน
ReplacingCuesResolver.discardCuesBeforeTimeUsที่คิวซึ่งทำงานอยู่ที่timeUs(เริ่มก่อนหน้านี้แต่ยังไม่สิ้นสุด) ถูกทิ้งอย่างไม่ถูกต้อง (#1939)
- แก้ไขข้อบกพร่องใน
- ข้อมูลเมตา
- ดึงข้อมูลหมายเลขแผ่น/แทร็กและประเภทจากความคิดเห็น Vorbis ไปยัง
MediaMetadata(#1958)
- ดึงข้อมูลหมายเลขแผ่น/แทร็กและประเภทจากความคิดเห็น Vorbis ไปยัง
เวอร์ชัน 1.5.0
27 พฤศจิกายน 2024
androidx.media3:media3-*:1.5.0 เผยแพร่แล้ว เวอร์ชัน 1.5.0 มี คอมมิตเหล่านี้
- Common Library:
- เพิ่ม
ForwardingSimpleBasePlayerที่อนุญาตให้ส่งต่อไปยังเพลเยอร์อื่นโดยมีการปรับเปลี่ยนเล็กน้อย ขณะเดียวกันก็รับประกันความสอดคล้องอย่างสมบูรณ์และการจัดการ Listener (#1183) - แทนที่
SimpleBasePlayer.State.playlistด้วยเมธอดgetPlaylist() - เพิ่มการลบล้างสำหรับ
SimpleBasePlayer.State.Builder.setPlaylist()เพื่อระบุTimelineและTracksและMetadataปัจจุบันโดยตรงแทนการสร้างโครงสร้างเพลย์ลิสต์ - เพิ่ม
minSdkเป็น 21 (Android Lollipop) ซึ่งสอดคล้องกับไลบรารี AndroidX อื่นๆ ทั้งหมด - เพิ่มอาร์ติแฟกต์
androidx.media3:media3-common-ktxซึ่งมีฟังก์ชันการทำงานเฉพาะ Kotlin ที่สร้างขึ้นบนไลบรารีทั่วไป - เพิ่มฟังก์ชันส่วนขยาย
Player.listenที่ระงับเพื่อหมุน Coroutine เพื่อฟังPlayer.Eventsไปยังไลบรารีmedia3-common-ktx - นำคำอธิบายประกอบ
@DoNotInlineออกจากคลาสภายในที่อยู่นอกบรรทัดด้วยตนเองซึ่งออกแบบมาเพื่อหลีกเลี่ยงความล้มเหลวในการยืนยันคลาสรันไทม์ R8 เวอร์ชันล่าสุดจะแยกการเรียกใช้โค้ดแบบนี้โดยอัตโนมัติเพื่อหลีกเลี่ยงความล้มเหลวของรันไทม์ (ดังนั้นจึงไม่จำเป็นต้องแยกการเรียกใช้โค้ดด้วยตนเองอีกต่อไป) ผู้ใช้ Gradle ทั้งหมดของไลบรารีต้องใช้ปลั๊กอิน Android Gradle เวอร์ชันที่ใช้ R8 เวอร์ชันที่ดำเนินการนี้อยู่แล้ว เนื่องจากcompileSdk = 35ผู้ใช้ไลบรารีที่มีระบบบิลด์ที่ไม่ใช่ Gradle จะต้องตรวจสอบว่าขั้นตอนการย่อ/สร้างความสับสนที่เทียบเท่า R8 ทำกระบวนการ Out-of-lining อัตโนมัติที่คล้ายกันเพื่อหลีกเลี่ยงความล้มเหลวในการยืนยันคลาสรันไทม์ การเปลี่ยนแปลงนี้ได้ดำเนินการแล้วในไลบรารี AndroidX อื่นๆ
- เพิ่ม
- ExoPlayer:
- ตอนนี้คุณสามารถเรียกใช้
MediaCodecRenderer.onProcessedStreamChange()สำหรับรายการสื่อทุกรายการได้แล้ว ก่อนหน้านี้ ระบบไม่ได้เรียกใช้เมธอดนี้สำหรับรายการแรก ใช้MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()เพื่อเปิดใช้ฟีเจอร์นี้ - เพิ่ม
PreloadMediaSource.PreloadControl.onPreloadErrorเพื่ออนุญาตให้การติดตั้งใช้งานPreloadMediaSource.PreloadControlดำเนินการเมื่อเกิดข้อผิดพลาด - เพิ่ม
BasePreloadManager.Listenerเพื่อเผยแพร่เหตุการณ์โหลดล่วงหน้าไปยังแอป - อนุญาตให้เปลี่ยนระยะหมดเวลาของไคลเอ็นต์ SNTP และลองใช้ที่อยู่สำรองอีกครั้งเมื่อหมดเวลา (#1540)
- นำ
MediaCodecAdapter.Configuration.flagsออกเนื่องจากช่องเป็นศูนย์เสมอ - อนุญาตให้ผู้ใช้เลือกลำโพงในตัวสำหรับการเล่นบน Wear OS API 35 ขึ้นไป (ในกรณีที่อุปกรณ์โฆษณาว่ารองรับฟีเจอร์นี้)
- เลื่อนการเรียกใช้การบล็อกไปยัง
Context.getSystemService(Context.AUDIO_SERVICE)จนกว่าจะเปิดใช้การจัดการโฟกัสเสียง วิธีนี้ช่วยให้มั่นใจได้ว่าจะไม่มีการเรียกใช้การบล็อกหากไม่ได้เปิดใช้การจัดการโฟกัสเสียง (#1616) - อนุญาตให้เล่นโดยไม่คำนึงถึงระยะเวลาที่บัฟเฟอร์เมื่อโหลดไม่สำเร็จ (#1571)
- เพิ่ม
AnalyticsListener.onRendererReadyChanged()เพื่อส่งสัญญาณเมื่อโปรแกรมแสดงผลแต่ละโปรแกรมอนุญาตให้การเล่นพร้อมใช้งาน - แก้ไข
MediaCodec.CryptoExceptionที่บางครั้งมีการรายงานเป็น "ข้อผิดพลาดขณะรันไทม์ที่ไม่คาดคิด" เมื่อMediaCodecทำงานในโหมดอะซิงโครนัส (ลักษณะการทำงานเริ่มต้นใน API 31 ขึ้นไป) - บัตรราคา
bufferedDurationUsแทนราคาเต็มbufferedPositionUsพร้อมPreloadMediaSource.PreloadControl.onContinueLoadingRequested()นอกจากนี้ยังเปลี่ยนDefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MSเป็นDefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MSจากนั้นแอปจะต้องส่งค่าที่แสดงระยะเวลาที่เจาะจงจากตำแหน่งเริ่มต้นเริ่มต้นซึ่งต้องโหลดแหล่งที่มาของสื่อที่เกี่ยวข้องไว้ล่วงหน้าด้วย IntDef นี้แทนตำแหน่ง - เพิ่มการติดตั้งใช้งาน
ForwardingRendererที่ส่งต่อการเรียกใช้เมธอดทั้งหมดไปยังโปรแกรมแสดงผลอื่น (1703) - เพิ่มการโหลดเพลย์ลิสต์ล่วงหน้าสำหรับรายการถัดไปในเพลย์ลิสต์ แอปสามารถเปิดใช้การโหลดล่วงหน้าได้โดยเรียกใช้
ExoPlayer.setPreloadConfiguration(PreloadConfiguration)ตามความเหมาะสม ระบบจะปิดใช้การโหลดล่วงหน้าโดยค่าเริ่มต้น เมื่อเลือกใช้และเพื่อไม่ให้รบกวนการเล่นDefaultLoadControlจะจำกัดการโหลดล่วงหน้าให้เริ่มและดำเนินการต่อเมื่อโปรแกรมเล่นไม่ได้โหลดเพื่อเล่นเท่านั้น แอปสามารถเปลี่ยนลักษณะการทำงานนี้ได้โดยใช้LoadControl.shouldContinuePreloading()ตามความเหมาะสม (เช่น เมื่อลบล้างเมธอดนี้ในDefaultLoadControl) การใช้งานLoadControlเริ่มต้นจะปิดใช้การโหลดล่วงหน้าในกรณีที่แอปใช้การใช้งานLoadControlที่กำหนดเอง - เพิ่มเมธอด
MediaSourceEventListener.EventDispatcher.dispatchEvent()เพื่ออนุญาตให้เรียกใช้เหตุการณ์ของ Listener คลาสย่อย (1736) - เพิ่ม
DefaultPreloadManager.Builderที่สร้างอินสแตนซ์DefaultPreloadManagerและExoPlayerด้วยการกำหนดค่าที่ใช้ร่วมกันอย่างสอดคล้องกัน - นำพารามิเตอร์
Renderer[]ออกจากLoadControl.onTracksSelected()เนื่องจากการใช้งานDefaultLoadControlสามารถดึงข้อมูลประเภทสตรีมจากExoTrackSelection[]ได้ - เลิกใช้งาน
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])และทำเครื่องหมายเมธอดเป็น "final" เพื่อป้องกันการลบล้าง ควรใช้DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])ใหม่แทน - รายงานเหตุการณ์
MediaSourceEventListenerจากแหล่งที่มาสำรองในMergingMediaSourceซึ่งจะส่งผลให้มีการรายงานเหตุการณ์การเริ่ม/ข้อผิดพลาด/ยกเลิก/เสร็จสมบูรณ์ของการโหลดสำหรับคำบรรยายที่ไซด์โหลด (คำบรรยายที่เพิ่มด้วยMediaItem.LocalConfiguration.subtitleConfigurations) ซึ่งอาจปรากฏเป็นเหตุการณ์การโหลดที่ซ้ำกันซึ่งส่งมาจากAnalyticsListener - ป้องกันไม่ให้ข้อผิดพลาดเกี่ยวกับคำบรรยายและข้อมูลเมตาทำให้การเล่นหยุดลงโดยสมบูรณ์
แต่ระบบจะปิดใช้แทร็กที่มีปัญหาและเล่นแทร็กที่เหลือต่อไป (#1722)
- ในการจัดการคำบรรยายใหม่ (ระหว่างการดึงข้อมูล) ระบบจะแสดงข้อผิดพลาดในการแยกวิเคราะห์ (เช่น ข้อมูลคำบรรยายไม่ถูกต้อง) และข้อผิดพลาดในการโหลด (เช่น HTTP 404) ที่เกี่ยวข้องผ่าน Callback ของ
onLoadError - ในการจัดการคำบรรยายแบบเดิม (ระหว่างการแสดงผล) ระบบจะแสดงเฉพาะข้อผิดพลาดในการโหลดที่เกี่ยวข้องผ่าน Callback
onLoadErrorขณะที่ข้อผิดพลาดในการแยกวิเคราะห์จะถูกละเว้นโดยไม่มีการแจ้งเตือน (ซึ่งเป็นลักษณะการทำงานที่มีอยู่แล้ว)
- ในการจัดการคำบรรยายใหม่ (ระหว่างการดึงข้อมูล) ระบบจะแสดงข้อผิดพลาดในการแยกวิเคราะห์ (เช่น ข้อมูลคำบรรยายไม่ถูกต้อง) และข้อผิดพลาดในการโหลด (เช่น HTTP 404) ที่เกี่ยวข้องผ่าน Callback ของ
- แก้ไขข้อบกพร่องที่รายการเพลย์ลิสต์หรือระยะเวลาในสตรีม DASH แบบหลายระยะเวลาที่มีระยะเวลาไม่ตรงกับเนื้อหาจริงอาจทำให้เฟรมค้างที่ส่วนท้ายของรายการ (#1698)
- เพิ่ม Setter ลงใน
SntpClientเพื่อตั้งค่าเวลาสูงสุดที่ผ่านไปนับตั้งแต่การอัปเดตครั้งล่าสุด หลังจากนั้นไคลเอ็นต์จะเริ่มต้นใหม่ (#1794)
- ตอนนี้คุณสามารถเรียกใช้
- Transformer:
- เพิ่ม
SurfaceAssetLoaderซึ่งรองรับการจัดคิวข้อมูลวิดีโอไปยัง Transformer ผ่านSurface ImageAssetLoaderรายงานอินพุตที่ไม่รองรับผ่านAssetLoader.onErrorแทนที่จะแสดงIllegalStateException- กำหนดให้ต้องตั้งค่าระยะเวลาของรูปภาพโดยใช้
MediaItem.Builder.setImageDurationMsสำหรับการส่งออกรูปภาพ - เพิ่มการรองรับการส่งออกสำหรับช่องว่างในลำดับของ EditedMediaItems เสียง
- เพิ่ม
- การเลือกแทร็ก
DefaultTrackSelector: เลือกใช้เสียงแบบออบเจ็กต์มากกว่าเสียงแบบช่องสัญญาณเมื่อปัจจัยอื่นๆ เท่ากัน
- เครื่องสกัดน้ำผลไม้
- อนุญาตให้
Mp4ExtractorและFragmentedMp4Extractorระบุตัวอย่าง H264 ที่ตัวอย่างต่อมาไม่ได้ใช้เป็นข้อมูลอ้างอิง - เพิ่มตัวเลือกเพื่อเปิดใช้การค้นหาตามดัชนีใน
AmrExtractor - ถือว่าไฟล์ MP3 ที่มีข้อมูลมากกว่า 128kB ระหว่างเฟรมที่ถูกต้องเป็นไฟล์ที่ถูกตัด (แทนที่จะเป็นไฟล์ที่ไม่ถูกต้อง) ซึ่งหมายความว่าไฟล์ที่มีข้อมูลที่ไม่ใช่ MP3 อยู่ท้ายไฟล์และไม่มีข้อมูลเมตาอื่นๆ ที่ระบุความยาวของไบต์ MP3 จะหยุดเล่นเมื่อสิ้นสุดข้อมูล MP3 แทนที่จะหยุดทำงานพร้อมข้อผิดพลาด
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}(#1563) - แก้ไขการจัดการตัวอย่างโฆษณาตอนต้นสำหรับตำแหน่งเริ่มต้นของสื่อที่ไม่ใช่คีย์เฟรมเมื่อประมวลผลรายการแก้ไขในไฟล์ MP4 (#1659)
- ปรับปรุงการคำนวณอัตราเฟรมโดยใช้ระยะเวลาของสื่อจากกล่อง
mdhdในMp4ExtractorและFragmentedMp4Extractor(#1531) - แก้ไขการปรับขนาด
media_timeที่ไม่ถูกต้องในรายการแก้ไข MP4 แม้ว่าsegment_durationจะปรับขนาดอย่างถูกต้องแล้วโดยใช้สเกลเวลาของภาพยนตร์ แต่ตอนนี้media_timeได้รับการปรับขนาดอย่างเหมาะสมโดยใช้สเกลเวลาของแทร็กตามที่มาตรฐานรูปแบบ MP4 กำหนดไว้ (#1792) - จัดการเฟรมที่ไม่อยู่ในลำดับในการคำนวณ
endIndicesสำหรับ MP4 ที่มีรายการแก้ไข (#1797) - แก้ไขการแยกวิเคราะห์ระยะเวลาของสื่อในกล่อง
mdhdของไฟล์ MP4 เพื่อจัดการค่า-1(#1819) - เพิ่มการรองรับการระบุกล่อง
h263ในไฟล์ MP4 สำหรับวิดีโอ H.263 (#1821) - เพิ่มการรองรับรูปแบบไฟล์สื่อพื้นฐาน ISO AC-4 ระดับ 4 (#1265)
- อนุญาตให้
- DataSource:
- อัปเดต
HttpEngineDataSourceเพื่ออนุญาตให้ใช้ตั้งแต่เวอร์ชัน S ส่วนขยาย 7 แทนระดับ API 34 (#1262) DataSourceContractTest: ยืนยันว่าDataSource.getUri()แสดงผล URI ที่ได้รับการแก้ไข (ตามที่ระบุไว้ในเอกสาร) ในกรณีที่แตกต่างจาก URI คำขอ การทดสอบจะระบุข้อมูลนี้ได้โดยใช้เมธอดDataSourceContractTest.TestResource.Builder.setResolvedUri()ใหม่DataSourceContractTest: ยืนยันว่าDataSource.getUri()และgetResponseHeaders()แสดงผลค่า "เปิด" หลังจากเรียกใช้open()ไม่สำเร็จ (เนื่องจากทรัพยากร "ไม่พบ") และก่อนการเรียกใช้close()ครั้งถัดไป- การลบล้าง
DataSourceContractTest.getNotFoundResources()ช่วยให้คลาสย่อยของการทดสอบระบุทรัพยากร "ไม่พบ" หลายรายการ และระบุส่วนหัวที่คาดไว้ได้ด้วย ซึ่งช่วยให้แยกความแตกต่างระหว่าง HTTP 404 (ที่มีส่วนหัว) และ "ไม่พบเซิร์ฟเวอร์" (ไม่มีส่วนหัว) ได้
- การลบล้าง
- อัปเดต
- เสียง
- กำหนดค่าข้อมูลเมตาความดัง CTA-2075 ในตัวแปลงรหัสโดยอัตโนมัติหากมีอยู่ในสื่อ
- ตรวจสอบว่าระดับเสียงลดลงอย่างราบรื่นเมื่อกรอวิดีโอ
- แก้ไขเสียงป๊อปที่อาจเกิดขึ้นระหว่างการกรอวิดีโอ
- แก้ไขการสะสมข้อผิดพลาดในการตัดทอนสำหรับอัลกอริทึมการยืดเวลา/การเปลี่ยนระดับเสียงของ Sonic
- แก้ไขข้อบกพร่องใน
SpeedChangingAudioProcessorที่ทำให้เฟรมเอาต์พุตหายไป
- วิดีโอ:
MediaCodecVideoRendererหลีกเลี่ยงการถอดรหัสตัวอย่างที่ไม่ได้แสดงผลหรือใช้เป็นข้อมูลอ้างอิงโดยตัวอย่างอื่นๆ- ใน API 35 ขึ้นไป ตอนนี้
MediaCodecAdapterอาจได้รับnullSurfaceในconfigureและการเรียกใช้เมธอดใหม่detachOutputSurfaceเพื่อนำSurfaceที่ตั้งค่าไว้ก่อนหน้านี้ออกหากตัวแปลงรหัสรองรับการดำเนินการนี้ (MediaCodecInfo.detachedSurfaceSupported) - ใช้ค่าสัดส่วนพิกเซลที่
MediaCodecAdapterระบุไว้ หากมี เมื่อประมวลผลonOutputFormatChanged(#1371) - เพิ่มวิธีแก้ปัญหาเกี่ยวกับอุปกรณ์ใน Galaxy Tab S7 FE ที่ทำให้สตรีม H264 ที่ปลอดภัย 60fps ถูกทำเครื่องหมายว่าไม่รองรับ (#1619)
- เพิ่มวิธีแก้ปัญหาสำหรับตัวแปลงรหัสที่ค้างหลังจากตัวอย่างสุดท้ายโดยไม่แสดงสัญญาณสิ้นสุดสตรีม
- ข้อความ
- เพิ่ม
VoiceSpanที่กำหนดเองและป้อนข้อมูลสำหรับช่วงเสียง WebVTT (#1632) - ตรวจสอบว่า WebVTT ใน HLS ที่มีการประทับเวลาคำบรรยายขนาดใหญ่มาก (ซึ่งเกิน
long64 บิตเมื่อแสดงเป็นไมโครวินาทีและคูณด้วยฐานเวลา MPEG90,000) แสดงขึ้น (#1763) - รองรับคำบรรยาย CEA-608 ในเนื้อหา Dolby Vision (#1820)
- แก้ไขการเล่นค้างในสตรีมแบบหลายช่วงเวลาของ DASH เมื่อเปิดใช้คำบรรยาย CEA-608 (#1863)
- เพิ่ม
- ข้อมูลเมตา
- กำหนดประเภท
C.TRACK_TYPE_METADATAให้กับแทร็กที่มีเนื้อหา icy หรือ vnd.dvb.ait
- กำหนดประเภท
- รูปภาพ:
- เพิ่ม
ExternallyLoadedImageDecoderเพื่อให้ผสานรวมกับไลบรารีการโหลดรูปภาพภายนอก เช่น Glide หรือ Coil ได้ง่ายขึ้น
- เพิ่ม
- DataSource:
- เพิ่ม
FileDescriptorDataSourceซึ่งเป็นDataSourceใหม่ที่ใช้เพื่ออ่านจากFileDescriptorได้ (#3757)
- เพิ่ม
- ผลกระทบ
- เพิ่มวิธีแก้ปัญหาชั่วคราวของ
DefaultVideoFrameProcessorสำหรับการปรับขนาดSurfaceTextureเล็กน้อยSurfaceTextureอาจรวมถึงการปรับขนาดเล็กน้อยที่ตัดขอบ 1 เท็กเซลรอบขอบของบัฟเฟอร์ที่ครอบตัด ตอนนี้เราได้จัดการปัญหานี้แล้ว เพื่อให้เอาต์พุตใกล้เคียงกับที่คาดไว้มากขึ้น - เร่งความเร็ว
DefaultVideoFrameProcessor.queueInputBitmap()ด้วยเหตุนี้ การส่งออกรูปภาพเป็นวิดีโอด้วยTransformerจึงรวดเร็วยิ่งขึ้น
- เพิ่มวิธีแก้ปัญหาชั่วคราวของ
- ส่วนขยาย IMA:
- แก้ไขข้อบกพร่องที่การล้างเพลย์ลิสต์อาจทำให้เกิด
ArrayIndexOutOfBoundsExceptionในImaServerSideAdInsertionMediaSource - แก้ไขข้อบกพร่องที่สตรีม DAI ที่แทรกฝั่งเซิร์ฟเวอร์โดยไม่มีโฆษณาตอนต้นอาจส่งผลให้เกิด
ArrayIndexOutOfBoundsExceptionเมื่อเล่นผ่านโฆษณาตอนกลางรายการสุดท้าย (#1741)
- แก้ไขข้อบกพร่องที่การล้างเพลย์ลิสต์อาจทำให้เกิด
- เซสชัน:
- เพิ่ม
MediaButtonReceiver.shouldStartForegroundService(Intent)เพื่ออนุญาตให้แอปยับยั้งคำสั่งเล่นที่เข้ามาเพื่อกลับมาเล่นต่อโดยการลบล้างเมธอดนี้ โดยค่าเริ่มต้น บริการจะเริ่มทำงานเสมอและไม่สามารถระงับการเล่นได้โดยที่ระบบไม่ทำให้บริการขัดข้องด้วยForegroundServiceDidNotStartInTimeException(#1528) - แก้ไขข้อบกพร่องที่ทำให้คำสั่งที่กำหนดเองซึ่งส่งจาก
MediaBrowserถูกส่งไปยังMediaSessionCompat.Callbackแทนที่จะเป็นตัวแปรMediaBrowserServiceCompatของเมธอดเมื่อเชื่อมต่อกับบริการเดิม ซึ่งทำให้MediaBrowserไม่ได้รับค่าที่แสดงผลจริงที่ส่งกลับโดยบริการเดิม (#1474) - จัดการ
IllegalArgumentExceptionที่แสดงโดยอุปกรณ์ของผู้ผลิตบางรายเมื่อตั้งค่า Broadcast Receiver สำหรับ Intent ของปุ่มสื่อ (#1730) - เพิ่มปุ่มคำสั่งสำหรับรายการสื่อ ซึ่งจะเพิ่ม Media3 API สำหรับสิ่งที่เรียกว่า
Custom browse actionsด้วยไลบรารีเดิมที่มีMediaBrowserCompatโปรดทราบว่าเมื่อใช้ Media3 ปุ่มคำสั่งสำหรับรายการสื่อจะใช้ได้ทั้งMediaBrowserและMediaControllerดูใช้การดำเนินการเรียกดูที่กำหนดเอง * แก้ไขข้อบกพร่องที่บางครั้งตัวควบคุม Media3 ไม่สามารถอนุญาตให้แอปเซสชันเริ่มบริการที่ทำงานอยู่เบื้องหน้าหลังจากขอplay() - จำกัด
CommandButton.Builder.setIconUriให้ยอมรับเฉพาะ URI เนื้อหา - ส่งคำแนะนำการเชื่อมต่อของเบราว์เซอร์ Media3 ไปยัง
MediaBrowserCompatเริ่มต้นเมื่อเชื่อมต่อกับMediaBrowserCompatเดิม บริการจะรับคำแนะนำการเชื่อมต่อที่ส่งมาเป็นคำแนะนำรูทได้ด้วยการเรียกใช้onGetRoot()ครั้งแรก - แก้ไขข้อบกพร่องที่
MediaBrowserซึ่งเชื่อมต่อกับบริการเบราว์เซอร์เดิมไม่ได้รับข้อผิดพลาดที่บริการส่งมาหลังจากที่เบราว์เซอร์สมัครใช้บริการparentid - ปรับปรุงลักษณะการทำงานของการทำงานร่วมกัน เพื่อให้เบราว์เซอร์ Media3 ที่เชื่อมต่อกับ
MediaBrowserServiceเดิมไม่ขอรายการย่อยของparentId2 ครั้งเมื่อสมัครใช้บริการรายการหลัก
- เพิ่ม
- UI:
- ทำให้วิดีโอที่ยืด/ครอบตัดในวิธีแก้ปัญหา
PlayerView-in-Compose-AndroidViewเป็นแบบเลือกใช้ เนื่องจากปัญหาเกี่ยวกับการเปลี่ยนภาพที่แชร์ซึ่งใช้ XML แอปที่ใช้PlayerViewภายในAndroidViewต้องเรียกใช้PlayerView.setEnableComposeSurfaceSyncWorkaroundเพื่อเลือกใช้ (#1237, #1594) - เพิ่ม
setFullscreenButtonStateลงในPlayerViewเพื่ออนุญาตให้อัปเดตไอคอนของปุ่มเต็มหน้าจอตามต้องการ กล่าวคือ อัปเดตนอกแบนด์และไม่ตอบสนองต่อการโต้ตอบด้วยการคลิก (#1590, #184) - แก้ไขข้อบกพร่องที่ตัวเลือก "ไม่มี" ในการเลือกข้อความไม่ทำงานหากมีการตั้งค่าการเลือกแทร็กข้อความที่แอปกำหนด
- ทำให้วิดีโอที่ยืด/ครอบตัดในวิธีแก้ปัญหา
- ส่วนขยาย DASH
- เพิ่มการรองรับระยะเวลาที่เริ่มต้นตรงกลางของกลุ่ม (#1440)
- ส่วนขยาย Smooth Streaming:
- แก้ไขข้อผิดพลาด
Bad magic number for Bundleเมื่อเล่นสตรีม SmoothStreaming ที่มีแทร็กข้อความ (#1779)
- แก้ไขข้อผิดพลาด
- ส่วนขยาย RTSP:
- ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
- เพิ่มโมดูลตัวถอดรหัส IAMF ซึ่งรองรับการเล่นไฟล์ MP4 ที่มีแทร็ก IAMF โดยใช้ไลบรารีแบบเนทีฟ libiamf เพื่อสังเคราะห์เสียง
- การเล่นจะเปิดใช้ด้วยเลย์เอาต์สเตอริโอและ 5.1 พร้อมการสร้างเสียงรอบทิศทาง รวมถึงการติดตามการเคลื่อนไหวของศีรษะ (ไม่บังคับ) แต่ปัจจุบันยังไม่รองรับการเล่นแบบ 2 หู
- เพิ่มการรองรับหน้าขนาด 16 KB สำหรับส่วนขยายตัวถอดรหัสใน Android 15 (#1685)
- เพิ่มโมดูลตัวถอดรหัส IAMF ซึ่งรองรับการเล่นไฟล์ MP4 ที่มีแทร็ก IAMF โดยใช้ไลบรารีแบบเนทีฟ libiamf เพื่อสังเคราะห์เสียง
- ส่วนขยาย Cast:
- หยุดล้างไทม์ไลน์หลังจาก CastSession ยกเลิกการเชื่อมต่อ ซึ่งจะช่วยให้แอปผู้ส่งกลับมาเล่นในเครื่องได้อีกครั้งหลังจากยกเลิกการเชื่อมต่อ
- ป้อนข้อมูล
DeviceInfoของ CastPlayer เมื่อระบุContextซึ่งจะช่วยให้ลิงก์MediaSessionกับRoutingSessionได้ ซึ่งจำเป็นสำหรับการผสานรวมตัวสลับเอาต์พุต (#1056)
- ยูทิลิตีการทดสอบ
- ตอนนี้
DataSourceContractTestมีการทดสอบเพื่อยืนยันสิ่งต่อไปนี้- อัปเดตสตรีมอินพุต
read positionแล้ว - ใช้บัฟเฟอร์เอาต์พุต
offsetอย่างถูกต้องแล้ว
- อัปเดตสตรีมอินพุต
- ตอนนี้
- แอปเดโม
- แก้ไขปัญหาหน่วยความจำรั่วไหลในแอปสาธิตแบบสั้น (#1839)
- นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
- นำ
Player.hasPrevious,Player.hasPreviousWindow()ที่เลิกใช้งานแล้วออก โปรดใช้Player.hasPreviousMediaItem()แทน - นำเมธอด
Player.previous()ที่เลิกใช้งานแล้วออก โปรดใช้Player.seekToPreviousMediaItem()แทน - นำเมธอด
DrmSessionEventListener.onDrmSessionAcquiredที่เลิกใช้งานแล้วออก - นำคอนสตรักเตอร์
DefaultEncoderFactoryที่เลิกใช้งานแล้วออก โปรดใช้DefaultEncoderFactory.Builderแทน
- นำ
เวอร์ชัน 1.5.0-rc02
19 พฤศจิกายน 2024
ใช้เวอร์ชันเสถียร 1.5.0
เวอร์ชัน 1.5.0-rc01
13 พฤศจิกายน 2024
ใช้เวอร์ชันเสถียร 1.5.0
เวอร์ชัน 1.5.0-beta01
30 ตุลาคม 2024
ใช้เวอร์ชันเสถียร 1.5.0
เวอร์ชัน 1.5.0-alpha01
10 กันยายน 2024
ใช้เวอร์ชันเสถียร 1.5.0
เวอร์ชัน 1.4.0
เวอร์ชัน 1.4.1
27 สิงหาคม 2024
androidx.media3:media3-*:1.4.1 เผยแพร่แล้ว เวอร์ชัน 1.4.1 มีคอมมิตเหล่านี้
- ExoPlayer:
- เครื่องสกัดน้ำผลไม้
- MP3: แก้ไขข้อผิดพลาด
Searched too many bytesโดยละเว้นข้อมูลที่ไม่ใช่ MP3 ต่อท้ายอย่างถูกต้องตามช่องความยาวในเฟรมInfo(#1480)
- MP3: แก้ไขข้อผิดพลาด
- ข้อความ
- TTML: แก้ไขการจัดการค่า
tts:fontSizeของเปอร์เซ็นต์เพื่อให้แน่ใจว่าค่าดังกล่าวรับค่ามาจากโหนดระดับบนที่มีค่าtts:fontSizeของเปอร์เซ็นต์อย่างถูกต้อง - แก้ไข
IndexOutOfBoundsExceptionในLegacySubtitleUtilเนื่องจากจัดการกรณีที่เวลาเริ่มต้นของเอาต์พุตที่ขอมากกว่าหรือเท่ากับเวลาของเหตุการณ์สุดท้ายในSubtitleไม่ถูกต้อง (#1516)
- TTML: แก้ไขการจัดการค่า
- DRM:
- แก้ไขข้อผิดพลาด
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLEในอุปกรณ์ API 31 ขึ้นไปที่เล่นเนื้อหา L1 Widevine ข้อผิดพลาดนี้เกิดจากการติดตั้งใช้งานเมธอดMediaDrm.requiresSecureDecoderของเฟรมเวิร์กที่ไม่สมบูรณ์ (#1603)
- แก้ไขข้อผิดพลาด
- ผลกระทบ
- เพิ่มวิธีการ
release()ไปยังGlObjectsProvider
- เพิ่มวิธีการ
- เซสชัน:
- ส่วนขยาย RTSP:
- ข้ามคำอธิบายสื่อที่ไม่ถูกต้องในการแยกวิเคราะห์ SDP (#1087)
เวอร์ชัน 1.4.0
25 กรกฎาคม 2024
androidx.media3:media3-*:1.4.0 เผยแพร่แล้ว เวอร์ชัน 1.4.0 มี คอมมิตเหล่านี้
- Common Library:
- ส่งต่อการเรียกใช้การกรอที่คาดว่าไม่มีการดำเนินการไปยังเมธอด
BasePlayer.seekTo()และSimpleBasePlayer.handleSeek()ที่ได้รับการป้องกันแทนที่จะละเว้น หากคุณใช้วิธีการเหล่านี้ในเพลเยอร์ที่กำหนดเอง คุณอาจต้องจัดการการเรียกเพิ่มเติมเหล่านี้ด้วยmediaItemIndex == C.INDEX_UNSET - นำทรัพยากร Dependency ของการคอมไพล์ในกระบวนการ Desugaring ของ Java 8 ที่ปรับปรุงแล้วออก (#1312)
- ตรวจสอบว่าระบบละเว้นระยะเวลาที่ส่งไปยัง
MediaItem.Builder.setImageDurationMs()สำหรับMediaItemที่ไม่ใช่รูปภาพ (ตามที่ระบุไว้ในเอกสารประกอบ) - เพิ่ม
Format.customDataเพื่อจัดเก็บข้อมูลที่กำหนดเองซึ่งแอปให้มาเกี่ยวกับอินสแตนซ์Format
- ส่งต่อการเรียกใช้การกรอที่คาดว่าไม่มีการดำเนินการไปยังเมธอด
- ExoPlayer:
- เพิ่ม
BasePreloadManagerซึ่งจะประสานงานการโหลดล่วงหน้าสำหรับแหล่งที่มาหลายแห่งตามลำดับความสำคัญที่กำหนดโดยrankingDataคุณปรับแต่งได้โดยการขยายคลาสนี้ เพิ่มDefaultPreloadManagerซึ่งใช้PreloadMediaSourceเพื่อโหลดตัวอย่างสื่อของแหล่งที่มาล่วงหน้าลงในหน่วยความจำ และใช้จำนวนเต็มrankingDataที่ระบุดัชนีของรายการใน UI - เพิ่ม
PlayerIdลงในเมธอดส่วนใหญ่ของLoadControlเพื่อเปิดใช้การติดตั้งใช้งานLoadControlเพื่อรองรับผู้เล่นหลายคน - นำ
Buffer.isDecodeOnly()และC.BUFFER_FLAG_DECODE_ONLYออก ไม่จำเป็นต้องตั้งค่าแฟล็กนี้เนื่องจากโปรแกรมแสดงผลและโปรแกรมถอดรหัสจะตัดสินใจข้ามบัฟเฟอร์ตามการประทับเวลา การติดตั้งใช้งานRendererที่กำหนดเองควรตรวจสอบว่าช่วงเผื่อเวลาเป็นอย่างน้อยBaseRenderer.getLastResetPositionUs()หรือไม่ เพื่อตัดสินใจว่าจะแสดงตัวอย่างหรือไม่ การติดตั้งใช้งานSimpleDecoderที่กำหนดเองสามารถตรวจสอบisAtLeastOutputStartTimeUs()ได้หากจำเป็น หรือทำเครื่องหมายบัฟเฟอร์อื่นๆ ด้วยDecoderOutputBuffer.shouldBeSkippedเพื่อข้ามบัฟเฟอร์เหล่านั้น - อนุญาตให้
TargetPreloadStatusControl.getTargetPreloadStatus(T)แสดงผลค่า Null เพื่อระบุว่าไม่ต้องโหลดMediaSourceล่วงหน้าด้วยrankingDataที่ระบุ - เพิ่ม
remove(MediaSource)ไปยังBasePreloadManager - เพิ่ม
reset()ลงในBasePreloadManagerเพื่อปล่อยแหล่งข้อมูลที่เก็บไว้ทั้งหมดขณะที่ยังคงอินสแตนซ์เครื่องมือจัดการการโหลดล่วงหน้าไว้ - เพิ่ม
ExoPlayer.setPriority()(และBuilder.setPriority()) เพื่อกำหนดค่าลำดับความสำคัญที่ใช้ในPriorityTaskManagerและสำหรับความสำคัญของ MediaCodec จาก API 35 - แก้ไขปัญหาเกี่ยวกับการอัปเดตเวลาบัฟเฟอร์ซ้ำครั้งล่าสุดซึ่งส่งผลให้คีย์
bs(บัฟเฟอร์ไม่เพียงพอ) ไม่ถูกต้องใน CMCD (#1124) - เพิ่ม
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)เพื่อระบุว่าแหล่งที่มาโหลดจนจบแล้ว ซึ่งจะช่วยให้การติดตั้งใช้งานDefaultPreloadManagerและPreloadMediaSource.PreloadControlที่กำหนดเองสามารถโหลดแหล่งที่มาถัดไปล่วงหน้าหรือดำเนินการอื่นๆ ได้ - แก้ไขข้อบกพร่องที่การข้ามช่วงที่ไม่มีเสียงที่ส่วนท้ายของรายการอาจทำให้เกิดข้อยกเว้นในการเล่น
- เพิ่ม
clearลงในPreloadMediaSourceเพื่อทิ้งระยะเวลาการโหลดล่วงหน้า - เพิ่มรหัสข้อผิดพลาดใหม่
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMEDที่ใช้เมื่อมีการเรียกคืนทรัพยากรตัวแปลงรหัสสำหรับงานที่มีลำดับความสำคัญสูงกว่า - ให้
AdsMediaSourceโหลดโฆษณาตอนต้นก่อนที่การเตรียมสื่อเนื้อหาเริ่มต้นจะเสร็จสมบูรณ์ (#1358) - แก้ไขข้อบกพร่องที่การเล่นย้ายไปที่
STATE_ENDEDเมื่อเตรียมไลฟ์สด DASH แบบหลายช่วงเวลาอีกครั้งหลังจากที่นำช่วงเวลาเดิมออกจากไฟล์ Manifest แล้ว - เปลี่ยนชื่อ
onTimelineRefreshed()เป็นonSourcePrepared()และonPrepared()เป็นonTracksSelected()ในPreloadMediaSource.PreloadControlและเปลี่ยนชื่อ IntDefs ในDefaultPreloadManager.Stageตามไปด้วย - เพิ่มการรองรับการทดสอบสำหรับการกำหนดเวลาแบบไดนามิกเพื่อให้จัดแนวการทำงานกับรอบการทำงานของ CPU ได้ดียิ่งขึ้น และเลื่อนการทำงานออกไปจนกว่าโปรแกรมแสดงผลจะทำงานต่อได้
คุณเปิดใช้ฟีเจอร์นี้ได้โดยใช้
experimentalSetDynamicSchedulingEnabled()เมื่อตั้งค่าอินสแตนซ์ ExoPlayer - เพิ่ม
Renderer.getDurationToProgressUs()Rendererสามารถใช้เมธอดนี้เพื่อแสดงระยะเวลาที่การเล่นต้องดำเนินต่อไปเพื่อให้โปรแกรมแสดงผลทำงานต่อใน ExoPlayer หากตั้งค่าExoPlayerด้วยexperimentalSetDynamicSchedulingEnabled()แล้วExoPlayerจะเรียกใช้เมธอดนี้เมื่อคำนวณเวลาเพื่อกำหนดเวลางาน - เพิ่ม
MediaCodecAdapter#OnBufferAvailableListenerเพื่อแจ้งเตือนเมื่อบัฟเฟอร์อินพุตและเอาต์พุตพร้อมใช้งานโดยMediaCodecRendererMediaCodecRendererจะส่งสัญญาณไปยังExoPlayerเมื่อได้รับ Callback เหล่านี้ และหากตั้งค่าExoPlayerด้วยexperimentalSetDynamicSchedulingEnabled()แล้วExoPlayerจะกำหนดเวลาลูปการทำงานเนื่องจากโปรแกรมแสดงผลสามารถดำเนินการต่อได้ - ใช้คลาสข้อมูลสำหรับเมธอด
LoadControlแทนพารามิเตอร์แต่ละรายการ - เพิ่ม
ExoPlayer.isReleased()เพื่อตรวจสอบว่ามีการเรียกใช้Exoplayer.release()หรือไม่ - เพิ่ม
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()เพื่อกำหนดค่าตำแหน่งสูงสุดที่seekToPrevious()จะกรอไปยังรายการก่อนหน้า (#1425) - แก้ไขความไม่สอดคล้องกันของโฟกัสเสียง เช่น ไม่รายงานการสูญเสียโฟกัสทั้งหมดหรือชั่วคราวขณะที่เพลเยอร์หยุดชั่วคราว (#1436)
- แก้ไขปัญหา
IndexOutOfBoundsExceptionที่อาจเกิดขึ้นซึ่งเกิดจากเครื่องมือแยกข้อมูลที่รายงานแทร็กเพิ่มเติมหลังจากขั้นตอนการเตรียมการเบื้องต้น (#1476) EffectsในExoPlayer.setVideoEffect()จะได้รับการประทับเวลาโดยนำออฟเซ็ตของโปรแกรมแสดงผลออก (#1098)- แก้ไข
IllegalArgumentExceptionที่อาจเกิดขึ้นเมื่อจัดการข้อผิดพลาดของเพลเยอร์ที่เกิดขึ้นขณะอ่านล่วงหน้าไปยังรายการเพลย์ลิสต์อื่น (#1483)
- เพิ่ม
- Transformer:
- เพิ่ม
audioConversionProcessและvideoConversionProcessลงในExportResultเพื่อระบุวิธีสร้างแทร็กที่เกี่ยวข้องในไฟล์เอาต์พุต - ผ่อนคลายการตรวจสอบระดับ H.264 ของการเพิ่มประสิทธิภาพการตัดแต่ง
- เพิ่มการรองรับการเปลี่ยนระหว่างสื่ออินพุต SDR และ HDR ในลำดับ
- เพิ่มการรองรับเอฟเฟกต์เสียงระดับองค์ประกอบ
- เพิ่มการรองรับการแปลงรูปภาพ Ultra HDR เป็นวิดีโอ HDR
- แก้ไขปัญหาที่
DefaultAudioMixerไม่แสดงผลจำนวนไบต์ที่ถูกต้องหลังจากรีเซ็ตและนำมาใช้ซ้ำ - แก้ไขข้อบกพร่องของตัวถอดรหัสที่จำกัดจำนวนช่องเสียงไว้ที่สเตอริโอเมื่อจัดการอินพุต PCM
- เมื่อเลือกแทร็กใน
ExoPlayerAssetLoaderให้ละเว้นข้อจำกัดจำนวนช่องเสียงเนื่องจากมีผลกับการเล่นเท่านั้น - แทนที่อินเทอร์เฟซ
androidx.media3.transformer.Muxerด้วยandroidx.media3.muxer.Muxerและนำandroidx.media3.transformer.Muxerออก - แก้ไขการโหลดรูปภาพ HEIC จากสคีม URI เนื้อหา (#1373)
- ปรับระยะเวลาของแทร็กเสียงใน
AudioGraphInputเพื่อปรับปรุงการซิงค์ AV - นำช่อง
ExportResult.processedInputsออก หากคุณใช้ฟิลด์นี้สำหรับรายละเอียดตัวแปลงรหัส ให้ใช้DefaultDecoderFactory.listenerแทน ในกรณีที่มีข้อยกเว้นเกี่ยวกับตัวแปลงรหัส รายละเอียดตัวแปลงรหัสจะอยู่ในExportException.codecInfo
- เพิ่ม
- เครื่องสกัดน้ำผลไม้
- MPEG-TS: นำการเปลี่ยนแปลงไปใช้เพื่อให้แน่ใจว่าเฟรมสุดท้ายแสดงผลโดยการส่งหน่วยการเข้าถึงสุดท้ายของสตรีมไปยังคิวตัวอย่าง (#7909) รวมการแก้ไขเพื่อแก้ปัญหาที่เกิดขึ้นในสตรีม HLS แบบ I-frame เท่านั้น(#1150) และสตรีม HLS แบบ H.262 (#1126)
- MP3: แนะนำให้ใช้ขนาดข้อมูลจากเฟรม
Infoแทนขนาดที่รายงานโดยสตรีมที่เกี่ยวข้อง (เช่น ขนาดไฟล์หรือส่วนหัว HTTPContent-Length) ซึ่งจะช่วยยกเว้นข้อมูลตัวอย่างที่เล่นไม่ได้ (เช่น ภาพปกอัลบั้ม) จากการคำนวณการกรอวิดีโอที่มีอัตราบิตคงที่ ทำให้การกรอวิดีโอแม่นยำยิ่งขึ้น (#1376) - MP3: ใช้จำนวนเฟรมและข้อมูลอื่นๆ ในเฟรม
Info(หากมี) เพื่อคำนวณอัตราบิตเฉลี่ยสำหรับการค้นหาอัตราบิตคงที่ แทนที่จะคาดการณ์จากอัตราบิตของเฟรมหลังจากเฟรมInfoซึ่งอาจมีขนาดเล็กเกินจริง เช่น เฟรมPCUT(#1376) - แก้ไขการแยกรูปแบบเสียง PCM ในคอนเทนเนอร์ AVI
- เสียง
- แก้ไขแอตทริบิวต์การเข้ารหัส DTS:X Profile 2 สำหรับการเล่นแบบพาสทรู (#1299)
- สำหรับการเล่นแบบออฟโหลด ให้รีเซ็ตช่องการติดตามสำหรับการสตรีมที่เสร็จสมบูรณ์ใน
DefaultAudioSinkก่อนเรียกใช้AudioTrack.stop()เพื่อให้AudioTrack.StreamEventCallback#onPresentationEndedระบุได้อย่างถูกต้องเมื่อเล่นข้อมูลที่รอดำเนินการทั้งหมดแล้ว - แก้ไขข้อบกพร่องใน
SilenceSkippingAudioProcessorซึ่งการเปลี่ยนระหว่างรูปแบบเสียงต่างๆ (เช่น สเตอริโอเป็นโมโน) อาจทำให้โปรเซสเซอร์แสดงข้อยกเว้น (#1352) - ใช้
MediaCodecAudioRenderer.getDurationToProgressUs()เพื่อให้ ExoPlayer กำหนดเวลาลูปการทำงานหลักแบบไดนามิกเมื่อ MediaCodecAudioRenderer สามารถดำเนินการต่อได้
- วิดีโอ:
- แก้ไขปัญหาที่
Listener.onRenderedFirstFrame()มาถึงเร็วเกินไปเมื่อเปลี่ยนแพลตฟอร์มระหว่างการเล่น - แก้ไขตรรกะการสำรองข้อมูลของตัวถอดรหัสสำหรับ Dolby Vision เพื่อใช้ตัวถอดรหัส AV1 ที่เข้ากันได้หากจำเป็น (#1389)
- แก้ไขข้อยกเว้นของตัวแปลงรหัสที่อาจเกิดจากการเปิดใช้โปรแกรมแสดงผลวิดีโอระหว่างการเล่น
- แก้ไขปัญหาที่
- ข้อความ
- แก้ไขปัญหาที่ระบบข้ามคำบรรยายที่เริ่มต้นก่อนตำแหน่งการกรอ ปัญหานี้เกิดขึ้นใน Media3 1.4.0-alpha01 เท่านั้น
- เปลี่ยนลักษณะการทำงานของการแยกวิเคราะห์คำบรรยายเริ่มต้นเพื่อให้เกิดขึ้นระหว่างการแยกข้อมูลแทนที่จะเป็นระหว่างการแสดงผล (ดูแผนภาพสถาปัตยกรรมของ ExoPlayer เพื่อดูความแตกต่างระหว่างการแยกข้อมูลและการแสดงผล)
- การเปลี่ยนแปลงนี้สามารถลบล้างได้โดยการเรียกใช้ทั้ง
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)และTextRenderer.experimentalSetLegacyDecodingEnabled(true)ดูเอกสารเกี่ยวกับการปรับแต่งเพื่อดูวิธีเชื่อมต่อคอมโพเนนต์เหล่านี้กับอินสแตนซ์ExoPlayerเราจะนำเมธอดเหล่านี้ (และการรองรับทั้งหมดสำหรับการถอดรหัสคำบรรยายเดิม) ออกในรุ่นต่อๆ ไป - แอปที่มีการติดตั้งใช้งาน
SubtitleDecoderที่กำหนดเองจะต้องอัปเดตเพื่อติดตั้งใช้งานSubtitleParserแทน (และSubtitleParser.FactoryแทนSubtitleDecoderFactory)
- การเปลี่ยนแปลงนี้สามารถลบล้างได้โดยการเรียกใช้ทั้ง
- PGS: แก้ไขการถอดรหัสความยาวการรันเพื่อแก้ไข
0เป็นดัชนีสีแทนค่าสีตามตัวอักษร (#1367) - CEA-708: ละเว้นค่า
rowLockข้อกำหนด CEA-708-E S-2023 ระบุว่าควรสันนิษฐานว่าทั้งrowLockและcolumnLockเป็นจริง ไม่ว่าค่าที่แสดงในสตรีมจะเป็นค่าใดก็ตาม (ไม่ได้ใช้การรองรับcolumnLockจึงถือว่าค่าเป็นเท็จเสมอ)- เดิมทีฟีเจอร์นี้รวมอยู่ในบันทึกประจำรุ่น
1.3.0-alpha01แต่มีการเปลี่ยนกลับการเปลี่ยนแปลงโดยไม่ตั้งใจก่อนการเปิดตัว1.3.0-rc01ซึ่งตอนนี้ปัญหาได้รับการแก้ไขแล้ว และการเปลี่ยนแปลงจะปรากฏขึ้นอีกครั้ง
- เดิมทีฟีเจอร์นี้รวมอยู่ในบันทึกประจำรุ่น
- CEA-708: หลีกเลี่ยงการเพิ่มบรรทัดใหม่ที่ซ้ำกันโดยการจัดการคำสั่ง "set pen location" ของ ExoPlayer (#1315)
- แก้ไข
IllegalArgumentExceptionจากLegacySubtitleUtilเมื่อตัวอย่างคำบรรยาย WebVTT ไม่มีคิว เช่น เป็นส่วนหนึ่งของสตรีม DASH (#1516)
- ข้อมูลเมตา
- แก้ไขการแมป MP4 กับแท็กการจัดเรียง ID3 ก่อนหน้านี้แท็ก MP4 "การจัดเรียงอัลบั้ม" (
soal) "การจัดเรียงศิลปิน" (soar) และ "การจัดเรียงศิลปินของอัลบั้ม" (soaa) มีการแมปกับแท็ก ID3TSO2,TSOAและTSOPอย่างไม่ถูกต้อง (#1302) - แก้ไขการอ่านแท็กตัวเลข
gnre(ประเภท) และtmpo(จังหวะ) ของ MP4 (/iTunes) เมื่อค่ามีความยาวมากกว่า 1 ไบต์ - ส่งต่อเฟรม ID3
TCONไปยังMediaMetadata.genre(#1305)
- แก้ไขการแมป MP4 กับแท็กการจัดเรียง ID3 ก่อนหน้านี้แท็ก MP4 "การจัดเรียงอัลบั้ม" (
- รูปภาพ:
- เพิ่มการรองรับตารางกริดภาพปก DASH ที่ไม่ใช่สี่เหลี่ยมจัตุรัส (#1300)
- เพิ่มการรองรับ AVIF สำหรับ API 34 ขึ้นไป
- อนุญาตให้ใช้
nullเป็นพารามิเตอร์สำหรับExoPlayer.setImageOutput()เพื่อล้างImageOutputที่ตั้งค่าไว้ก่อนหน้านี้
- DataSource:
- ใช้การรองรับ URI ทรัพยากรดิบ
android.resource://package/idโดยที่packageแตกต่างจากแพ็กเกจของแอปพลิเคชันปัจจุบัน ก่อนหน้านี้ไม่มีการบันทึกว่าวิธีนี้ใช้ได้ แต่เป็นวิธีที่มีประสิทธิภาพมากกว่าในการเข้าถึงทรัพยากรในแพ็กเกจอื่นนอกเหนือจากชื่อ - ตรวจสอบอย่างกระตือรือร้นว่า
urlไม่ใช่ค่า Null ในตัวสร้างDataSpecพารามิเตอร์นี้มีคำอธิบายประกอบอยู่แล้วว่าไม่ใช่ค่า Null - อนุญาตให้
ByteArrayDataSourceแปลง URI เป็นอาร์เรย์ไบต์ระหว่างopen()แทนที่จะเป็นฮาร์ดโค้ดที่การสร้าง (#1405)
- ใช้การรองรับ URI ทรัพยากรดิบ
- DRM:
- อนุญาตให้ตั้งค่า
LoadErrorHandlingPolicyในDefaultDrmSessionManagerProvider(#1271)
- อนุญาตให้ตั้งค่า
- ผลกระทบ
- รองรับการเปลี่ยนความเร็วหลายครั้งภายใน
EditedMediaItemหรือCompositionเดียวกันในSpeedChangeEffect - รองรับเอาต์พุต HLG และ PQ จากอินพุตบิตแมป Ultra HDR
- เพิ่มการรองรับ EGL_GL_COLORSPACE_BT2020_HLG_EXT ซึ่งปรับปรุงเอาต์พุตพื้นผิว HLG ใน ExoPlayer.setVideoEffect และ Debug SurfaceView ของ Transformer
- อัปเดตการติดตั้งใช้งานเมทริกซ์การวางซ้อนเพื่อให้สอดคล้องกับเอกสารประกอบโดยการสลับค่า x และ y ที่ใช้ใน
setOverlayFrameAnchor()หากใช้OverlaySettings.Builder.setOverlayFrameAnchor()ให้สลับค่า x และ y โดยคูณด้วย-1 - แก้ไขข้อบกพร่องที่
TimestampWrapperขัดข้องเมื่อใช้กับExoPlayer#setVideoEffects(#821) - เปลี่ยนพื้นที่ทำงานสี SDR เริ่มต้นจากสีเชิงเส้นเป็นวิดีโอ BT 709 SDR แบบไฟฟ้า นอกจากนี้ยังมีตัวเลือกที่ 3 เพื่อคงพื้นที่สีเดิมไว้
- อนุญาตให้กำหนดลำดับ Z ที่ไม่แน่นอนของ EditedMediaItemSequences (#1055)
- รักษาช่วงความสว่างให้สอดคล้องกันในเนื้อหา HDR ต่างๆ (ใช้ช่วง HLG)
- เพิ่มการรองรับการวางซ้อน Ultra HDR (บิตแมป) ในเนื้อหา HDR
- อนุญาตให้ใช้เอฟเฟกต์
SeparableConvolutionก่อน API 26 - นำ
OverlaySettings.useHdrที่ไม่ได้ใช้ออกเนื่องจากช่วงไดนามิกของการวางซ้อนและเฟรมต้องตรงกัน - เพิ่มการรองรับ HDR สำหรับ
TextOverlayคุณปรับความสว่างของข้อความวางซ้อนได้ด้วยOverlaySettings.Builder.setHdrLuminanceMultiplier()
- รองรับการเปลี่ยนความเร็วหลายครั้งภายใน
- ส่วนขยาย IMA:
- โปรโมต API ที่จำเป็นสำหรับแอปในการเล่นสตรีมโฆษณา DAI เป็นเวอร์ชันเสถียร
- เพิ่ม
replaceAdTagParameters(Map <String, String>)ลงในImaServerSideAdInsertionMediaSource.AdLoaderซึ่งช่วยให้แทนที่พารามิเตอร์แท็กโฆษณาได้ที่รันไทม์ - แก้ไขข้อบกพร่องที่ไม่มีการเรียกใช้
VideoAdPlayer.VideoAdPlayerCallback.onError()เมื่อเกิดข้อผิดพลาดของเพลเยอร์ระหว่างการเล่นโฆษณา (#1334) - อัปเกรดเวอร์ชัน IMA SDK เป็น 3.33.0 เพื่อแก้ไข
NullPointerExceptionเมื่อใช้ URI แท็กโฆษณาdata://(#700)
- เซสชัน:
- เปลี่ยนค่าเริ่มต้นของ
CommandButton.enabledเป็นtrueและตรวจสอบว่าค่าสามารถเป็นเท็จสำหรับตัวควบคุมได้ แม้ว่าคำสั่งที่เกี่ยวข้องจะพร้อมใช้งานก็ตาม - เพิ่มค่าคงที่ของไอคอนสำหรับ
CommandButtonที่ควรใช้แทนทรัพยากรไอคอนที่กำหนดเอง - เพิ่ม
MediaSessionService.isPlaybackOngoing()เพื่อให้แอปค้นหาได้ว่า จำเป็นต้องหยุดบริการในonTaskRemoved()หรือไม่ (#1219) - เพิ่ม
MediaSessionService.pauseAllPlayersAndStopSelf()ที่ช่วยให้หยุดเล่นเซสชันทั้งหมดชั่วคราวได้อย่างสะดวก และเรียกใช้stopSelf()เพื่อสิ้นสุดวงจรของMediaSessionService - ลบล้าง
MediaSessionService.onTaskRemoved(Intent)เพื่อให้การใช้งานเริ่มต้นที่ปลอดภัยซึ่งจะทำให้บริการทำงานอยู่เบื้องหน้าหากการเล่นดำเนินอยู่ หรือหยุดบริการหากไม่ได้เล่น - ซ่อนแถบค้นหาในการแจ้งเตือนสื่อสำหรับไลฟ์สดโดยไม่ตั้งค่าระยะเวลาในข้อมูลเมตาของเซสชันแพลตฟอร์ม (#1256)
- ปรับการแปลง
MediaMetadataเป็นMediaDescriptionCompatเพื่อใช้ลำดับและตรรกะที่ต้องการเดียวกันเมื่อเลือกพร็อพเพอร์ตี้ข้อมูลเมตาเหมือนใน media1 - เพิ่ม
MediaSession.sendError()ที่อนุญาตให้ส่งข้อผิดพลาดที่ไม่ร้ายแรงไปยังตัวควบคุม Media3 เมื่อใช้ตัวควบคุมการแจ้งเตือน (ดูMediaSession.getMediaNotificationControllerInfo()) ระบบจะใช้ข้อผิดพลาดที่กำหนดเองเพื่ออัปเดตPlaybackStateของเซสชันแพลตฟอร์มเป็นสถานะข้อผิดพลาดพร้อมข้อมูลข้อผิดพลาดที่ระบุ (#543) - เพิ่ม
MediaSession.Callback.onPlayerInteractionFinished()เพื่อแจ้งเซสชันเมื่อชุดการโต้ตอบของผู้เล่นจากคอนโทรลเลอร์ที่เฉพาะเจาะจงสิ้นสุดลง - เพิ่ม
SessionErrorและใช้ในSessionResultและLibraryResultแทนรหัสข้อผิดพลาดเพื่อให้ข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดและวิธีแก้ไขข้อผิดพลาด หากเป็นไปได้ - เผยแพร่โค้ดสำหรับแอปทดสอบตัวควบคุม media3 ที่ใช้ทดสอบการโต้ตอบกับแอปที่เผยแพร่เซสชันสื่อได้
- ส่งต่อข้อมูลเพิ่มเติมที่ส่งไปยัง
MediaSession[Builder].setSessionExtras()ของ media3 ไปยังPlaybackStateCompat.getExtras()ของตัวควบคุม media1 - แมปข้อผิดพลาดร้ายแรงและไม่ร้ายแรงกับเซสชันแพลตฟอร์ม
PlaybackExceptionจะแมปกับสถานะข้อผิดพลาดร้ายแรงของPlaybackStateCompatSessionErrorที่ส่งไปยังตัวควบคุมการแจ้งเตือนสื่อพร้อมMediaSession.sendError(ControllerInfo, SessionError)จะแมปกับข้อผิดพลาดที่ไม่ร้ายแรงในPlaybackStateCompatซึ่งหมายความว่ามีการตั้งค่ารหัสข้อผิดพลาดและข้อความ แต่สถานะของเซสชันแพลตฟอร์มยังคงแตกต่างจากSTATE_ERROR - อนุญาตให้ตั้งค่ากิจกรรมเซสชันต่อตัวควบคุมเพื่อลบล้างกิจกรรมเซสชันส่วนกลาง คุณสามารถกำหนดกิจกรรมของเซสชันสำหรับตัวควบคุมได้ในเวลาที่เชื่อมต่อโดยการสร้าง
ConnectionResultด้วยAcceptedResultBuilder.setSessionActivivty(PendingIntent)เมื่อเชื่อมต่อแล้ว คุณจะอัปเดตกิจกรรมของเซสชันด้วยMediaSession.setSessionActivity(ControllerInfo, PendingIntent)ได้ - ปรับปรุงการจำลองข้อผิดพลาดของการเรียกไปยัง
MediaLibrarySession.Callbackตอนนี้คุณสามารถกำหนดค่าการจำลองข้อผิดพลาดได้โดยใช้MediaLibrarySession.Builder.setLibraryErrorReplicationMode()เพื่อเลือกประเภทข้อผิดพลาดหรือเลือกไม่ใช้การจำลองข้อผิดพลาดซึ่งเปิดอยู่โดยค่าเริ่มต้น
- เปลี่ยนค่าเริ่มต้นของ
- UI:
- เพิ่มการรองรับการแสดงรูปภาพใน
PlayerViewเมื่อเชื่อมต่อกับExoPlayer(#1144) - เพิ่มการปรับแต่งไอคอนต่างๆ ใน
PlayerControlViewผ่านแอตทริบิวต์ XML เพื่ออนุญาตให้มี Drawable ที่แตกต่างกันต่ออินสแตนซ์PlayerViewแทนการลบล้างส่วนกลาง (#1200) - แก้ปัญหาข้อบกพร่องของแพลตฟอร์มที่ทำให้วิดีโอถูกยืด/ครอบตัดเมื่อใช้
SurfaceViewภายใน ComposeAndroidViewใน API 34 (#1237)
- เพิ่มการรองรับการแสดงรูปภาพใน
- ดาวน์โหลด:
- ตรวจสอบว่า
DownloadHelperไม่ทำให้เกิดการรั่วไหลของอินสแตนซ์Rendererที่ยังไม่ได้เผยแพร่ ซึ่งอาจส่งผลให้แอปขัดข้องด้วยIllegalStateException: Too many receivers, total of 1000, registered for pid(#1224)
- ตรวจสอบว่า
- ส่วนขยาย Cronet:
- แก้ไข
SocketTimeoutExceptionในCronetDataSourceใน Cronet บางเวอร์ชัน คำขอที่ได้จาก Callback อาจไม่เหมือนกันเสมอไป ซึ่งส่งผลให้ Callback ไม่เสร็จสมบูรณ์และคำขอหมดเวลา (https://issuetracker.google.com/328442628)
- แก้ไข
- ส่วนขยาย HLS
- แก้ไขข้อบกพร่องที่ตัวอย่าง EMSG ที่รอดำเนินการซึ่งรอความไม่ต่อเนื่องได้รับการมอบสิทธิ์ใน
HlsSampleStreamWrapperโดยมีออฟเซ็ตที่ไม่ถูกต้องซึ่งทำให้เกิดIndexOutOfBoundsExceptionหรือIllegalArgumentException(#1002) - แก้ไขข้อบกพร่องที่เพลย์ลิสต์ที่ไม่ใช่เพลย์ลิสต์หลักโหลดซ้ำอย่างต่อเนื่องสำหรับสตรีม LL-HLS (#1240)
- แก้ไขข้อบกพร่องที่การเปิดใช้ CMCD สำหรับ HLS ที่มีกลุ่มการเริ่มต้นส่งผลให้เกิด
Source ErrorและIllegalArgumentException - แก้ไขข้อบกพร่องที่เพลย์ลิสต์ที่เล่นซึ่งไม่ใช่เพลย์ลิสต์หลักไม่รีเฟรชระหว่างการเล่นแบบสด (#1240)
- แก้ไขข้อบกพร่องที่การเปิดใช้ CMCD สำหรับไลฟ์สด HLS ทำให้เกิด
ArrayIndexOutOfBoundsException(#1395)
- แก้ไขข้อบกพร่องที่ตัวอย่าง EMSG ที่รอดำเนินการซึ่งรอความไม่ต่อเนื่องได้รับการมอบสิทธิ์ใน
- ส่วนขยาย DASH
- ส่วนขยาย Cast:
- แก้ไขข้อบกพร่องที่แปลงชื่ออัลบั้มของ
MediaQueueItemเป็นศิลปินในรายการสื่อ Media3 (#1255)
- แก้ไขข้อบกพร่องที่แปลงชื่ออัลบั้มของ
- ยูทิลิตีการทดสอบ
- ใช้
onInit()และonRelease()ในFakeRenderer - เปลี่ยนเมธอด
TestPlayerRunHelper.runUntil()/playUntil()ให้ล้มเหลวเมื่อเกิดข้อผิดพลาดที่ไม่ร้ายแรง (เช่น ข้อผิดพลาดที่รายงานไปยังAnalyticsListener.onVideoCodecError()) ใช้เชนเมธอดTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()ใหม่เพื่อปิดใช้ลักษณะการทำงานนี้
- ใช้
- แอปสาธิต:
- ใช้
DefaultPreloadManagerในแอปสาธิตแบบสั้น - อนุญาตให้ตั้งค่าโหมดเล่นซ้ำด้วยอาร์กิวเมนต์
Intentจากบรรทัดคำสั่ง (#1266) - ใช้
HttpEngineDataSourceเป็นHttpDataSourceเมื่ออุปกรณ์รองรับ
- ใช้
- นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
- นำ
CronetDataSourceFactoryออก โปรดใช้CronetDataSource.Factoryแทน - นำตัวสร้าง
DataSpecบางตัวออก โปรดใช้DataSpec.Builderแทน - นำเมธอด
setContentTypePredicate(Predicate)ออกจากDefaultHttpDataSource,OkHttpDataSourceและCronetDataSourceโปรดใช้วิธีการที่เทียบเท่าในแต่ละXXXDataSource.Factoryแทน - นำผู้สร้าง
OkHttpDataSourceและOkHttpDataSourceFactoryออก โปรดใช้OkHttpDataSource.Factoryแทน - นำ
PlayerMessage.setHandler(Handler)ออก โปรดใช้setLooper(Looper)แทน - นำช่อง
Timeline.Window.isLiveออก โปรดใช้เมธอดisLive()แทน - นำคอนสตรัคเตอร์
DefaultHttpDataSourceออก โปรดใช้DefaultHttpDataSource.Factoryแทน - นำ
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MSออก โปรดใช้DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MSแทน - นำ
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)ออก โปรดใช้MediaCodecInfo.canReuseCodec(Format, Format)แทน - นำวิธีการชำระเงิน
DrmSessionManager.DUMMYและgetDummyDrmSessionManager()ออก โปรดใช้DrmSessionManager.DRM_UNSUPPORTEDแทน - นำ
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format),AnalyticsListener.onVideoInputFormatChanged(EventTime, Format),AudioRendererEventListener.onAudioInputFormatChanged(Format),VideoRendererEventListener.onVideoInputFormatChanged(Format)ออก ใช้โอเวอร์โหลดที่ใช้DecoderReuseEvaluationแทน - นำ
RendererSupport.FormatSupportIntDef และค่าคงที่FORMAT_HANDLED,FORMAT_EXCEEDS_CAPABILITIES,FORMAT_UNSUPPORTED_DRM,FORMAT_UNSUPPORTED_SUBTYPE,FORMAT_UNSUPPORTED_TYPEออก ใช้ IntDef และค่าคงที่ที่เทียบเท่าในandroidx.media3.common.Cแทน (เช่นC.FORMAT_HANDLED) - นำอินเทอร์เฟซ
Bundleableออก ซึ่งรวมถึงการนำช่องค่าคงที่Bundleable.Creator<Foo> CREATORทั้งหมดออก ผู้เรียกควรใช้เมธอดBundle toBundle()และstatic Foo fromBundle(Bundle)ในแต่ละประเภทแทน
- นำ
เวอร์ชัน 1.4.0-rc01
10 กรกฎาคม 2024
ใช้เวอร์ชันเสถียร 1.4.0
เวอร์ชัน 1.4.0-beta01
26 มิถุนายน 2024
ใช้เวอร์ชันเสถียร 1.4.0
เวอร์ชัน 1.4.0-alpha02
7 มิถุนายน 2024
ใช้เวอร์ชันเสถียร 1.4.0
เวอร์ชัน 1.4.0-alpha01
17 เมษายน 2024
ใช้เวอร์ชันเสถียร 1.4.0
เวอร์ชัน 1.3.0
เวอร์ชัน 1.3.1
11 เมษายน 2024
androidx.media3:media3-*:1.3.1 เผยแพร่แล้ว เวอร์ชัน 1.3.1 มี คอมมิตเหล่านี้
- Common Library:
- เพิ่ม
Format.labelsเพื่ออนุญาตป้ายกำกับที่แปลแล้วหรือป้ายกำกับอื่นๆ
- เพิ่ม
- ExoPlayer:
- แก้ไขปัญหาที่
PreloadMediaPeriodไม่สามารถเก็บสตรีมไว้ได้เมื่อโหลดล่วงหน้าอีกครั้ง - ใช้
TrackSelectionResultที่สอดคล้องกันอย่างถูกต้องกับระยะเวลาการเล่นในการเลือกแทร็กอีกครั้ง - เริ่มโปรแกรมแสดงผลที่เปิดใช้ก่อนกำหนดหลังจากเลื่อนระยะเวลาการเล่นเมื่อเปลี่ยนระหว่างรายการสื่อเท่านั้น (#1017)
- เพิ่มประเภทการแสดงผลที่ขาดหายไปลงในกฎ
-keepclasseswithmembersของ ProGuard สำหรับDefaultVideoFrameProcessor.Factory.Builder.build()(#1187)
- แก้ไขปัญหาที่
- Transformer:
- เพิ่มวิธีแก้ปัญหาสำหรับข้อยกเว้นที่เกิดขึ้นเนื่องจาก
MediaMuxerไม่รองรับการประทับเวลาการนำเสนอเชิงลบก่อน API 30
- เพิ่มวิธีแก้ปัญหาสำหรับข้อยกเว้นที่เกิดขึ้นเนื่องจาก
- การเลือกแทร็ก
DefaultTrackSelector: แนะนำให้ใช้แทร็กวิดีโอที่มีอัตราเฟรมที่ "เหมาะสม" (>=10fps) แทนแทร็กที่มีอัตราเฟรมต่ำกว่าหรือไม่ได้ตั้งค่าไว้ ซึ่งจะช่วยให้มั่นใจว่าเพลเยอร์จะเลือกแทร็กวิดีโอ "จริง" ใน MP4 ที่ดึงมาจากภาพเคลื่อนไหวซึ่งอาจมีแทร็ก HEVC 2 แทร็ก โดยแทร็กหนึ่งมีความละเอียดสูงกว่าแต่มีจำนวนเฟรมน้อยมาก (#1051)
- เครื่องสกัดน้ำผลไม้
- แก้ไขปัญหาที่ระบบไม่ข้ามระยะห่างจากขอบเมื่ออ่านข้อมูลขนาดคี่จากไฟล์ WAV (#1117)
- MP3: ป้อน
Format.averageBitrateจากเฟรมข้อมูลเมตา เช่นXINGและVBRI - MPEG-TS: ยกเลิกการเปลี่ยนแปลงที่มีจุดประสงค์เพื่อให้แน่ใจว่าเฟรมสุดท้ายได้รับการแสดงผลโดยการส่งหน่วยการเข้าถึงสุดท้ายของสตรีมไปยังคิวตัวอย่าง (#7909) เนื่องจากการเปลี่ยนแปลงทำให้เกิดปัญหาใหม่กับสตรีม HLS แบบ I-frame เท่านั้น (#1150) และสตรีม HLS แบบ H.262 (#1126)
- เสียง
- อนุญาตให้กู้คืนโปรแกรมแสดงผลโดยปิดใช้การส่งต่อเสียงไปยังอุปกรณ์อื่นหากแทร็กเสียงไม่สามารถเริ่มต้นในโหมดส่งต่อเสียงไปยังอุปกรณ์อื่น
- วิดีโอ:
- เพิ่มวิธีแก้ปัญหาเกี่ยวกับอุปกรณ์ใน Galaxy Tab S7 FE, Chromecast พร้อม Google TV และ Lenovo M10 FHD Plus ที่ทำให้ระบบทำเครื่องหมายสตรีม H265 60 FPS ว่าไม่รองรับ
- เพิ่มวิธีแก้ปัญหาที่ช่วยให้มั่นใจว่าเฟรมแรกจะแสดงผลเสมอขณะทำการทันเนล แม้ว่าอุปกรณ์จะไม่ดำเนินการนี้โดยอัตโนมัติตามที่ API กำหนด (#1169) (#966)
- แก้ไขปัญหาที่การจัดการข้อมูลสี HDR ทำให้ตัวแปลงรหัสทำงานผิดพลาดและป้องกันไม่ให้มีการเปลี่ยนรูปแบบที่ปรับเปลี่ยนได้สำหรับแทร็กวิดีโอ SDR (#1158)
- ข้อความ
- WebVTT: ป้องกันไม่ให้คิวที่ต่อเนื่องกันโดยตรงสร้างอินสแตนซ์
CuesWithTimingปลอมเพิ่มเติมจากWebvttParser.parse(#1177)
- WebVTT: ป้องกันไม่ให้คิวที่ต่อเนื่องกันโดยตรงสร้างอินสแตนซ์
- DRM:
- แก้ปัญหา
NoSuchMethodErrorซึ่งเฟรมเวิร์กMediaDrmอาจแสดงขึ้นมาแทนResourceBusyExceptionหรือNotProvisionedExceptionในอุปกรณ์ Android 14 บางรุ่น (#1145)
- แก้ปัญหา
- ผลกระทบ
- ปรับปรุงการแมปโทนสี PQ เป็น SDR โดยการแปลงขอบเขตสี
- เซสชัน:
- UI:
- ใช้ชื่อภาษาของแทร็กเสียงเป็นชื่อสำรองหาก
Localeไม่สามารถระบุชื่อที่แสดงได้ (#988)
- ใช้ชื่อภาษาของแทร็กเสียงเป็นชื่อสำรองหาก
- ส่วนขยาย DASH
- ป้อนข้อมูลองค์ประกอบ
Labelทั้งหมดจากไฟล์ Manifest ลงในFormat.labels(#1054)
- ป้อนข้อมูลองค์ประกอบ
- ส่วนขยาย RTSP:
- ข้ามค่าข้อมูลเซสชันที่ว่างเปล่า (i-tag) ในการแยกวิเคราะห์ SDP (#1087)
- ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1, MIDI ฯลฯ):
- ปิดใช้ส่วนขยาย MIDI เป็นทรัพยากร Dependency ในเครื่องโดยค่าเริ่มต้น เนื่องจากต้องกำหนดค่าที่เก็บ Maven เพิ่มเติม ผู้ใช้ที่ต้องการโมดูลนี้จากการขึ้นต่อกันในเครื่องสามารถเปิดใช้ใหม่ได้
เวอร์ชัน 1.3.0
6 มีนาคม 2024
androidx.media3:media3-*:1.3.0 เผยแพร่แล้ว เวอร์ชัน 1.3.0 มีคอมมิตเหล่านี้
- Common Library:
- ใช้การรองรับ URI ทรัพยากรดิบ
android.resource://package/[type/]nameโดยที่packageแตกต่างจากแพ็กเกจของแอปพลิเคชันปัจจุบัน เราได้บันทึกไว้เสมอว่าวิธีนี้ใช้ได้ผล แต่ไม่ได้นำไปใช้อย่างถูกต้องจนถึงตอนนี้ - ปรับประเภท MIME ที่ตั้งค่าโดยโค้ดแอปหรืออ่านจากสื่อให้เป็นตัวพิมพ์เล็กทั้งหมด
- กำหนดโฆษณาด้วย
MediaItemแบบเต็มแทนที่จะเป็นUriรายการเดียวในAdPlaybackState - เพิ่ม
minSdkเป็น 19 (Android KitKat) ซึ่งสอดคล้องกับไลบรารี AndroidX อื่นๆ ทั้งหมด และเราจำเป็นต้องอัปเกรดทรัพยากร Dependency ของ AndroidX เป็นเวอร์ชันล่าสุด - ป้อนทั้ง
artworkUriและartworkDataในMediaMetadata.Builder.populate(MediaMetadata)เมื่อมีอย่างน้อย 1 รายการที่ไม่ใช่ค่า Null (#964)
- ใช้การรองรับ URI ทรัพยากรดิบ
- ExoPlayer:
- เพิ่ม
PreloadMediaSourceและPreloadMediaPeriodที่อนุญาตให้แอปโหลดแหล่งที่มาของสื่อเนื้อหาล่วงหน้า ณ ตำแหน่งเริ่มต้นที่เฉพาะเจาะจงก่อนการเล่นPreloadMediaSourceจะดูแลการเตรียมแหล่งที่มาของสื่อเนื้อหาเพื่อรับTimeline, การเตรียมและแคชระยะเวลาที่ตำแหน่งเริ่มต้นที่ระบุ, การเลือกแทร็ก และการโหลดข้อมูลสื่อสำหรับระยะเวลาดังกล่าว แอปจะควบคุมความคืบหน้าของการโหลดล่วงหน้าโดยใช้PreloadMediaSource.PreloadControlและตั้งค่าแหล่งที่มาที่โหลดล่วงหน้าเป็นเพลเยอร์สำหรับการเล่น - เพิ่ม
ExoPlayer.setImageOutputที่อนุญาตให้แอปตั้งค่าImageRenderer.ImageOutput - ตอนนี้
DefaultRenderersFactoryจะให้ImageRendererแก่เพลเยอร์โดยค่าเริ่มต้นพร้อมImageOutputและImageDecoder.Factory.DEFAULTที่เป็นค่า Null - ส่งเหตุการณ์
Player.Listener.onPositionDiscontinuityเมื่อข้ามช่วงที่ไม่มีเสียง (#765) - เพิ่มการรองรับเวอร์ชันทดลองสำหรับการแยกวิเคราะห์คำบรรยายระหว่างการแยกข้อมูล คุณเปิดใช้ฟีเจอร์นี้ได้โดยใช้
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction() - รองรับแหล่งที่มาของสื่อแบบปรับอัตโนมัติด้วย
PreloadMediaSource - ใช้
HttpEngineDataSourceซึ่งเป็นHttpDataSourceโดยใช้ API HttpEngine - ป้องกันการสร้างคลาสย่อย
CompositeSequenceableLoaderคอมโพเนนต์นี้เคยทำให้ขยายได้ แต่ไม่เคยมีการสร้างคลาสย่อยภายในไลบรารี คุณปรับแต่งได้โดยการรวมอินสแตนซ์โดยใช้รูปแบบเดคอเรเตอร์และใช้CompositeSequenceableLoaderFactoryที่กำหนดเอง - แก้ไขปัญหาที่การทำซ้ำเวลาเดียวกันทำให้ข้อมูลเมตาจากรายการนี้ถูกล้าง (#1007)
- เปลี่ยนชื่อเมธอด
experimentalSetSubtitleParserFactoryในBundledChunkExtractor.FactoryและDefaultHlsExtractorFactoryเป็นsetSubtitleParserFactoryและไม่อนุญาตให้ส่งnullใช้เมธอดexperimentalParseSubtitlesDuringExtraction(boolean)ใหม่เพื่อควบคุมลักษณะการทำงานของการแยกวิเคราะห์ - เพิ่มการรองรับการปรับแต่ง
SubtitleParser.Factoryที่ใช้ระหว่างการดึงข้อมูล ซึ่งทำได้ด้วยMediaSource.Factory.setSubtitleParserFactory() - เพิ่มคำนำหน้าแหล่งที่มาลงในช่อง
Format.idทั้งหมดที่สร้างจากMergingMediaSourceซึ่งจะช่วยระบุแหล่งที่มาที่สร้างFormat(#883) - แก้ไขนิพจน์ทั่วไปที่ใช้ในการตรวจสอบชื่อคีย์ Common Media Client Data (CMCD) ที่กำหนดเองโดยแก้ไขให้ตรวจสอบเฉพาะขีดกลาง (#1028)
- หยุดการเข้ารหัสพารามิเตอร์การค้นหา CMCD ซ้ำ (#1075)
- เพิ่ม
- Transformer:
- เพิ่มการรองรับการปรับวิดีโอสโลว์โมชัน H.265/HEVC SEF ให้เป็นแบบปกติ
- เพิ่มความเร็วในการแปลงมัลติเพล็กซ์ โดยเฉพาะสำหรับการแก้ไข "นำวิดีโอออก"
- เพิ่ม API เพื่อให้แน่ใจว่าไฟล์เอาต์พุตเริ่มต้นที่เฟรมวิดีโอ ซึ่งจะทำให้เอาต์พุตของการดำเนินการตัดเข้ากันได้มากขึ้นกับการติดตั้งใช้งานโปรแกรมเล่นที่ไม่แสดงเฟรมวิดีโอแรกจนกว่าจะถึงการประทับเวลาการนำเสนอ (#829)
- เพิ่มการรองรับการเพิ่มประสิทธิภาพการตัด MP4 ของชิ้นงานเดียว
- เพิ่มการรองรับเพื่อให้แน่ใจว่าเฟรมวิดีโอมีการประทับเวลาแรกในไฟล์เอาต์พุต แก้ไขไฟล์เอาต์พุตที่ขึ้นต้นด้วยเฟรมสีดำในโปรแกรมเล่นที่ใช้ iOS (#829)
- การเลือกแทร็ก
- เพิ่ม
DefaultTrackSelector.selectImageTrackเพื่อเปิดใช้การเลือกแทร็กรูปภาพ - เพิ่ม
TrackSelectionParameters.isPrioritizeImageOverVideoEnabledเพื่อระบุว่าจะเลือกแทร็กรูปภาพหรือไม่หากมีทั้งแทร็กรูปภาพและแทร็กวิดีโอ ค่าเริ่มต้นคือfalseซึ่งหมายความว่าระบบจะให้ความสำคัญกับการเลือกแทร็กวิดีโอ
- เพิ่ม
- เครื่องสกัดน้ำผลไม้
- เพิ่มการแยกวิเคราะห์ AV1C เพิ่มเติมลงในเครื่องมือแยก MP4 เพื่อดึงค่า
ColorInfo.colorSpace,ColorInfo.colorTransferและColorInfo.colorRange(#692) - MP3: ใช้การค้นหาอัตราบิตคงที่ (CBR) สำหรับไฟล์ที่มีส่วนหัว
Info(CBR เทียบเท่ากับส่วนหัวXing) ก่อนหน้านี้เราใช้ตารางการกรอจากส่วนหัวInfoแต่ส่งผลให้การกรอวิดีโออย่างละเอียดมีความแม่นยำน้อยกว่าการละเว้นและถือว่าไฟล์เป็น CBR - MPEG2-TS: เพิ่มการรองรับ DTS, DTS-LBR และ DTS:X Profile2 (#275)
- ดึงข้อมูลประเภทเสียงจากตัวบ่งชี้ TS และแมปกับแฟล็กบทบาท ซึ่งช่วยให้ผู้ใช้เลือกแทร็กเสียงได้ดีขึ้น (#973)
- เพิ่มการแยกวิเคราะห์ AV1C เพิ่มเติมลงในเครื่องมือแยก MP4 เพื่อดึงค่า
- เสียง
- วิดีโอ:
- เปลี่ยนเครื่องมือสร้าง
MediaCodecVideoRendererที่รับอาร์กิวเมนต์VideoFrameProcessor.Factoryและแทนที่ด้วยเครื่องมือสร้างที่รับอาร์กิวเมนต์VideoSinkProviderแอปที่ต้องการแทรกVideoFrameProcessor.Factoryที่กำหนดเองสามารถสร้างอินสแตนซ์CompositingVideoSinkProviderที่ใช้VideoFrameProcessor.Factoryที่กำหนดเองและส่งผู้ให้บริการซิงก์วิดีโอไปยังMediaCodecVideoRendererได้
- เปลี่ยนเครื่องมือสร้าง
- ข้อความ
- แก้ไขการเรียงลำดับคิวบิตแมปเพื่อแก้ไขข้อผิดพลาด
Tried to marshall a Parcel that contained Binder objectsเมื่อใช้DefaultExtractorsFactory.setTextTrackTranscodingEnabled(#836) - CEA-708: ละเว้นค่า
rowLockข้อกำหนด CEA-708-E S-2023 ระบุว่าควรสันนิษฐานว่าทั้งrowLockและcolumnLockเป็นจริง ไม่ว่าค่าที่แสดงในสตรีมจะเป็นค่าใดก็ตาม (ไม่ได้ใช้การรองรับcolumnLockจึงถือว่าค่าเป็นเท็จเสมอ)
- แก้ไขการเรียงลำดับคิวบิตแมปเพื่อแก้ไขข้อผิดพลาด
- รูปภาพ:
- เพิ่มการรองรับภาพปก DASH ระบบจะครอบตัดรูปภาพตารางกริดและส่งภาพขนาดย่อแต่ละภาพให้
ImageOutputใกล้กับเวลาที่นำเสนอ
- เพิ่มการรองรับภาพปก DASH ระบบจะครอบตัดรูปภาพตารางกริดและส่งภาพขนาดย่อแต่ละภาพให้
- DRM:
- เล่นตัวอย่างที่ไม่ได้เข้ารหัส "Clear Lead" ในเนื้อหา DRM ทันทีโดยค่าเริ่มต้น แม้ว่าคีย์สำหรับตัวอย่างที่เข้ารหัสในภายหลังจะยังไม่พร้อมใช้งานก็ตาม ซึ่งอาจทำให้การเล่นหยุดชะงักกลางคันหากคีย์ยังไม่พร้อมเมื่อตำแหน่งการเล่นถึงตัวอย่างที่เข้ารหัส (แต่ก่อนหน้านี้การเล่นจะไม่เริ่มเลยเมื่อถึงจุดนี้) คุณปิดใช้ลักษณะการทำงานนี้ได้ด้วย
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKeyหรือDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys- ส่วนขยาย IMA:
- แก้ไขปัญหาที่โฆษณา DASH และ HLS ที่ไม่มีนามสกุลไฟล์ที่เหมาะสมไม่สามารถเล่นได้
- เล่นตัวอย่างที่ไม่ได้เข้ารหัส "Clear Lead" ในเนื้อหา DRM ทันทีโดยค่าเริ่มต้น แม้ว่าคีย์สำหรับตัวอย่างที่เข้ารหัสในภายหลังจะยังไม่พร้อมใช้งานก็ตาม ซึ่งอาจทำให้การเล่นหยุดชะงักกลางคันหากคีย์ยังไม่พร้อมเมื่อตำแหน่งการเล่นถึงตัวอย่างที่เข้ารหัส (แต่ก่อนหน้านี้การเล่นจะไม่เริ่มเลยเมื่อถึงจุดนี้) คุณปิดใช้ลักษณะการทำงานนี้ได้ด้วย
- เซสชัน:
- ปิดใช้การตรวจจับการดับเบิลคลิกสำหรับแอป TV (#962)
- แก้ไขปัญหาที่ไม่มีการส่ง
MediaItem.RequestMetadataที่มีเฉพาะข้อมูลเพิ่มเติมที่ไม่ใช่ค่า Null ระหว่างตัวควบคุมสื่อและเซสชัน - เพิ่มคอนสตรัคเตอร์ลงใน
MediaLibrarySession.Builderซึ่งใช้เฉพาะContextแทนMediaLibraryService
- ส่วนขยาย HLS
- ลดระดับการเข้าถึง
HlsMediaPeriodเป็นแบบส่วนตัวในแพ็กเกจ ไม่ควรใช้ประเภทนี้โดยตรงจากภายนอกแพ็กเกจ HLS - แก้ไขปัญหาการกรอไปยังจุดเริ่มต้นของกลุ่มได้อย่างมีประสิทธิภาพมากขึ้น (#1031)
- ลดระดับการเข้าถึง
- ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1, MIDI ฯลฯ):
- ตัวถอดรหัส MIDI: ละเว้นข้อความเหตุการณ์ SysEx (#710)
- ยูทิลิตีการทดสอบ
- อย่าหยุดเล่นชั่วคราวใน
TestPlayerRunHelper.playUntilPositionการทดสอบจะทำให้การเล่นอยู่ในสถานะกำลังเล่น แต่จะระงับความคืบหน้าไว้จนกว่าการทดสอบจะเพิ่มการยืนยันและการดำเนินการเพิ่มเติมได้
- อย่าหยุดเล่นชั่วคราวใน
- แอปสาธิต:
- เพิ่มโมดูลสาธิตแบบสั้นเพื่อสาธิตการใช้งาน
PreloadMediaSourceด้วยกรณีการใช้งานเนื้อหาแบบสั้น
- เพิ่มโมดูลสาธิตแบบสั้นเพื่อสาธิตการใช้งาน
เวอร์ชัน 1.3.0-rc01
22 กุมภาพันธ์ 2024
เวอร์ชัน 1.3.0-beta01
7 กุมภาพันธ์ 2024
เวอร์ชัน 1.3.0-alpha01
15 มกราคม 2024
เวอร์ชัน 1.2.0
เวอร์ชัน 1.2.1
9 มกราคม 2024
- ExoPlayer:
- แก้ไขปัญหาที่การกรอวิดีโอด้วยตนเองนอกช่วง
LiveConfiguration.min/maxOffsetยังคงปรับออฟเซ็ตกลับไปเป็นmin/maxOffset - แก้ไขปัญหาที่เลย์เอาต์ช่อง OPUS และ VORBIS ไม่ถูกต้องสำหรับช่อง 3, 5, 6, 7 และ 8 (#8396)
- แก้ไขปัญหาที่การเลือกแทร็กหลังจากกรอไปที่ศูนย์ในไลฟ์สดทำให้ไลฟ์สดเริ่มที่ตำแหน่งเริ่มต้นอย่างไม่ถูกต้อง (#9347)
- แก้ไขปัญหาที่อินสแตนซ์ใหม่ของ
CmcdData.Factoryได้รับค่าลบสำหรับbufferedDurationUsจากแหล่งข้อมูลกลุ่ม ซึ่งส่งผลให้เกิดIllegalArgumentException(#888)
- แก้ไขปัญหาที่การกรอวิดีโอด้วยตนเองนอกช่วง
- Transformer:
- แก้ปัญหาที่โปรแกรมเปลี่ยนไฟล์จะแสดงข้อผิดพลาดในเวลาที่กำหนดค่าเนื่องจากการตั้งค่าอัตราการทำงานสูง
- เครื่องสกัดน้ำผลไม้
- ทำเครื่องหมายแทร็ก HEVC รอง (เล่นไม่ได้) ในรูปภาพเคลื่อนไหว JPEG เป็น
ROLE_FLAG_ALTERNATEเพื่อป้องกันไม่ให้ระบบเลือกแทร็กดังกล่าวสำหรับการเล่นโดยอัตโนมัติเนื่องจากมีความละเอียดสูงกว่า - แก้ไขการตรวจพบคีย์เฟรมที่ไม่ถูกต้องสำหรับสตรีม TS H264 (#864)
- แก้ไขการประมาณระยะเวลาของสตรีม TS ที่ยาวกว่า 47,721 วินาที (#855)
- ทำเครื่องหมายแทร็ก HEVC รอง (เล่นไม่ได้) ในรูปภาพเคลื่อนไหว JPEG เป็น
- เสียง
- แก้ไขการจัดการ EOS สำหรับ
SilenceSkippingAudioProcessorเมื่อมีการเรียกใช้หลายครั้ง (#712)
- แก้ไขการจัดการ EOS สำหรับ
- วิดีโอ:
- เพิ่มวิธีแก้ปัญหาเกี่ยวกับอุปกรณ์ใน Galaxy Tab S7 FE, Chromecast พร้อม Google TV และ Lenovo M10 FHD Plus ที่ทำให้ระบบทำเครื่องหมายสตรีม AVC 60 FPS ว่าไม่รองรับ (#693)
- ข้อมูลเมตา
- แก้ไขข้อบกพร่องที่
MediaMetadataมีข้อมูลจากความคิดเห็น Vorbis ที่มีคีย์ตัวพิมพ์ใหญ่เท่านั้น (#876) - ตรวจจับ
OutOfMemoryErrorเมื่อแยกวิเคราะห์เฟรม ID3 ขนาดใหญ่มาก ซึ่งหมายความว่าการเล่นจะดำเนินต่อไปได้โดยไม่มีข้อมูลแท็ก แทนที่จะเล่นไม่สำเร็จโดยสิ้นเชิง
- แก้ไขข้อบกพร่องที่
- DRM:
- ขยายวิธีแก้ปัญหาสำหรับ URL ใบอนุญาต ClearKey
https://default.urlปลอมไปยัง API 33 ขึ้นไป (ก่อนหน้านี้วิธีแก้ปัญหาใช้ได้กับ API 33 เท่านั้น) (#837) - แก้ไข
ERROR_DRM_SESSION_NOT_OPENEDเมื่อเปลี่ยนจากเนื้อหาที่เข้ารหัสเป็นเนื้อหาที่ไม่มีการเข้ารหัสโดยไม่มีแพลตฟอร์มที่เชื่อมต่อกับเพลเยอร์ ข้อผิดพลาดเกิดจากการใช้ตัวถอดรหัสที่ปลอดภัยอย่างไม่ถูกต้องเพื่อเล่นเนื้อหาที่ไม่มีการเข้ารหัส
- ขยายวิธีแก้ปัญหาสำหรับ URL ใบอนุญาต ClearKey
- เซสชัน:
- ใส่คีย์และค่าที่กำหนดเองใน
MediaMetadataCompatเป็นMediaMetadata.extrasและMediaMetadata.extrasเป็นMediaMetadataCompat(#756, #802) - แก้ไขการกระจายสัญญาณ
notifyChildrenChangedสำหรับตัวควบคุมเดิม (#644) - แก้ไขข้อบกพร่องที่การตั้งค่าเวลาติดลบสำหรับตัวจับเวลา
setWhenที่ปิดใช้ของการแจ้งเตือนทำให้เกิดข้อขัดข้องในอุปกรณ์บางเครื่อง (#903) - แก้ไข
IllegalStateExceptionเมื่อตัวควบคุมการแจ้งเตือนสื่อยังเชื่อมต่อไม่เสร็จสมบูรณ์เมื่อมีการขออัปเดตการแจ้งเตือนครั้งแรก (#917)
- ใส่คีย์และค่าที่กำหนดเองใน
- UI:
- ส่วนขยาย DASH
- แยกวิเคราะห์ "f800" เป็นจำนวนช่อง 5 ช่องสำหรับ Dolby ในไฟล์ Manifest ของ DASH (#688)
- ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1, MIDI ฯลฯ):
- ส่วนขยาย Cast:
- ล้างการสร้าง
Timelineเพื่อไม่ให้แอปขัดข้องเมื่อโหลดสื่อไม่สำเร็จในอุปกรณ์แคสต์ (#708)
- ล้างการสร้าง
เวอร์ชัน 1.2.0
15 พฤศจิกายน 2023
- Common Library:
- เพิ่มพารามิเตอร์
@Nullable Throwableลงในเมธอดในอินเทอร์เฟซLog.Loggerพารามิเตอร์messageสำหรับเมธอดเหล่านี้จะไม่มีข้อมูลเกี่ยวกับThrowableที่ส่งไปยังเมธอดLog.{d,i,w,e}()อีกต่อไป ดังนั้นการติดตั้งใช้งานจะต้องเพิ่มข้อมูลนี้ด้วยตนเองหากต้องการ (อาจใช้Logger.appendThrowableString(String, Throwable)) - แก้ไขปัญหาความเข้ากันได้ของ Kotlin ที่ระบบตรวจไม่พบพารามิเตอร์ประเภททั่วไปที่อนุญาตค่า Null และประเภทองค์ประกอบอาร์เรย์ที่อนุญาตค่า Null ว่าอนุญาตค่า Null ตัวอย่างเช่น พารามิเตอร์เมธอด
TrackSelectorResultและSimpleDecoder(#6792) - เปลี่ยน UI เริ่มต้นและลักษณะการทำงานของการแจ้งเตือนใน
Util.shouldShowPlayButtonเพื่อแสดงปุ่ม "เล่น" ขณะที่การเล่นถูกระงับชั่วคราว (เช่น เนื่องจากสูญเสียโฟกัสเสียงชั่วคราว) คุณสามารถคงลักษณะการทำงานเดิมไว้ได้โดยใช้PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)หรือMediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)(#11213) - อัปเกรด
androidx.annotation:annotation-experimentalเป็น1.3.1เพื่อแก้ไข https://issuetracker.google.com/251172715 - ย้าย
ExoPlayer.setAudioAttributesไปยังอินเทอร์เฟซPlayer
- เพิ่มพารามิเตอร์
- ExoPlayer:
- แก้ไขปัญหาการกรอในสตรีม AC4 ที่เกิดจากการระบุตัวอย่างแบบถอดรหัสเท่านั้นไม่ถูกต้อง (#11000)
- เพิ่มการระงับการเล่นในอุปกรณ์เอาต์พุตเสียงที่ไม่เหมาะสม (เช่น ลำโพงในตัวของอุปกรณ์ Wear OS) เมื่อเปิดใช้ฟีเจอร์นี้ผ่าน
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutputเหตุผลในการระงับการเล่นจะได้รับการอัปเดตเป็นPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUTหากพยายามเล่นเมื่อไม่มีเอาต์พุตเสียงที่เหมาะสม หรือหากเอาต์พุตที่เหมาะสมทั้งหมดถูกตัดการเชื่อมต่อระหว่างการเล่น เหตุผลในการระงับจะถูกนำออกเมื่อมีการเชื่อมต่อเอาต์พุตที่เหมาะสม - เพิ่ม
MediaSource.canUpdateMediaItemและMediaSource.updateMediaItemเพื่อรับข้อมูลอัปเดตเกี่ยวกับMediaItemหลังจากสร้างผ่านPlayer.replaceMediaItem(s) - อนุญาตการอัปเดต
MediaItemสำหรับคลาสMediaSourceทั้งหมดที่ไลบรารีมีให้ผ่านPlayer.replaceMediaItem(s)(#33, #9978) - เปลี่ยนชื่อ
MimeTypes.TEXT_EXOPLAYER_CUESเป็นMimeTypes.APPLICATION_MEDIA3_CUES - เพิ่ม
PngExtractorที่ส่งและอ่านไฟล์ PNG ทั้งไฟล์ลงในTrackOutputเป็นตัวอย่างเดียว - ปรับปรุงเมธอด
SequenceableLoader.continueLoading(long)ในอินเทอร์เฟซSequenceableLoaderเพื่อSequenceableLoader.continueLoading(LoadingInfo loadingInfo)LoadingInfoมีพารามิเตอร์เพิ่มเติม ซึ่งรวมถึงplaybackSpeedและlastRebufferRealtimeMsนอกเหนือจากplaybackPositionUsที่มีอยู่ - ปรับปรุงเมธอด
ChunkSource.getNextChunk(long, long, List, ChunkHolder)ในอินเทอร์เฟซChunkSourceเป็นChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder) - เพิ่มช่องเพิ่มเติมในการบันทึก Common Media Client Data (CMCD) ได้แก่ บัฟเฟอร์ไม่เพียงพอ (
bs) กำหนดเวลา (dl) อัตราการเล่น (pr) และการเริ่มต้น (su) (#8699) - เพิ่มความลึกของบิต Luma และ Chroma ลงใน
ColorInfo(#491) - เพิ่มช่องเพิ่มเติมในการบันทึกข้อมูลไคลเอ็นต์สื่อทั่วไป (CMCD): คำขอออบเจ็กต์ถัดไป (
nor) และคำขอช่วงถัดไป (nrr) (#8699) - เพิ่มฟังก์ชันการทำงานเพื่อส่งข้อมูล Common Media Client Data (CMCD) โดยใช้พารามิเตอร์การค้นหา (#553)
- แก้ไข
ConcurrentModificationExceptionในExperimentalBandwidthMeter(#612) - เพิ่มพารามิเตอร์
MediaPeriodIdลงในCompositeMediaSource.getMediaTimeForChildMediaTime - รองรับ
ClippingMediaSource(และแหล่งที่มาอื่นๆ ที่มีออฟเซ็ตเวลาของระยะเวลา/กรอบเวลา) ในConcatenatingMediaSource2(#11226) - เปลี่ยน
BaseRenderer.onStreamChanged()เพื่อรับอาร์กิวเมนต์MediaPeriodIdด้วย
- Transformer:
- แยกวิเคราะห์ข้อมูลการหมุน EXIF สำหรับอินพุตรูปภาพ
- นำประเภทคำอธิบายประกอบ
TransformationRequest.HdrModeและค่าคงที่ที่เกี่ยวข้องออก โปรดใช้Composition.HdrModeและค่าคงที่ที่เกี่ยวข้องแทน - ลดความซับซ้อนของ
OverlaySettingsเพื่อแก้ไขปัญหาการหมุน - เปลี่ยนพารามิเตอร์
frameRateและdurationUsของSampleConsumer.queueInputBitmapเป็นTimestampIteratorแล้ว
- การเลือกแทร็ก
- เพิ่ม
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptivenessเพื่ออนุญาตหรือไม่อนุญาตการปรับเปลี่ยนแบบไม่ราบรื่นอย่างชัดแจ้ง ค่าเริ่มต้นจะยังคงเป็นลักษณะการทำงานปัจจุบันของtrue
- เพิ่ม
- เครื่องสกัดน้ำผลไม้
- MPEG-TS: ตรวจสอบว่าเฟรมสุดท้ายแสดงผลโดยการส่งหน่วยการเข้าถึงสุดท้ายของสตรีมไปยังคิวตัวอย่าง (#7909)
- แก้ไขคำที่สะกดผิดเมื่อระบุ
rotationDegreesเปลี่ยนprojectionPosePitchเป็นprojectionPoseRoll(#461) - นำสมมติฐานที่ว่าอินสแตนซ์
Extractorสามารถตรวจสอบได้โดยตรงด้วยinstanceofออก หากต้องการสิทธิ์เข้าถึงขณะรันไทม์สำหรับรายละเอียดการติดตั้งใช้งานของExtractorคุณต้องเรียกใช้Extractor.getUnderlyingInstanceก่อน - เพิ่ม
BmpExtractor - เพิ่ม
WebpExtractor - เพิ่ม
HeifExtractor - เพิ่มการรองรับ QuickTime แบบคลาสสิกไปยัง
Mp4Extractor
- เสียง
- เพิ่มการรองรับ PCM แบบ Big-Endian 24/32 บิตใน MP4 และ Matroska รวมถึงแยกวิเคราะห์การเข้ารหัส PCM สำหรับ
lpcmใน MP4 - เพิ่มการรองรับการแยกเสียง Vorbis ใน MP4
- เพิ่ม
AudioSink.getFormatOffloadSupport(Format)ที่ดึงข้อมูลระดับการรองรับการออฟโหลดที่ซิงก์สามารถให้สำหรับรูปแบบผ่านDefaultAudioOffloadSupportProviderซึ่งจะแสดงผลAudioOffloadSupportใหม่ที่มีisFormatSupported,isGaplessSupportedและisSpeedChangeSupported - เพิ่ม
AudioSink.setOffloadMode()ซึ่งใช้กำหนดค่าการลดภาระงานในซิงก์เสียง ค่าเริ่มต้นคือAudioSink.OFFLOAD_MODE_DISABLED - คุณเปิดใช้การลดภาระได้ผ่าน
setAudioOffloadPreferenceในTrackSelectionParametersหากค่ากำหนดที่ตั้งไว้คือเปิดใช้ อุปกรณ์จะรองรับการลดภาระสำหรับรูปแบบ และการเลือกแทร็กเป็นแทร็กเสียงเดียว จากนั้นระบบจะเปิดใช้การลดภาระเสียง - หากตั้งค่า
audioOffloadModePreferenceเป็นAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIREDDefaultTrackSelectorจะเลือกเฉพาะแทร็กเสียงและเฉพาะในกรณีที่รูปแบบของแทร็กนั้นรองรับการออฟโหลด หากไม่มีแทร็กเสียงที่รองรับในการออฟโหลด ระบบจะไม่เลือกแทร็กใดเลย - Disabling gapless support for offload when pre-API level 33 due to playback position issue after track transition.
- นำพารามิเตอร์
enableOffloadออกจากซิกเนเจอร์ของเมธอดDefaultRenderersFactory.buildAudioSink - นำวิธีการ
DefaultAudioSink.Builder.setOffloadModeออก - นำค่า intdef ออก
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED - เพิ่มการรองรับข้อมูลเมตาแบบไม่มีช่องว่างของ Opus ระหว่างการเล่นแบบออฟโหลด
- อนุญาตให้กู้คืนโปรแกรมแสดงผลโดยปิดใช้การออฟโหลดหากเขียนครั้งแรกไม่สำเร็จ (#627)
- เปิดใช้การกำหนดเวลาการส่งต่อเสียงไปยังอุปกรณ์อื่นโดยค่าเริ่มต้นสำหรับการเล่นแบบส่งต่อเสียงไปยังอุปกรณ์อื่นเท่านั้น
- ลบ
ExoPlayer.experimentalSetOffloadSchedulingEnabledและAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged - เปลี่ยนชื่อ
onExperimentalSleepingForOffloadChangedเป็นonSleepingForOffloadChangedและonExperimentalOffloadedPlaybackเป็นonOffloadedPlaybackแล้ว - ย้ายอินเทอร์เฟซและคำจำกัดความ
TrackSelectionParametersที่เกี่ยวข้องกับโหมดการลดภาระเสียงไปยังคลาสAudioOffloadPreferencesภายใน - เพิ่ม Callback
onAudioTrackInitializedและonAudioTrackReleasedไปยังAnalyticsListener,AudioRendererEventListenerและAudioSink.Listener - แก้ไขปัญหาบัฟเฟอร์เสียง DTS Express ไม่เพียงพอ (#650)
- แก้ไขข้อบกพร่องที่การตรวจสอบความสามารถสำหรับ E-AC3-JOC แสดงข้อผิดพลาด
IllegalArgumentException(#677)
- เพิ่มการรองรับ PCM แบบ Big-Endian 24/32 บิตใน MP4 และ Matroska รวมถึงแยกวิเคราะห์การเข้ารหัส PCM สำหรับ
- วิดีโอ:
- อนุญาตให้
MediaCodecVideoRendererใช้VideoFrameProcessor.Factoryที่กำหนดเอง - แก้ไขข้อบกพร่องที่ทำให้แสดงผลเฟรมแรกไม่ได้หากสตรีมเสียงเริ่มต้นด้วยการประทับเวลาติดลบ (#291)
- อนุญาตให้
- ข้อความ
- นำ
ExoplayerCuesDecoderออก ตอนนี้แทร็กข้อความที่มีsampleMimeType = application/x-media3-cuesจะได้รับการจัดการโดยตรงจากTextRendererโดยไม่ต้องมีอินสแตนซ์SubtitleDecoder
- นำ
- ข้อมูลเมตา
- ระบบจะไม่เรียกใช้
MetadataDecoder.decodeสำหรับตัวอย่าง "ถอดรหัสเท่านั้น" อีกต่อไป เนื่องจากการติดตั้งใช้งานต้องแสดงผลเป็น Null อยู่แล้ว
- ระบบจะไม่เรียกใช้
- ผลกระทบ
- เพิ่ม
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)การจัดคิวอินพุตบิตแมปตามการประทับเวลา - เปลี่ยน
VideoFrameProcessor.registerInputStream()เป็นแบบไม่บล็อก แอปต้องใช้VideoFrameProcessor.Listener#onInputStreamRegistered() - เปลี่ยนพารามิเตอร์
frameRateและdurationUsของVideoFrameProcessor.queueInputBitmapเป็นTimestampIteratorแล้ว
- เพิ่ม
- ส่วนขยาย IMA:
- แก้ไขข้อบกพร่องที่ไลฟ์สดแบบ DASH หลายช่วงเวลาซึ่งไม่ใช่รายการแรกในเพลย์ลิสต์อาจทำให้เกิดข้อยกเว้น (#571)
- ปล่อย StreamManager ก่อนเรียกใช้
AdsLoader.destroy() - อัปเกรด IMA SDK เป็นเวอร์ชัน 3.31.0
- เซสชัน:
- ตั้งค่าลักษณะการทำงานของบริการที่ทำงานอยู่เบื้องหน้าของการแจ้งเตือนเป็น
FOREGROUND_SERVICE_IMMEDIATEในDefaultMediaNotificationProvider(#167) - ใช้เฉพาะ
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()ที่สูงกว่า API 31 เพื่อหลีกเลี่ยงปัญหาเกี่ยวกับ API ที่เลิกใช้งานแล้วในอุปกรณ์ Samsung (#167) - ใช้ตัวควบคุมการแจ้งเตือนสื่อเป็นพร็อกซีเพื่อตั้งค่าคำสั่งที่ใช้ได้และเลย์เอาต์ที่กำหนดเองซึ่งใช้เพื่อสร้างการแจ้งเตือนและเซสชันแพลตฟอร์ม
- แปลงเหตุการณ์ปุ่มสื่อที่
MediaSessionService.onStartCommand()ได้รับภายใน Media3 แทนที่จะกำหนดเส้นทางไปยังเซสชันแพลตฟอร์มและกลับไปยัง Media3 ด้วยเหตุนี้ ตัวควบคุมผู้โทรจึงเป็นตัวควบคุมการแจ้งเตือนสื่อเสมอ และแอปจะจดจำการโทรที่มาจากประกาศในลักษณะเดียวกันได้อย่างง่ายดายในระดับ API ที่รองรับทั้งหมด - แก้ไขข้อบกพร่องที่
MediaController.getCurrentPosition()ไม่ทำงานเมื่อเชื่อมต่อกับMediaSessionCompatรุ่นเดิม - เพิ่ม
MediaLibrarySession.getSubscribedControllers(mediaId)เพื่อความสะดวก - ลบล้าง
MediaLibrarySession.Callback.onSubscribe()เพื่อยืนยันความพร้อมใช้งานของรหัสหลักที่ตัวควบคุมสมัครใช้บริการ หากสำเร็จ ระบบจะยอมรับการสมัครใช้บริการและเรียกใช้notifyChildrenChanged()ทันทีเพื่อแจ้งเบราว์เซอร์ (#561) - เพิ่มโมดูลสาธิตเซสชันสำหรับ Automotive OS และเปิดใช้การสาธิตเซสชันสำหรับ Android Auto
- อย่าตั้งค่าคิวของเซสชันเฟรมเวิร์กเมื่อ
COMMAND_GET_TIMELINEไม่พร้อมใช้งานสำหรับตัวควบคุมการแจ้งเตือนสื่อ เมื่อใช้ Android Auto เป็นตัวควบคุมไคลเอ็นต์ที่อ่านจากเซสชันเฟรมเวิร์ก จะส่งผลให้ปุ่มqueueใน UI ของ Android Auto ไม่แสดง (#339) - ใช้
DataSourceBitmapLoaderโดยค่าเริ่มต้นแทนSimpleBitmapLoader(#271, #327) - เพิ่ม
MediaSession.Callback.onMediaButtonEvent(Intent)ที่อนุญาตให้แอปสามารถลบล้างการจัดการเหตุการณ์ของปุ่มสื่อเริ่มต้นได้
- ตั้งค่าลักษณะการทำงานของบริการที่ทำงานอยู่เบื้องหน้าของการแจ้งเตือนเป็น
- UI:
- เพิ่มการติดตั้งใช้งาน
Player.Listenerสำหรับอุปกรณ์ Wear OS ที่จัดการการระงับการเล่นเนื่องจากPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUTโดยการเปิดกล่องโต้ตอบของระบบเพื่อให้ผู้ใช้เชื่อมต่อเอาต์พุตเสียงที่เหมาะสม (เช่น หูฟังบลูทูธ) Listener จะกลับมาเล่นต่อโดยอัตโนมัติหากมีการเชื่อมต่ออุปกรณ์ที่เหมาะสมภายในระยะหมดเวลาที่กำหนดค่าได้ (ค่าเริ่มต้นคือ 5 นาที)
- เพิ่มการติดตั้งใช้งาน
- ดาวน์โหลด:
- ประกาศประเภทบริการที่ทำงานอยู่เบื้องหน้าเป็น "การซิงค์ข้อมูล" สำหรับ
DownloadServiceเพื่อให้เข้ากันได้กับ Android 14 เมื่อใช้บริการนี้ แอปยังต้องเพิ่มdataSyncเป็นforegroundServiceTypeในไฟล์ Manifest และเพิ่มสิทธิ์FOREGROUND_SERVICE_DATA_SYNC(#11239) ด้วย
- ประกาศประเภทบริการที่ทำงานอยู่เบื้องหน้าเป็น "การซิงค์ข้อมูล" สำหรับ
- ส่วนขยาย HLS
- รีเฟรชเพลย์ลิสต์ไลฟ์สด HLS โดยมีช่วงเวลาที่คำนวณจากเวลาเริ่มต้นโหลดครั้งล่าสุดแทนที่จะเป็นเวลาที่โหลดเสร็จครั้งล่าสุด (#663)
- ส่วนขยาย DASH
- อนุญาตให้มีตัวระบุ DASH เดียวกันหลายรายการใน URL เทมเพลตกลุ่ม
- เพิ่มการรองรับเวอร์ชันทดลองสำหรับการแยกวิเคราะห์คำบรรยายระหว่างการแยกข้อมูล ซึ่งรองรับการรวมคำบรรยายที่ทับซ้อนกันได้ดีขึ้น รวมถึงการแก้ปัญหาการกะพริบเมื่อเปลี่ยนระหว่างส่วนของคำบรรยาย คุณเปิดใช้ฟีเจอร์นี้ได้โดยใช้
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()(#288)
- ส่วนขยาย RTSP:
- แก้ไขภาวะแข่งขันที่อาจทำให้เกิด
IndexOutOfBoundsExceptionเมื่อกลับไปใช้ TCP หรือการเล่นค้างในบางสถานการณ์ - ตรวจสอบสถานะในการตั้งค่า RTSP เมื่อแสดงสถานะการโหลดของ
RtspMediaPeriod(#577) - ละเว้นเมธอดคำขอ RTSP ที่กำหนดเองในส่วนหัวสาธารณะของการตอบกลับ Options (#613)
- ใช้ค่าระยะหมดเวลาของการตอบกลับการตั้งค่า RTSP ในช่วงเวลาของการส่งคำขอตัวเลือก RTSP แบบ Keep-Alive (#662)
- แก้ไขภาวะแข่งขันที่อาจทำให้เกิด
- ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1, MIDI ฯลฯ):
- เปิดตัวโมดูลตัวถอดรหัส MIDI ซึ่งรองรับการเล่นไฟล์ MIDI มาตรฐานโดยใช้ไลบรารี Jsyn เพื่อสังเคราะห์เสียง
- เพิ่ม
DecoderOutputBuffer.shouldBeSkippedเพื่อทำเครื่องหมายบัฟเฟอร์เอาต์พุตที่ไม่จำเป็นต้องแสดงโดยตรง เราขอแนะนำให้ใช้ตัวเลือกนี้แทนC.BUFFER_FLAG_DECODE_ONLYที่จะเลิกใช้งาน - เพิ่ม
Decoder.setOutputStartTimeUsและSimpleDecoder.isAtLeastOutputStartTimeUsเพื่ออนุญาตให้ตัวถอดรหัสทิ้งตัวอย่างแบบถอดรหัสเท่านั้นก่อนเวลาเริ่มต้น เราขอแนะนำให้ใช้เมธอดนี้แทนBuffer.isDecodeOnlyที่จะเลิกใช้งาน - แก้ไขข้อบกพร่องในการเผยแพร่อาร์ติแฟกต์ตัวถอดรหัส MIDI ไปยังที่เก็บ Maven อาร์ติแฟกต์เปลี่ยนชื่อเป็น
media3-exoplayer-midi(#734)
- ส่วนขยาย Leanback:
- แก้ไขข้อบกพร่องที่การปิดใช้แพลตฟอร์มอาจทำให้เกิด
ArithmeticExceptionในโค้ด Leanback (#617)
- แก้ไขข้อบกพร่องที่การปิดใช้แพลตฟอร์มอาจทำให้เกิด
- ยูทิลิตีการทดสอบ
- ทำให้
TestExoPlayerBuilderและFakeClockเข้ากันได้กับการทดสอบ Espresso UI และการทดสอบ Compose UI การดำเนินการนี้จะแก้ไขข้อบกพร่องที่การเล่นดำเนินไปอย่างไม่แน่นอนในระหว่างการโต้ตอบกับมุมมอง Espresso หรือ Compose
- ทำให้
- นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
- นำ
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)และTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)ออก โปรดใช้Composition.Builder.setHdrMode(int)และส่งCompositionไปยังTransformer.start(Composition, String)แทน - นำเมธอด
DownloadNotificationHelper.buildProgressNotificationที่เลิกใช้งานแล้วออก และใช้เมธอดที่ไม่ได้เลิกใช้งานซึ่งใช้พารามิเตอร์notMetRequirementsแทน
- นำ
เวอร์ชัน 1.2.0-rc01
1 พฤศจิกายน 2023
ใช้เวอร์ชันเสถียร 1.2.0
เวอร์ชัน 1.2.0-beta01
19 ตุลาคม 2023
ใช้เวอร์ชันเสถียร 1.2.0
เวอร์ชัน 1.2.0-alpha02
29 กันยายน 2023
ใช้เวอร์ชันเสถียร 1.2.0
เวอร์ชัน 1.2.0-alpha01
17 สิงหาคม 2023
ใช้เวอร์ชันเสถียร 1.2.0
เวอร์ชัน 1.1.0
เวอร์ชัน 1.1.1
16 สิงหาคม 2023
- Common Library:
- นำทรัพยากร Dependency
multidexที่เพิ่มโดยไม่ตั้งใจออกจากโมดูลทั้งหมด (#499)
- นำทรัพยากร Dependency
- ExoPlayer:
- แก้ไขปัญหาใน
PlaybackStatsListenerที่มีการสร้างPlaybackStatsปลอมขึ้นหลังจากล้างเพลย์ลิสต์ - เพิ่มช่องเพิ่มเติมในการบันทึก Common Media Client Data (CMCD) ได้แก่ รูปแบบสตรีมมิง (sf), ประเภทสตรีม (st), เวอร์ชัน (v), อัตราบิตสูงสุด (tb), ระยะเวลาของออบเจ็กต์ (d), อัตราความเร็วที่วัดได้ (mtp) และประเภทออบเจ็กต์ (ot) (#8699)
- แก้ไขปัญหาใน
- เสียง
- แก้ไขข้อบกพร่องที่
Player.getState()ไม่เคยเปลี่ยนเป็นSTATE_ENDEDเมื่อเล่นไฟล์ที่สั้นมาก (#538)
- แก้ไขข้อบกพร่องที่
- การลดภาระการประมวลผลเสียง
- เพิ่มส่วนหัว Ogg ID และหน้าส่วนหัวของความคิดเห็นไว้หน้าบิตสตรีมสำหรับการเล่น Opus ที่ออฟโหลดตาม RFC 7845
- วิดีโอ:
- H.265/HEVC: แก้ไขการแยกวิเคราะห์ข้อมูลภาพอ้างอิงระยะสั้นและระยะยาวของ SPS
- ข้อความ
- CEA-608: เปลี่ยนตรรกะการตัดคิวให้พิจารณาเฉพาะข้อความที่มองเห็นได้ ก่อนหน้านี้ ระบบจะรวมการเยื้องและการชดเชยแท็บเมื่อจำกัดความยาวของคิวไว้ที่ 32 อักขระ (ซึ่งถูกต้องตามข้อกำหนดทางเทคนิค) (#11019)
- ส่วนขยาย IMA:
- อัปเกรดเวอร์ชัน IMA SDK เป็น 3.30.3
- เซสชัน:
- เพิ่มเลย์เอาต์ที่กำหนดเองลงในสถานะของตัวควบคุมและระบุ Getter เพื่อเข้าถึงเลย์เอาต์ดังกล่าว เมื่อเลย์เอาต์ที่กำหนดเองมีการเปลี่ยนแปลง ระบบจะเรียกใช้
MediaController.Listener.onCustomLayoutChangedแอปที่ต้องการส่งเลย์เอาต์ที่กำหนดเองที่แตกต่างกันไปยังตัวควบคุม Media3 ที่แตกต่างกันสามารถทำได้ในMediaSession.Callback.onConnectโดยใช้AcceptedResultBuilderเพื่อให้แน่ใจว่าเลย์เอาต์ที่กำหนดเองพร้อมใช้งานสำหรับตัวควบคุมเมื่อการเชื่อมต่อเสร็จสมบูรณ์ - แก้ไขกรณีที่
MediaLibraryServiceLegacyStubส่งข้อผิดพลาดไปยังResultที่ไม่รองรับ ซึ่งทำให้เกิดUnsupportedOperationException(#78) - แก้ไขวิธีที่
PlayerWrapperสร้างVolumeProviderCompatโดยกำหนดvolumeControlTypeผ่านทั้งคำสั่งเดิม (COMMAND_ADJUST_DEVICE_VOLUMEและCOMMAND_SET_DEVICE_VOLUME) และคำสั่งใหม่ (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGSและCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554)
- เพิ่มเลย์เอาต์ที่กำหนดเองลงในสถานะของตัวควบคุมและระบุ Getter เพื่อเข้าถึงเลย์เอาต์ดังกล่าว เมื่อเลย์เอาต์ที่กำหนดเองมีการเปลี่ยนแปลง ระบบจะเรียกใช้
เวอร์ชัน 1.1.0
5 กรกฎาคม 2023
- Common Library:
- เพิ่มเหตุผลในการระงับสำหรับเส้นทางเสียงที่ไม่เหมาะสม และเล่นเมื่อพร้อม เปลี่ยนเหตุผลสำหรับการระงับนานเกินไป (#15)
- เพิ่มคำสั่งลงใน Player โดยทำดังนี้
COMMAND_GET_METADATACOMMAND_SET_PLAYLIST_METADATACOMMAND_SET_DEVICE_VOLUME_WITH_FLAGSCOMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- เพิ่มเมธอดที่โอเวอร์โหลดลงใน Player ซึ่งช่วยให้ผู้ใช้ระบุแฟล็กระดับเสียงได้ ดังนี้
void setDeviceVolume(int, int)void increaseDeviceVolume(int)void decreaseDeviceVolume(int)void setDeviceMuted(boolean, int)
- เพิ่ม
BuilderสำหรับDeviceInfoและเลิกใช้งานคอนสตรัคเตอร์ที่มีอยู่ - เพิ่ม
DeviceInfo.routingControllerIdเพื่อระบุรหัสตัวควบคุมการกำหนดเส้นทางสำหรับการเล่นระยะไกล - เพิ่ม
Player.replaceMediaItem(s)เป็นทางลัดในการเพิ่มและนำรายการออกที่ตำแหน่งเดียวกัน (#8046)
- ExoPlayer:
- อนุญาตให้ ExoPlayer ควบคุมวิธีการปรับระดับเสียงของอุปกรณ์เฉพาะในกรณีที่เลือกใช้อย่างชัดแจ้งเท่านั้น ใช้
ExoPlayer.Builder.setDeviceVolumeControlEnabledเพื่อเข้าถึงสิ่งต่อไปนี้getDeviceVolume()isDeviceMuted()setDeviceVolume(int)และsetDeviceVolume(int, int)increaseDeviceVolume(int)และincreaseDeviceVolume(int, int)decreaseDeviceVolume(int)และdecreaseDeviceVolume(int, int)
- เพิ่ม
FilteringMediaSourceที่ช่วยให้กรองประเภทแทร็กที่ใช้ได้จากMediaSource - เพิ่มการรองรับการรวมข้อมูลไคลเอ็นต์สื่อทั่วไป (CMCD) ในคำขอขาออกของรูปแบบสตรีมมิงแบบปรับอัตโนมัติ DASH, HLS และ SmoothStreaming มีการรวมช่อง
br,bl,cid,rtpและsid(#8699) โครงสร้าง API และเมธอด API:- การบันทึก CMCD จะปิดใช้อยู่โดยค่าเริ่มต้น ให้ใช้
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)เพื่อเปิดใช้ - คีย์ทั้งหมดจะเปิดใช้โดยค่าเริ่มต้น ให้ลบล้าง
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)เพื่อกรองคีย์ที่บันทึกไว้ออก - ลบล้าง
CmcdConfiguration.RequestConfig.getCustomData()เพื่อเปิดใช้การบันทึกคีย์ที่กำหนดเอง
- การบันทึก CMCD จะปิดใช้อยู่โดยค่าเริ่มต้น ให้ใช้
- เพิ่มการดำเนินการเพิ่มเติมลงในไฟล์ Manifest ของเดโมหลักเพื่อให้เริ่มแอปเดโมด้วยไฟล์
*.exolist.jsonที่กำหนดเองได้ง่ายขึ้น (#439) - เพิ่ม
ExoPlayer.setVideoEffects()สำหรับการใช้Effectระหว่างการเล่นวิดีโอ - อัปเดต
SampleQueueเพื่อจัดเก็บsourceIdเป็นlongแทนที่จะเป็นintซึ่งจะเปลี่ยนซิกเนเจอร์ของเมธอดสาธารณะSampleQueue.sourceIdและSampleQueue.peekSourceId - เพิ่มพารามิเตอร์ลงในเมธอด
LoadControlshouldStartPlaybackและonTracksSelectedที่อนุญาตให้เชื่อมโยงเมธอดเหล่านี้กับMediaPeriodที่เกี่ยวข้อง - เปลี่ยนลายเซ็นของ
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)โดยเพิ่มพารามิเตอร์ไทม์ไลน์ที่มีระยะเวลาพร้อม UID ที่ใช้เป็นคีย์ในแผนที่ ซึ่งจำเป็นเพื่อหลีกเลี่ยงปัญหาการเกิดขึ้นพร้อมกันกับไลฟ์สดแบบหลายช่วงเวลา - เลิกใช้งาน
EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)และBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)คุณสามารถเรียกใช้ตัวแปรของเมธอดที่ไม่มีmediaTimeOffsetUsแทนได้ โปรดทราบว่าแม้แต่ตัวแปรที่เลิกใช้งานแล้ว ระบบก็จะไม่เพิ่มออฟเซ็ตลงในstartTimeUsและendTimeUsของออบเจ็กต์MediaLoadDataที่ส่งโดยโปรแกรมจ่ายงานอีกต่อไป - เปลี่ยนชื่อ
ExoTrackSelection.blacklistเป็นexcludeTrackและisBlacklistedเป็นisTrackExcluded - แก้ไขลักษณะการทำงานที่ไม่สอดคล้องกันระหว่าง
ExoPlayer.setMediaItem(s)และaddMediaItem(s)เมื่อเรียกใช้ในเพลย์ลิสต์ที่ว่างเปล่า
- อนุญาตให้ ExoPlayer ควบคุมวิธีการปรับระดับเสียงของอุปกรณ์เฉพาะในกรณีที่เลือกใช้อย่างชัดแจ้งเท่านั้น ใช้
- Transformer:
- นำ
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)ออก โปรดใช้ExoPlayerAssetLoader.Factory(MediaSource.Factory)และTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)แทน - นำ
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)ออก - แก้ไขข้อบกพร่องที่การเปลี่ยนรูปแบบอาจค้าง (ทำให้ Muxer หมดเวลา) หากมีการส่งสัญญาณจุดสิ้นสุดของสตรีมวิดีโอในขณะที่เฟรมอินพุตรอการประมวลผลอยู่
- ค้นหาตัวแปลงรหัสผ่าน
MediaCodecListแทนการใช้ยูทิลิตีfindDecoder/EncoderForFormatเพื่อขยายการรองรับ - นำการกำหนดค่า B-frame ใน
DefaultEncoderFactoryออกเนื่องจากใช้ไม่ได้ในอุปกรณ์บางเครื่อง
- นำ
- การเลือกแทร็ก
- เพิ่ม
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChangeซึ่งปิดใช้อยู่โดยค่าเริ่มต้น เมื่อเปิดใช้DefaultTrackSelectorจะทริกเกอร์การเลือกแทร็กใหม่เมื่อความสามารถของโปรแกรมแสดงผลมีการเปลี่ยนแปลง
- เพิ่ม
- เครื่องสกัดน้ำผลไม้
- เสียง
- แก้ไขข้อบกพร่องที่การเล่นบางรายการไม่สำเร็จเมื่อเปิดใช้การทันเนลและ
AudioProcessorsทำงานอยู่ เช่น สำหรับการตัดแต่งแบบไม่มีช่องว่าง (#10847) - รวมเฟรม Opus ไว้ในแพ็กเก็ต Ogg ในการเล่นโดยตรง (ออฟโหลด)
- คาดการณ์ตำแหน่งปัจจุบันระหว่างที่อยู่ในโหมดสลีปด้วยการกำหนดเวลาออฟโหลด
- เพิ่ม
Renderer.release()และAudioSink.release()เพื่อปล่อยทรัพยากรเมื่อสิ้นสุดวงจรของโปรแกรมเล่น - ฟังการเปลี่ยนแปลงความสามารถด้านเสียงใน
DefaultAudioSinkเพิ่มพารามิเตอร์contextที่จำเป็นในคอนสตรัคเตอร์ของDefaultAudioSinkซึ่งDefaultAudioSinkจะลงทะเบียนเป็น Listener ของAudioCapabilitiesReceiverและอัปเดตพร็อพเพอร์ตี้audioCapabilitiesเมื่อได้รับแจ้งเกี่ยวกับการเปลี่ยนแปลงความสามารถ - เผยแพร่การเปลี่ยนแปลงความสามารถด้านเสียงผ่านเหตุการณ์ใหม่
onAudioCapabilitiesChangedในอินเทอร์เฟซAudioSink.Listenerและ อินเทอร์เฟซใหม่RendererCapabilities.Listenerซึ่งทริกเกอร์ เหตุการณ์onRendererCapabilitiesChanged - เพิ่ม
ChannelMixingAudioProcessorเพื่อใช้การปรับขนาด/การมิกซ์กับช่องเสียง - เพิ่มค่า int ใหม่
DISCARD_REASON_AUDIO_BYPASS_POSSIBLEลงในDecoderDiscardReasonsเพื่อทิ้งตัวถอดรหัสเสียงเมื่อสามารถใช้โหมดบายพาสได้หลังจากที่ความสามารถด้านเสียงเปลี่ยนแปลง - เพิ่มการรองรับการเล่นโดยตรงสำหรับ DTS Express และ DTS:X (#335)
- แก้ไขข้อบกพร่องที่การเล่นบางรายการไม่สำเร็จเมื่อเปิดใช้การทันเนลและ
- วิดีโอ:
- ทำให้
MediaCodecVideoRendererรายงานVideoSizeที่มีความกว้างและความสูงเป็น 0 เมื่อปิดใช้โปรแกรมแสดงผล ระบบจะเรียกใช้Player.Listener.onVideoSizeChangedตามนั้นเมื่อPlayer.getVideoSize()มีการเปลี่ยนแปลง การเปลี่ยนแปลงนี้ทำให้ขนาดวิดีโอของ ExoPlayer ที่มีMediaCodecVideoRendererมีความกว้างและความสูงเป็น 0 เมื่อPlayer.getCurrentTracksไม่รองรับวิดีโอ หรือยังไม่ได้กำหนดขนาดของแทร็กวิดีโอที่รองรับ
- ทำให้
- DRM:
- ลดระดับการเข้าถึงเมธอดภายในเท่านั้นหลายรายการใน
DefaultDrmSessionซึ่งไม่คาดว่าจะมีการเรียกจากภายนอกแพ็กเกจ DRM ดังนี้void onMediaDrmEvent(int)void provision()void onProvisionCompleted()onProvisionError(Exception, boolean)
- ลดระดับการเข้าถึงเมธอดภายในเท่านั้นหลายรายการใน
- Muxer:
- เพิ่มไลบรารี Muxer ใหม่ที่ใช้สร้างไฟล์คอนเทนเนอร์ MP4 ได้
- ส่วนขยาย IMA:
- เปิดใช้สตรีม DASH แบบสดที่มีหลายช่วงเวลาสำหรับ DAI โปรดทราบว่าการใช้งานในปัจจุบันยังไม่รองรับการกรอในไลฟ์สด (#10912)
- แก้ไขข้อบกพร่องที่มีการแทรกกลุ่มโฆษณาใหม่ในไลฟ์สดเนื่องจากตำแหน่งเนื้อหาที่คำนวณในไทม์ไลน์ที่ต่อเนื่องกันแตกต่างกันเล็กน้อย
- เซสชัน:
- เพิ่มเมธอดตัวช่วย
MediaSession.getControllerForCurrentRequestเพื่อรับข้อมูลเกี่ยวกับตัวควบคุมที่กำลังเรียกใช้เมธอดPlayerอยู่ - เพิ่ม
androidx.media3.session.MediaButtonReceiverเพื่อให้แอปใช้การเล่นต่อด้วยเหตุการณ์ปุ่มสื่อที่ส่งโดยชุดหูฟังบลูทูธ เป็นต้น (#167) - เพิ่มการติดตั้งใช้งานเริ่มต้นลงใน
MediaSession.Callback.onAddMediaItemsเพื่ออนุญาตให้ส่งMediaItemsที่ขอไปยังPlayerหากมีLocalConfiguration(เช่น URI) (#282) - เพิ่มปุ่มคำสั่ง "กรอกลับไปยังก่อนหน้า" และ "กรอไปยังถัดไป" ในมุมมองการแจ้งเตือนสื่อแบบกะทัดรัดโดยค่าเริ่มต้นสำหรับ Android 12 และต่ำกว่า (#410)
- เพิ่มการติดตั้งใช้งานเริ่มต้นลงใน
MediaSession.Callback.onAddMediaItemsเพื่ออนุญาตให้ส่งMediaItemsที่ขอไปยังPlayerหากมีLocalConfiguration(เช่น URI) (#282) - เพิ่มปุ่มคำสั่ง "กรอกลับไปยังก่อนหน้า" และ "กรอไปยังถัดไป" ในมุมมองการแจ้งเตือนสื่อแบบกะทัดรัดโดยค่าเริ่มต้นสำหรับ Android 12 และต่ำกว่า (#410)
- เพิ่มเมธอดตัวช่วย
- UI:
- เพิ่มเมธอด Util
shouldShowPlayButtonและhandlePlayPauseButtonActionเพื่อเขียนองค์ประกอบ UI ที่กำหนดเองด้วยปุ่มเล่น/หยุดชั่วคราว
- เพิ่มเมธอด Util
- ส่วนขยาย RTSP:
- ส่วนขยาย DASH
- นำออฟเซ็ตเวลาของสื่อออกจาก
MediaLoadData.startTimeMsและMediaLoadData.endTimeMsสำหรับสตรีม DASH แบบหลายช่วงเวลา - แก้ไขข้อบกพร่องที่การเตรียมแหล่งที่มาของสื่อ DASH แบบสดที่มีหลายช่วงเวลาอีกครั้งทำให้เกิด
IndexOutOfBoundsException(#10838)
- นำออฟเซ็ตเวลาของสื่อออกจาก
- ส่วนขยาย HLS
- เพิ่ม
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)เพื่อตั้งค่าระยะหมดเวลาสำหรับชุดข้อความการโหลดเพื่อรอให้TimestampAdjusterเริ่มต้น หากการเริ่มต้นไม่เสร็จสมบูรณ์ก่อนหมดเวลา ระบบจะแสดงPlaybackExceptionเพื่อหลีกเลี่ยงไม่ให้การเล่นหยุดชะงักอย่างไม่มีที่สิ้นสุด ระยะหมดเวลาจะตั้งค่าเป็น 0 โดยค่าเริ่มต้น (#323)
- เพิ่ม
- ยูทิลิตีการทดสอบ
- ตรวจสอบการไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ของสคีม URI ใน
DataSourceContractTest
- ตรวจสอบการไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ของสคีม URI ใน
- นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
- นำตัวสร้าง
DefaultAudioSinkออก แล้วใช้DefaultAudioSink.Builderแทน - นำ
HlsMasterPlaylistออก แล้วใช้HlsMultivariantPlaylistแทน - นำ
Player.stop(boolean)ออก โปรดใช้Player.stop()และPlayer.clearMediaItems()(หากresetเป็นtrue) แทน - นำคอนสตรัคเตอร์
SimpleCacheที่เลิกใช้งานแล้ว 2 รายการออก แล้วใช้คอนสตรัคเตอร์ที่ไม่ได้เลิกใช้งานซึ่งใช้DatabaseProviderแทนเพื่อประสิทธิภาพที่ดีขึ้น - นำตัวสร้าง
DefaultBandwidthMeterออก แล้วใช้DefaultBandwidthMeter.Builderแทน - นำคอนสตรัคเตอร์
DefaultDrmSessionManagerออก แล้วใช้DefaultDrmSessionManager.Builderแทน - นำคอนสตรักเตอร์
HttpDataSource.InvalidResponseCodeExceptionที่เลิกใช้งานแล้ว 2 รายการออก แล้วใช้คอนสตรักเตอร์ที่ไม่ได้เลิกใช้งานซึ่งยอมรับฟิลด์เพิ่มเติม(cause,responseBody) เพื่อปรับปรุงการบันทึกข้อผิดพลาด - นำ
DownloadHelper.forProgressive,DownloadHelper.forHls,DownloadHelper.forDashและDownloadHelper.forSmoothStreamingออก แล้วใช้DownloadHelper.forMediaItemแทน - นำเครื่องมือสร้าง
DownloadServiceที่เลิกใช้งานแล้วออก ให้ใช้เครื่องมือสร้างที่ไม่ได้เลิกใช้งานซึ่งมีตัวเลือกในการระบุพารามิเตอร์channelDescriptionResourceId - นำค่าคงที่สตริงที่เลิกใช้งานแล้วสำหรับชุดอักขระ (
ASCII_NAME,UTF8_NAME,ISO88591_NAME,UTF16_NAMEและUTF16LE_NAME) ออก แล้วใช้ชุดอักขระ Kotlin จากแพ็กเกจkotlin.text,java.nio.charset.StandardCharsetsหรือcom.google.common.base.Charsetsแทน - นำคอนสตรักเตอร์
WorkManagerSchedulerที่เลิกใช้งานแล้วออก ให้ใช้คอนสตรักเตอร์ที่ไม่ได้เลิกใช้งานซึ่งมีตัวเลือกในการระบุพารามิเตอร์Contextแทน - นำเมธอดที่เลิกใช้งานแล้วออก ซึ่งได้แก่
createVideoSampleFormat,createAudioSampleFormat,createContainerFormatและcreateSampleFormatซึ่งใช้เพื่อสร้างอินสแตนซ์คลาสFormatแต่ให้ใช้Format.Builderเพื่อสร้างอินสแตนซ์ของFormatแทน - นำเมธอดที่เลิกใช้งานแล้วออก ได้แก่
copyWithMaxInputSize,copyWithSubsampleOffsetUs,copyWithLabel,copyWithManifestFormatInfo,copyWithGaplessInfo,copyWithFrameRate,copyWithDrmInitData,copyWithMetadata,copyWithBitrateและcopyWithVideoSizeโดยใช้Format.buildUpon()และเมธอด Setter แทน - นำ
ExoPlayer.retry()ที่เลิกใช้งานแล้วออก และใช้prepare()แทน - นำตัวสร้าง
DefaultTrackSelectorที่ไม่มีอาร์กิวเมนต์ซึ่งเลิกใช้งานแล้วออก และใช้DefaultTrackSelector(Context)แทน - นำคอนสตรัคเตอร์
OfflineLicenseHelperที่เลิกใช้งานแล้วออก และใช้OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)แทน - นำเครื่องมือสร้าง
DownloadManagerที่เลิกใช้งานแล้วออก และใช้เครื่องมือสร้างที่ใช้Executorแทน - นำตัวสร้าง
Cueที่เลิกใช้งานแล้วออก และใช้Cue.Builderแทน - นำคอนสตรัคเตอร์
OfflineLicenseHelperที่เลิกใช้งานแล้วออก และใช้OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)แทน - นำเมธอด
AnalyticsListenerที่เลิกใช้งานแล้ว 4 รายการออก ดังนี้onDecoderEnabledโปรดใช้onAudioEnabledและ/หรือonVideoEnabledแทนonDecoderInitializedโปรดใช้onAudioDecoderInitializedและ/หรือonVideoDecoderInitializedแทนonDecoderInputFormatChangedโปรดใช้onAudioInputFormatChangedและ/หรือonVideoInputFormatChangedแทนonDecoderDisabledโปรดใช้onAudioDisabledและ/หรือonVideoDisabledแทน
- นำ
Player.Listener.onSeekProcessedและAnalyticsListener.onSeekProcessedที่เลิกใช้งานแล้วออก แล้วใช้onPositionDiscontinuityกับDISCONTINUITY_REASON_SEEKแทน - นำ
ExoPlayer.setHandleWakeLock(boolean)ออก แล้วใช้setWakeMode(int)แทน - นำ
DefaultLoadControl.Builder.createDefaultLoadControl()ที่เลิกใช้งานแล้วออก และใช้build()แทน - นำ
MediaItem.PlaybackPropertiesที่เลิกใช้งานแล้วออก และใช้MediaItem.LocalConfigurationแทน ฟิลด์ที่เลิกใช้งานแล้วMediaItem.playbackPropertiesเป็นประเภทMediaItem.LocalConfigurationแล้ว
- นำตัวสร้าง
เวอร์ชัน 1.1.0-rc01
21 มิถุนายน 2023
ใช้เวอร์ชันเสถียร 1.1.0
เวอร์ชัน 1.1.0-beta01
7 มิถุนายน 2023
ใช้เวอร์ชันเสถียร 1.1.0
เวอร์ชัน 1.1.0-alpha01
10 พฤษภาคม 2023
ใช้เวอร์ชันเสถียร 1.1.0
เวอร์ชัน 1.0.0
เวอร์ชัน 1.0.2
18 พฤษภาคม 2023
androidx.media3:media3-*:1.0.2 เผยแพร่แล้ว เวอร์ชัน 1.0.2 มีคอมมิตเหล่านี้
รุ่นนี้สอดคล้องกับรุ่น ExoPlayer 2.18.7
รุ่นนี้มีการเปลี่ยนแปลงต่อไปนี้ตั้งแต่รุ่น 1.0.1
- ไลบรารีหลัก
- เพิ่ม
Buffer.isLastSample()ที่ระบุว่าBufferมีแฟล็กC.BUFFER_FLAG_LAST_SAMPLEหรือไม่ - แก้ไขปัญหาที่เฟรมสุดท้ายอาจไม่แสดงผลหากตัวอย่างสุดท้ายที่มีเฟรมถูกนำออกจากคิวโดยไม่อ่านตัวอย่าง "สิ้นสุดสตรีม" (#11079)
- เพิ่ม
- เครื่องสกัดน้ำผลไม้
- แก้ไขการแยกวิเคราะห์ H.265 SPS ในไฟล์ MPEG-TS โดยใช้ตรรกะการแยกวิเคราะห์ที่ใช้โดยเครื่องมือแยก RTSP และ MP4 ซ้ำ (#303)
- ข้อความ
- SSA: เพิ่มการรองรับไฟล์ UTF-16 หากไฟล์เริ่มต้นด้วยเครื่องหมายลำดับไบต์ (#319)
- เซสชัน:
- แก้ไขปัญหาที่
MediaControllerไม่อัปเดตคำสั่งที่ใช้ได้เมื่อเชื่อมต่อกับMediaSessionCompatรุ่นเดิมที่อัปเดตการดำเนินการ - แก้ไขข้อบกพร่องที่ทำให้
MediaLibraryServiceไม่แสดงผลเป็น Null สำหรับการเรียกจาก System UI ไปยังCallback.onGetLibraryRootด้วยparams.isRecent == trueใน API 30 (#355) - แก้ไขหน่วยความจำรั่วไหลของ
MediaSessionServiceหรือMediaLibraryService(#346) - แก้ไขข้อบกพร่องที่การอัปเดต
Timelineและตำแหน่งร่วมกันในMediaSessionอาจทำให้MediaControllerแสดงIllegalStateException
- แก้ไขปัญหาที่
เวอร์ชัน 1.0.1
18 เมษายน 2023
androidx.media3:media3-*:1.0.1 เผยแพร่แล้ว เวอร์ชัน 1.0.1 มีคอมมิตเหล่านี้
รุ่นนี้สอดคล้องกับรุ่น ExoPlayer 2.18.6
- ไลบรารีหลัก
- รีเซ็ตการลบล้างไลฟ์สดเป้าหมายเมื่อกรอไปยังตำแหน่งเริ่มต้น (#11051)
- แก้ไขข้อบกพร่องที่สตรีมตัวอย่างที่ว่างเปล่าในสื่ออาจทำให้การเล่นค้าง
- เซสชัน:
- แก้ไขข้อบกพร่องที่รายการคิวที่เหมือนกันหลายรายการซึ่งเผยแพร่โดย
MediaSessionCompatเดิมส่งผลให้เกิดข้อยกเว้นในMediaController(#290) - เพิ่มการส่งต่อ
MediaSession.broadcastCustomCommandที่ขาดหายไปไปยังMediaControllerCompat.Callback.onSessionEventเดิม (#293) - แก้ไขข้อบกพร่องที่การเรียก
MediaSession.setPlayerไม่อัปเดตคำสั่งที่ใช้ได้ - แก้ไขปัญหาที่ระบบละเว้นอินสแตนซ์
TrackSelectionOverrideที่ส่งจากMediaControllerหากอ้างอิงกลุ่มที่มีFormat.metadata(#296) - แก้ไขปัญหาที่
Player.COMMAND_GET_CURRENT_MEDIA_ITEMต้องพร้อมใช้งานเพื่อเข้าถึงข้อมูลเมตาผ่านMediaSessionCompatเดิม - แก้ไขปัญหาที่อินสแตนซ์
MediaSessionในเทรดเบื้องหลังทำให้เกิดข้อขัดข้องเมื่อใช้ในMediaSessionService(#318) - แก้ไขปัญหาที่ไลบรารีประกาศตัวรับปุ่มสื่อโดยที่แอปไม่ได้ตั้งใจให้เป็นเช่นนี้ (#314)
- แก้ไขข้อบกพร่องที่รายการคิวที่เหมือนกันหลายรายการซึ่งเผยแพร่โดย
- DASH:
- แก้ไขการจัดการไทม์ไลน์ของกลุ่มที่ว่างเปล่า (#11014)
- RTSP:
- ลองอีกครั้งด้วย TCP หากการตั้งค่า RTSP ด้วย UDP ไม่สำเร็จโดยมีข้อผิดพลาด RTSP 461 UnsupportedTransport (#11069)
เวอร์ชัน 1.0.0
22 มีนาคม 2023
androidx.media3:media3-*:1.0.0 เผยแพร่แล้ว เวอร์ชัน 1.0.0 มีคอมมิตเหล่านี้
รุ่นนี้สอดคล้องกับรุ่น ExoPlayer 2.18.5
ไม่มีการเปลี่ยนแปลงตั้งแต่ 1.0.0-rc02
เวอร์ชัน 1.0.0-rc02
2 มีนาคม 2023
androidx.media3:media3-*:1.0.0-rc02 เผยแพร่แล้ว เวอร์ชัน 1.0.0-rc02 มีคอมมิตเหล่านี้
รุ่นนี้สอดคล้องกับรุ่น ExoPlayer 2.18.4
- ไลบรารีหลัก
- ดาวน์โหลด:
- ทำให้ความแตกต่างสูงสุดของเวลาเริ่มต้นของ 2 ส่วนที่จะผสานรวมสามารถกำหนดค่าได้ใน
SegmentDownloaderและคลาสย่อย (#248)
- ทำให้ความแตกต่างสูงสุดของเวลาเริ่มต้นของ 2 ส่วนที่จะผสานรวมสามารถกำหนดค่าได้ใน
- เสียง
- วิดีโอ:
- แมปรูปแบบ HEVC HDR10 กับ
HEVCProfileMain10HDR10แทนHEVCProfileMain10 - เพิ่มวิธีแก้ปัญหาเกี่ยวกับอุปกรณ์ใน Chromecast พร้อม Google TV และ Lenovo M10 FHD Plus ที่ทำให้ระบบทำเครื่องหมายสตรีม AVC 60 FPS ว่าไม่รองรับ (#10898)
- แก้ไขปัญหาด้านประสิทธิภาพการแสดงผลเฟรมเมื่อเล่นสื่อที่มีอัตราเฟรมสูงกว่าอัตราการรีเฟรชหน้าจอมาก
- แมปรูปแบบ HEVC HDR10 กับ
- นักแสดง
- แก้ไขปัญหา
STATE_IDLEชั่วคราวเมื่อเปลี่ยนระหว่างรายการสื่อ (#245)
- แก้ไขปัญหา
- RTSP:
- ตรวจจับ IllegalArgumentException ที่เกิดขึ้นในการแยกวิเคราะห์ข้อความอธิบายการตอบกลับ RTSP ที่ไม่ถูกต้อง (#10971)
- เซสชัน:
- แก้ไขข้อบกพร่องที่ปุ่มเล่น/หยุดชั่วคราวของการแจ้งเตือนไม่อัปเดตตามสถานะโปรแกรมเล่น (#192)
- ส่วนขยาย IMA:
- แก้ไขข้อบกพร่องที่ทำให้สตรีม DAI ที่ไม่มีโฆษณาไม่เริ่มทำงานเนื่องจากไม่ได้รับเหตุการณ์
LOADEDแรก (และในกรณีที่ไม่มีโฆษณาจะเป็นเหตุการณ์เดียว)
- แก้ไขข้อบกพร่องที่ทำให้สตรีม DAI ที่ไม่มีโฆษณาไม่เริ่มทำงานเนื่องจากไม่ได้รับเหตุการณ์
เวอร์ชัน 1.0.0-rc01
16 กุมภาพันธ์ 2023
androidx.media3:media3-*:1.0.0-rc01 เผยแพร่แล้ว เวอร์ชัน 1.0.0-rc01 มีคอมมิตเหล่านี้
รุ่นนี้สอดคล้องกับรุ่น ExoPlayer 2.18.3
- ไลบรารีหลัก
- ปรับแต่งตรรกะการจัดลำดับตัวถอดรหัสของโปรแกรมแสดงผลเพื่อรักษาค่ากำหนดของ
MediaCodecSelectorแม้ว่าตัวถอดรหัสจะรายงานว่าอาจไม่สามารถเล่นสื่อได้อย่างมีประสิทธิภาพ ตัวอย่างเช่น เมื่อใช้ตัวเลือกเริ่มต้น ระบบจะเลือกใช้ตัวถอดรหัสฮาร์ดแวร์ที่มีการรองรับเฉพาะฟังก์ชันการทำงานมากกว่าตัวถอดรหัสซอฟต์แวร์ที่รองรับรูปแบบอย่างเต็มรูปแบบ (#10604) - เพิ่ม
ExoPlayer.Builder.setPlaybackLooperที่ตั้งค่าชุดข้อความการเล่นที่มีอยู่แล้วสำหรับอินสแตนซ์ ExoPlayer ใหม่ - อนุญาตให้ล้างตัวช่วย Download Manager (#10776)
- เพิ่มพารามิเตอร์ลงใน
BasePlayer.seekToเพื่อระบุคำสั่งที่ใช้สำหรับการกรอด้วย - ใช้ธีมเมื่อโหลด Drawable ใน API 21 ขึ้นไป (#220)
- เพิ่ม
ConcatenatingMediaSource2ที่ช่วยให้รวมรายการสื่อหลายรายการไว้ในหน้าต่างเดียวได้ (#247)
- ปรับแต่งตรรกะการจัดลำดับตัวถอดรหัสของโปรแกรมแสดงผลเพื่อรักษาค่ากำหนดของ
- เครื่องสกัดน้ำผลไม้
- แสดง
ParserExceptionแทนNullPointerExceptionหากตารางตัวอย่าง (stbl) ไม่มีคำอธิบายตัวอย่าง (stsd) ที่จำเป็นเมื่อแยกวิเคราะห์อะตอม trak - ข้ามตัวอย่างอย่างถูกต้องเมื่อกรอไปยังเฟรมการซิงค์ใน fMP4 โดยตรง (#10941)
- แสดง
- เสียง
- ใช้บิตเรตรูปแบบเสียงที่บีบอัดเพื่อคำนวณขนาดบัฟเฟอร์ขั้นต่ำสำหรับ
AudioTrackในการเล่นโดยตรง (พาสทรู)
- ใช้บิตเรตรูปแบบเสียงที่บีบอัดเพื่อคำนวณขนาดบัฟเฟอร์ขั้นต่ำสำหรับ
- ข้อความ
- แก้ไข
TextRendererที่ส่งดัชนีที่ไม่ถูกต้อง (ค่าลบ) ไปยังSubtitle.getEventTimeหากไฟล์คำบรรยายไม่มีคิว - SubRip: เพิ่มการรองรับไฟล์ UTF-16 หากไฟล์เริ่มต้นด้วยเครื่องหมายลำดับไบต์
- แก้ไข
- ข้อมูลเมตา
- แยกวิเคราะห์ค่าที่คั่นด้วยค่าว่างหลายค่าจากเฟรม ID3 ตามที่ ID3 v2.4 อนุญาต
- เพิ่ม
MediaMetadata.mediaTypeเพื่อระบุประเภทเนื้อหาหรือประเภทของโฟลเดอร์ที่อธิบายโดยข้อมูลเมตา - เพิ่ม
MediaMetadata.isBrowsableเพื่อแทนที่MediaMetadata.folderTypeชนิดโฟลเดอร์จะเลิกใช้งานในรุ่นถัดไป
- DASH:
- เพิ่มการแยกวิเคราะห์แบบเต็มสำหรับชุดการปรับรูปภาพ รวมถึงจำนวนไทล์ (#3752)
- UI:
- แก้ไข
PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener)ที่เลิกใช้งานแล้วเพื่อให้แน่ใจว่าระบบจะส่งต่อการเปลี่ยนแปลงระดับการมองเห็นไปยัง Listener ที่ลงทะเบียนไว้ (#229) - แก้ไขการจัดลำดับตัวควบคุมวิดีโอเพลเยอร์ตรงกลางใน
PlayerViewเมื่อใช้เลย์เอาต์แบบขวาไปซ้าย (RTL) (#227)
- แก้ไข
- เซสชัน:
- เพิ่ม
SimpleBasePlayerนามธรรมเพื่อช่วยใช้อินเทอร์เฟซPlayerสำหรับเพลเยอร์ที่กำหนดเอง - เพิ่มเมธอดตัวช่วยเพื่อแปลงโทเค็นของเซสชันแพลตฟอร์มเป็น Media3
SessionToken(#171) - ใช้
onMediaMetadataChangedเพื่อทริกเกอร์การอัปเดตเซสชันสื่อของแพลตฟอร์ม (#219) - เพิ่มเซสชันสื่อเป็นอาร์กิวเมนต์ของ
getMediaButtons()ของDefaultMediaNotificationProviderและใช้รายการที่เปลี่ยนแปลงไม่ได้เพื่อความชัดเจน (#216) - เพิ่ม Listener Callback
onSetMediaItemsเพื่อให้สามารถแก้ไข/ตั้งค่ารายการMediaItemดัชนีเริ่มต้น และตำแหน่งตามเซสชันก่อนตั้งค่าลงในเพลเยอร์ (#156) - หลีกเลี่ยงการตรวจจับการแตะสองครั้งสำหรับเหตุการณ์ปุ่มสื่อที่ไม่ใช่บลูทูธ (#233)
- ทำให้
QueueTimelineมีประสิทธิภาพมากขึ้นในกรณีที่สถานะเซสชันเดิมไม่น่าเชื่อถือ (#241)
- เพิ่ม
- ข้อมูลเมตา
- แยกวิเคราะห์ค่าที่คั่นด้วยค่าว่างหลายค่าจากเฟรม ID3 ตามที่ ID3 v2.4 อนุญาต
- เพิ่ม
MediaMetadata.mediaTypeเพื่อระบุประเภทเนื้อหาหรือประเภทของโฟลเดอร์ที่อธิบายโดยข้อมูลเมตา - เพิ่ม
MediaMetadata.isBrowsableเพื่อแทนที่MediaMetadata.folderTypeชนิดโฟลเดอร์จะเลิกใช้งานในรุ่นถัดไป
- ส่วนขยาย Cast:
- อัปเกรด Cast SDK เป็นเวอร์ชัน 21.2.0
- ส่วนขยาย IMA:
- นำ Listener ของเพลเยอร์ของ
ImaServerSideAdInsertionMediaSourceออกในชุดข้อความของแอปพลิเคชันเพื่อหลีกเลี่ยงปัญหาเกี่ยวกับชุดข้อความ - เพิ่มพร็อพเพอร์ตี้
focusSkipButtonWhenAvailableลงในImaServerSideAdInsertionMediaSource.AdsLoader.Builderเพื่อขอให้โฟกัสที่ปุ่มข้ามบนอุปกรณ์ทีวี และตั้งค่าเป็น "จริง" โดยค่าเริ่มต้น - เพิ่มเมธอด
focusSkipButton()ลงในImaServerSideAdInsertionMediaSource.AdsLoaderเพื่อส่งคำขอแบบเป็นโปรแกรมให้โฟกัสที่ปุ่มข้าม - อัปเกรด IMA SDK เป็นเวอร์ชัน 3.29.0
- นำ Listener ของเพลเยอร์ของ
- แอปสาธิต:
- ขอสิทธิ์การแจ้งเตือนสำหรับการแจ้งเตือนการดาวน์โหลดที่รันไทม์ (#10884)
เวอร์ชัน 1.0.0-beta03
22 พฤศจิกายน 2022
androidx.media3:media3-*:1.0.0-beta03 เผยแพร่แล้ว เวอร์ชัน 1.0.0-beta03 มีคอมมิตเหล่านี้
รุ่นนี้สอดคล้องกับรุ่น ExoPlayer 2.18.2
- ไลบรารีหลัก
- เพิ่ม
ExoPlayer.isTunnelingEnabledเพื่อตรวจสอบว่ามีการเปิดใช้การทันเนลสำหรับแทร็กที่เลือกไว้ในปัจจุบันหรือไม่ (#2518) - เพิ่ม
WrappingMediaSourceเพื่อให้รวมMediaSourceรายการเดียวได้ง่ายขึ้น (#7279) - ทิ้งบัฟเฟอร์ย้อนหลังก่อนที่การเล่นจะค้างเนื่องจากหน่วยความจำที่ใช้ได้ไม่เพียงพอ
- ปิดบล็อก "doSomeWork" ของการติดตามเมื่อเปิดใช้การออฟโหลด
- แก้ไขปัญหาการติดตามเซสชันด้วยการกรออย่างรวดเร็วใน
PlaybackStatsListener(#180) - ส่ง Callback
onMediaItemTransitionที่ขาดหายไปเมื่อเรียกใช้seekToNextหรือseekToPreviousในเพลย์ลิสต์ที่มีรายการเดียว (#10667) - เพิ่ม
Player.getSurfaceSizeที่แสดงขนาดของแพลตฟอร์มที่แสดงผลวิดีโอ - แก้ไขข้อบกพร่องที่การนำ Listener ออกระหว่างการเผยแพร่เพลเยอร์อาจทำให้เกิด
IllegalStateException(#10758)
- เพิ่ม
- สร้าง:
- บังคับใช้
compileSdkVersionขั้นต่ำเพื่อหลีกเลี่ยงข้อผิดพลาดในการคอมไพล์ (#10684) - หลีกเลี่ยงการเผยแพร่บล็อกเมื่อรวมอยู่ในบิลด์ Gradle อื่น
- บังคับใช้
- การเลือกแทร็ก
- เลือกแทร็กอื่นแทน Dolby Vision หากจอแสดงผลไม่รองรับ (#8944)
- ดาวน์โหลด:
- วิดีโอ:
- ลองใช้ตัวถอดรหัสอื่นสำหรับ Dolby Vision หากจอแสดงผลไม่รองรับ (#9794)
- เสียง
- ใช้
SingleThreadExecutorสำหรับการปล่อยอินสแตนซ์AudioTrackเพื่อหลีกเลี่ยงข้อผิดพลาด OutOfMemory เมื่อปล่อยเพลเยอร์หลายรายการพร้อมกัน (#10057) - เพิ่ม
AudioOffloadListener.onExperimentalOffloadedPlaybackสำหรับสถานะการออฟโหลด AudioTrack (#134) - ทำให้
AudioTrackBufferSizeProviderเป็นอินเทอร์เฟซสาธารณะ - เพิ่ม
ExoPlayer.setPreferredAudioDeviceเพื่อตั้งค่าอุปกรณ์เอาต์พุตเสียงที่ต้องการ (#135) - เปลี่ยนชื่อ
androidx.media3.exoplayer.audio.AudioProcessorเป็นandroidx.media3.common.audio.AudioProcessor - แมปเสียง 8 ช่องและ 12 ช่องกับมาสก์ช่อง 7.1 และ 7.1.4 ตามลำดับใน Android ทุกเวอร์ชัน (#10701)
- ใช้
- ข้อมูลเมตา
- ตอนนี้คุณสามารถกำหนดค่า
MetadataRendererให้แสดงผลข้อมูลเมตาทันทีที่พร้อมใช้งานได้แล้ว สร้างอินสแตนซ์ด้วยMetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)เพื่อระบุว่าโปรแกรมแสดงผลจะแสดงผลข้อมูลเมตาก่อนหรือซิงค์กับตำแหน่งของเพลเยอร์
- ตอนนี้คุณสามารถกำหนดค่า
- DRM:
- แก้ปัญหาข้อบกพร่องในการติดตั้งใช้งาน ClearKey ของ Android 13 ซึ่งแสดงผล URL ใบอนุญาตที่ไม่ว่างเปล่าแต่ไม่ถูกต้อง
- แก้ไขข้อผิดพลาด
setMediaDrmSession failed: session not openedเมื่อสลับระหว่างรูปแบบ DRM ในเพลย์ลิสต์ (เช่น Widevine เป็น ClearKey)
- ข้อความ
- CEA-608: ตรวจสอบว่าคำสั่งสวิตช์บริการในฟิลด์ 2 ได้รับการจัดการอย่างถูกต้อง (#10666)
- DASH:
- แยกวิเคราะห์
EventStream.presentationTimeOffsetจากไฟล์ Manifest (#10460)
- แยกวิเคราะห์
- UI:
- ใช้การลบล้างปัจจุบันของเพลเยอร์ตามที่กำหนดไว้ล่วงหน้าใน
TrackSelectionDialogBuilder(#10429)
- ใช้การลบล้างปัจจุบันของเพลเยอร์ตามที่กำหนดไว้ล่วงหน้าใน
- เซสชัน:
- ตรวจสอบว่ามีการเรียกใช้คำสั่งตามลำดับที่ถูกต้องเสมอ แม้ว่าบางคำสั่งจะต้องมีการแก้ไขแบบอะซิงโครนัส (#85)
- เพิ่ม
DefaultMediaNotificationProvider.Builderเพื่อสร้างอินสแตนซ์DefaultMediaNotificationProviderเครื่องมือสร้างสามารถกำหนดค่ารหัสการแจ้งเตือน รหัสช่องทางการแจ้งเตือน และชื่อช่องทางการแจ้งเตือนที่ผู้ให้บริการใช้ นอกจากนี้ ให้เพิ่มเมธอดDefaultMediaNotificationProvider.setSmallIcon(int)เพื่อตั้งค่าไอคอนขนาดเล็กของการแจ้งเตือน (#104) - ตรวจสอบว่าคำสั่งที่ส่งก่อน
MediaController.release()ไม่ถูกยกเลิก (#99) SimpleBitmapLoaderสามารถโหลดบิตแมปจาก URIfile://ได้ (#108)- แก้ไขการยืนยันที่ป้องกันไม่ให้
MediaControllerค้นหาโฆษณาในระยะเวลาหนึ่ง (#122) - เมื่อการเล่นสิ้นสุดลง ระบบจะหยุด
MediaSessionServiceจากเบื้องหน้าและแสดงการแจ้งเตือนให้เริ่มเล่นรายการสื่อที่เล่นล่าสุดอีกครั้ง (#112) - อย่าเริ่มบริการที่ทำงานอยู่เบื้องหน้าด้วย Intent รอดำเนินการสำหรับการหยุดชั่วคราว (#167)
- ซ่อน "ป้าย" ที่เชื่อมโยงกับการแจ้งเตือนที่สร้างโดย
DefaultNotificationProviderใน API 26 และ API 27 ด้วยตนเอง (ป้ายจะซ่อนโดยอัตโนมัติใน API 28 ขึ้นไป) (#131) - แก้ไขข้อบกพร่องที่การเชื่อมต่อ Binder ครั้งที่ 2 จาก MediaSession เดิมไปยัง Media3 MediaController ทำให้เกิด IllegalStateExceptions (#49)
- RTSP:
- IMA:
- ส่วนขยาย FFmpeg:
- เพิ่มแฟล็กที่จำเป็นใหม่เพื่อลิงก์ไลบรารี FFmpeg กับ NDK 23.1.7779620 ขึ้นไป (#9933)
- ส่วนขยาย AV1:
- อัปเดตเวอร์ชัน CMake เพื่อหลีกเลี่ยงความไม่เข้ากันกับ Android Studio รุ่นล่าสุด (#9933)
- ส่วนขยาย Cast:
- ใช้
getDeviceInfo()เพื่อให้สามารถระบุCastPlayerเมื่อควบคุมการเล่นด้วยMediaController(#142)
- ใช้
- Transformer:
- เพิ่มตัวจับเวลา Watchdog ของ Muxer เพื่อตรวจจับเมื่อการสร้างตัวอย่างเอาต์พุตช้าเกินไป
- นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
- นำ
Transformer.Builder.setOutputMimeType(String)ออก เรานำฟีเจอร์นี้ออกแล้ว ประเภท MIME จะเป็น MP4 เสมอเมื่อใช้ Muxer เริ่มต้น
- นำ
เวอร์ชัน 1.0.0-beta02
21 กรกฎาคม 2022
androidx.media3:media3-*:1.0.0-beta02 เผยแพร่แล้ว เวอร์ชัน 1.0.0-beta02 มีคอมมิตเหล่านี้
รุ่นนี้สอดคล้องกับรุ่น ExoPlayer 2.18.1
- ไลบรารีหลัก
- ตรวจสอบว่าการเปลี่ยน
ShuffleOrderด้วยExoPlayer.setShuffleOrderส่งผลให้มีการเรียกใช้Player.Listener#onTimelineChangedด้วยreason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED(#9889) - สำหรับสื่อแบบโปรเกรสซีฟ ให้รวมเฉพาะแทร็กที่เลือกไว้ในตำแหน่งที่บัฟเฟอร์ (#10361)
- อนุญาตให้ใช้ตัวบันทึกที่กำหนดเองสำหรับเอาต์พุตบันทึก ExoPlayer ทั้งหมด (#9752)
- แก้ไขการติดตั้งใช้งาน
setDataSourceFactoryในDefaultMediaSourceFactoryซึ่งไม่ทำงานในบางกรณี (#116)
- ตรวจสอบว่าการเปลี่ยน
- เครื่องสกัดน้ำผลไม้
- DASH:
- แยกวิเคราะห์ URL ใบอนุญาต ClearKey จากไฟล์ Manifest (#10246)
- UI:
- ตรวจสอบว่า TalkBack ประกาศตัวเลือกความเร็วที่ใช้งานอยู่ในปัจจุบันในเมนูตัวควบคุมการเล่น (#10298)
- RTSP:
- เพิ่มการจัดการแพ็กเก็ตที่แยกส่วน VP8 (#110)
- ส่วนขยาย Leanback:
- ฟังการเปลี่ยนแปลงของ
playWhenReadyในLeanbackAdapter(10420)
- ฟังการเปลี่ยนแปลงของ
- นักแสดง
เวอร์ชัน 1.0.0-beta01
16 มิถุนายน 2022
androidx.media3:media3-*:1.0.0-beta01 เผยแพร่แล้ว เวอร์ชัน 1.0.0-beta01 มีคอมมิตเหล่านี้
ซึ่งสอดคล้องกับรุ่น ExoPlayer 2.18.0
- ไลบรารีหลัก
- เปิดใช้การสนับสนุนสำหรับการวินิจฉัยแพลตฟอร์ม Android ผ่าน
MediaMetricsManagerExoPlayer จะส่งต่อเหตุการณ์การเล่นและข้อมูลประสิทธิภาพไปยังแพลตฟอร์ม ซึ่งจะช่วยให้ข้อมูลประสิทธิภาพของระบบและการแก้ไขข้อบกพร่องในอุปกรณ์ นอกจากนี้ Google อาจรวบรวมข้อมูลนี้ด้วยหากผู้ใช้อุปกรณ์เปิดใช้การแชร์ข้อมูลการใช้งานและการวินิจฉัย แอปสามารถเลือกไม่ใช้การมีส่วนร่วมในการวินิจฉัยแพลตฟอร์มสำหรับ ExoPlayer ด้วยExoPlayer.Builder.setUsePlatformDiagnostics(false) - แก้ไขข้อบกพร่องที่แทร็กถูกรีเซ็ตบ่อยเกินไปเมื่อใช้
MergingMediaSourceเช่น เมื่อโหลดคำบรรยายจากภายนอกและเปลี่ยนคำบรรยายที่เลือกระหว่างการเล่น (#10248) - หยุดตรวจจับประเภทเครือข่าย 5G-NSA ใน API 29 และ 30 การเล่นเหล่านี้จะถือว่าใช้เครือข่าย 4G
- ไม่อนุญาตให้ส่ง
nullไปยังMediaSource.Factory.setDrmSessionManagerProviderและMediaSource.Factory.setLoadErrorHandlingPolicyคุณสามารถส่งอินสแตนซ์ของDefaultDrmSessionManagerProviderและDefaultLoadErrorHandlingPolicyได้อย่างชัดเจนหากจำเป็น - เพิ่ม
MediaItem.RequestMetadataเพื่อแสดงข้อมูลเมตาที่จำเป็นในการเล่นสื่อเมื่อไม่ทราบLocalConfigurationที่แน่นอน นอกจากนี้ ให้นำMediaMetadata.mediaUrlออกด้วย เนื่องจากตอนนี้รวมอยู่ในRequestMetadataแล้ว - เพิ่ม
Player.Command.COMMAND_SET_MEDIA_ITEMเพื่อให้ผู้เล่นอนุญาตการตั้งค่ารายการเดียวได้
- เปิดใช้การสนับสนุนสำหรับการวินิจฉัยแพลตฟอร์ม Android ผ่าน
- การเลือกแทร็ก
- รวมคลาส
TrackSelectionOverridesเข้ากับTrackSelectionParametersและเลื่อนระดับTrackSelectionOverrideเป็นคลาสระดับบนสุด - เปลี่ยนชื่อ
TracksInfoเป็นTracksและTracksInfo.TrackGroupInfoเป็นTracks.Groupนอกจากนี้Player.getCurrentTracksInfoและPlayer.Listener.onTracksInfoChangedยังเปลี่ยนชื่อเป็นPlayer.getCurrentTracksและPlayer.Listener.onTracksChangedด้วย ซึ่งรวมถึงการ "ยกเลิกการเลิกใช้งาน" ชื่อเมธอดPlayer.Listener.onTracksChangedแต่ใช้ประเภทพารามิเตอร์ที่ต่างกัน - เปลี่ยน
DefaultTrackSelector.buildUponParametersและDefaultTrackSelector.Parameters.buildUponเพื่อแสดงผลDefaultTrackSelector.Parameters.BuilderแทนDefaultTrackSelector.ParametersBuilderที่เลิกใช้งานแล้ว - เพิ่ม
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilitiesซึ่งเปิดใช้อยู่โดยค่าเริ่มต้น เมื่อเปิดใช้DefaultTrackSelectorจะเลือกแทร็กเสียงที่มีจำนวนช่องสัญญาณไม่เกินความสามารถเอาต์พุตของอุปกรณ์ ในอุปกรณ์พกพาDefaultTrackSelectorจะเลือกใช้รูปแบบเสียงสเตอริโอ/โมโนมากกว่ารูปแบบเสียงหลายช่องทาง เว้นแต่รูปแบบเสียงหลายช่องทางจะสามารถปรับเป็นเสียงรอบทิศทางได้ (Android 12L ขึ้นไป) หรือเป็นรูปแบบเสียงเซอร์ราวด์ของ Dolby นอกจากนี้ ในอุปกรณ์ที่รองรับการสร้างเสียงรอบทิศทางDefaultTrackSelectorจะตรวจสอบการเปลี่ยนแปลงในพร็อพเพอร์ตี้ Spatializer และทริกเกอร์การเลือกแทร็กใหม่ตามพร็อพเพอร์ตี้เหล่านี้ อุปกรณ์ที่มีtelevisionโหมด UI จะได้รับการยกเว้นจากข้อจำกัดเหล่านี้ และระบบจะเลือกใช้รูปแบบที่มีจำนวนช่องสัญญาณสูงสุด หากต้องการเปิดใช้ฟีเจอร์นี้ อินสแตนซ์DefaultTrackSelectorต้องสร้างขึ้นด้วยContext
- รวมคลาส
- วิดีโอ:
- เปลี่ยนชื่อ
DummySurfaceเป็นPlaceholderSurface - เพิ่มการรองรับ AV1 ไปยัง
MediaCodecVideoRenderer.getCodecMaxInputSize
- เปลี่ยนชื่อ
- เสียง
- ใช้ตัวถอดรหัสเสียง LG AC3 ที่โฆษณาประเภท MIME ที่ไม่ใช่มาตรฐาน
- เปลี่ยนประเภทการแสดงผลของ
AudioAttributes.getAudioAttributesV21()จากandroid.media.AudioAttributesเป็นคลาส WrapperAudioAttributesV21ใหม่ เพื่อป้องกันการยืนยัน ART ที่ช้าใน API < 21 - ค้นหาแพลตฟอร์ม (API 29 ขึ้นไป) หรือสมมติจำนวนช่องการเข้ารหัสเสียงสำหรับการส่งผ่านเสียงเมื่อไม่ได้ตั้งค่าจำนวนช่องเสียงของรูปแบบ ซึ่งเกิดขึ้นกับการเตรียมแบบไม่มีกลุ่มข้อมูลของ HLS (10204)
- กำหนดค่า
AudioTrackด้วยมาสก์ช่องสัญญาณAudioFormat.CHANNEL_OUT_7POINT1POINT4หากตัวถอดรหัสส่งออกเสียง PCM แบบ 12 ช่องสัญญาณ (#10322
- DRM
- ตรวจสอบว่าเซสชัน DRM ได้รับการอัปเดตอย่างถูกต้องเสมอเมื่อกรอวิดีโอทันทีหลังจากเปลี่ยนรูปแบบ (10274)
- ข้อความ
- เปลี่ยน
Player.getCurrentCues()เพื่อแสดงCueGroupแทนList<Cue> - SSA: รองรับการตั้งค่าสไตล์
OutlineColourเมื่อBorderStyle == 3(เช่นOutlineColourตั้งค่าพื้นหลังของคิว) (#8435) - CEA-708: แยกวิเคราะห์ข้อมูลเป็นบล็อกบริการหลายบล็อก และละเว้นบล็อกที่ไม่เชื่อมโยงกับหมายเลขบริการที่เลือกในปัจจุบัน
- นำ
RawCcExtractorออก ซึ่งใช้เพื่อจัดการรูปแบบคำบรรยายภายในของ Google เท่านั้น
- เปลี่ยน
- เครื่องสกัดน้ำผลไม้
- UI:
- แก้ไขการส่งเหตุการณ์ไปยัง
OnClickListenerที่ตั้งค่าไว้ในPlayerViewในกรณีที่useController=false(#9605) นอกจากนี้ ให้แก้ไขการส่งเหตุการณ์ไปยังOnLongClickListenerสำหรับการกำหนดค่าข้อมูลพร็อพเพอร์ตี้ทั้งหมดด้วย - แก้ไขการจัดการลำดับการโต้ตอบแบบสัมผัสที่ออกนอกขอบเขตของ
PlayerViewก่อนACTION_UPเป็นการคลิกอย่างไม่ถูกต้อง (#9861) - แก้ไขปัญหาการช่วยเหลือพิเศษของ
PlayerViewที่การแตะอาจสลับการเล่นแทนที่จะซ่อนตัวควบคุม (#8627) - เขียน
TrackSelectionViewและTrackSelectionDialogBuilderใหม่เพื่อให้ทำงานกับอินเทอร์เฟซPlayerแทนExoPlayerซึ่งจะช่วยให้สามารถใช้มุมมองกับการติดตั้งใช้งานPlayerอื่นๆ ได้ และนำการขึ้นต่อกันจากโมดูล UI ไปยังโมดูล ExoPlayer ออก การเปลี่ยนแปลงนี้เป็นการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบ - ไม่แสดงแทร็กข้อความที่บังคับในตัวเลือกแทร็ก
PlayerViewและเลือกแทร็กข้อความที่บังคับที่เหมาะสมไว้หากเลือก "ไม่มี" (#9432)
- แก้ไขการส่งเหตุการณ์ไปยัง
- DASH:
- แยกวิเคราะห์จำนวนช่องจากองค์ประกอบ DTS
AudioChannelConfigurationการดำเนินการนี้จะเปิดใช้การส่งผ่านเสียงสำหรับสตรีม DTS อีกครั้ง (#10159) - ไม่อนุญาตให้ส่ง
nullไปยังDashMediaSource.Factory.setCompositeSequenceableLoaderFactoryคุณสามารถส่งอินสแตนซ์ของDefaultCompositeSequenceableLoaderFactoryได้อย่างชัดเจนหากจำเป็น
- แยกวิเคราะห์จำนวนช่องจากองค์ประกอบ DTS
- HLS:
- เปลี่ยนไปใช้การเตรียมแบบ Chunkful หากแอตทริบิวต์ CODECS ของเพลย์ลิสต์ไม่มีตัวแปลงรหัสเสียง (#10065)
- ไม่อนุญาตให้ส่ง
nullไปยังHlsMediaSource.Factory.setCompositeSequenceableLoaderFactory,HlsMediaSource.Factory.setPlaylistParserFactoryและHlsMediaSource.Factory.setPlaylistTrackerFactoryคุณสามารถส่งอินสแตนซ์ของDefaultCompositeSequenceableLoaderFactory,DefaultHlsPlaylistParserFactoryหรือการอ้างอิงไปยังDefaultHlsPlaylistTracker.FACTORYได้อย่างชัดเจนหากจำเป็น
- Smooth Streaming:
- ไม่อนุญาตให้ส่ง
nullไปยังSsMediaSource.Factory.setCompositeSequenceableLoaderFactoryคุณสามารถส่งอินสแตนซ์ของDefaultCompositeSequenceableLoaderFactoryได้อย่างชัดเจนหากจำเป็น
- ไม่อนุญาตให้ส่ง
- RTSP:
- เพิ่มโปรแกรมอ่าน RTP สำหรับ H263 (#63)
- เพิ่มโปรแกรมอ่าน RTP สำหรับ MPEG4 (#35)
- เพิ่มโปรแกรมอ่าน RTP สำหรับ HEVC (#36)
- เพิ่มโปรแกรมอ่าน RTP สำหรับ AMR ปัจจุบันรองรับเฉพาะสตรีม AMR แบบช่องสัญญาณเดียวและไม่สลับช่องสัญญาณ ไม่รองรับเพย์โหลด RTP ของ AMR แบบผสม (#46)
- เพิ่มโปรแกรมอ่าน RTP สำหรับ VP8 (#47)
- เพิ่มโปรแกรมอ่าน RTP สำหรับ WAV (#56)
- แก้ไขส่วนหัวของการให้สิทธิ์พื้นฐาน RTSP (#9544)
- หยุดตรวจสอบช่อง SDP ที่จำเป็นเนื่องจาก ExoPlayer ไม่จำเป็นต้องใช้ (#10049)
- แสดงข้อยกเว้นที่ตรวจสอบแล้วเมื่อแยกวิเคราะห์เวลา RTSP (#10165)
- เพิ่มโปรแกรมอ่าน RTP สำหรับ VP9 (#47)
- เพิ่มโปรแกรมอ่าน RTP สำหรับ OPUS (#53)
- แหล่งข้อมูล
- เปลี่ยนชื่อ
DummyDataSourceเป็นPlaceholderDataSource - วิธีแก้ปัญหาการจัดการการขัดจังหวะ OkHttp
- เปลี่ยนชื่อ
- เซสชัน:
- แทนที่
MediaSession.MediaItemFillerด้วยMediaSession.Callback.onAddMediaItemsเพื่ออนุญาตการแก้ไขคำขอแบบอะซิงโครนัส - รองรับเมธอด
setMediaItems(s)เมื่อMediaControllerเชื่อมต่อกับเซสชันสื่อเดิม - นำ
MediaController.setMediaUriและMediaSession.Callback.onSetMediaUriออก คุณสามารถใช้ฟังก์ชันการทำงานเดียวกันนี้ได้โดยใช้MediaController.setMediaItemและMediaSession.Callback.onAddMediaItems - ส่งต่อการโทรเวอร์ชันเดิมของ
MediaControllerเพื่อเล่นสื่อไปยังMediaSession.Callback.onAddMediaItemsแทนonSetMediaUri - เพิ่ม
MediaNotification.ProviderและDefaultMediaNotificationProviderเพื่อปรับแต่งการแจ้งเตือน - เพิ่ม
BitmapLoaderและSimpleBitmapLoaderสำหรับการดาวน์โหลดรูปภาพอาร์ตเวิร์ก - เพิ่ม
MediaSession.setCustomLayout()เพื่อให้เข้ากันได้แบบย้อนหลังกับเซสชันเดิม - เพิ่ม
MediaSession.setSessionExtras()เพื่อให้มีฟีเจอร์เทียบเท่ากับเซสชันเดิม - เปลี่ยนชื่อ
MediaSession.MediaSessionCallbackเป็นMediaSession.Callback,MediaLibrarySession.MediaLibrarySessionCallbackเป็นMediaLibrarySession.CallbackและMediaSession.Builder.setSessionCallbackเป็นsetCallback - แก้ไข NPE ใน
MediaControllerImplLegacy(#59) - อัปเดตข้อมูลตำแหน่งเซสชันในการเปลี่ยนแปลงไทม์ไลน์(#51)
- แก้ไข NPE ใน
MediaControllerImplBaseหลังจากปล่อยตัวควบคุม (#74)
- แทนที่
- การเล่นโฆษณา / IMA:
- ลดอัตราการโพลโฆษณาจากทุกๆ 100 มิลลิวินาทีเป็นทุกๆ 200 มิลลิวินาที เพื่อให้สอดคล้องกับคำแนะนำของ Media Rating Council (MRC)
- ส่วนขยาย FFmpeg:
- อัปเดตเวอร์ชัน CMake เป็น
3.21.0+เพื่อหลีกเลี่ยงข้อบกพร่องของ CMake ที่ทำให้การซิงค์ Gradle ของ Android Studio ไม่สำเร็จ (#9933)
- อัปเดตเวอร์ชัน CMake เป็น
- นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
- นำ
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)ออก โปรดใช้Player.Listener.onTracksChanged(Tracks)แทน - นำ
Player.getCurrentTrackGroupsและPlayer.getCurrentTrackSelectionsออก โปรดใช้Player.getCurrentTracksแทน นอกจากนี้ คุณยังใช้ExoPlayer.getCurrentTrackGroupsและExoPlayer.getCurrentTrackSelectionsต่อไปได้ แม้ว่าเราจะเลิกใช้งานวิธีการเหล่านี้แล้วก็ตาม - นำค่าคงที่
DownloadHelperDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORTและDEFAULT_TRACK_SELECTOR_PARAMETERSออก โปรดใช้getDefaultTrackSelectorParameters(Context)แทนเมื่อเป็นไปได้ และใช้DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXTในกรณีอื่นๆ - นำคอนสตรัคเตอร์
DefaultTrackSelector(ExoTrackSelection.Factory)ออก โปรดใช้DefaultTrackSelector(Context, ExoTrackSelection.Factory)แทน - นำ
Transformer.Builder.setContextออก ควรส่งContextไปยังตัวสร้างTransformer.Builderแทน
- นำ
เวอร์ชัน 1.0.0-alpha03
14 มีนาคม 2022
androidx.media3:media3-*:1.0.0-alpha03 เผยแพร่แล้ว เวอร์ชัน 1.0.0-alpha03 มีคอมมิตเหล่านี้
ซึ่งสอดคล้องกับรุ่น ExoPlayer 2.17.1
- เสียง
- แก้ไขข้อผิดพลาดในการตรวจสอบความสามารถด้านเสียงสำหรับ Dolby Atmos (E-AC3-JOC) ใน HLS
- เครื่องสกัดน้ำผลไม้
- FMP4: แก้ไขปัญหาที่อาจมีการแสดงข้อมูลเมตาตัวอย่าง emsg ในลำดับที่ไม่ถูกต้องสำหรับสตรีมที่มีทั้งอะตอม emsg v0 และ v1 (#9996)
- ข้อความ
- แก้ไขการโต้ตอบของ
SingleSampleMediaSource.Factory.setTrackIdและMediaItem.SubtitleConfiguration.Builder.setIdเพื่อจัดลำดับความสำคัญของช่องSubtitleConfigurationและใช้ค่าFactoryแทนหากไม่ได้ตั้งค่าไว้ (#10016)
- แก้ไขการโต้ตอบของ
- การเล่นโฆษณา
- แก้ไขปัญหาบัฟเฟอร์เสียงไม่เพียงพอระหว่างช่วงโฆษณาในสตรีม SSAI แบบ HLS สด
เวอร์ชัน 1.0.0-alpha02
2 มีนาคม 2022
androidx.media3:media3-*:1.0.0-alpha02 เผยแพร่แล้ว เวอร์ชัน 1.0.0-alpha02 มีคอมมิตเหล่านี้
ซึ่งสอดคล้องกับรุ่น ExoPlayer 2.17.0
- ไลบรารีหลัก:
- เพิ่มเมธอดที่มีการป้องกัน
DefaultRenderersFactory.getCodecAdapterFactory()เพื่อให้คลาสย่อยของDefaultRenderersFactoryที่ลบล้างbuildVideoRenderers()หรือbuildAudioRenderers()สามารถเข้าถึงโรงงานตัวแปลง Codec และส่งไปยังอินสแตนซ์MediaCodecRendererที่สร้างขึ้นได้ - ส่งต่อช่องส่วนหัว ICY
nameและgenreไปยังMediaMetadata.stationและMediaMetadata.genreตามลำดับ เพื่อให้ช่องส่วนหัวดังกล่าวเข้าถึงแอปผ่านPlayer.Listener.onMediaMetadataChanged()(#9677) - นำคีย์ Null ออกจาก
DefaultHttpDataSource#getResponseHeaders - หยุดชั่วคราวและลองอีกครั้งเมื่อสร้างอินสแตนซ์
MediaCodecไม่สำเร็จ วิธีนี้จะช่วยแก้ปัญหาที่เกิดขึ้นในอุปกรณ์บางเครื่องเมื่อเปลี่ยน Surface จากตัวแปลงรหัสที่ปลอดภัยเป็นตัวแปลงรหัสอื่น (#8696) - เพิ่ม
MediaCodecAdapter.getMetrics()เพื่ออนุญาตให้ผู้ใช้รับข้อมูลเมตริกจากMediaCodec(#9766) - แก้ไขการแก้ไขทรัพยากร Dependency ของ Maven (#8353)
- ปิดใช้การปรับความเร็วอัตโนมัติสำหรับไลฟ์สดที่ไม่มีทั้งฟีเจอร์เวลาในการตอบสนองต่ำและการตั้งค่าความเร็วตามคำขอของผู้ใช้ (#9329)
- เปลี่ยนชื่อ
DecoderCounters#inputBufferCountเป็นqueuedInputBufferCount - ทำให้
SimpleExoPlayer.renderersเป็นแบบส่วนตัว เข้าถึงโปรแกรมแสดงผลได้ผ่านExoPlayer.getRenderer - อัปเดตค่าคงที่
AnalyticsListener.EventFlagsบางค่าให้ตรงกับค่าในPlayer.EventFlagsแล้ว - แยก
AnalyticsCollectorออกเป็นอินเทอร์เฟซและการใช้งานเริ่มต้นเพื่อให้ R8 นำออกได้หากแอปไม่จำเป็นต้องใช้
- เพิ่มเมธอดที่มีการป้องกัน
- การเลือกแทร็ก
- รองรับแฟล็กบทบาทวิดีโอที่ต้องการในการเลือกแทร็ก (#9402)
- อัปเดตตรรกะการเลือกแทร็กวิดีโอเพื่อพิจารณาประเภท MIME และแฟล็กบทบาทที่ต้องการเมื่อเลือกแทร็กวิดีโอหลายแทร็กสำหรับการปรับเปลี่ยน (#9519)
- อัปเดตตรรกะการเลือกแทร็กวิดีโอและเสียงให้เลือกเฉพาะรูปแบบสำหรับการเลือกแบบปรับอัตโนมัติที่มีตัวถอดรหัสและการรองรับฮาร์ดแวร์ในระดับเดียวกัน (#9565)
- อัปเดตตรรกะการเลือกแทร็กวิดีโอให้เลือกตัวแปลงรหัสที่มีประสิทธิภาพมากขึ้นหากตัวถอดรหัสหลักที่เร่งฮาร์ดแวร์รองรับตัวแปลงรหัสหลายตัว (#4835)
- เลือกค่ากำหนดเนื้อหาเสียง (เช่น แทร็กเสียง "เริ่มต้น" หรือแทร็กที่ตรงกับภาษาของภาษาของระบบ) มากกว่าข้อจำกัดการเลือกแทร็กทางเทคนิค (เช่น ประเภท MIME ที่ต้องการ หรือจำนวนช่องสูงสุด)
- แก้ไขปัญหาการเลือกแทร็กที่การลบล้างกลุ่มแทร็กหนึ่งไม่ได้ปิดใช้กลุ่มแทร็กอื่นๆ ที่เป็นประเภทเดียวกัน (#9675)
- แก้ไขปัญหาการเลือกแทร็กที่การลบล้างแทร็กแบบไม่ว่างเปล่าและแบบว่างเปล่าผสมกันไม่มีผลอย่างถูกต้อง (#9649)
- ห้ามใช้
TrackGroupซ้ำในTrackGroupArrayTrackGroupสามารถทำให้แยกความแตกต่างได้เสมอโดยการตั้งค่าidในคอนสตรัคเตอร์TrackGroupการดำเนินการนี้จะแก้ไขข้อขัดข้องเมื่อกลับมาเล่นต่อหลังจากที่แอปทำงานอยู่เบื้องหลังโดยมีการลบล้างแทร็กที่ใช้งานอยู่ (#9718) - แก้ไขตรรกะใน
AdaptiveTrackSelectionเพื่ออนุญาตให้เพิ่มคุณภาพภายใต้แบนด์วิดท์เครือข่ายที่เพียงพอ แม้ว่าการเล่นจะใกล้เคียงกับไลฟ์สดมากก็ตาม (#9784)
- วิดีโอ:
- แก้ไขตรรกะสำรองของตัวถอดรหัสสำหรับ Dolby Vision เพื่อใช้ตัวถอดรหัส H264/H265 ที่เข้ากันได้หากจำเป็น
- เสียง
- แก้ไขตรรกะการสำรองข้อมูลตัวถอดรหัสสำหรับ Dolby Atmos (E-AC3-JOC) เพื่อใช้ตัวถอดรหัส E-AC3 ที่เข้ากันได้หากจำเป็น
- เปลี่ยน
AudioCapabilitiesAPI ให้ต้องส่งAudioCapabilities.DEFAULT_AUDIO_CAPABILITIESอย่างชัดเจนแทนnull - อนุญาตให้ปรับแต่งการคำนวณขนาดบัฟเฟอร์
AudioTrackโดยแทรกAudioTrackBufferSizeProviderลงในDefaultAudioSink(#8891) - ลองสร้าง
AudioTrackอีกครั้งหากขนาดบัฟเฟอร์ที่ขอมากกว่า 1 MB (#9712)
- เครื่องสกัดน้ำผลไม้
- ข้อความ
- DRM:
- นำ
playbackLooperออกจากDrmSessionManager.(pre)acquireSessionเมื่อแอปใช้DrmSessionManagerในMediaSourceที่กำหนดเอง จะต้องส่งplaybackLooperไปยังDrmSessionManager.setPlayerแทน
- นำ
- การเล่นโฆษณา / IMA:
- เพิ่มการรองรับการแทรกโฆษณาแบบไดนามิก (DAI) ของ IMA (#8213)
- เพิ่มเมธอดลงใน
AdPlaybackStateเพื่ออนุญาตให้รีเซ็ตกลุ่มโฆษณาเพื่อให้เล่นอีกครั้งได้ (#9615) - บังคับใช้ความเร็วในการเล่นที่ 1.0 ระหว่างการเล่นโฆษณา (#9018)
- แก้ไขปัญหาที่กลุ่มโฆษณาซึ่งโหลดไม่สําเร็จทําให้ระบบรีเซ็ตการเล่นทันที (#9929)
- UI:
- DASH:
- เพิ่มพร็อพเพอร์ตี้ที่จำเป็นและเสริมที่แยกวิเคราะห์แล้วลงใน
Representation(#9579) - รองรับบทบาทแทร็ก
forced-subtitle(#9727) - หยุดตีความบทบาทแทร็ก
mainเป็นC.SELECTION_FLAG_DEFAULT - แก้ไขตรรกะการยกเว้น URL ฐานสำหรับไฟล์ Manifest ที่ไม่ได้ประกาศเนมสเปซ DVB (#9856)
- รองรับ URL
MPD.Locationแบบสัมพัทธ์ (#9939)
- เพิ่มพร็อพเพอร์ตี้ที่จำเป็นและเสริมที่แยกวิเคราะห์แล้วลงใน
- HLS:
- ป้อน
Format.labelอย่างถูกต้องสำหรับสตรีม HLS แบบเสียงเท่านั้น (#9608) - ใช้การเตรียมการแบบไม่มีกลุ่มข้อมูลโดยค่าเริ่มต้นเพื่อปรับปรุงเวลาเริ่มต้น หากการแสดงผลมีแทร็กคำบรรยายแทนเสียงแบบมัลติเพล็กซ์ที่ไม่ได้ประกาศในเพลย์ลิสต์หลัก คุณควรเพิ่มแทร็กดังกล่าวลงในเพลย์ลิสต์หลักเพื่อให้เล่นได้ หรือปิดการเตรียมแบบไม่มีกลุ่มข้อมูลด้วย
HlsMediaSource.Factory.setAllowChunklessPreparation(false) - รองรับการกรอวิดีโอที่แม่นยำระดับคีย์เฟรมใน HLS (#2882)
- ป้อน
- RTSP:
- Transformer:
- เพิ่มเวอร์ชัน API ขั้นต่ำที่จำเป็นเป็น 21
- ตอนนี้
TransformationExceptionใช้เพื่ออธิบายข้อผิดพลาดที่เกิดขึ้นระหว่างการเปลี่ยนรูปแบบ - เพิ่ม
TransformationRequestเพื่อระบุตัวเลือกการเปลี่ยนรูปแบบ - อนุญาตให้ลงทะเบียน Listener หลายรายการ
- แก้ไขปัญหา Transformer ค้างเมื่ออ่านเอาต์พุตตัวแปลงรหัสได้บางส่วน
- แก้ไข NPE ที่อาจเกิดขึ้นใน
Transformer.getProgressเมื่อการปล่อย Muxer แสดงข้อผิดพลาด - เพิ่มแอปสาธิตเพื่อใช้การเปลี่ยนรูปแบบ
- ส่วนขยาย MediaSession:
- โดยค่าเริ่มต้น ตอนนี้
MediaSessionConnectorจะล้างเพลย์ลิสต์เมื่อหยุดเล่น แอปที่ต้องการเก็บเพลย์ลิสต์ไว้สามารถเรียกใช้setClearMediaItemsOnStop(false)ในเครื่องมือเชื่อมต่อได้
- โดยค่าเริ่มต้น ตอนนี้
- ส่วนขยาย Cast:
- ส่วนขยาย FFmpeg:
- ทำให้
build_ffmpeg.shขึ้นอยู่กับ bin utils ของ LLVM แทน GNU (#9933)
- ทำให้
- ความเข้ากันได้กับ Android 12
- อัปเกรดส่วนขยาย Cast ให้ใช้
com.google.android.gms:play-services-cast-framework:20.1.0play-services-cast-frameworkเวอร์ชันก่อนหน้าไม่สามารถใช้งานร่วมกับแอปที่กำหนดเป้าหมายเป็น Android 12 และจะขัดข้องพร้อมข้อผิดพลาดIllegalArgumentExceptionเมื่อสร้างPendingIntent(#9528)
- อัปเกรดส่วนขยาย Cast ให้ใช้
- นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
- นำ
Player.EventListenerออก โปรดใช้Player.Listenerแทน - นำ
MediaSourceFactory#setDrmSessionManager,MediaSourceFactory#setDrmHttpDataSourceFactoryและMediaSourceFactory#setDrmUserAgentออก โปรดใช้MediaSourceFactory#setDrmSessionManagerProviderแทน - นำ
MediaSourceFactory#setStreamKeysออก โปรดใช้MediaItem.Builder#setStreamKeysแทน - นำ
MediaSourceFactory#createMediaSource(Uri)ออก โปรดใช้MediaSourceFactory#createMediaSource(MediaItem)แทน - นำ
setTagออกจากDashMediaSource,HlsMediaSourceและSsMediaSourceโปรดใช้MediaItem.Builder#setTagแทน - นำ
DashMediaSource#setLivePresentationDelayMs(long, boolean)ออก ใช้MediaItem.Builder#setLiveConfigurationและMediaItem.LiveConfiguration.Builder#setTargetOffsetMsเพื่อลบล้างไฟล์ Manifest หรือใช้DashMediaSource#setFallbackTargetLiveOffsetMsเพื่อระบุค่าสำรอง - นำ
(Simple)ExoPlayer.setThrowsWhenUsingWrongThreadออก คุณไม่สามารถเลือกไม่ใช้การบังคับใช้ชุดข้อความได้อีกต่อไป - นำ
ActionFileและActionFileUpgradeUtilออก ใช้ ExoPlayer 2.16.1 หรือเวอร์ชันก่อนหน้าเพื่อใช้ActionFileUpgradeUtilในการผสานไฟล์การดำเนินการเดิมเข้ากับDefaultDownloadIndex - นำ
ProgressiveMediaSource#setExtractorsFactoryออก โปรดใช้ตัวสร้างProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)แทน - นำ
ProgressiveMediaSource.Factory#setTagและProgressiveMediaSource.Factory#setCustomCacheKeyออก โปรดใช้MediaItem.Builder#setTagและMediaItem.Builder#setCustomCacheKeyแทน - นำตัวสร้าง
DefaultRenderersFactory(Context, @ExtensionRendererMode int)และDefaultRenderersFactory(Context, @ExtensionRendererMode int, long)ออก ให้ใช้คอนสตรัคเตอร์DefaultRenderersFactory(Context),DefaultRenderersFactory#setExtensionRendererModeและDefaultRenderersFactory#setAllowedVideoJoiningTimeMsแทน - นำตัวสร้าง
CronetDataSourceสาธารณะทั้งหมดออก โปรดใช้CronetDataSource.Factoryแทน
- นำ
- เปลี่ยน
IntDefsต่อไปนี้เป็น@Target(TYPE_USE)เท่านั้น ซึ่งอาจทำให้การคอมไพล์การใช้งานใน Kotlin เสียหาย แต่สามารถแก้ไขได้โดยย้ายคำอธิบายประกอบเพื่อกำกับเนื้อหาประเภท (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(ในแพ็กเกจcom.google.android.exoplayer2.ext.flac)@FlacExtractor.Flags(ในแพ็กเกจ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
เวอร์ชัน 1.0.0-alpha01
27 ตุลาคม 2021
androidx.media3:media3-*:1.0.0-alpha01 เผยแพร่แล้ว เวอร์ชัน 1.0.0-alpha01 มีคอมมิตเหล่านี้
ฟีเจอร์ใหม่
Media3 เป็นบ้านหลังใหม่สำหรับไลบรารีการสนับสนุนสื่อ ซึ่งรวมถึง ExoPlayer อัลฟ่าแรกประกอบด้วยการใช้งานไลบรารีที่ใช้งานได้ในช่วงแรกสำหรับการใช้งาน Use Case ของสื่อ ซึ่งรวมถึงรายการต่อไปนี้
- ExoPlayer ซึ่งเป็นมีเดียเพลเยอร์ระดับแอปพลิเคชันสำหรับ Android ที่ปรับแต่งและขยายได้ง่าย
- ฟังก์ชันการทำงานของเซสชันสื่อสำหรับการแสดงและควบคุมการเล่น โมดูลเซสชันใหม่นี้ใช้อินเทอร์เฟซ
Playerเดียวกันกับ ExoPlayer - คอมโพเนนต์ UI สำหรับสร้างอินเทอร์เฟซผู้ใช้สำหรับการเล่นสื่อ
- โมดูลที่รวมฟังก์ชันการทำงานในไลบรารีอื่นๆ เพื่อใช้กับ ExoPlayer เช่น การแทรกโฆษณาผ่าน IMA SDK
ดูข้อมูลเพิ่มเติมได้ที่โปรเจ็กต์ Media3 ใน GitHub
ก่อนหน้านี้ ExoPlayer โฮสต์อยู่ในโปรเจ็กต์ ExoPlayer GitHub แยกต่างหาก ใน Media3 ชื่อแพ็กเกจคือ androidx.media3.exoplayer เราวางแผนที่จะดูแลรักษาและเผยแพร่โปรเจ็กต์ ExoPlayer GitHub ต่อไปอีกระยะหนึ่งเพื่อให้แอปมีเวลาย้ายข้อมูลไปยัง Media3
Media3 มีรายการทดแทนสำหรับโมดูล ExoPlayer ทั้งหมด ยกเว้นส่วนขยาย media2 และ mediasession เดิม ซึ่งจะแทนที่ด้วยโมดูล media3-session ใหม่ ซึ่งจะช่วยให้สามารถผสานรวมระหว่างเพลเยอร์และเซสชันสื่อได้โดยตรงโดยไม่ต้องใช้คลาสอะแดปเตอร์/เครื่องมือเชื่อมต่อ