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 ในการแมปสี ISO MediaFormatUtil และ ColorInfo
    • เพิ่มรีจิสทรี Flags ส่วนกลางเพื่อจัดการแฟล็กฟีเจอร์ทดลองและการเปิดตัวแบบทีละขั้น (Flags.setCanaryModeEnabled) ย้ายข้อมูลเมธอด @ExperimentalApi ที่มีอยู่จำนวนมากเพื่อใช้ API แฟล็กใหม่
    • เพิ่ม MediaMetadata.playlistId, MediaMetadata.Builder.setPlaylistId(String), MediaMetadata.categories และ MediaMetadata.Builder.setCategories(List<String>)
    • แทนที่ androidx.media3.common.util.NonNullApi ด้วย JSpecify org.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 กลางสตรีม
  • ผู้ตรวจสอบ
    • รองรับการดึงข้อมูลเมตา XMP จากไฟล์ MP4 โดยใช้ MetadataRetriever
    • รองรับการแยกแทร็กข้อมูลเมตาแบบกำหนดเวลาที่จัดกลุ่ม mebx ใน MediaExtractorCompat เป็น MimeTypes.APPLICATION_MEBX
  • เฟรมเครื่องมือตรวจสอบ
    • แก้ไขการคลิปสี BT.2020 ที่มีขอบเขตกว้างในรูปภาพฐาน SDR เมื่อดึงเฟรม Ultra HDR ด้วย FrameExtractor ตอนนี้สีที่อยู่นอกขอบเขตจะถูกบีบอัดให้เข้ากับขอบเขต sRGB อย่างนุ่มนวลแทนที่จะถูกจำกัด
  • เสียง
    • เพิ่มวิธีแก้ปัญหาสำหรับอุปกรณ์ที่เรียกใช้ 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
  • เซสชัน:
    • เพิ่ม 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 เดิมที่หยุดชั่วคราวอาจส่ง Callback onPrepareFrom* ที่ไม่รองรับแทน onPlayFrom* หรือส่ง onPlay() โดยไม่เริ่มต้นรายการสื่อที่ขออีกครั้ง
    • แก้ไข NullPointerException ใน MediaBrowser เดิมเมื่อได้รับการตอบกลับคำสั่งที่กำหนดเอง (#3432)
    • แก้ไขข้อขัดข้องของ IllegalArgumentException เมื่อได้รับข้อมูลเมตาเดิมที่มีคีย์ซ้ำกันใน Bundle ที่เกี่ยวข้อง
    • รวมการเรียก MediaControllerCompat.TransportControls ขาออกที่ทำขึ้นภายในการทำซ้ำ Looper เดียวกันเมื่อควบคุม MediaSessionCompat เดิม (เช่น การเรียก setMediaItem, prepare และ play พร้อมกันจะส่ง Callback onPlayFrom* รายการเดียว)
  • UI:
    • แก้ไขการวางตำแหน่งเครื่องหมายวรรคตอนของคำบรรยายแบบ RTL และการคงช่วงของ Span เมื่อเปิดใช้การตัดข้อความแบบ 2 ทิศทาง (#3454, #3455)
    • เพิ่มคลาส TrackSelectionState และ TrackSelectionParametersState และฟังก์ชัน remember ของสถานะ Composable ที่เกี่ยวข้องลงในโมดูล media3-ui-compose
    • แนะนำ PresentationState.videoAspectRatio และทำให้ Modifier.resizeWithContentScale ใช้ aspectRatio: Float? แทน sourceSizeDp: Size?
    • เพิ่มคลาส CuesState และ Composable rememberCuesState ลงในโมดูล media3-ui-compose เพื่อฟังคิวปัจจุบันของเพลเยอร์
    • เพิ่มการรองรับโหมดการสครับไปยัง ProgressSlider หากอิงตาม ExoPlayer หรือ CompositionPlayer
    • เพิ่มการรองรับ showArtwork ไปยัง PresentationState และใช้เพื่อจับเวลาการแสดงผลของ Composable artwork ที่ไม่บังคับซึ่งระบุไว้ใน ContentFrame และ Player เพิ่ม Artwork Composable เพื่อใช้เป็น ค่าเริ่มต้นสำหรับช่อง 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 เพิ่ม LiveButton Composable ลงใน 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-TS EXT-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)
  • ส่วนขยาย 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

เวอร์ชัน 1.11.0

1.11.1

10 กันยายน 2569

  • ExoPlayer:
    • ย้ายแฟล็กเพื่อเปิด/ปิดใช้ข้อมูลเมตา HAGC สำหรับสื่อแบบโปรเกรสซีฟจาก MediaSource.Factory เป็น ExtractorsFactory ระบบจะนำวิธีการ setExperimentalEnableHagcPlayback ก่อนหน้าออกและแทนที่ด้วย ExtractorsFactory.setParseHagcMetadata นอกจากนี้ยังช่วยแก้ไขปัญหาที่การปิดใช้ไม่ทำงานสำหรับคอนเทนเนอร์ Matroska/WebM ด้วย
    • แก้ไขปัญหาการหยุดเล่นชั่วคราวที่เกิดขึ้นเมื่อเตรียมการแสดงผลรองที่ไม่ใช่การเปลี่ยนผ่านล่วงหน้า
    • แก้ไขปัญหาการอุ่นเครื่องล่วงหน้าซึ่งควรส่งคืน Surface ไปยังโปรแกรมแสดงผลหลักเมื่อการกรอรีเซ็ตและปิดใช้โปรแกรมแสดงผลทั้ง 2 รายการ
    • แก้ไข ArrayIndexOutOfBoundsException เมื่อการรีเฟรชไทม์ไลน์แบบสดเลื่อนตำแหน่งเริ่มต้นผ่านโฆษณาที่แทรกฝั่งเซิร์ฟเวอร์ซึ่งกำลังเล่นอยู่ (#3348)
    • แก้ไขปัญหาโหมดการสครับที่เฟรมวิดีโอเก่าอาจแสดงขึ้นมาสั้นๆ เมื่อกรอวิดีโอโดยเปิดใช้ ScrubbingModeParameters.allowSkippingMediaCodecFlush
  • เครื่องสกัดน้ำผลไม้
    • Matroska: แก้ไขปัญหาที่แทร็กซึ่งวางไว้หลังคลัสเตอร์ไม่ส่งผลให้เกิดไทม์ไลน์ที่ค้นหาได้ (#3377)
  • เสียง
    • แก้ไขการคำนวณขนาดบัฟเฟอร์ใน SilenceSkippingAudioProcessor เพื่อไม่ให้ขนาดเฟรมลดระยะเวลาความเงียบขั้นต่ำลงอย่างไม่ถูกต้อง (#3271)
    • แก้ไขการจัดการ PCM แบบ 8 บิตใน PcmAudioUtil เพื่อจัดการตัวอย่างเป็นแบบไม่มีเครื่องหมายตามที่ Android กำหนด (#3271)
    • แก้ไขปัญหาการถ่ายโอนข้อมูลซึ่งการเล่นอาจหยุดชะงักระหว่างโฆษณาตอนต้นหรือการเปลี่ยนแบบไม่มีช่องว่างเนื่องจากขนาดบัฟเฟอร์ของฮาร์ดแวร์มีจำกัด
    • แก้ไขข้อบกพร่องใน DefaultAudioSink ที่จำนวนการเผยแพร่ไม่ลดลงเมื่อเทรดการเล่นไม่ทำงานแล้ว (#3338)
  • เซสชัน:
    • แก้ไข NullPointerException เมื่อมีการปล่อย MediaController ที่อยู่ระหว่างดำเนินการจาก Callback Player.Listener (#3375)
    • แก้ไขการหยุดชะงักในเทรดหลักเมื่อ MediaBrowser เดิมเชื่อมต่อกับบริการที่แสดงผลลัพธ์แบบอะซิงโครนัสจาก onGetLibraryRoot() หรือ onConnectAsync() (#3393)
  • ส่วนขยาย HLS
    • แก้ไขการคำนวณออฟเซ็ตการเล่นเนื้อหาต่อเมื่อกลุ่มเป้าหมายสำหรับการสแนปยังไม่อยู่ในเพลย์ลิสต์ (#3322)
    • แก้ไขปัญหาที่ HlsMediaChunk ที่ใช้ไปจนหมดแล้วพยายามโหลดซ้ำเมื่อได้รับ EOFException จาก Extractor (#3350)
  • ส่วนขยาย DASH
    • แก้ไขการคำนวณการประทับเวลาตัวอย่างที่ไม่ถูกต้องสำหรับแทร็กรูปภาพที่มี presentationTimeOffset (#3334)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
    • Opus: แก้ไขความเสียหายของหน่วยความจำเมื่อมีการเริ่มต้นอินสแตนซ์ OpusDecoder หลายรายการพร้อมกัน
    • MPEG-H: แก้ไขหน่วยความจำรั่วไหล การตัดอักขระที่ไม่ใช่ ASCII และการขัดข้องของระบบที่อาจเกิดขึ้นในสภาวะหน่วยความจำเหลือน้อยเมื่อส่งคำสั่งไปยัง MpeghUiManager (#3365)

เวอร์ชัน 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)
  • เสียง
    • เพิ่มระยะเวลาผ่อนผัน 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 มากเกินไปในเทรดหลัก
  • ข้อความ
    • TTML: เปลี่ยนกลับไปใช้ displayAlign จาก style สำหรับภูมิภาค (#2559)
    • TTML: รับค่าเวลาเริ่มต้นของคิวจากระดับบนสุดขององค์ประกอบ <p> (#3246)
  • ข้อมูลเมตา
    • เพิ่มช่อง MediaMetadata.discSubtitle และแยกวิเคราะห์จากข้อมูล ID3v2.4 TSST และ Vorbis DISCSUBTITLE
    • แยกวิเคราะห์หมายเลขและจำนวนแผ่นดิสก์จากเฟรม ID3 TPOS
  • ผลกระทบ
    • ล้างสถานะการวาดใหม่ใน FinalShaderProgramWrapper เมื่อล้างข้อมูลเพื่อป้องกันไม่ให้โปรแกรมเล่นค้างเมื่อกรอวิดีโอ
  • Muxer:
    • เพิ่มการรองรับการอ้างอิงแทร็ก (กล่อง tref) ใน Mp4Muxer ผ่าน API addTrackReference ใหม่ ซึ่งจะช่วยสร้างความสัมพันธ์ระหว่างแทร็กต่างๆ เช่น การลิงก์แทร็กข้อมูลเมตากับแทร็กวิดีโอที่อธิบาย
    • เพิ่ม 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 ได้รับไม่มี UID Timeline เดิม ตอนนี้เซสชันจะแปลและเผยแพร่ UID เหล่านี้อย่างน่าเชื่อถือในระหว่างการอัปเดตสถานะ
    • แก้ไขข้อขัดข้องโดยการตรวจจับ ForegroundServiceStartNotAllowedException ใน MediaSessionService.stopSelfSafely() (#3310)
    • แก้ไข Callback onMediaItemTransition() ที่ไม่คาดคิดใน MediaController เมื่อกรอภายในรายการสื่อเดียวกัน (#3248)
  • UI:
    • แก้ไขการแสดงผลเฟรมแรกในขนาดที่ไม่ถูกต้องเมื่อมีการจัดองค์ประกอบ ContentFrame ใหม่ระหว่างการเล่น (#3238)
    • เพิ่มคลาส CurrentMediaItemState และ rememberCurrentMediaItemState Composable ที่เกี่ยวข้องลงในโมดูล media3-ui-compose ตัวเก็บสถานะนี้ใช้ใน demo-compose เพื่อแสดงข้อมูลเมตาต่างๆ เกี่ยวกับ MediaItem ที่กำลังเล่นอยู่
    • เพิ่มคลาส PlaylistState และ Composable rememberPlaylistState ที่เกี่ยวข้องลงในโมดูล media3-ui-compose ตัวเก็บสถานะนี้ใช้ใน demo-compose เพื่อแสดงข้อมูลเมตาต่างๆ เกี่ยวกับ MediaItems ที่ตั้งค่าไว้ในเพลเยอร์
    • เพิ่ม API การกรอไปข้างหน้า/สโลว์โมชันลงใน PlaybackSpeedState ใช้ฟังก์ชันนี้ใน demo-compose เพื่อแสดงการกรอไปข้างหน้าด้วยการกดค้าง
    • เพิ่ม MiniController Composable ลงในโมดูล media3-ui-compose-material3 โดยจะแสดงแผงควบคุมขนาดกะทัดรัดเพื่อควบคุมPlayer พร้อมแสดงชื่อ ศิลปิน อาร์ตเวิร์ก และความคืบหน้าของรายการสื่อปัจจุบัน
    • เพิ่มคลาส ErrorState และ Composable rememberErrorState ที่เกี่ยวข้องลงในโมดูล media3-ui-compose เพิ่ม Composable ErrorText ลงใน media3-ui-compose-material3 และทำให้เป็นภาพซ้อนทับเริ่มต้นใน Player
    • เผยแพร่ออบเจ็กต์ PlayerDefaults ที่มี Composable สำหรับ TopControls, CenterControls, BottomControls และ ErrorOverlay
    • เพิ่ม FocusRequester ไปยัง Composable Player และช่องเนื้อหา
    • เผยแพร่ PlayerPool (common-ktx) และ rememberPooledPlayer (ui-compose) เพื่อรองรับการโหลด MediaItems ล่วงหน้าในสภาพแวดล้อม UI ของหน้าต่างแบบเลื่อน แสดงฟังก์ชันการทำงานนี้ใน demo-compose ด้วย ShortFormPlayerScreen ใหม่
    • แก้ไขข้อบกพร่องการระงับชัตเตอร์ใน PlayerView และ Compose PresentationState ที่ทำให้เกิดข้อขัดข้องในไทม์ไลน์ที่ไม่รองรับ การค้นหา UID ของระยะเวลา (#3264)
  • ดาวน์โหลด:
    • แก้ไขตัวแปร HLS ในเพลย์ลิสต์สื่อเมื่อดึงข้อมูลเพื่อดาวน์โหลด (#3258)
  • ส่วนขยาย Ktor:
    • เพิ่มโมดูลส่วนขยาย media3-datasource-ktor ใหม่ที่ให้ KtorDataSource ซึ่งสนับสนุนโดยสแต็ก HTTP ของ Ktor
    • แก้ไข KtorDataSource ที่โหลดเนื้อหาการตอบกลับ HTTP ทั้งหมดลงในหน่วยความจำเมื่อเปิดการเชื่อมต่อ (#3305)
  • ส่วนขยาย 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)
  • ส่วนขยาย 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
    • แก้ไขข้อบกพร่องที่มีการแสดง ArrayIndexOutOfBoundsException ระหว่างการใช้สตรีมสำรองหากการเลือกแทร็กเป็นชุดย่อยของแทร็กที่พร้อมใช้งาน (#3161)
    • แก้ไขปัญหาที่ระบบไม่ส่งต่อกลุ่มการเริ่มต้นในการอัปเดตเพลย์ลิสต์สื่อหากไม่มีการใช้แท็ก #EXT-X-MAP ซ้ำในการอัปเดตครั้งต่อๆ ไป (#3105)
  • ส่วนขยาย 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
  • ผู้ตรวจสอบ
    • การเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบ: นำ 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
    • แก้ไขข้อบกพร่องที่ทำให้การเล่นค้างเมื่อเล่นเพลย์ลิสต์เสียงแบบไม่มีช่องว่างในโหมดการลดภาระการประมวลผลที่บีบอัด
  • ข้อความ
    • VobSub: ใช้คำสั่งควบคุม SPU START และ STOP เพื่อรับระยะเวลาของคิวแทนที่จะใช้ค่าเริ่มต้น 5 วินาทีเสมอ (#2935)
  • ข้อมูลเมตา
    • เพิ่มจำนวนเริ่มต้นของโปรแกรมแสดงผลข้อมูลเมตาเป็น 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 ซึ่งมี setPreferredLinearOrientation API นี่คือ API ในการทดสอบอัลฟ่าที่จะช่วยให้คุณตั้งค่าการวางแนวที่ต้องการสำหรับโฆษณาเชิงเส้นได้ หากต้องการเข้าร่วมกลุ่มทดสอบเวอร์ชันอัลฟ่า โปรดติดต่อพาร์ทเนอร์บัญชีของคุณ
  • เซสชัน:
    • แก้ไขข้อบกพร่องที่อาร์เรย์ขนาดใหญ่ใน MediaMetadata.artworkData อาจทำให้แอปขัดข้อง
    • ใช้อาร์กิวเมนต์ประเภท int สำหรับ @Player.Command ในอินเทอร์เฟซ ActionFactory (#2933)
    • ทำให้ MediaSessionService และ MediaLibraryService เป็น LifecycleService ซึ่งช่วยให้แนบการดำเนินการที่รับรู้วงจรกับวงจรของบริการได้ (#187)
    • หยุดรองรับคำสั่งเปลี่ยนระดับเสียงของอุปกรณ์จาก MediaController และ MediaBrowser สำหรับการเล่นในเครื่อง แอปไม่ควรเปลี่ยนระดับเสียงของอุปกรณ์ในเครื่อง และหากจำเป็น ให้ใช้ API AudioManager เพื่อวัตถุประสงค์นี้
    • ตรวจหาอินสแตนซ์ 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:
    • เพิ่ม PlaybackSpeedControl Composable ลงใน media3-ui-compose เพื่อแสดงและแก้ไขความเร็วในการเล่น
    • เพิ่ม PlaybackSpeedToggleButton Composable ลงใน media3-ui-compose-material3 เพื่อควบคุมความเร็วในการเล่น
    • เพิ่ม ProgressSlider Composable ลงใน 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
    • แก้ไขปัญหาที่แทร็กซึ่งมีเวลาเริ่มต้นของกลุ่มที่ไม่สอดคล้องกันทำให้เกิดความล่าช้าหรือตัวอย่างที่ขาดหายไปเมื่อเริ่มเล่น (#3057)
    • แก้ไขข้อบกพร่องที่ระบบตั้งค่าการประทับเวลาของข้อมูลเมตา EMSG v0 ในย่านความถี่ไม่ถูกต้อง (#3024)
  • ส่วนขยาย 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)
    • เพิ่มการยืนยันเพิ่มเติมในอินสแตนซ์ extras Bundle ในคลาสต่างๆ เพื่อป้องกันอินสแตนซ์ 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)
  • ส่วนขยาย 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 ได้
    • แก้ไขการเผยแพร่ค่าข้อมูลเมตาที่ไม่ใช่ String CharSequence เช่น สตริงที่มีสไตล์ span (#2853)
    • เพิ่ม CommandButton.executeAction เพื่อให้ตัวควบคุมเรียกใช้การดำเนินการที่ต้องการได้ง่ายขึ้น นอกจากนี้ยังอนุญาตให้ระบุพารามิเตอร์สำหรับคำสั่งบางอย่างของเพลเยอร์และเซสชันเพื่อกำหนดการดำเนินการที่จะทริกเกอร์
    • เพิ่มความเข้ากันได้แบบย้อนหลังสำหรับอินสแตนซ์ CommandButton โดยใช้ Player.Command หรือ SessionCommand ที่ไม่ใช่แบบกำหนดเองเพื่อกำหนดการดำเนินการ ตอนนี้ข้อมูลเหล่านี้จะแสดงอย่างถูกต้องในเซสชันสื่อของแพลตฟอร์ม เช่น สำหรับ UI ของระบบหรือ Android Auto
    • แก้ไขปัญหาที่ Bitmap เดียวกันถูกบีบอัดหลายครั้งเมื่อเชื่อมต่อ MediaController กับเซสชันสื่อของแพลตฟอร์ม
  • UI:
    • เพิ่มคลาส ProgressStateWithTickInterval และ Composable rememberProgressStateWithTickInterval ที่เกี่ยวข้องลงในโมดูล media3-ui-compose ตัวเก็บสถานะนี้ใช้ใน demo-compose เพื่อแสดงตำแหน่งและระยะเวลาปัจจุบันในรูปแบบข้อความ
    • เพิ่ม MuteButtonState ลงใน ui-compose ซึ่งจะจัดการการปิดเสียงของระดับเสียง Player ตัวเก็บสถานะนี้ใช้ใน demo-compose เพื่อแสดงปุ่มเปิด/ปิดเสียง
    • เพิ่มคลาส ProgressStateWithTickCount และ rememberProgressStateWithTickCount Composable ที่เกี่ยวข้องลงในโมดูล media3-ui-compose ตัวเก็บสถานะนี้ใช้ใน demo-compose เพื่อแสดงความคืบหน้าเป็นแถบความคืบหน้าแนวนอนแบบอ่านอย่างเดียว
    • เพิ่ม ContentFrame Composable ลงใน media3-ui-compose ซึ่งรวมการจัดการ PlayerSurface เข้ากับการปรับขนาดสัดส่วนภาพและการปิดด้วยชัตเตอร์
    • แก้ปัญหาข้อบกพร่องที่ทราบของแพลตฟอร์ม API 34 ซึ่งทำให้วิดีโอถูกยืด/ครอบตัดเมื่อใช้ SurfaceView ภายใน Compose AndroidView จึงส่งผลต่อ Composable ContentFrame และ PlayerSurface ที่มี SURFACE_TYPE_SURFACE_VIEW (#1237, #2811)
    • สร้างโมดูล media3-ui-compose-material3 ใหม่และเพิ่ม Composable ที่มีธีม Material3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton) ลงในโมดูล
    • เพิ่ม TimeText Composable ลงใน 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 ของ URI data: ที่ไม่ใช่แบบลำดับชั้น (#2688)
    • รีเซ็ต LiveConfiguration เป็นค่าที่ระบุโดย MediaItem ของ DashMediaSource เมื่อเผยแพร่และเมื่อผู้ใช้อัปเดตรายการสื่อ (#2606)
    • หลีกเลี่ยงการขัดข้องที่เกิดจากการอัปเดตไฟล์ Manifest ที่ไม่ถูกต้องซึ่งไม่ได้รายงานว่าเป็นข้อผิดพลาดของเพลเยอร์ (#2805)
  • ส่วนขยาย RTSP:
    • จัดการข้อผิดพลาดของแพ็กเก็ต RTP ที่ขาดหายไปเมื่อประมวลผลหน่วย NAL ที่แยกส่วนสำหรับ H264 และ H265 (#2613)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
    • ส่วนขยาย AV1: ตอนนี้ตัวถอดรหัสซอฟต์แวร์ AV1 ใช้ไลบรารี dav1d ประสิทธิภาพสูงแทนการใช้งาน libgav1 ก่อนหน้านี้เพื่อเพิ่มความเร็วในการถอดรหัส
    • ส่วนขยาย FFmpeg: แก้ไขปัญหาที่ทำให้ไฟล์ FLAC บางไฟล์เล่นไม่ได้โดยตรวจสอบว่าบล็อก STREAMINFO ได้รับการแยกวิเคราะห์อย่างถูกต้องและส่งไปยังตัวถอดรหัส (#2887)
  • ส่วนขยาย 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
  • 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)
    • เพิ่ม ExoPlayer API เวอร์ชันทดลองเพื่อรวมแฟล็ก 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 และย้ายข้อมูลไปยัง API AutoCloseable ที่อิงตามอินสแตนซ์ ใช้ 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:
    • เพิ่มการรองรับแพ็กเก็ตการรวม RTP สำหรับ H265 ตาม RFC 7798#4.4.2 (#2413)
    • แก้ไข RtspClient ให้ใช้ URI ของตำแหน่งตามที่ระบุไว้เมื่อประมวลผลการตอบกลับ HTTP 302 (#2398)
    • เพิ่มการรองรับการแยกวิเคราะห์สำหรับ SessionDescriptions ที่มีบรรทัดที่มีอักขระเว้นวรรคต่อท้าย (#2357)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
    • แก้ไขข้อบกพร่องที่ DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange ไม่มีผลกับส่วนขยายตัวถอดรหัสเสียง (#2258)
  • ส่วนขยาย Cast:
    • เพิ่มการรองรับ setVolume() และ getVolume() (#2279)
    • ป้องกันไม่ให้ CastPlayer เข้าสู่ STATE_BUFFERING ขณะที่ไทม์ไลน์ว่างเปล่า
    • เพิ่มการรองรับ getDeviceVolume(), setDeviceVolume(), getDeviceMuted() และ setDeviceMuted() (#2089)
  • ยูทิลิตีการทดสอบ
    • เพิ่ม 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)
  • เสียง
    • แก้ไขปัญหาการออฟโหลดที่ตำแหน่งอาจค้างเมื่อเล่นเพลย์ลิสต์เนื้อหาสั้น (#1920)
  • เซสชัน:
    • ลดระยะหมดเวลาการรวมสำหรับ Callback ของแพลตฟอร์ม MediaSession จาก 500 เป็น 100 มิลลิวินาที และเพิ่ม Setter ทดลองเพื่อให้แอปกำหนดค่านี้ได้
    • แก้ไขปัญหาที่การแจ้งเตือนปรากฏขึ้นอีกครั้งหลังจากที่ผู้ใช้ปิดไปแล้ว (#2302)
    • แก้ไขข้อบกพร่องที่เซสชันแสดงไทม์ไลน์รายการเดียวเมื่อเพลเยอร์ที่รวมไว้ว่างเปล่าจริงๆ กรณีนี้เกิดขึ้นเมื่อเพลเยอร์ที่รวมไว้ไม่มี COMMAND_GET_TIMELINE พร้อมใช้งานขณะที่ COMMAND_GET_CURRENT_MEDIA_ITEM พร้อมใช้งานและเพลเยอร์ที่รวมไว้ว่างเปล่า (#2320)
    • แก้ไขข้อบกพร่องที่ระบบละเว้นการเรียกใช้ MediaSessionService.setMediaNotificationProvider โดยไม่มีการแจ้งเตือนหลังจากมีการโต้ตอบอื่นๆ กับบริการ เช่น setForegroundServiceTimeoutMs (#2305)
  • 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 ด้วย null MediaMetadata ไม่ประเมินข้อมูลเมตาอีกครั้ง (#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 เพิ่มอินสแตนซ์ MetadataRenderer 2 รายการเพื่อเปิดใช้แอปให้รับสคีมาข้อมูลเมตาที่แตกต่างกัน 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 โดยใช้ MediaMetricsManager Transformer จะส่งต่อเหตุการณ์การแก้ไขและข้อมูลประสิทธิภาพไปยังแพลตฟอร์ม ซึ่งจะช่วยให้ข้อมูลประสิทธิภาพของระบบและข้อมูลการแก้ไขข้อบกพร่องในอุปกรณ์ นอกจากนี้ 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
    • เพิ่ม ExoPlayer API เวอร์ชันทดลองเพื่อทิ้งบัฟเฟอร์อินพุตของตัวถอดรหัส 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)
  • UI:
    • เพิ่มตัวเก็บสถานะและ Composable ลงในโมดูล media3-ui-compose สำหรับ PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState และ PlaybackSpeedState
  • ดาวน์โหลด:
    • แก้ไขข้อบกพร่องใน 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)
  • แอปสาธิต:
    • ขยาย 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)
  • วิดีโอ:
    • ย้อนกลับการใช้ค่าสัดส่วนภาพพิกเซลที่ระบุ MediaCodecAdapter เมื่อระบุขณะประมวลผล onOutputFormatChanged (#1371)
  • ข้อความ
    • แก้ไขข้อบกพร่องใน ReplacingCuesResolver.discardCuesBeforeTimeUs ที่คิวซึ่งทำงานอยู่ที่ timeUs (เริ่มก่อนหน้านี้แต่ยังไม่สิ้นสุด) ถูกทิ้งอย่างไม่ถูกต้อง (#1939)
  • ข้อมูลเมตา
    • ดึงข้อมูลหมายเลขแผ่น/แทร็กและประเภทจากความคิดเห็น Vorbis ไปยัง MediaMetadata (#1958)

เวอร์ชัน 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 ขณะที่ข้อผิดพลาดในการแยกวิเคราะห์จะถูกละเว้นโดยไม่มีการแจ้งเตือน (ซึ่งเป็นลักษณะการทำงานที่มีอยู่แล้ว)
    • แก้ไขข้อบกพร่องที่รายการเพลย์ลิสต์หรือระยะเวลาในสตรีม 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 อาจได้รับ null Surface ใน configure และการเรียกใช้เมธอดใหม่ detachOutputSurface เพื่อนำ Surface ที่ตั้งค่าไว้ก่อนหน้านี้ออกหากตัวแปลงรหัสรองรับการดำเนินการนี้ (MediaCodecInfo.detachedSurfaceSupported)
    • ใช้ค่าสัดส่วนพิกเซลที่ MediaCodecAdapter ระบุไว้ หากมี เมื่อประมวลผล onOutputFormatChanged (#1371)
    • เพิ่มวิธีแก้ปัญหาเกี่ยวกับอุปกรณ์ใน Galaxy Tab S7 FE ที่ทำให้สตรีม H264 ที่ปลอดภัย 60fps ถูกทำเครื่องหมายว่าไม่รองรับ (#1619)
    • เพิ่มวิธีแก้ปัญหาสำหรับตัวแปลงรหัสที่ค้างหลังจากตัวอย่างสุดท้ายโดยไม่แสดงสัญญาณสิ้นสุดสตรีม
  • ข้อความ
    • เพิ่ม VoiceSpan ที่กำหนดเองและป้อนข้อมูลสำหรับช่วงเสียง WebVTT (#1632)
    • ตรวจสอบว่า WebVTT ใน HLS ที่มีการประทับเวลาคำบรรยายขนาดใหญ่มาก (ซึ่งเกิน long 64 บิตเมื่อแสดงเป็นไมโครวินาทีและคูณด้วยฐานเวลา MPEG 90,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 เดิมไม่ขอรายการย่อยของ parentId 2 ครั้งเมื่อสมัครใช้บริการรายการหลัก
  • 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:
    • แก้ไขการนำข้อมูลผู้ใช้ออกสำหรับ URL ที่มีอักขระ @ ที่เข้ารหัส (#1138)
    • แก้ไขข้อขัดข้องเมื่อแยกวิเคราะห์แพ็กเก็ต RTP ที่มีส่วนขยายส่วนหัว (#1225)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
    • เพิ่มโมดูลตัวถอดรหัส IAMF ซึ่งรองรับการเล่นไฟล์ MP4 ที่มีแทร็ก IAMF โดยใช้ไลบรารีแบบเนทีฟ libiamf เพื่อสังเคราะห์เสียง
      • การเล่นจะเปิดใช้ด้วยเลย์เอาต์สเตอริโอและ 5.1 พร้อมการสร้างเสียงรอบทิศทาง รวมถึงการติดตามการเคลื่อนไหวของศีรษะ (ไม่บังคับ) แต่ปัจจุบันยังไม่รองรับการเล่นแบบ 2 หู
    • เพิ่มการรองรับหน้าขนาด 16 KB สำหรับส่วนขยายตัวถอดรหัสใน Android 15 (#1685)
  • ส่วนขยาย 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:
    • จัดการ Callback การโหลดล่วงหน้าแบบอะซิงโครนัสใน PreloadMediaSource (#1568)
    • อนุญาตให้เล่นโดยไม่คำนึงถึงระยะเวลาที่บัฟเฟอร์เมื่อโหลดไม่สำเร็จ (#1571)
  • เครื่องสกัดน้ำผลไม้
    • MP3: แก้ไขข้อผิดพลาด Searched too many bytes โดยละเว้นข้อมูลที่ไม่ใช่ MP3 ต่อท้ายอย่างถูกต้องตามช่องความยาวในเฟรม Info (#1480)
  • ข้อความ
    • TTML: แก้ไขการจัดการค่า tts:fontSize ของเปอร์เซ็นต์เพื่อให้แน่ใจว่าค่าดังกล่าวรับค่ามาจากโหนดระดับบนที่มีค่า tts:fontSize ของเปอร์เซ็นต์อย่างถูกต้อง
    • แก้ไข IndexOutOfBoundsException ใน LegacySubtitleUtil เนื่องจากจัดการกรณีที่เวลาเริ่มต้นของเอาต์พุตที่ขอมากกว่าหรือเท่ากับเวลาของเหตุการณ์สุดท้ายใน Subtitle ไม่ถูกต้อง (#1516)
  • DRM:
    • แก้ไขข้อผิดพลาด android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE ในอุปกรณ์ API 31 ขึ้นไปที่เล่นเนื้อหา L1 Widevine ข้อผิดพลาดนี้เกิดจากการติดตั้งใช้งานเมธอด MediaDrm.requiresSecureDecoder ของเฟรมเวิร์กที่ไม่สมบูรณ์ (#1603)
  • ผลกระทบ
    • เพิ่มวิธีการ release() ไปยัง GlObjectsProvider
  • เซสชัน:
    • เปลี่ยนการแตะ KEYCODE_HEADSETHOOK สองครั้งเป็นการดำเนินการ "กรอไปยังรายการถัดไป" ตามที่ระบุไว้ (#1493)
    • จัดการ KEYCODE_HEADSETHOOK เป็นคำสั่ง "เล่น" ใน MediaButtonReceiver เมื่อตัดสินใจว่าจะละเว้นเพื่อหลีกเลี่ยง ForegroundServiceDidNotStartInTimeException (#1581) หรือไม่
  • ส่วนขยาย 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 เพื่อแจ้งเตือนเมื่อบัฟเฟอร์อินพุตและเอาต์พุตพร้อมใช้งานโดย MediaCodecRenderer MediaCodecRenderer จะส่งสัญญาณไปยัง 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 แทนขนาดที่รายงานโดยสตรีมที่เกี่ยวข้อง (เช่น ขนาดไฟล์หรือส่วนหัว HTTP Content-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) มีการแมปกับแท็ก ID3 TSO2, TSOA และ TSOP อย่างไม่ถูกต้อง (#1302)
    • แก้ไขการอ่านแท็กตัวเลข gnre (ประเภท) และ tmpo (จังหวะ) ของ MP4 (/iTunes) เมื่อค่ามีความยาวมากกว่า 1 ไบต์
    • ส่งต่อเฟรม ID3 TCON ไปยัง MediaMetadata.genre (#1305)
  • รูปภาพ:
    • เพิ่มการรองรับตารางกริดภาพปก DASH ที่ไม่ใช่สี่เหลี่ยมจัตุรัส (#1300)
    • เพิ่มการรองรับ AVIF สำหรับ API 34 ขึ้นไป
    • อนุญาตให้ใช้ null เป็นพารามิเตอร์สำหรับ ExoPlayer.setImageOutput() เพื่อล้าง ImageOutput ที่ตั้งค่าไว้ก่อนหน้านี้
  • DataSource:
    • ใช้การรองรับ URI ทรัพยากรดิบ android.resource://package/id โดยที่ package แตกต่างจากแพ็กเกจของแอปพลิเคชันปัจจุบัน ก่อนหน้านี้ไม่มีการบันทึกว่าวิธีนี้ใช้ได้ แต่เป็นวิธีที่มีประสิทธิภาพมากกว่าในการเข้าถึงทรัพยากรในแพ็กเกจอื่นนอกเหนือจากชื่อ
    • ตรวจสอบอย่างกระตือรือร้นว่า url ไม่ใช่ค่า Null ในตัวสร้าง DataSpec พารามิเตอร์นี้มีคำอธิบายประกอบอยู่แล้วว่าไม่ใช่ค่า Null
    • อนุญาตให้ ByteArrayDataSource แปลง URI เป็นอาร์เรย์ไบต์ระหว่าง open() แทนที่จะเป็นฮาร์ดโค้ดที่การสร้าง (#1405)
  • 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 จะแมปกับสถานะข้อผิดพลาดร้ายแรงของ PlaybackStateCompat SessionError ที่ส่งไปยังตัวควบคุมการแจ้งเตือนสื่อพร้อม 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 ภายใน Compose AndroidView ใน 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)
  • ส่วนขยาย DASH
    • แก้ไขข้อบกพร่องที่การเตรียมไลฟ์สดแบบหลายช่วงเวลาอีกครั้งอาจทำให้เกิดข้อผิดพลาด IndexOutOfBoundsException (#1329)
    • เพิ่มการรองรับ URL ใบอนุญาต dashif:Laurl (#1345)
  • ส่วนขยาย 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.FormatSupport IntDef และค่าคงที่ 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)
  • DRM:
    • แก้ปัญหา NoSuchMethodError ซึ่งเฟรมเวิร์ก MediaDrm อาจแสดงขึ้นมาแทน ResourceBusyException หรือ NotProvisionedException ในอุปกรณ์ Android 14 บางรุ่น (#1145)
  • ผลกระทบ
    • ปรับปรุงการแมปโทนสี PQ เป็น SDR โดยการแปลงขอบเขตสี
  • เซสชัน:
    • แก้ไขปัญหาที่ตำแหน่งปัจจุบันข้ามกลับเมื่อตัวควบคุมแทนที่รายการปัจจุบัน (#951)
    • แก้ไขปัญหาที่ไม่มีการส่ง MediaMetadata ที่มีเพียง extras ที่ไม่ใช่ค่า Null ระหว่างตัวควบคุมสื่อและเซสชัน (#1176)
  • 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)
  • 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)
  • เสียง
    • ปรับปรุงอัลกอริทึมการข้ามช่วงที่ไม่มีเสียงด้วยการเพิ่มระดับเสียงอย่างราบรื่น โดยคงช่วงที่ไม่มีเสียงไว้เล็กน้อยและระยะเวลาที่ไม่มีเสียงที่เป็นธรรมชาติมากขึ้น (#7423)
    • รายงานช่วงที่ข้ามเสียงเงียบอย่างชัดเจนยิ่งขึ้น (#1035)
  • วิดีโอ:
    • เปลี่ยนเครื่องมือสร้าง 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 ใกล้กับเวลาที่นำเสนอ
  • DRM:
    • เล่นตัวอย่างที่ไม่ได้เข้ารหัส "Clear Lead" ในเนื้อหา DRM ทันทีโดยค่าเริ่มต้น แม้ว่าคีย์สำหรับตัวอย่างที่เข้ารหัสในภายหลังจะยังไม่พร้อมใช้งานก็ตาม ซึ่งอาจทำให้การเล่นหยุดชะงักกลางคันหากคีย์ยังไม่พร้อมเมื่อตำแหน่งการเล่นถึงตัวอย่างที่เข้ารหัส (แต่ก่อนหน้านี้การเล่นจะไม่เริ่มเลยเมื่อถึงจุดนี้) คุณปิดใช้ลักษณะการทำงานนี้ได้ด้วย MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey หรือ DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
      • ส่วนขยาย IMA:
    • แก้ไขปัญหาที่โฆษณา DASH และ HLS ที่ไม่มีนามสกุลไฟล์ที่เหมาะสมไม่สามารถเล่นได้
  • เซสชัน:
    • ปิดใช้การตรวจจับการดับเบิลคลิกสำหรับแอป 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

เวอร์ชัน 1.3.0-beta01

7 กุมภาพันธ์ 2024

ใช้เวอร์ชันเสถียร 1.3.0

เวอร์ชัน 1.3.0-alpha01

15 มกราคม 2024

ใช้เวอร์ชันเสถียร 1.3.0

เวอร์ชัน 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)
  • เสียง
    • แก้ไขการจัดการ EOS สำหรับ SilenceSkippingAudioProcessor เมื่อมีการเรียกใช้หลายครั้ง (#712)
  • วิดีโอ:
    • เพิ่มวิธีแก้ปัญหาเกี่ยวกับอุปกรณ์ใน 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 เมื่อเปลี่ยนจากเนื้อหาที่เข้ารหัสเป็นเนื้อหาที่ไม่มีการเข้ารหัสโดยไม่มีแพลตฟอร์มที่เชื่อมต่อกับเพลเยอร์ ข้อผิดพลาดเกิดจากการใช้ตัวถอดรหัสที่ปลอดภัยอย่างไม่ถูกต้องเพื่อเล่นเนื้อหาที่ไม่มีการเข้ารหัส
  • เซสชัน:
    • ใส่คีย์และค่าที่กำหนดเองใน MediaMetadataCompat เป็น MediaMetadata.extras และ MediaMetadata.extras เป็น MediaMetadataCompat (#756, #802)
    • แก้ไขการกระจายสัญญาณ notifyChildrenChanged สำหรับตัวควบคุมเดิม (#644)
    • แก้ไขข้อบกพร่องที่การตั้งค่าเวลาติดลบสำหรับตัวจับเวลา setWhen ที่ปิดใช้ของการแจ้งเตือนทำให้เกิดข้อขัดข้องในอุปกรณ์บางเครื่อง (#903)
    • แก้ไข IllegalStateException เมื่อตัวควบคุมการแจ้งเตือนสื่อยังเชื่อมต่อไม่เสร็จสมบูรณ์เมื่อมีการขออัปเดตการแจ้งเตือนครั้งแรก (#917)
  • UI:
    • แก้ไขปัญหาที่ปุ่มกรอไปข้างหน้าและกรอกลับไม่แสดงเมื่อใช้กับ Material Design ใน BottomSheetDialogFragment (#511)
    • แก้ไขปัญหาที่ตัวเลขในปุ่มกรอไปข้างหน้าของPlayerControlViewไม่ตรงแนว (#547)
  • ส่วนขยาย DASH
    • แยกวิเคราะห์ "f800" เป็นจำนวนช่อง 5 ช่องสำหรับ Dolby ในไฟล์ Manifest ของ DASH (#688)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1, MIDI ฯลฯ):
    • MIDI: แก้ไขปัญหาที่การกรอไปข้างหน้าข้ามเหตุการณ์การเปลี่ยนแปลงโปรแกรม (#704)
    • ย้ายข้อมูลไปยัง FFmpeg 6.0 และอัปเดต NDK ที่รองรับเป็น r26b (#707, #867)
  • ส่วนขยาย 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_REQUIRED DefaultTrackSelector จะเลือกเฉพาะแทร็กเสียงและเฉพาะในกรณีที่รูปแบบของแทร็กนั้นรองรับการออฟโหลด หากไม่มีแทร็กเสียงที่รองรับในการออฟโหลด ระบบจะไม่เลือกแทร็กใดเลย
    • 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)
  • วิดีโอ:
    • อนุญาตให้ 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)
  • 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)

เวอร์ชัน 1.1.0

5 กรกฎาคม 2023

  • Common Library:
    • เพิ่มเหตุผลในการระงับสำหรับเส้นทางเสียงที่ไม่เหมาะสม และเล่นเมื่อพร้อม เปลี่ยนเหตุผลสำหรับการระงับนานเกินไป (#15)
    • เพิ่มคำสั่งลงใน Player โดยทำดังนี้
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_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() เพื่อเปิดใช้การบันทึกคีย์ที่กำหนดเอง
    • เพิ่มการดำเนินการเพิ่มเติมลงในไฟล์ Manifest ของเดโมหลักเพื่อให้เริ่มแอปเดโมด้วยไฟล์ *.exolist.json ที่กำหนดเองได้ง่ายขึ้น (#439)
    • เพิ่ม ExoPlayer.setVideoEffects() สำหรับการใช้ Effect ระหว่างการเล่นวิดีโอ
    • อัปเดต SampleQueue เพื่อจัดเก็บ sourceId เป็น long แทนที่จะเป็น int ซึ่งจะเปลี่ยนซิกเนเจอร์ของเมธอดสาธารณะ SampleQueue.sourceId และ SampleQueue.peekSourceId
    • เพิ่มพารามิเตอร์ลงในเมธอด LoadControl shouldStartPlayback และ 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) เมื่อเรียกใช้ในเพลย์ลิสต์ที่ว่างเปล่า
  • 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 จะทริกเกอร์การเลือกแทร็กใหม่เมื่อความสามารถของโปรแกรมแสดงผลมีการเปลี่ยนแปลง
  • เครื่องสกัดน้ำผลไม้
    • Ogg: แก้ไขข้อบกพร่องเมื่อกรอในไฟล์ที่มีระยะเวลานาน (#391)
    • FMP4: แก้ไขปัญหาที่ TimestampAdjuster เริ่มต้นการประทับเวลาออฟเซ็ตที่ไม่ถูกต้องด้วยเวลาตัวอย่างข้อมูลเมตาจากอะตอม emsg (#356)
  • เสียง
    • แก้ไขข้อบกพร่องที่การเล่นบางรายการไม่สำเร็จเมื่อเปิดใช้การทันเนลและ 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 ที่กำหนดเองด้วยปุ่มเล่น/หยุดชั่วคราว
  • ส่วนขยาย RTSP:
    • สำหรับ MPEG4-LATM ให้ใช้ค่า profile-level-id เริ่มต้นหากไม่มีในข้อความ SDP ของการตอบกลับ Describe (#302)
    • ใช้ URI พื้นฐานสำหรับการแปลง Relative Path จากเซสชัน RTSP หากมีอยู่ในส่วนหัวการตอบกลับ DESCRIBE (#11160)
  • ส่วนขยาย DASH
    • นำออฟเซ็ตเวลาของสื่อออกจาก MediaLoadData.startTimeMs และ MediaLoadData.endTimeMs สำหรับสตรีม DASH แบบหลายช่วงเวลา
    • แก้ไขข้อบกพร่องที่การเตรียมแหล่งที่มาของสื่อ DASH แบบสดที่มีหลายช่วงเวลาอีกครั้งทำให้เกิด IndexOutOfBoundsException (#10838)
  • ส่วนขยาย HLS
    • เพิ่ม HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) เพื่อตั้งค่าระยะหมดเวลาสำหรับชุดข้อความการโหลดเพื่อรอให้ TimestampAdjuster เริ่มต้น หากการเริ่มต้นไม่เสร็จสมบูรณ์ก่อนหมดเวลา ระบบจะแสดง PlaybackException เพื่อหลีกเลี่ยงไม่ให้การเล่นหยุดชะงักอย่างไม่มีที่สิ้นสุด ระยะหมดเวลาจะตั้งค่าเป็น 0 โดยค่าเริ่มต้น (#323)
  • ยูทิลิตีการทดสอบ
    • ตรวจสอบการไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ของสคีม URI ใน DataSourceContractTest
  • นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
    • นำตัวสร้าง 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

  • ไลบรารีหลัก
    • แก้ไขการตรวจหาประเภทเครือข่ายใน API 33 (#10970)
    • แก้ไข NullPointerException เมื่อโทรหา ExoPlayer.isTunnelingEnabled (#10977)
  • ดาวน์โหลด:
    • ทำให้ความแตกต่างสูงสุดของเวลาเริ่มต้นของ 2 ส่วนที่จะผสานรวมสามารถกำหนดค่าได้ใน SegmentDownloader และคลาสย่อย (#248)
  • เสียง
    • แก้ไขการเล่น MP3 แบบไม่มีช่องว่างที่ใช้งานไม่ได้ในอุปกรณ์ Samsung (#8594)
    • แก้ไขข้อบกพร่องที่ความเร็วในการเล่นที่ตั้งค่าทันทีหลังจากปิดใช้เสียงอาจถูกลบล้างโดยการเปลี่ยนความเร็วครั้งก่อนหน้า (#10882)
  • วิดีโอ:
    • แมปรูปแบบ HEVC HDR10 กับ HEVCProfileMain10HDR10 แทน HEVCProfileMain10
    • เพิ่มวิธีแก้ปัญหาเกี่ยวกับอุปกรณ์ใน Chromecast พร้อม Google TV และ Lenovo M10 FHD Plus ที่ทำให้ระบบทำเครื่องหมายสตรีม AVC 60 FPS ว่าไม่รองรับ (#10898)
    • แก้ไขปัญหาด้านประสิทธิภาพการแสดงผลเฟรมเมื่อเล่นสื่อที่มีอัตราเฟรมสูงกว่าอัตราการรีเฟรชหน้าจอมาก
  • นักแสดง
    • แก้ไขปัญหา STATE_IDLE ชั่วคราวเมื่อเปลี่ยนระหว่างรายการสื่อ (#245)
  • RTSP:
    • ตรวจจับ IllegalArgumentException ที่เกิดขึ้นในการแยกวิเคราะห์ข้อความอธิบายการตอบกลับ RTSP ที่ไม่ถูกต้อง (#10971)
  • เซสชัน:
    • แก้ไขข้อบกพร่องที่ปุ่มเล่น/หยุดชั่วคราวของการแจ้งเตือนไม่อัปเดตตามสถานะโปรแกรมเล่น (#192)
  • ส่วนขยาย IMA:
    • แก้ไขข้อบกพร่องที่ทำให้สตรีม DAI ที่ไม่มีโฆษณาไม่เริ่มทำงานเนื่องจากไม่ได้รับเหตุการณ์ LOADED แรก (และในกรณีที่ไม่มีโฆษณาจะเป็นเหตุการณ์เดียว)

เวอร์ชัน 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
  • แอปสาธิต:
    • ขอสิทธิ์การแจ้งเตือนสำหรับการแจ้งเตือนการดาวน์โหลดที่รันไทม์ (#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)
  • ดาวน์โหลด:
    • แก้ไขการวนซ้ำที่ไม่สิ้นสุดที่อาจเกิดขึ้นใน ProgressiveDownloader ซึ่งเกิดจากการดาวน์โหลดและการเล่นพร้อมกันด้วย PriorityTaskManager เดียวกัน (#10570)
    • ทำให้การแจ้งเตือนการดาวน์โหลดปรากฏขึ้นทันที (#183)
    • จำกัดการนำการดาวน์โหลดแบบขนานออกเป็น 1 รายการเพื่อหลีกเลี่ยงการสร้างชุดข้อความมากเกินไป (#10458)
  • วิดีโอ:
    • ลองใช้ตัวถอดรหัสอื่นสำหรับ 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 สามารถโหลดบิตแมปจาก URI file:// ได้ (#108)
    • แก้ไขการยืนยันที่ป้องกันไม่ให้ MediaController ค้นหาโฆษณาในระยะเวลาหนึ่ง (#122)
    • เมื่อการเล่นสิ้นสุดลง ระบบจะหยุด MediaSessionService จากเบื้องหน้าและแสดงการแจ้งเตือนให้เริ่มเล่นรายการสื่อที่เล่นล่าสุดอีกครั้ง (#112)
    • อย่าเริ่มบริการที่ทำงานอยู่เบื้องหน้าด้วย Intent รอดำเนินการสำหรับการหยุดชั่วคราว (#167)
    • ซ่อน "ป้าย" ที่เชื่อมโยงกับการแจ้งเตือนที่สร้างโดย DefaultNotificationProvider ใน API 26 และ API 27 ด้วยตนเอง (ป้ายจะซ่อนโดยอัตโนมัติใน API 28 ขึ้นไป) (#131)
    • แก้ไขข้อบกพร่องที่การเชื่อมต่อ Binder ครั้งที่ 2 จาก MediaSession เดิมไปยัง Media3 MediaController ทำให้เกิด IllegalStateExceptions (#49)
  • RTSP:
    • เพิ่มการจัดการแพ็กเก็ตที่แยกส่วนของ H263 (#119)
    • เพิ่มการรองรับ MP4A-LATM (#162)
  • IMA:
    • เพิ่มระยะหมดเวลาสำหรับการโหลดข้อมูลโฆษณาเพื่อจัดการกรณีที่ IMA SDK โหลดโฆษณาไม่สำเร็จ (#10510)
    • ป้องกันการข้ามโฆษณาตอนกลางเมื่อกรอไปยังตอนท้ายของเนื้อหา (#10685)
    • คำนวณระยะเวลาของหน้าต่างสำหรับไลฟ์สดที่มีโฆษณาที่แทรกฝั่งเซิร์ฟเวอร์อย่างถูกต้อง เช่น IMA DAI (#10764)
  • ส่วนขยาย 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)
  • เครื่องสกัดน้ำผลไม้
    • แก้ไขการแยกวิเคราะห์ชุดภาพอ้างอิงระยะสั้น H265 (#10316)
    • แก้ไขการแยกวิเคราะห์อัตราบิตจากกล่อง esds (#10381)
  • DASH:
    • แยกวิเคราะห์ URL ใบอนุญาต ClearKey จากไฟล์ Manifest (#10246)
  • UI:
    • ตรวจสอบว่า TalkBack ประกาศตัวเลือกความเร็วที่ใช้งานอยู่ในปัจจุบันในเมนูตัวควบคุมการเล่น (#10298)
  • RTSP:
    • เพิ่มการจัดการแพ็กเก็ตที่แยกส่วน VP8 (#110)
  • ส่วนขยาย Leanback:
    • ฟังการเปลี่ยนแปลงของ playWhenReady ใน LeanbackAdapter (10420)
  • นักแสดง
    • ใช้ MediaItem ที่ส่งไปยังเมธอดเพลย์ลิสต์เป็น Window.mediaItem ใน CastTimeline (#25, #8212)
    • สนับสนุน Player.getMetadata() และ Listener.onMediaMetadataChanged() ด้วย CastPlayer (#25)

เวอร์ชัน 1.0.0-beta01

16 มิถุนายน 2022

androidx.media3:media3-*:1.0.0-beta01 เผยแพร่แล้ว เวอร์ชัน 1.0.0-beta01 มีคอมมิตเหล่านี้

ซึ่งสอดคล้องกับรุ่น ExoPlayer 2.18.0

  • ไลบรารีหลัก
    • เปิดใช้การสนับสนุนสำหรับการวินิจฉัยแพลตฟอร์ม Android ผ่าน MediaMetricsManager ExoPlayer จะส่งต่อเหตุการณ์การเล่นและข้อมูลประสิทธิภาพไปยังแพลตฟอร์ม ซึ่งจะช่วยให้ข้อมูลประสิทธิภาพของระบบและการแก้ไขข้อบกพร่องในอุปกรณ์ นอกจากนี้ 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 เพื่อให้ผู้เล่นอนุญาตการตั้งค่ารายการเดียวได้
  • การเลือกแทร็ก
    • รวมคลาส 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 เป็นคลาส Wrapper AudioAttributesV21 ใหม่ เพื่อป้องกันการยืนยัน 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 เท่านั้น
  • เครื่องสกัดน้ำผลไม้
    • เพิ่มการรองรับ AVI (#2092)
    • Matroska: แยกวิเคราะห์ DiscardPadding สำหรับแทร็ก Opus
    • MP4: แยกวิเคราะห์อัตราบิตจากกล่อง esds
    • Ogg: อนุญาตให้ใช้รหัส Opus และส่วนหัวของความคิดเห็นที่ซ้ำกัน (#10038)
  • 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 ได้อย่างชัดเจนหากจำเป็น
  • 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)
  • นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
    • นำ Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray) ออก โปรดใช้ Player.Listener.onTracksChanged(Tracks) แทน
    • นำ Player.getCurrentTrackGroups และ Player.getCurrentTrackSelections ออก โปรดใช้ Player.getCurrentTracks แทน นอกจากนี้ คุณยังใช้ ExoPlayer.getCurrentTrackGroups และ ExoPlayer.getCurrentTrackSelections ต่อไปได้ แม้ว่าเราจะเลิกใช้งานวิธีการเหล่านี้แล้วก็ตาม
    • นำค่าคงที่ DownloadHelper DEFAULT_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 ซ้ำใน TrackGroupArray TrackGroup สามารถทำให้แยกความแตกต่างได้เสมอโดยการตั้งค่า id ในคอนสตรัคเตอร์ TrackGroup การดำเนินการนี้จะแก้ไขข้อขัดข้องเมื่อกลับมาเล่นต่อหลังจากที่แอปทำงานอยู่เบื้องหลังโดยมีการลบล้างแทร็กที่ใช้งานอยู่ (#9718)
    • แก้ไขตรรกะใน AdaptiveTrackSelection เพื่ออนุญาตให้เพิ่มคุณภาพภายใต้แบนด์วิดท์เครือข่ายที่เพียงพอ แม้ว่าการเล่นจะใกล้เคียงกับไลฟ์สดมากก็ตาม (#9784)
  • วิดีโอ:
    • แก้ไขตรรกะสำรองของตัวถอดรหัสสำหรับ Dolby Vision เพื่อใช้ตัวถอดรหัส H264/H265 ที่เข้ากันได้หากจำเป็น
  • เสียง
    • แก้ไขตรรกะการสำรองข้อมูลตัวถอดรหัสสำหรับ Dolby Atmos (E-AC3-JOC) เพื่อใช้ตัวถอดรหัส E-AC3 ที่เข้ากันได้หากจำเป็น
    • เปลี่ยน AudioCapabilities API ให้ต้องส่ง AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES อย่างชัดเจนแทน null
    • อนุญาตให้ปรับแต่งการคำนวณขนาดบัฟเฟอร์ AudioTrack โดยแทรก AudioTrackBufferSizeProvider ลงใน DefaultAudioSink (#8891)
    • ลองสร้าง AudioTrack อีกครั้งหากขนาดบัฟเฟอร์ที่ขอมากกว่า 1 MB (#9712)
  • เครื่องสกัดน้ำผลไม้
    • WAV: เพิ่มการรองรับสตรีม RF64 (#9543)
    • แก้ไขการแยกวิเคราะห์หน่วย NAL ของ H.265 SPS ที่ไม่ถูกต้อง (#9719)
    • แยกวิเคราะห์ Vorbis Comments (รวมถึง METADATA_BLOCK_PICTURE) ในไฟล์ Ogg Opus และ Ogg Vorbis
  • ข้อความ
    • เพิ่มช่อง MediaItem.SubtitleConfiguration.id ซึ่งจะส่งต่อไปยังช่อง Format.id ของแทร็กคำบรรยายที่สร้างขึ้นจากการกำหนดค่า (#9673)
    • เพิ่มการรองรับพื้นฐานสำหรับคำบรรยาย WebVTT ในคอนเทนเนอร์ Matroska (#9886)
    • ป้องกันไม่ให้ Cea708Decoder อ่านเกินขนาดที่ประกาศไว้ของบล็อกบริการ
  • DRM:
    • นำ playbackLooper ออกจาก DrmSessionManager.(pre)acquireSession เมื่อแอปใช้ DrmSessionManager ใน MediaSource ที่กำหนดเอง จะต้องส่ง playbackLooper ไปยัง DrmSessionManager.setPlayer แทน
  • การเล่นโฆษณา / IMA:
    • เพิ่มการรองรับการแทรกโฆษณาแบบไดนามิก (DAI) ของ IMA (#8213)
    • เพิ่มเมธอดลงใน AdPlaybackState เพื่ออนุญาตให้รีเซ็ตกลุ่มโฆษณาเพื่อให้เล่นอีกครั้งได้ (#9615)
    • บังคับใช้ความเร็วในการเล่นที่ 1.0 ระหว่างการเล่นโฆษณา (#9018)
    • แก้ไขปัญหาที่กลุ่มโฆษณาซึ่งโหลดไม่สําเร็จทําให้ระบบรีเซ็ตการเล่นทันที (#9929)
  • UI:
    • แก้ไขสีของตัวเลขในปุ่มกรอกลับและกรอไปข้างหน้าของ StyledPlayerView เมื่อใช้ธีมบางธีม (#9765)
    • แปลสตริงความเร็วในการเล่นอย่างถูกต้อง (#9811)
  • 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:
    • จัดเตรียม API ของไคลเอ็นต์เพื่อลบล้าง SocketFactory ที่ใช้สำหรับการเชื่อมต่อเซิร์ฟเวอร์ (#9606)
    • เลือกวิธีการตรวจสอบสิทธิ์แบบ DIGEST แทน BASIC หากมีทั้ง 2 วิธี (#9800)
    • จัดการเมื่อเวลาของแทร็ก RTSP ไม่พร้อมใช้งาน (#9775)
    • ละเว้นค่าส่วนหัว RTP-Info ที่ไม่ถูกต้อง (#9619)
  • Transformer:
    • เพิ่มเวอร์ชัน API ขั้นต่ำที่จำเป็นเป็น 21
    • ตอนนี้ TransformationException ใช้เพื่ออธิบายข้อผิดพลาดที่เกิดขึ้นระหว่างการเปลี่ยนรูปแบบ
    • เพิ่ม TransformationRequest เพื่อระบุตัวเลือกการเปลี่ยนรูปแบบ
    • อนุญาตให้ลงทะเบียน Listener หลายรายการ
    • แก้ไขปัญหา Transformer ค้างเมื่ออ่านเอาต์พุตตัวแปลงรหัสได้บางส่วน
    • แก้ไข NPE ที่อาจเกิดขึ้นใน Transformer.getProgress เมื่อการปล่อย Muxer แสดงข้อผิดพลาด
    • เพิ่มแอปสาธิตเพื่อใช้การเปลี่ยนรูปแบบ
  • ส่วนขยาย MediaSession:
    • โดยค่าเริ่มต้น ตอนนี้ MediaSessionConnector จะล้างเพลย์ลิสต์เมื่อหยุดเล่น แอปที่ต้องการเก็บเพลย์ลิสต์ไว้สามารถเรียกใช้ setClearMediaItemsOnStop(false) ในเครื่องมือเชื่อมต่อได้
  • ส่วนขยาย Cast:
    • แก้ไขข้อบกพร่องที่ทำให้ CastPlayer ไม่สามารถเรียกใช้ onIsPlayingChanged ได้อย่างถูกต้อง (#9792)
    • รองรับข้อมูลเมตาของเสียง รวมถึงอาร์ตเวิร์กด้วย DefaultMediaItemConverter (#9663)
  • ส่วนขยาย FFmpeg:
    • ทำให้ build_ffmpeg.sh ขึ้นอยู่กับ bin utils ของ LLVM แทน GNU (#9933)
  • ความเข้ากันได้กับ Android 12
    • อัปเกรดส่วนขยาย Cast ให้ใช้ com.google.android.gms:play-services-cast-framework:20.1.0 play-services-cast-framework เวอร์ชันก่อนหน้าไม่สามารถใช้งานร่วมกับแอปที่กำหนดเป้าหมายเป็น Android 12 และจะขัดข้องพร้อมข้อผิดพลาด IllegalArgumentException เมื่อสร้าง PendingIntent (#9528)
  • นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
    • นำ 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 ใหม่ ซึ่งจะช่วยให้สามารถผสานรวมระหว่างเพลเยอร์และเซสชันสื่อได้โดยตรงโดยไม่ต้องใช้คลาสอะแดปเตอร์/เครื่องมือเชื่อมต่อ