Media3

ไลบรารีสนับสนุนสำหรับกรณีการใช้งานสื่อ
อัปเดตล่าสุด รุ่นที่เสถียร รุ่นที่อาจได้รับการเผยแพร่ รุ่นเบต้า รุ่นอัลฟ่า
11 พฤศจิกายน 2569 1.11.1 - 1.12.0-beta01 -

การประกาศทรัพยากร 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-beta01

11 พฤศจิกายน 2569

เวอร์ชัน 1.12.0-beta01 มีคอมมิตต่อไปนี้

  • ไลบรารีทั่วไป:
    • ลด C.DEFAULT_BUFFER_SEGMENT_SIZE จาก 65536 เป็น 65520 เพื่อให้การจัดสรรบัฟเฟอร์แต่ละรายการ (รวมถึงส่วนหัวของออบเจ็กต์ byte[]) พอดีกับหน้า OS ทั้งหมดในพื้นที่ออบเจ็กต์ขนาดใหญ่ของ ART ซึ่งจะช่วยลดการใช้งานหน่วยความจำบัฟเฟอร์ตัวอย่างลงประมาณ 6% ในอุปกรณ์หน้า 4 KiB และประมาณ 20% ในอุปกรณ์หน้า 16 KiB
    • แทนที่ androidx.media3.common.util.NullableType ด้วย JSpecify org.jspecify.annotations.Nullable
    • นำ androidx.media3.common.util.UnknownNull ออกเพื่อใช้คำอธิบายประกอบ Nullness ของ JSpecify คลาสย่อย Kotlin ของ RunnableFutureTask ที่มีประเภทผลลัพธ์ที่อนุญาตค่า Null (เช่น Void?) ต้องระบุอาร์กิวเมนต์ประเภทที่อนุญาตค่า Null (เช่น RunnableFutureTask<Void?, Exception>)
    • เพิ่ม AdViewProvider.getAdVideoView() เพื่อระบุคอนเทนเนอร์วิดีโอ View ที่ปรับขนาดได้ระหว่างการเล่นโฆษณา
    • แมปสตริงตัวแปลงรหัส RFC 6381 ของ mlpa กับ MimeTypes.AUDIO_TRUEHD ใน MimeTypes.getMediaMimeType ซึ่งจะแก้ไขแทร็กเสียง Dolby TrueHD ที่มัลติเพล็กซ์ซึ่งขาดหายไประหว่างการเตรียมแบบไม่มีกลุ่มข้อมูลของ HLS (#3485)
    • แก้ไข AdPlaybackState.withAdDurationsUs เพื่อคัดลอกอาร์เรย์ที่ส่งมาและ AdPlaybackState.fromAdPlaybackState เพื่อคัดลอกฟิลด์อาร์เรย์ทั้งหมดของกลุ่มโฆษณา เพื่อไม่ให้แก้ไขอินสแตนซ์ผ่านอาร์เรย์ที่เก็บไว้หรือแชร์ได้อีกต่อไป
    • แก้ไข IllegalStateException ("มีการเข้าถึงเพลเยอร์ในชุดข้อความที่ไม่ถูกต้อง") เมื่อ Player.listen หรือ Player.listenTo ถูกยกเลิกจากชุดข้อความอื่นที่ไม่ใช่ชุดข้อความแอปพลิเคชันของเพลเยอร์ (เช่น ระหว่างการแยกย่อยการทดสอบ UI ของ Compose) (#3005)
  • ExoPlayer:
    • แก้ไขปัญหาที่โปรแกรมแสดงผลที่เปิดใช้ก่อนเวลาสำหรับช่วงสื่อที่กำลังจะมาถึงอาจเริ่มแสดงผลก่อนที่การเล่นจะเปลี่ยนไปเป็นช่วงนั้น
    • คลาสย่อย Kotlin ของ CompositeMediaSource ที่ใช้รหัสแหล่งที่มาของบุตรหลานที่อนุญาตค่า Null (เช่น Void?) ต้องระบุอาร์กิวเมนต์ประเภทที่อนุญาตค่า Null (เช่น CompositeMediaSource<Void?>)
    • ตรวจสอบใน AdsMediaSource ว่า AdPlaybackState.removedAdGroupCount ไม่ลดลงในการอัปเดต AdPlaybackState รายการ
    • แก้ไขปัญหาที่การเปลี่ยนระหว่างช่วงเวลาของสื่อที่ใช้โปรแกรมแสดงผลที่แตกต่างกันอาจเปิดใช้โปรแกรมแสดงผลขาเข้าก่อนเวลาอันควร ก่อนที่โปรแกรมแสดงผลขาออกจะแสดงผลเสร็จ (เช่น แสดง IllegalStateException ("เปิดใช้นาฬิกาสื่อของโปรแกรมแสดงผลหลายรายการ")) เมื่อเปิดใช้ Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION
    • แก้ไขปัญหาที่การเปลี่ยนไปใช้โฆษณาที่ความเร็วในการเล่นที่กำหนดเองอาจทำให้การเลื่อนโปรแกรมแสดงผลทั้งหมดไปยังช่วงโฆษณาล่าช้าเมื่อเปิดใช้ Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION
    • แก้ไขปัญหาเกี่ยวกับโปรแกรมแสดงผลที่เตรียมพร้อมล่วงหน้าระหว่างการเปลี่ยนช่วงเวลาของสื่อและการเลือกแทร็กอีกครั้ง
    • เพิ่ม MediaPeriod.supportsStreamPrerollFlags() (ค่าเริ่มต้นเป็น false) เพื่อให้การติดตั้งใช้งาน MediaPeriod ที่กำหนดเองสามารถเลือกใช้การรายงานความไม่ต่อเนื่องเริ่มต้นโดยใช้ SampleStream.getFlags() และกลับไปใช้ MediaPeriod.readDiscontinuity() เมื่อไม่รองรับและเปิดใช้ Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION
    • แก้ไขปัญหาที่การข้ามโฆษณาตามด้วยโฆษณาอีกรายการในกลุ่มโฆษณาเดียวกันได้รับการรายงานด้วย DISCONTINUITY_REASON_AUTO_TRANSITION แทนที่จะเป็น DISCONTINUITY_REASON_SKIP หรือไม่ได้รับการรายงานเลยเมื่อ AdsMediaSource ใช้การเตรียมแหล่งที่มาของเนื้อหาแบบ Lazy Loading
  • Transformer:
    • เพิ่ม CodecDB (androidx.media3.transformer.codecdb) ซึ่งจะแนะนำการกำหนดค่าโปรแกรมเปลี่ยนไฟล์วิดีโอ (ตัวแปลงรหัส การตั้งค่าโปรแกรมเปลี่ยนไฟล์ และอัตราบิต) สำหรับอุปกรณ์ปัจจุบันจากข้อมูลคุณภาพของโปรแกรมเปลี่ยนไฟล์ที่วัดได้
  • เครื่องสกัดน้ำผลไม้
    • ADTS: แก้ไข AdtsExtractor ที่รับรูปแบบเสียงจากคำที่ซิงค์ไม่ถูกต้องในเพย์โหลดของเฟรมแรกบางส่วน ซึ่งอาจทำให้การเล่นสตรีม AAC แบบสดที่เข้าร่วมกลางเฟรมล้มเหลวหรือหยุดชะงัก (#3464)
    • แก้ไข ArrayIndexOutOfBoundsException ใน FragmentedMp4Extractor เมื่อส่วนย่อยมีกล่อง trun ที่ไม่มีตัวอย่าง (#3471)
    • ADTS: เพิ่ม FLAG_DISABLE_ID3_METADATA ลงใน AdtsExtractor เพื่อหยุดไม่ให้ข้อมูล ID3 ในสตรีมแสดงผลเป็นแทร็ก application/id3
    • MP4: แก้ไขการเล่นแบบไม่มีช่องว่างของแทร็ก AAC ที่มี Muxer (เช่น FFmpeg) ซึ่งลดรายการ stts สุดท้ายเพื่อยกเว้นระยะห่างจากขอบของโปรแกรมเปลี่ยนไฟล์ ซึ่ง ทำให้ระยะห่างจากขอบได้มาเป็น 0 จากรายการแก้ไข elst และ ตอนท้ายของเฟรมสุดท้ายที่จะเล่น (#3489)
    • แก้ไขการจัดสรรบัฟเฟอร์การดูตัวอย่างล่วงหน้าขนาดใหญ่และ OutOfMemoryError เมื่อตรวจหาไฟล์ที่เสียหายหรือไม่ใช่ไฟล์สื่อที่ขึ้นต้นด้วย ID3 (#3502)
  • ผู้ตรวจสอบ
    • แก้ไขปัญหาที่การยกเลิก Future ที่แสดงผลโดย MetadataRetriever.retrieveDurationUs() ทำให้ close() ไม่สามารถปล่อย MediaSource ที่เกี่ยวข้องได้ (#3468)
    • แก้ไข MediaExtractorCompat เพื่อแสดงผล MediaFormat.KEY_FRAME_RATE เป็นจำนวนเต็มที่ตรงกับแพลตฟอร์ม MediaExtractor
  • เสียง:
    • แก้ไขปัญหาที่ระบบรวมช่วงที่ไม่มีเสียงซึ่งข้ามไปในบัฟเฟอร์ไว้ใน AudioSink.getCurrentPositionUs(boolean) และรายงานโดยใช้ AudioSink.Listener.onSilenceSkipped() ก่อนที่การเล่นจะถึงส่วนที่ข้ามไป (#3472)
    • ตั้งค่าแหล่งที่มาของตัวแปลงรหัสโดยใช้ AudioTrack.Builder.setCodecProvenance ใน API 37 ขึ้นไปเมื่อเล่นเสียง PCM แบบหลายช่องทางเชิงพื้นที่ซึ่งถอดรหัสจากรูปแบบที่บีบอัด
    • แก้ไขการข้ามการลองเริ่มต้น AudioTrack อีกครั้งเมื่อเสียง 1 วินาทีมีขนาดอย่างน้อยเท่ากับขนาดบัฟเฟอร์เริ่มต้น ซึ่งทำให้การส่งผ่าน DTS-HD ไม่สำเร็จในอุปกรณ์ที่มีหน่วยความจำเสียงจำกัด (#3487)
  • วิดีโอ
    • อนุญาตให้กลับไปใช้ตัวถอดรหัส H.265/HEVC สำหรับสตรีม Dolby Vision Profile 7 ที่เข้ากันได้แบบย้อนหลัง และไม่กลับไปใช้ตัวถอดรหัส AV1 สำหรับสตรีม Profile 10 ที่เลเยอร์ฐานส่งสัญญาณแบบเต็มช่วงพร้อมลักษณะการโอนที่ไม่ได้ระบุ (#3486)
    • แก้ไขการเลือกตัวถอดรหัสใน MediaCodecUtil เพื่อหลีกเลี่ยงการเลือกตัวถอดรหัสหลักที่ไม่รองรับโปรไฟล์ของรูปแบบในเชิงฟังก์ชัน (เช่น ตัวถอดรหัส Dolby Vision สำหรับโปรไฟล์อื่น) เมื่อไม่มีตัวถอดรหัสที่รองรับรูปแบบอย่างเต็มรูปแบบ (#3486)
  • ข้อความ
    • ลดการใช้งานหน่วยความจำใน DvbParser โดยแสดงผลขอบเขตคำบรรยายลงในบิตแมปขนาดขอบเขตโดยตรง แทนที่จะเก็บรักษาบิตแมปชั่วคราวแบบเต็มหน้าจอ
  • ผลกระทบ
    • แก้ไข NullPointerException ใน DefaultVideoFrameProcessor เมื่อฟลัช (เช่น ขณะกรอวิดีโอหรือสครับใน CompositionPlayer) (#3470)
    • แก้ไข DefaultGlObjectsProvider.release แสดง GlException เมื่อมีการใช้ผู้ให้บริการซ้ำหลังจากเผยแพร่ (#2016)
  • Muxer:
    • ตรวจสอบแทร็ก Format เมื่อเพิ่มแทร็กลงใน Mp4Muxer หรือ FragmentedMp4Muxer แทนที่จะดำเนินการไม่สำเร็จในภายหลังเมื่อเขียนตัวอย่างหรือปิด Muxer
    • ทำให้การเรียกใช้ Muxer.close() ซ้ำๆ ไม่มีการดำเนินการในการติดตั้งใช้งานไลบรารี Muxer ทั้งหมด และถือว่า Muxer ปิดอยู่แม้ว่า close() จะแสดงข้อผิดพลาดก็ตาม การเรียกใช้เมธอดอื่นๆ หลังจาก close() จะแสดง IllegalStateException
  • ส่วนขยาย IMA:
    • รองรับอินเทอร์เฟซ ResizablePlayer ของ IMA SDK เพื่ออนุญาตให้โฆษณาแบบอินเทอร์แอกทีฟปรับขนาดและเปลี่ยนตำแหน่งมุมมองวิดีโอเพลเยอร์ภายในคอนเทนเนอร์โฆษณา และเพิ่ม ImaAdsLoader.requestAds(DataSpec, Object, AdViewProvider) (เลิกใช้งาน ImaAdsLoader.requestAds(DataSpec, Object, ViewGroup))
  • เซสชัน:
    • ทำให้ API ค่ากำหนดปุ่มสื่อมีความเสถียร
    • ลดการใช้งานหน่วยความจำโดยไม่เก็บข้อมูลอาร์ตเวิร์กที่บีบอัดไว้ใน CacheBitmapLoader อีกต่อไป
    • หลีกเลี่ยงการเรียกใช้ MediaSession.setQueue(null) ซ้ำซ้อนในการอัปเดตไทม์ไลน์เมื่อคิวเซสชันของแพลตฟอร์ม null อยู่แล้ว (เช่น เมื่อ Player.COMMAND_GET_TIMELINE ไม่พร้อมใช้งาน)
    • แก้ไขปัญหาที่ MediaSessionService ไม่ให้ตัวเลือกการกู้คืนอย่างถูกต้องแก่การติดตั้งใช้งานบริการโดยไม่พยายามสร้างเซสชันใหม่ (#3490)
    • รายงาน Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE แทน Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED เมื่อการอัปเดตข้อมูลเมตา MediaSessionCompat เดิมแก้ไขข้อมูลเมตาหรือระยะเวลาของรายการในคิวที่ใช้งานอยู่โดยไม่เปลี่ยนคิว
    • แก้ไขอาร์ตเวิร์กที่ขาดหายไปสำหรับเซสชันเดิมที่ตั้งค่า null METADATA_KEY_DISPLAY_ICON (หรือ URI ของอาร์ตเวิร์ก) ควบคู่ไปกับ METADATA_KEY_ALBUM_ART ที่ถูกต้อง: ระบบจะข้ามค่าอาร์ตเวิร์กที่เป็น Null เมื่อ แปลงข้อมูลเมตาเดิม
  • UI:
    • เพิ่มช่อง subtitles Composable ลงใน ContentFrame และ Player โดยมีการรองรับเริ่มต้นใน media3-ui-compose-material3 สำหรับการแสดงผลบิตแมปและคิวคำบรรยายข้อความแนวนอน
    • เพิ่ม SubtitleView.setTextDirectionHeuristic เพื่ออนุญาตให้ปรับแต่งการวิเคราะห์ทิศทางข้อความที่ใช้สำหรับการตัดข้อความคำบรรยายแบบ 2 ทิศทาง (#3454)
    • สร้างภาพเคลื่อนไหวให้กับช่องควบคุมทั้งหมดใน Player ใน media3-ui-compose-material3 รวมถึงช่องที่กำหนดเอง และนำพารามิเตอร์ visible ออกจาก PlayerDefaults.TopControls, CenterControls และ BottomControls นี่เป็นการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบ API ที่ไม่เสถียร
    • รองรับ AdViewProvider.getAdVideoView() ใน PlayerView โดยรวม exo_content_frame ไว้ใน exo_content_frame_container
    • ลดการใช้งานหน่วยความจำใน SubtitleView โดยการปล่อยบิตแมปคำบรรยายและเลย์เอาต์ข้อความที่แคชไว้เมื่อล้างคิว และแก้ไขปัญหาที่ข้อความคำบรรยายเก่าอาจยังคงมองเห็นได้เมื่อคิวมีความกว้างไม่เพียงพอที่จะจัดวาง
  • ส่วนขยาย HLS:
    • แก้ไขปัญหาที่การโหลดกลุ่มสื่อ HLS ที่ล้มเหลวหรือถูกยกเลิกซ้ำอาจเก็บตัวอย่างที่บัฟเฟอร์ไว้บางส่วนโดยไม่ทิ้งหรือต่อเข้าด้วยกัน หรือรีเซ็ตตำแหน่งการโหลดเป็นตำแหน่งการกรอที่ล้าสมัย (#3362)
    • แก้ไข IllegalStateException เมื่อกรอไปยังจุดเริ่มต้นของกลุ่มที่บัฟเฟอร์หลังจากเปลี่ยนแทร็กแบบปรับอัตโนมัติ
    • แก้ไขปัญหาการเล่นหลายรายการเมื่อเปลี่ยนเส้นทางด้วยการควบคุมเนื้อหา HLS (#3465)
  • ส่วนขยาย DASH
    • แก้ไขคำบรรยาย CEA-608 ที่ซ้ำกันหรืออ่านไม่ออกเมื่อสตรีมมีแทร็กคำบรรยายแทนเสียงแบบฝังหลายแทร็ก (#887)
  • ส่วนขยาย Cast
    • แก้ไขปัญหาที่คำขอโหลด RemoteCastPlayer ถูกยกเลิกโดยตัวรับสัญญาณ Android TV (#3462)
    • อัปเดตทรัพยากร Dependency ของ com.google.android.gms:play-services-cast-framework เป็น 23.0.0
    • เพิ่ม CastParams.Builder.setSystemOutputSwitcherEnabled(boolean) เพื่อกำหนดค่าว่าจะให้อุปกรณ์แคสต์ปรากฏในตัวสลับเอาต์พุตของระบบหรือไม่ โดยไม่ต้องประกาศ MediaTransferReceiver ใน AndroidManifest.xml และเปิดใช้ตัวสลับเอาต์พุตของระบบโดยค่าเริ่มต้นสำหรับแอปที่กำหนดเป้าหมายเป็น API 37 ขึ้นไปในอุปกรณ์ที่ใช้ API 37 ขึ้นไป
    • รองรับช่อง MediaMetadata ของ Cast ที่กำหนดไว้ล่วงหน้าใน DefaultMediaItemConverter โดยการแมปช่องที่ไม่มีพร็อพเพอร์ตี้ MediaItem.mediaMetadata โดยเฉพาะไปยังและจาก MediaItem.mediaMetadata.extras และเก็บข้อมูลเพิ่มเติมที่กำหนดเองไว้ใน MediaInfo.customData
    • หยุดแสดงข้อยกเว้นใน DefaultMediaItemConverter เมื่อไม่มี URI การเล่นหรือการแปลงไม่สำเร็จ โดยเก็บรหัสสื่อและข้อมูลเมตาไว้ในไทม์ไลน์ CastPlayer สำหรับรายการในคิว Cast ที่ไม่มี URI การเล่น
    • เพิ่ม SessionAvailabilityListener.onCastSessionAvailable(boolean) เพื่อระบุว่าเซสชัน Cast ที่พร้อมใช้งานเริ่มต้นโดยใช้ Intent to Join หรือไม่ และคงสถานะการเล่นระยะไกลไว้แทนที่จะเขียนทับด้วยสถานะเพลเยอร์ในเครื่องเมื่อเข้าร่วมเซสชัน Cast โดยใช้ Intent to Join ใน CastPlayer
    • ป้อนข้อมูล MediaInfo และระยะเวลาของไทม์ไลน์จาก MediaMetadata.durationMs สำหรับรายการที่ไม่ใช่รายการสดใน DefaultMediaItemConverter และ RemoteCastPlayer รวมถึงคงระยะเวลาที่ตัวรับสัญญาณแก้ไขและสถานะไลฟ์สดไว้ในการกรอคิว
  • แอปสาธิต:
    • อนุญาตให้จัดเรียงรายการเพลย์ลิสต์ใหม่โดยการลากในแอปสาธิตเซสชัน
  • นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
    • นำ androidx.media3.transformer.TextureAssetLoader ออก โปรดใช้ androidx.media3.transformer.RawAssetLoader แทน
    • นำเครื่องมือสร้าง DefaultDecoderFactory สาธารณะออก โปรดใช้ DefaultDecoderFactory.Builder แทน
    • นำ DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_BLACKLIST_MS ออก โปรดใช้ DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_EXCLUSION_MS แทน
    • นำออก DefaultVideoFrameProcessor.Factory.Builder.setRequireRegisteringAllInputFrames(boolean) โปรดใช้ VideoFrameProcessor.INPUT_TYPE_SURFACE_AUTOMATIC_FRAME_REGISTRATION แทน
    • นำ EditedMediaItemSequence.Builder.experimentalSetForceAudioTrack(boolean) และ EditedMediaItemSequence.Builder.experimentalSetForceVideoTrack(boolean) ออก โปรดใช้ EditedMediaItemSequence.Builder(Set) แทน
    • นำ EditedMediaItemSequence.forceAudioTrack ออก โปรดใช้ trackTypes.contains(C.TRACK_TYPE_AUDIO) แทน
    • นำ EditedMediaItemSequence.forceVideoTrack ออก โปรดใช้ trackTypes.contains(C.TRACK_TYPE_VIDEO) แทน
    • นำ ExportResult.durationMs และ ExportResult.Builder.setDurationMs ออก โปรดใช้ ExportResult.approximateDurationMs และ ExportResult.Builder.setApproximateDurationMs แทน
    • นำ SilenceSkippingAudioProcessor.DEFAULT_PADDING_SILENCE_US ออก ระบุลักษณะการทำงานของการปิดเสียงโดยใช้ silenceRetentionRatio แทน
    • นำ Timeline.getPeriodPosition(Window, Period, int, long, long) ออก โปรดใช้ Timeline.getPeriodPositionUs(Window, Period, int, long, long) แทน

เวอร์ชัน 1.12.0-alpha02

26 ตุลาคม 2026

เวอร์ชัน 1.12.0-alpha02 มีคอมมิตต่อไปนี้

  • บริการ Google Play สำหรับเอฟเฟกต์:
    • เปิดตัวโมดูล media3-effect-play-services ใหม่ที่ให้บริการเอฟเฟกต์สื่อของบริการ Google Play ซึ่งรวมถึง EnhancementSessionDecorator สำหรับการเพิ่มประสิทธิภาพวิดีโอและ StudioSoundAudioProcessor สำหรับการแยกแหล่งที่มาของเสียง

เวอร์ชัน 1.12.0-alpha01

21 ตุลาคม 2569

เวอร์ชัน 1.12.0-alpha01 มีคอมมิตต่อไปนี้

  • ไลบรารีทั่วไป:
    • เพิ่ม 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)
    • แก้ไขปัญหาที่การเล่นสื่อแบบโปรเกรสซีฟอาจข้ามไปยังตำแหน่งที่ไม่ถูกต้องเมื่อการโหลดหลังจากกรอ (หรือเมื่อเริ่มเล่นที่ตำแหน่งที่ไม่ใช่ศูนย์) ล้มเหลวและมีการลองใหม่ (#3440)
    • เพิ่มวิธีแก้ปัญหาสำหรับตัวถอดรหัส H.264 ของ Xiaomi TV Stick 4K (MiTV-AYFR0) ที่ค้างเมื่อเปลี่ยนความละเอียดแบบราบรื่น (#3457)
    • แก้ไข NullPointerException ใน SteeringManifestTracker เมื่อเครื่องมือติดตามหยุดทำงานก่อนที่จะมีการเรียกใช้ Callback การโหลดเสร็จสมบูรณ์หรือข้อผิดพลาดที่โพสต์ (#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: แยกวิเคราะห์แทร็กข้อมูลเมตาที่กำหนดเวลาแบบ Boxed mebx ใน Mp4Extractor และ FragmentedMp4Extractor แทร็กที่มีคีย์ it35 จะแสดงเป็น MimeTypes.APPLICATION_ITUT_T35 (เปิดใช้การเล่น HAGC) ระบบจะไม่สนใจแทร็ก mebx อื่นๆ เว้นแต่จะตั้งค่า FLAG_EMIT_RAW_MEBX_DATA ไว้ ซึ่งในกรณีนี้ ระบบจะส่งแทร็ก mebx ทั้งหมดเป็น MimeTypes.APPLICATION_MEBX ดิบ
    • Ogg: รองรับการแยก Opus end-padding สำหรับการเล่นแบบไม่มีช่องว่าง (#2576) และแก้ไขการประทับเวลาตัวอย่างหลังจากกรอไปยังหน้าเว็บที่เริ่มต้นด้วยแพ็กเก็ตต่อเนื่อง
    • Ogg: แก้ไขข้อผิดพลาดในการถอดรหัสและการข้ามการประทับเวลาประมาณ 1 วินาทีในสตรีม Ogg Opus แบบเชนโดยละเว้นแพ็กเก็ตส่วนหัวของความคิดเห็นและรหัส Opus กลางสตรีม
  • ผู้ตรวจสอบ
    • รองรับการดึงข้อมูลเมตา XMP จากไฟล์ MP4 โดยใช้ MetadataRetriever
    • รองรับการแยกแทร็กข้อมูลเมตาที่กำหนดเวลาแบบ Boxed 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 ที่แยกส่วนเพื่อระบุการประทับเวลาการถอดรหัสสื่อ
    • รองรับการเขียนกล่องคอนเทนเนอร์ E-AC-3 และ E-AC-3 JOC (Dolby Atmos) dec3 ใน 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 และการคงช่วงสแปนเมื่อเปิดใช้การตัดข้อความแบบ 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 เพิ่ม Composable Artwork เพื่อใช้เป็นค่าเริ่มต้นสำหรับช่อง artwork
    • เพิ่มช่องใหม่ลงใน PlayPauseButtonState (showBuffering, showRetry, showReplay) และใช้ช่องเหล่านั้นใน PlayPauseButton เพื่อแสดงผลไอคอนเพิ่มเติมและสัญญาณบอกสถานะการบัฟเฟอร์
    • เพิ่มคลาส PlaybackState เพื่ออนุญาตให้สังเกตสถานะการเล่นที่กำหนดเอง และเปิดตัว BufferingIndicator เป็นคอมโพเนนต์ที่ไม่ขึ้นอยู่กับปุ่ม
    • แก้ไขปัญหาที่ PlayerView และ PlayerControlView แสดงตัวทำเครื่องหมายโฆษณาที่ขอบเขตของช่วงเวลาสำหรับตัวยึดตำแหน่งโฆษณาตอนท้ายแบบสดในไลฟ์สดแบบหลายช่วงเวลา
    • ช่อง Composable ของ 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 เมื่อแยกวิเคราะห์กลุ่มการเริ่มต้น EXT-X-MAP ของ MPEG-TS ที่มีตัวอย่างสื่อ 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 จากเครื่องมือแยก (#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)
  • วิดีโอ
    • แก้ไขตรรกะการเข้าร่วมวิดีโอเพื่อให้นับบัฟเฟอร์ที่ถูกทิ้งระหว่างการเข้าร่วมว่าข้ามไปแทนที่จะถูกทิ้ง
    • แก้ไขการตัดสินใจแสดงผลทันทีเมื่อตั้งค่าแพลตฟอร์มใหม่เพื่อหลีกเลี่ยงเฟรมที่หายไปในอุปกรณ์ที่ไม่รองรับแพลตฟอร์มตัวยึดตำแหน่ง
    • แก้ไขการประมาณอัตราเฟรมใน 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 เมื่อใช้เซสชันที่มี Looper ของเพลเยอร์ในเทรดเบื้องหลัง
    • บังคับใช้ข้อกำหนดเกี่ยวกับชุดข้อความที่เข้มงวดขึ้นสำหรับเมธอด 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 ลงใน Player Composable และช่องเนื้อหา
    • เผยแพร่ 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 รองรับเอาต์พุตแบบไบเนอรอลผ่านตัวถอดรหัส (เมื่อใช้ส่วนขยายตัวถอดรหัส 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 ด้วย)
  • Lottie ของเอฟเฟกต์:
    • เปิดตัวโมดูล :media3-effect-lottie ใหม่ซึ่งมีฟังก์ชันการทำงานสำหรับการใช้เอฟเฟกต์ Lottie กับเฟรมวิดีโอ
  • ส่วนขยาย IMA:
    • อัปเดต IMA SDK เป็นเวอร์ชัน 3.39.0 เพื่อให้เข้าถึง Ad Media Info 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 แบบเคลื่อนไหว
    • เพิ่ม Player Composable ลงใน 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 มี Commit ต่อไปนี้

  • เสียง:
    • แก้ไขข้อบกพร่องที่ทำให้การเล่นค้างเมื่อเล่นเพลย์ลิสต์เสียงแบบไม่มีช่องว่างในโหมดการลดภาระการบีบอัด

1.9.2

6 กุมภาพันธ์ 2026

เวอร์ชัน 1.9.2 มีคอมมิตต่อไปนี้

  • ExoPlayer:
    • แก้ไขข้อบกพร่องที่ ProgressiveMediaSource เผยแพร่ข้อมูลไทม์ไลน์ที่ล้าสมัยไปยังเพลเยอร์และระยะเวลาที่อยู่ในคิวถูกนำออกโดยไม่คาดคิด (#3016)
  • เซสชัน:
    • แก้ไขปัญหาที่วิธีแก้ปัญหาชั่วคราวสำหรับการวางปุ่ม UI ของระบบส่งผลเสียต่อแพลตฟอร์ม UI อื่นๆ เช่น Android Auto หรือผู้ผลิตที่ไม่ต้องการวิธีแก้ปัญหาชั่วคราว (#3041)
  • ส่วนขยาย Cast
    • แก้ไขข้อบกพร่องที่ทำให้การโอนจากการแคสต์ไปยังการเล่นในเครื่องใช้งานไม่ได้

1.9.1

26 มกราคม 2026

เวอร์ชัน 1.9.1 มี คอมมิตเหล่านี้

  • ไลบรารีทั่วไป:
    • รองรับสตริงวันที่และเวลาที่มีเฉพาะชั่วโมงในการชดเชยเขตเวลา (#2929)
  • ExoPlayer:
    • อนุญาตให้การจัดกำหนดการแบบไดนามิกชะลอช่วงเวลา doSomeWork หลังจากที่เสียงเริ่มรองรับการซิงค์เสียง/วิดีโอที่ราบรื่นยิ่งขึ้นเมื่อเริ่มเล่นเท่านั้น
    • แก้ไขข้อบกพร่องใน DefaultLoadErrorHandlingPolicy ซึ่งมีการลองใหม่ FileNotFoundException และประเภทข้อยกเว้นที่คล้ายกันหลายครั้ง
    • แก้ไขข้อบกพร่องเกี่ยวกับการกำหนดเวลาแบบไดนามิกซึ่งเวลาที่คำนวณสำหรับ doSomeWork ถัดไปลดลงอย่างไม่ถูกต้องตามเวลาที่ผ่านไปของการทำซ้ำ doSomeWork ปัจจุบัน การแก้ไขปัญหานี้จะช่วยยืดเวลาที่ CPU ไม่ทำงานและประหยัดพลังงานได้
    • แก้ไขปัญหาที่การเล่นไฟล์ Dolby Vision บางไฟล์ล้มเหลวเมื่อพยายามใช้ตัวแปลงรหัส AVC หรือ HEVC สำรอง
    • แก้ไขข้อบกพร่องที่การโหลดดำเนินต่อไปหลังจากที่การเล่นสิ้นสุดลงเมื่อนำรายการที่กำลังเล่นออกจากเพลย์ลิสต์ (#2873)
    • หลีกเลี่ยงการรั่วไหลของอินสแตนซ์ MediaItem เมื่อใช้ ExoPlayer.replaceMediaItem ซ้ำๆ กับรายการเดียวกัน (#2993)
    • ป้องกัน ANR ที่อาจเกิดขึ้นจากการปล่อย Wake Lock ฉุกเฉิน (#2979)
  • เครื่องสกัดน้ำผลไม้
    • MP3: แยกวิเคราะห์ข้อมูล LAME ReplayGain (#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 ที่มีการประทับเวลาแบบ Wrap Around อย่างถูกต้อง (#2930)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
    • แก้ไข NullPointerException ที่อาจเกิดขึ้นเมื่อกรอก่อนประมวลผลเฟรมวิดีโอแรก (#2965)
  • ส่วนขยาย Cast
    • แก้ไขข้อบกพร่องที่ทำให้ไทม์ไลน์ RemoteCastPlayer ไม่อัปเดตอย่างถูกต้องเมื่อแทนที่เพลย์ลิสต์

1.9.0

17 ธันวาคม 2025

  • ไลบรารีทั่วไป:
    • อัปเดต minSdk เป็น 23 ให้สอดคล้องกับไลบรารี AndroidX อื่นๆ
    • เพิ่ม PlayerTransferState ซึ่งช่วยให้โอนสถานะการเล่นข้ามอินสแตนซ์ Player ได้
    • เพิ่มเมธอด void mute() และ void unmute() ลงใน Player ซึ่งจะคงระดับเสียงของ 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 ที่กำหนดเองออก เพื่อให้แอปใช้กฎที่เผยแพร่ในไฟล์เก็บถาวร IMA Android แทนได้
    • เพิ่ม 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) ลงในโมดูล
    • เพิ่ม Composable TimeText ลงใน media3-ui-compose-material3 เพื่อแสดงความคืบหน้าของโปรแกรมเล่นในรูปแบบข้อความ โดยสามารถกำหนดค่าให้แสดงตำแหน่งปัจจุบัน ระยะเวลา หรือเวลาที่เหลือได้
    • เพิ่มการรองรับการวางปุ่มเส้นทางสื่อใน PlayerView
    • ใช้ BidiFormatter เพื่อแสดงเครื่องหมายวรรคตอนอย่างถูกต้องในคำบรรยายที่เป็นข้อความแบบอ่านจากขวาไปซ้าย (#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 มีคอมมิตต่อไปนี้

  • ผลกระทบ
    • ตั้งค่า GL_DRAW_BUFFER และ GL_READ_BUFFER อย่างชัดเจนเมื่อเปลี่ยนจากบริบทที่ไม่มีแพลตฟอร์ม

เวอร์ชัน 1.8.0

30 กรกฎาคม 2025

เวอร์ชัน 1.8.0 มี คอมมิตเหล่านี้

  • ไลบรารีทั่วไป:
    • เพิ่มการรองรับการแทนที่เพลเยอร์ใน 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 ให้ใช้ 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 เพื่อกำหนดค่าโปรแกรมเปลี่ยนไฟล์และโปรแกรมถอดรหัส Shadow แทน
    • แทนที่คำนำหน้า "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 มี Commit เหล่านี้

  • ไลบรารีทั่วไป:
    • เพิ่มเมธอด 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 มี คอมมิตเหล่านี้

  • ไลบรารีทั่วไป:
    • เพิ่ม 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 เวอร์ชันทดลองเพื่อเร่งความเร็วในการกรอวิดีโอ เปิดใช้ด้วย DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies API ใหม่
    • เพิ่ม API ExoPlayer เวอร์ชันทดลองเพื่อทิ้งบัฟเฟอร์อินพุตของตัวถอดรหัส 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 เวอร์ชันเริ่มต้นนี้รองรับเฉพาะสตรีม VOD แบบ HLS ที่มีแอตทริบิวต์ X-ASSET-URI เท่านั้น
    • เพิ่ม HlsInterstitialsAdsLoader.AdsMediaSourceFactory แอปสามารถใช้เพื่อสร้างอินสแตนซ์ 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 มี Commit เหล่านี้

  • ไลบรารีทั่วไป:
    • เพิ่ม 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 ที่สร้างขึ้นบนไลบรารี Common
    • เพิ่มฟังก์ชันส่วนขยาย Player.listen ที่ระงับเพื่อหมุน Coroutine เพื่อฟัง Player.Events ไปยังไลบรารี media3-common-ktx
    • นำคำอธิบายประกอบ @DoNotInline ออกจากคลาสภายในที่อยู่นอกบรรทัดด้วยตนเองซึ่งออกแบบมาเพื่อหลีกเลี่ยงความล้มเหลวในการยืนยันคลาสรันไทม์ R8 เวอร์ชันล่าสุดจะทำการเรียกใช้แบบ Out-of-line โดยอัตโนมัติเพื่อหลีกเลี่ยงความล้มเหลวของรันไทม์ (ดังนั้นจึงไม่จำเป็นต้องทำการเรียกใช้แบบ Out-of-line ด้วยตนเองอีกต่อไป) ผู้ใช้ 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 ออกเนื่องจากช่องเป็น 0 เสมอ
    • อนุญาตให้ผู้ใช้เลือกลำโพงในตัวสำหรับการเล่นบน 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 ที่มีข้อมูลมากกว่า 128 KB ระหว่างเฟรมที่ถูกต้องถูกตัดให้สั้นลง (แทนที่จะไม่ถูกต้อง) ซึ่งหมายความว่าไฟล์ที่มีข้อมูลที่ไม่ใช่ 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 นี้แตกต่างจาก 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 ที่ปลอดภัย 60 FPS ถูกทำเครื่องหมายว่าไม่รองรับ (#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 พร้อมการสร้างเสียงรอบทิศทาง รวมถึงการติดตามการเคลื่อนไหวของศีรษะ (ไม่บังคับ) แต่ปัจจุบันยังไม่รองรับการเล่นแบบสองหู
    • เพิ่มการรองรับหน้าขนาด 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 มีคอมมิตเหล่านี้

  • ไลบรารีทั่วไป:
    • ส่งต่อการเรียกใช้การกรอที่คาดว่าไม่มีการดำเนินการไปยังเมธอด 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 จะเรียกใช้เมธอดนี้เมื่อคำนวณเวลาเพื่อกำหนดเวลา Work Tasks
    • เพิ่ม 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 เพื่อปรับปรุงการซิงค์ภาพและเสียง
    • นำช่อง 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 ภายใน AndroidView ของ Compose ใน API 34 (#1237)
  • ดาวน์โหลด
    • ตรวจสอบว่า DownloadHelper ไม่ทำให้เกิดการรั่วไหลของอินสแตนซ์ Renderer ที่ยังไม่ได้เผยแพร่ ซึ่งอาจส่งผลให้แอปขัดข้องด้วย IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224)
  • ส่วนขยาย Cronet:
    • แก้ไขSocketTimeoutExceptionในCronetDataSource ใน Cronet บางเวอร์ชัน คำขอที่ได้จาก 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 มี คอมมิตเหล่านี้

  • ไลบรารีทั่วไป:
    • เพิ่ม 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 มี คอมมิตเหล่านี้

  • ไลบรารีทั่วไป:
    • ใช้การรองรับ 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:
    • เพิ่มการรองรับการปรับวิดีโอสโลว์โมชัน SEF แบบ H.265/HEVC ให้เป็นแบบปกติ
    • เพิ่มความเร็วในการแปลงมัลติเพล็กซ์ โดยเฉพาะสำหรับการแก้ไข "นำวิดีโอออก"
    • เพิ่ม 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

  • ไลบรารีทั่วไป:
    • เพิ่มพารามิเตอร์ @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)
    • เพิ่มช่องเพิ่มเติมในการบันทึกข้อมูล Common Media Client Data (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 classic ไปยัง 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 จะเลือกเฉพาะแทร็กเสียงและเฉพาะในกรณีที่รูปแบบของแทร็กนั้นรองรับการออฟโหลด หากไม่มีแทร็กเสียงที่รองรับในการออฟโหลด ระบบจะไม่เลือกแทร็กใดเลย
    • ปิดใช้การรองรับการเล่นแบบไม่มีช่องว่างสำหรับการออฟโหลดเมื่อใช้ระดับ API ต่ำกว่า 33 เนื่องจากปัญหาเกี่ยวกับตำแหน่งการเล่นหลังจากการเปลี่ยนแทร็ก
    • นำพารามิเตอร์ 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:
    • แก้ไขข้อบกพร่องที่การปิดใช้ Surface อาจทำให้เกิด ArithmeticException ในโค้ด Leanback (#617)
  • ยูทิลิตีการทดสอบ
    • ทำให้ TestExoPlayerBuilder และ FakeClock เข้ากันได้กับการทดสอบ UI ของ Espresso และการทดสอบ UI ของ Compose การดำเนินการนี้จะแก้ไขข้อบกพร่องที่ทำให้การเล่นดำเนินไปอย่างไม่แน่นอนในระหว่างการโต้ตอบกับมุมมอง 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

  • ไลบรารีทั่วไป:
    • นำทรัพยากร 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 และหน้าส่วนหัวของความคิดเห็นไว้ข้างหน้าบิตสตรีมสำหรับการเล่น 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

  • ไลบรารีทั่วไป:
    • เพิ่มเหตุผลในการระงับสำหรับเส้นทางเสียงที่ไม่เหมาะสมและเล่นเมื่อพร้อม เปลี่ยนเหตุผลสำหรับการระงับนานเกินไป (#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
    • เพิ่มการรองรับการรวม Common Media Client Data (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 atom (#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 สำหรับการเรียกจาก 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 เพื่อระบุคำสั่งที่ใช้สำหรับการกรอด้วย
    • ใช้ธีมเมื่อโหลดทรัพยากรที่ถอดออกได้ใน 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 เดิมไปยัง MediaController ของ Media3 ทำให้เกิด 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 และทริกเกอร์การเลือกแทร็กใหม่ตามพร็อพเพอร์ตี้เหล่านี้ อุปกรณ์ที่มีโหมด UI television จะได้รับการยกเว้นจากข้อจำกัดเหล่านี้ และระบบจะเลือกใช้รูปแบบที่มีจำนวนช่องสัญญาณสูงสุด หากต้องการเปิดใช้ฟีเจอร์นี้ อินสแตนซ์ 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 ของ AndroidStudio ไม่สำเร็จ (#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() สามารถเข้าถึงโรงงานอะแดปเตอร์ตัวแปลงรหัสและส่งไปยังอินสแตนซ์ 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 (รวมถึง 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 ใหม่ ซึ่งจะช่วยให้ผสานรวมระหว่างเพลเยอร์และเซสชันสื่อได้โดยตรงโดยไม่ต้องใช้คลาสอะแดปเตอร์/เครื่องมือเชื่อมต่อ