Media3

รองรับไลบรารีสำหรับกรณีการใช้งานสื่อ
อัปเดตล่าสุด รุ่นที่เสถียร รุ่นที่อาจได้รับการเผยแพร่ รุ่นเบต้า เวอร์ชันอัลฟ่า
27 พฤศจิกายน 2024 1.5.0 - - -

การประกาศทรัพยากร Dependency

หากต้องการเพิ่มทรัพยากร Dependency ของ Media3 คุณต้องเพิ่มที่เก็บ Maven ของ Google ลงในโปรเจ็กต์ อ่านข้อมูลเพิ่มเติมในที่เก็บ Maven ของ Google

เพิ่มการอ้างอิงสำหรับอาร์ติแฟกต์ที่ต้องการในไฟล์ build.gradle สำหรับแอปหรือโมดูล

ดึงดูด

dependencies {
    def media3_version = "1.4.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
    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 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 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.4.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
    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 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 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.5

เวอร์ชัน 1.5.0

27 พฤศจิกายน 2024

androidx.media3:media3-*:1.5.0 ได้รับการปล่อยแล้ว เวอร์ชัน 1.5.0 มีการคอมมิตเหล่านี้

  • คลังทั่วไป:
    • เพิ่ม ForwardingSimpleBasePlayer ที่อนุญาตให้ส่งต่อไปยังโปรแกรมเล่นอื่นโดยทำการปรับเปลี่ยนเล็กน้อยไปพร้อมกับการรับประกันความสอดคล้องและการจัดการผู้ฟังอย่างเต็มรูปแบบ (#1183)
    • แทนที่ SimpleBasePlayer.State.playlist ด้วยเมธอด getPlaylist()
    • เพิ่มการลบล้างสำหรับ SimpleBasePlayer.State.Builder.setPlaylist() เพื่อระบุ Timeline และ Tracks และ Metadata ในปัจจุบันโดยตรงแทนการสร้างโครงสร้างเพลย์ลิสต์
    • เพิ่ม minSdk เป็น 21 (Android Lollipop) ซึ่งสอดคล้องกับไลบรารี AndroidX อื่นๆ ทั้งหมด
    • เพิ่มอาร์ติแฟกต์ androidx.media3:media3-common-ktx ซึ่งให้ฟังก์ชันการทำงานเฉพาะ Kotlin ที่สร้างขึ้นจากไลบรารีทั่วไป
    • เพิ่มPlayer.listenฟังก์ชันส่วนขยายที่หยุดชั่วคราวเพื่อเรียกใช้ coroutine เพื่อรับฟัง Player.Events ไปยังไลบรารี media3-common-ktx
    • นำคำอธิบายประกอบ @DoNotInline ออกจากคลาสภายในที่อยู่นอกบรรทัดซึ่งเขียนขึ้นด้วยตนเอง ซึ่งออกแบบมาเพื่อหลีกเลี่ยงการยืนยันคลาสรันไทม์ที่ไม่สำเร็จ R8 เวอร์ชันล่าสุดจะทำการเรียกใช้นอกบรรทัดเช่นนี้โดยอัตโนมัติเพื่อหลีกเลี่ยงข้อผิดพลาดรันไทม์ (จึงไม่จำเป็นต้องทำการเรียกใช้นอกบรรทัดด้วยตนเองอีกต่อไป) ผู้ใช้ Gradle ทุกคนของไลบรารีต้องใช้ปลั๊กอิน Android Gradle เวอร์ชันที่ใช้ R8 เวอร์ชันที่ดำเนินการนี้อยู่แล้วเนื่องจาก compileSdk = 35 ผู้ใช้ไลบรารีที่มีระบบบิลด์ที่ไม่ใช่ Gradle จะต้องตรวจสอบว่าขั้นตอนการปรับขนาด/การสร้างความสับสนที่เทียบเท่า R8 ดำเนินการตามกระบวนการตัดส่วนเกินอัตโนมัติที่คล้ายกันเพื่อหลีกเลี่ยงการยืนยันคลาสรันไทม์ที่ไม่สำเร็จ การเปลี่ยนแปลงนี้เกิดขึ้นแล้วในไลบรารี 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.CryptoException ทำงานในโหมดแบบไม่ประสานเวลา (ลักษณะการทำงานเริ่มต้นใน API 31 ขึ้นไป)MediaCodec
    • ส่ง 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[]) แล้วและทำเครื่องหมายเมธอดเป็น "สุดท้าย" เพื่อป้องกันไม่ให้ลบล้าง คุณควรใช้ DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]) ใหม่แทน
    • รายงานเหตุการณ์ MediaSourceEventListener จากแหล่งที่มารองใน MergingMediaSource ซึ่งจะส่งผลให้มีการรายงานเหตุการณ์การเริ่ม/ข้อผิดพลาด/ยกเลิก/เสร็จสมบูรณ์ของการโหลดคำบรรยายที่โหลดจากภายนอก (คำบรรยายที่เพิ่มด้วย MediaItem.LocalConfiguration.subtitleConfigurations) ซึ่งอาจปรากฏเป็นเหตุการณ์การโหลดที่ซ้ำกันซึ่งมาจาก AnalyticsListener
    • ป้องกันไม่ให้ข้อผิดพลาดของคำบรรยายและข้อมูลเมตาหยุดการเล่นโดยสมบูรณ์ แต่ระบบจะปิดใช้แทร็กที่เป็นปัญหาและเล่นแทร็กที่เหลือต่อ (#1722)
      • ในการจัดการคำบรรยายใหม่ (ระหว่างการดึงข้อมูล) ระบบจะแสดงการแยกวิเคราะห์ที่เกี่ยวข้อง (เช่น ข้อมูลคำบรรยายที่ไม่ถูกต้อง) และข้อผิดพลาดในการโหลด (เช่น HTTP 404) ผ่าน onLoadError callbacks
      • ในการจัดการคำบรรยายแบบเดิม (ระหว่างการแสดงผล) ระบบจะแสดงเฉพาะข้อผิดพลาดในการโหลดที่เกี่ยวข้องผ่าน onLoadError callbacks ขณะที่ระบบจะไม่สนใจข้อผิดพลาดในการแยกวิเคราะห์ (ซึ่งเป็นลักษณะการทำงานที่มีอยู่ก่อนแล้ว)
    • แก้ไขข้อบกพร่องที่รายการหรือระยะเวลาในเพลย์ลิสต์ในสตรีม DASH แบบหลายช่วงเวลาที่มีระยะเวลาไม่ตรงกับเนื้อหาจริงอาจทำให้เฟรมค้างอยู่ที่ส่วนท้ายของรายการ (#1698)
    • เพิ่มตัวตั้งค่าลงใน 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 ระดับ 4 ของ AC-4 (#1265)
  • DataSource:
    • อัปเดต HttpEngineDataSource เพื่ออนุญาตให้ใช้งานตั้งแต่เวอร์ชัน S ส่วนขยาย 7 แทน API ระดับ 34 (#1262)
    • DataSourceContractTest: ยืนยันว่า DataSource.getUri() แสดงผล URI ที่แก้ไขแล้ว (ตามที่ระบุไว้ในเอกสารประกอบ) หาก URL นี้แตกต่างจากที่ขอ การทดสอบจะระบุได้โดยใช้วิธีการใหม่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 บิตเมื่อแสดงเป็นไมโครวินาทีและคูณด้วยฐานเวลา MPEG90,000) แสดงขึ้น (#1763)
    • รองรับคำบรรยาย CEA-608 ในเนื้อหา Dolby Vision (#1820)
    • แก้ไขการเล่นที่ค้างอยู่ในสตรีม DASH แบบหลายช่วงเวลาเมื่อเปิดใช้คำบรรยาย CEA-608 (#1863)
  • ข้อมูลเมตา:
    • กําหนดประเภท C.TRACK_TYPE_METADATA ให้กับแทร็กที่มีเนื้อหา icy หรือ vnd.dvb.ait
  • รูปภาพ:
    • เพิ่ม ExternallyLoadedImageDecoder เพื่อผสานรวมกับไลบรารีการโหลดรูปภาพภายนอกอย่าง Glide หรือ Coil ได้ง่ายขึ้น
  • DataSource:
    • เพิ่ม FileDescriptorDataSource ซึ่งเป็น DataSource ใหม่ที่ใช้อ่านจาก FileDescriptor ได้ (#3757)
  • ผล:
    • เพิ่มวิธีแก้ปัญหา DefaultVideoFrameProcessor สำหรับการปรับขนาด SurfaceTexture เล็กน้อย SurfaceTexture อาจมีการขยายขนาดเล็กน้อยที่ตัดขอบ 1 เทเซลรอบขอบของบัฟเฟอร์ที่ครอบตัด ตอนนี้เราจัดการปัญหานี้แล้วเพื่อให้ผลลัพธ์ใกล้เคียงกับที่คาดไว้
    • เร่งความเร็ว DefaultVideoFrameProcessor.queueInputBitmap() ด้วยเหตุนี้ การส่งออกรูปภาพเป็นวิดีโอด้วย Transformer จึงเร็วขึ้น
  • ส่วนขยาย IMA
    • แก้ไขข้อบกพร่องที่การล้างเพลย์ลิสต์อาจทำให้เกิดArrayIndexOutOfBoundsExceptionใน ImaServerSideAdInsertionMediaSource
    • แก้ไขข้อบกพร่องที่การสตรีม DAI ที่แทรกฝั่งเซิร์ฟเวอร์โดยไม่มีโฆษณาตอนต้นอาจส่งผลให้เกิด ArrayIndexOutOfBoundsException เมื่อเล่นผ่านโฆษณาตอนกลางสุดท้าย (#1741)
  • เซสชัน:
    • เพิ่ม MediaButtonReceiver.shouldStartForegroundService(Intent) เพื่ออนุญาตให้แอประงับคําสั่งเล่นที่เข้ามาเพื่อเล่นต่อโดยลบล้างวิธีการนี้ โดยค่าเริ่มต้น ระบบจะเริ่มต้นบริการเสมอและไม่สามารถระงับการเล่นได้หากไม่ทำให้ระบบขัดข้องด้วย ForegroundServiceDidNotStartInTimeException (#1528)
    • แก้ไขข้อบกพร่องที่ทำให้ระบบส่งคำสั่งที่กำหนดเองจาก MediaBrowser ไปยัง MediaSessionCompat.Callback แทนที่จะส่งไปยังตัวแปร MediaBrowserServiceCompat ของเมธอดเมื่อเชื่อมต่อกับบริการเดิม ซึ่งทำให้ MediaBrowser ไม่ได้รับค่าผลลัพธ์จริงที่บริการเดิมส่งกลับ (#1474)
    • จัดการ IllegalArgumentException ที่อุปกรณ์ของผู้ผลิตบางรายแสดงเมื่อตั้งค่าตัวรับการออกอากาศสำหรับ Intent ของปุ่มสื่อ (#1730)
    • เพิ่มปุ่มคำสั่งสำหรับรายการสื่อ ซึ่งจะเพิ่ม Media3 API สําหรับสิ่งที่เรียกว่า Custom browse actions กับไลบรารีเดิมที่มี MediaBrowserCompat โปรดทราบว่าเมื่อใช้ Media3 ปุ่มคำสั่งสำหรับรายการสื่อจะใช้ได้กับทั้ง MediaBrowser และ MediaController ดูการเรียกดูการดำเนินการที่กำหนดเองของ AAOS
    • แก้ไขข้อบกพร่องที่บางครั้งตัวควบคุม Media3 ไม่อนุญาตให้แอปเซสชันเริ่มบริการที่ทำงานอยู่เบื้องหน้าหลังจากขอ play()
    • จำกัด CommandButton.Builder.setIconUri ให้ยอมรับเฉพาะ URI ของเนื้อหา
    • ส่งคำแนะนำการเชื่อมต่อของเบราว์เซอร์ Media3 ไปยัง MediaBrowserCompat เริ่มต้นเมื่อเชื่อมต่อกับ MediaBrowserCompat รุ่นเดิม บริการจะรับคำแนะนำการเชื่อมต่อที่ส่งผ่านเป็นคำแนะนำรูทได้ด้วยการเรียกใช้ onGetRoot() ครั้งแรก
    • แก้ไขข้อบกพร่องที่ MediaBrowser ที่เชื่อมต่อกับบริการเบราว์เซอร์เดิมไม่ได้รับข้อผิดพลาดที่บริการส่งมาหลังจากที่เบราว์เซอร์สมัครใช้บริการ parentid
    • ปรับปรุงลักษณะการทำงานร่วมกันเพื่อให้เบราว์เซอร์ Media3 ที่เชื่อมต่อกับ MediaBrowserService รุ่นเดิมไม่ขอ parentId ย่อย 2 ครั้งเมื่อสมัครใช้บริการของ MediaBrowserService หลัก
  • UI:
    • สร้างวิดีโอที่ยืด/ครอบตัดในตัวเลือกวิธีแก้ปัญหา PlayerView-in-Compose-AndroidView เนื่องจากปัญหาเกี่ยวกับทรานซิชันที่ใช้ร่วมกันซึ่งอิงตาม XML แอปที่ใช้ PlayerView ใน AndroidView ต้องเรียกใช้ PlayerView.setEnableComposeSurfaceSyncWorkaround เพื่อเลือกใช้ (#1237, #1594)
    • เพิ่ม setFullscreenButtonState ลงใน PlayerView เพื่ออนุญาตให้อัปเดตไอคอนของปุ่มแบบเต็มหน้าจอตามต้องการ เช่น นอกแบนด์และไม่ตอบสนองต่อการโต้ตอบด้วยการคลิก (#1590, #184)
    • แก้ไขข้อบกพร่องที่ตัวเลือก "ไม่มี" ในการเลือกข้อความไม่ทำงานหากมีค่ากำหนดการเลือกแทร็กข้อความที่แอปกำหนด
  • ส่วนขยาย DASH:
    • เพิ่มการรองรับระยะเวลาที่เริ่มต้นในช่วงกลางของกลุ่ม (#1440)
  • ส่วนขยายสตรีมมิงอย่างราบรื่น:
    • แก้ไขข้อผิดพลาด Bad magic number for Bundle เมื่อเล่นสตรีม SmoothStreaming ที่มีแทร็กข้อความ (#1779)
  • ส่วนขยาย RTSP:
    • แก้ไขการนำข้อมูลผู้ใช้ออกสำหรับ URL ที่มีอักขระ @ ที่เข้ารหัส (#1138)
    • แก้ไขข้อขัดข้องเมื่อแยกวิเคราะห์แพ็กเก็ต RTP ที่มีส่วนขยายส่วนหัว (#1225)
  • ส่วนขยายโปรแกรมถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ)
    • เพิ่มโมดูลตัวถอดรหัส IAMF ซึ่งรองรับการเล่นไฟล์ MP4 ที่มีแทร็ก IAMF โดยใช้ไลบรารีเนทีฟ libiamf เพื่อสังเคราะห์เสียง
      • การเล่นจะเปิดใช้รูปแบบสเตอริโอและ 5.1 พร้อมการจัดวางเสียงให้สมจริง รวมถึงเปิดใช้การติดตามการเคลื่อนไหวของศีรษะ (ไม่บังคับ) แต่ปัจจุบันยังไม่รองรับการเล่นเสียงแบบ Binaural
    • เพิ่มการรองรับหน้าขนาด 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:
    • จัดการการเรียกกลับการโหลดล่วงหน้าแบบไม่พร้อมกันใน 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 ขึ้นไปขณะเล่นเนื้อหา Widevine ระดับ L1 ข้อผิดพลาดนี้เกิดจากการใช้งานเฟรมเวิร์กMediaDrm.requiresSecureDecoder (#1603) ที่ไม่สมบูรณ์
  • ผล:
    • เพิ่มวิธีการ release() ลงใน GlObjectsProvider
  • เซสชัน:
    • เปลี่ยนการแตะ 2 ครั้งของ 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
    • นำการพึ่งพาการคอมไพล์ในการแปลง Sugar ของ 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 ออก คุณไม่จำเป็นต้องตั้งค่า Flag นี้เนื่องจากโปรแกรมแสดงผลและโปรแกรมถอดรหัสจะตัดสินใจข้ามบัฟเฟอร์ตามการประทับเวลา การติดตั้งใช้งาน Renderer ที่กําหนดเองควรตรวจสอบว่าเวลาบัฟเฟอร์อย่างน้อย BaseRenderer.getLastResetPositionUs() เพื่อตัดสินใจว่าควรแสดงตัวอย่างหรือไม่ การใช้งาน SimpleDecoder ที่กําหนดเองจะตรวจสอบได้ isAtLeastOutputStartTimeUs() หากจําเป็น หรือทําเครื่องหมายบัฟเฟอร์อื่นๆ ด้วย DecoderOutputBuffer.shouldBeSkipped เพื่อข้ามบัฟเฟอร์เหล่านั้น
    • อนุญาตให้ TargetPreloadStatusControl.getTargetPreloadStatus(T) แสดงผลค่า Null เพื่อระบุว่าไม่โหลด MediaSource ล่วงหน้าด้วย rankingData ที่ระบุ
    • เพิ่ม remove(MediaSource) ไปยัง BasePreloadManager
    • เพิ่ม reset() ลงใน BasePreloadManager เพื่อปล่อยแหล่งที่มาทั้งหมดที่ถือครองขณะเก็บอินสแตนซ์เครื่องมือจัดการการโหลดล่วงหน้าไว้
    • เพิ่ม ExoPlayer.setPriority() (และ Builder.setPriority()) เพื่อกำหนดค่าลําดับความสําคัญที่ใช้ใน PriorityTaskManager และความสําคัญของ MediaCodec จาก API 35
    • แก้ไขปัญหาการอัปเดตเวลาในการบัฟเฟอร์ใหม่ครั้งล่าสุดซึ่งส่งผลให้คีย์ bs (บัฟเฟอร์ไม่เพียงพอ) ใน CMCD ไม่ถูกต้อง (#1124)
    • เพิ่ม PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) เพื่อระบุว่าโหลดแหล่งที่มาจนจบแล้ว ซึ่งจะช่วยให้การติดตั้งใช้งาน DefaultPreloadManager และPreloadMediaSource.PreloadControlที่กําหนดเองโหลดแหล่งที่มาถัดไปล่วงหน้าหรือดําเนินการอื่นๆ ได้
    • แก้ไขข้อบกพร่องที่การข้ามช่วงเงียบที่ท้ายรายการอาจทริกเกอร์ข้อยกเว้นการเล่น
    • เพิ่ม clear ลงใน PreloadMediaSource เพื่อทิ้งระยะเวลาการโหลดล่วงหน้า
    • เพิ่มรหัสข้อผิดพลาดใหม่ PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED ที่ใช้เมื่อมีการเรียกคืนทรัพยากรโค้ดสำหรับงานที่มีลำดับความสำคัญสูงกว่า
    • อนุญาตให้ AdsMediaSource โหลดโฆษณาตอนต้นก่อนที่การเตรียมสื่อเนื้อหาเริ่มต้นจะเสร็จสมบูรณ์ (#1358)
    • แก้ไขข้อบกพร่องที่การเล่นย้ายไปที่ STATE_ENDED เมื่อเตรียมสตรีมแบบสด DASH แบบหลายช่วงเวลาอีกครั้งหลังจากที่นำช่วงเวลาเดิมออกจากไฟล์ Manifest แล้ว
    • เปลี่ยนชื่อ onTimelineRefreshed() เป็น onSourcePrepared() และ onPrepared() เป็น onTracksSelected() ใน PreloadMediaSource.PreloadControl และเปลี่ยนชื่อ IntDefs ใน DefaultPreloadManager.Stage ด้วย
    • เพิ่มการรองรับแบบทดลองสำหรับการกำหนดเวลาแบบไดนามิกเพื่อปรับงานให้สอดคล้องกับรอบการตื่นของ CPU ได้ดียิ่งขึ้น และเลื่อนเวลาการตื่นขึ้นเมื่อโปรแกรมแสดงผลสามารถทำงานได้ คุณสามารถเปิดใช้โดยใช้ experimentalSetDynamicSchedulingEnabled() เมื่อตั้งค่าอินสแตนซ์ ExoPlayer
    • เพิ่ม Renderer.getDurationToProgressUs() Renderer สามารถใช้วิธีนี้เพื่อส่งค่าระยะเวลาที่การเล่นต้องส่งต่อไปยัง ExoPlayer เพื่อให้โปรแกรมแสดงผลทำงานต่อไปได้ หากตั้งค่า ExoPlayer ด้วย experimentalSetDynamicSchedulingEnabled() ExoPlayer จะเรียกใช้เมธอดนี้เมื่อคํานวณเวลาเพื่อกําหนดเวลางาน
    • เพิ่ม MediaCodecAdapter#OnBufferAvailableListener เพื่อแจ้งเตือนเมื่อบัฟเฟอร์อินพุตและเอาต์พุตพร้อมให้ MediaCodecRenderer ใช้ MediaCodecRenderer จะส่งสัญญาณให้ ExoPlayer เมื่อได้รับการเรียกกลับเหล่านี้ และหากตั้งค่า ExoPlayer ด้วย experimentalSetDynamicSchedulingEnabled() แล้ว ExoPlayer จะกำหนดเวลาลูปการทำงานเมื่อโปรแกรมแสดงผลทํางานได้
    • ใช้คลาสข้อมูลสําหรับเมธอด LoadControl แทนพารามิเตอร์แต่ละรายการ
    • เพิ่ม ExoPlayer.isReleased() เพื่อตรวจสอบว่ามีเรียกใช้ Exoplayer.release() หรือไม่
    • เพิ่ม ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() เพื่อกําหนดค่าตําแหน่งสูงสุดที่ seekToPrevious() จะเลื่อนไปยังรายการก่อนหน้า (#1425)
    • แก้ไขความไม่สอดคล้องกันของโฟกัสเสียงบางรายการ เช่น ไม่รายงานการสูญเสียโฟกัสอย่างสมบูรณ์หรือชั่วคราวขณะที่เพลเยอร์หยุดชั่วคราว (#1436)
    • แก้ไขIndexOutOfBoundsExceptionที่อาจเกิดขึ้นจากโปรแกรมแยกที่รายงานแทร็กเพิ่มเติมหลังจากขั้นตอนเตรียมการเริ่มต้น (#1476)
    • Effects ใน ExoPlayer.setVideoEffect() จะได้รับการประทับเวลาโดยนำออฟเซ็ตของโปรแกรมแสดงผลออกแล้ว (#1098)
    • แก้ไข IllegalArgumentException ที่อาจเกิดขึ้นเมื่อจัดการข้อผิดพลาดของโปรแกรมเล่นที่เกิดขึ้นขณะอ่านรายการอื่นในเพลย์ลิสต์ (#1483)
  • Transformer:
    • เพิ่ม audioConversionProcess และ videoConversionProcess ลงใน ExportResult เพื่อระบุวิธีสร้างแทร็กที่เกี่ยวข้องในไฟล์เอาต์พุต
    • ผ่อนปรนการตรวจสอบระดับ H.264 ของการเพิ่มประสิทธิภาพการตัด
    • เพิ่มการรองรับการเปลี่ยนระหว่างสื่ออินพุต SDR และ HDR ตามลำดับ
    • เพิ่มการรองรับเอฟเฟกต์เสียงระดับการประพันธ์
    • เพิ่มการรองรับการแปลงไฟล์ภาพ Ultra HDR เป็นวิดีโอ HDR
    • แก้ไขปัญหาที่ DefaultAudioMixer แสดงผลจำนวนไบต์ที่ไม่ถูกต้องหลังจากรีเซ็ตและนํามาใช้ซ้ำ
    • แก้ปัญหาข้อบกพร่องของตัวถอดรหัสที่จำกัดจำนวนช่องเสียงไว้ที่สเตอริโอเมื่อจัดการอินพุต PCM
    • เมื่อเลือกแทร็กใน ExoPlayerAssetLoader ให้ละเว้นข้อจำกัดจำนวนช่องเสียง เนื่องจากข้อจำกัดดังกล่าวมีผลกับการเล่นเท่านั้น
    • แทนที่อินเทอร์เฟซ androidx.media3.transformer.Muxer ด้วย androidx.media3.muxer.Muxer และนํา androidx.media3.transformer.Muxer ออก
    • แก้ไขการโหลดรูปภาพ HEIC จากรูปแบบ URI ของเนื้อหา (#1373)
    • ปรับระยะเวลาของแทร็กเสียงใน AudioGraphInput เพื่อปรับปรุงการซิงค์ AV
    • นำช่อง ExportResult.processedInputs ออก หากคุณใช้ช่องนี้สำหรับรายละเอียดตัวแปลงรหัส ให้ใช้ DefaultDecoderFactory.listener แทน ในกรณีที่มีข้อยกเว้นเกี่ยวกับตัวแปลงรหัส รายละเอียดตัวแปลงรหัสจะแสดงใน ExportException.codecInfo
  • เครื่องมือแยกข้อมูล:
    • MPEG-TS: เลื่อนการเปลี่ยนแปลงไปข้างหน้าเพื่อให้แน่ใจว่าระบบแสดงผลเฟรมสุดท้ายโดยส่งหน่วยการเข้าถึงสุดท้ายของสตรีมไปยังคิวตัวอย่าง (#7909) การใช้การแก้ไขเพื่อแก้ไขปัญหาที่เกิดขึ้นในสตรีม HLS ที่เป็น I-frame เท่านั้น(#1150) และในสตรีม HLS ที่เป็น H.262 (#1126)
    • MP3: แนะนำให้ใช้ขนาดข้อมูลจากเฟรม Info แทนขนาดที่รายงานโดยสตรีมที่อยู่เบื้องหลัง (เช่น ขนาดไฟล์หรือส่วนหัว Content-Length ของ HTTP) วิธีนี้จะช่วยยกเว้นข้อมูลตัวอย่างเพลงที่เล่นไม่ได้ (เช่น อาร์ตเวิร์กอัลบั้ม) ออกจากการคํานวณการกรอไปยังอัตราบิตคงที่ ซึ่งทําให้การกรอแม่นยํายิ่งขึ้น (#1376)
    • MP3: ใช้จำนวนเฟรมและข้อมูลอื่นๆ ในเฟรม Info (หากมี) เพื่อคํานวณอัตราบิตเฉลี่ยสำหรับการกรอตามอัตราบิตคงที่ แทนที่จะประมาณจากอัตราบิตของเฟรมหลังเฟรม Info ซึ่งอาจมีค่าต่ำเกินจริง เช่น เฟรม PCUT (#1376)
    • แก้ไขการดึงข้อมูลรูปแบบเสียง PCM ในคอนเทนเนอร์ AVI
  • เสียง:
    • แก้ไขแอตทริบิวต์การเข้ารหัส DTS:X โปรไฟล์ 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 ควรถือว่าทั้ง 2 ค่าเป็นจริง โดยไม่คำนึงถึงค่าที่มีอยู่ในสตรีม (ระบบไม่ได้รองรับ 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:
    • รองรับ android.resource://package/id URI ของทรัพยากรดิบ โดยที่ package แตกต่างจากแพ็กเกจของแอปพลิเคชันปัจจุบัน ก่อนหน้านี้ยังไม่มีการบันทึกว่าวิธีนี้ใช้งานได้ แต่นี่เป็นวิธีที่มีประสิทธิภาพมากกว่าในการเข้าถึงทรัพยากรในแพ็กเกจอื่นเมื่อเทียบกับการเข้าถึงตามชื่อ
    • ตรวจสอบว่า url ไม่ใช่ค่า Null ในคอนสตรัคเตอร์ DataSpec มีการกำกับเนื้อหาพารามิเตอร์นี้ไว้ว่าไม่ใช่ค่า Null อยู่แล้ว
    • อนุญาตให้ ByteArrayDataSource แปลง URI เป็นอาร์เรย์ไบต์ระหว่าง open() แทนที่จะกำหนดค่าแบบฮาร์ดโค้ดเมื่อสร้าง (#1405)
  • DRM:
    • อนุญาตให้ตั้งค่า LoadErrorHandlingPolicy ใน DefaultDrmSessionManagerProvider (#1271)
  • ผล:
    • รองรับการเปลี่ยนแปลงความเร็วหลายรายการภายใน EditedMediaItem เดียวกัน หรือ Composition ใน SpeedChangeEffect
    • รองรับเอาต์พุต HLG และ PQ จากอินพุตบิตแมป 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 เริ่มต้นจากสีเชิงเส้นเป็นวิดีโอ SDR รูปแบบไฟฟ้าของ BT 709 รวมถึงระบุตัวเลือกที่ 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
    • จับคู่ข้อผิดพลาดร้ายแรงและไม่ร้ายแรงจากเซสชันแพลตฟอร์ม A 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 เพื่ออนุญาตให้ใช้ภาพวาดที่แตกต่างกันต่ออินสแตนซ์ PlayerView แทนการลบล้างแบบทั่วโลก (#1200)
    • แก้ปัญหาข้อบกพร่องของแพลตฟอร์มที่ทําให้วิดีโอยืด/ครอบตัดเมื่อใช้ SurfaceView ใน Compose AndroidView ใน API 34 (#1237)
  • การดาวน์โหลด
    • ตรวจสอบว่า DownloadHelper ไม่ได้เปิดเผยอินสแตนซ์ Renderer ที่ยังไม่ได้เผยแพร่ ซึ่งอาจส่งผลให้แอปขัดข้องด้วย IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224)
  • ส่วนขยาย Cronet:
    • แก้ไข SocketTimeoutException ใน CronetDataSource ใน Cronet บางเวอร์ชัน คำขอที่ได้จากคอลแบ็กจะไม่เหมือนกันเสมอไป ซึ่งส่งผลให้การเรียกกลับไม่เสร็จสมบูรณ์และคำขอหมดเวลา (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)
    • เพิ่มการรองรับdashif:Laurl URL ของใบอนุญาต (#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 instead.
    • นำตัวสร้าง DataSpec บางรายการออก ให้ใช้ DataSpec.Builder แทน
    • นำวิธีการชำระเงิน setContentTypePredicate(Predicate) ออกจาก DefaultHttpDataSource, OkHttpDataSource และ CronetDataSource ให้ใช้วิธีเทียบเท่าใน XXXDataSource.Factory แต่ละรายการแทน
    • นำตัวสร้าง OkHttpDataSource และ OkHttpDataSourceFactory ออก ให้ใช้ OkHttpDataSource.Factory แทน
    • นำ PlayerMessage.setHandler(Handler) ออก ให้ใช้ setLooper(Looper) instead.
    • นำช่อง 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: แนะนำให้ใช้แทร็กวิดีโอที่มีอัตราเฟรม "เหมาะสม" (>=10 fps) มากกว่าแทร็กที่มีอัตราเฟรมต่ำกว่าหรือไม่กำหนด วิธีนี้ช่วยให้มั่นใจว่าโปรแกรมเล่นจะเลือกแทร็กวิดีโอ "จริง" ใน MP4 ที่ดึงมาจากภาพเคลื่อนไหวซึ่งมีแทร็ก HEVC 2 แทร็กที่แทร็กหนึ่งมีความละเอียดสูงกว่าแต่มีจำนวนเฟรมน้อยมาก (#1051)
  • เครื่องมือแยกข้อมูล:
    • แก้ไขปัญหาที่ระบบไม่ข้ามการเติมเมื่ออ่านข้อมูลขนาดแปลกๆ จากไฟล์ WAV (#1117)
    • MP3: ป้อนข้อมูล Format.averageBitrate จากเฟรมข้อมูลเมตา เช่น XING และ VBRI
    • MPEG-TS: เปลี่ยนกลับการเปลี่ยนแปลงที่มีจุดประสงค์เพื่อให้แน่ใจว่าระบบจะแสดงผลเฟรมสุดท้ายโดยส่งหน่วยการเข้าถึงสุดท้ายของสตรีมไปยังคิวตัวอย่าง (#7909) เนื่องจากการเปลี่ยนแปลงนี้ทำให้เกิดปัญหาใหม่กับสตรีม HLS ที่มีเฉพาะเฟรม I (#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) ที่ว่างเปล่าในการแยกวิเคราะห์ SDP (#1087)
  • ส่วนขยายโปรแกรมถอดรหัส (FFmpeg, VP9, AV1, MIDI ฯลฯ)
    • ปิดใช้ส่วนขยาย MIDI ในฐานะทรัพยากรที่ต้องพึ่งพาในเครื่องโดยค่าเริ่มต้น เนื่องจากต้องมีการกำหนดค่าที่เก็บ 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 อื่นๆ ทั้งหมด และจําเป็นต่อเราในการอัปเกรดข้อกําหนดของ 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 ที่ว่าง
    • ส่งเหตุการณ์ Player.Listener.onPositionDiscontinuity เมื่อข้ามช่วงเงียบ (#765)
    • เพิ่มการรองรับเวอร์ชันทดลองสำหรับการแยกวิเคราะห์คำบรรยายระหว่างการดึงข้อมูล คุณเปิดใช้ฟีเจอร์นี้ได้โดยใช้ MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
    • รองรับแหล่งที่มาของสื่อแบบปรับเปลี่ยนได้ด้วย PreloadMediaSource
    • ติดตั้งใช้งาน HttpEngineDataSource ซึ่งเป็น HttpDataSource โดยใช้ HttpEngine API
    • ป้องกันการแบ่งชั้น CompositeSequenceableLoader คอมโพเนนต์นี้เคยทำให้ขยายได้แต่ไม่เคยมีคลาสย่อยภายในไลบรารี การปรับแต่งทำได้โดยการตัดอินสแตนซ์โดยใช้รูปแบบตัวตกแต่งและการใช้ CompositeSequenceableLoaderFactory ที่กําหนดเอง
    • แก้ไขปัญหาที่การซ้ำเวลาเดียวกันทำให้ข้อมูลเมตาจากรายการนี้ถูกล้าง (#1007)
    • เปลี่ยนชื่อเมธอด experimentalSetSubtitleParserFactory ใน BundledChunkExtractor.Factory และ DefaultHlsExtractorFactory เป็น setSubtitleParserFactory และห้ามไม่ให้ส่ง null ใช้เมธอด experimentalParseSubtitlesDuringExtraction(boolean) ใหม่เพื่อควบคุมลักษณะการแยกวิเคราะห์
    • เพิ่มการรองรับการปรับแต่ง SubtitleParser.Factory ที่ใช้ในระหว่างการดึงข้อมูล ซึ่งทำได้ด้วย MediaSource.Factory.setSubtitleParserFactory()
    • เพิ่มคำนำหน้าแหล่งที่มาในช่อง Format.id ทั้งหมดที่สร้างขึ้นจาก MergingMediaSource ซึ่งจะช่วยระบุแหล่งที่มาที่ผลิต Format (#883)
    • แก้ไขนิพจน์ทั่วไปที่ใช้ตรวจสอบชื่อคีย์ Common Media Client Data (CMCD) ที่กําหนดเองโดยแก้ไขให้ตรวจสอบเฉพาะขีดกลาง (#1028)
    • หยุดการเข้ารหัสพารามิเตอร์การค้นหา CMCD ซ้ำ (#1075)
  • Transformer:
    • เพิ่มการรองรับการแปลงวิดีโอสโลว์โมชัน H.265/HEVC SEF เป็นวิดีโอแบบแบน
    • เพิ่มความเร็วในการแปลงรหัส โดยเฉพาะสำหรับการแก้ไข "นำวิดีโอออก"
    • เพิ่ม API เพื่อให้ไฟล์เอาต์พุตเริ่มต้นที่เฟรมวิดีโอ ซึ่งอาจทำให้เอาต์พุตของการดำเนินการตัดแต่งเข้ากันได้มากขึ้นกับการใช้งานโปรแกรมเล่นที่ไม่แสดงเฟรมวิดีโอแรกจนกว่าจะถึงการประทับเวลาของการแสดง (#829)
    • เพิ่มการรองรับการเพิ่มประสิทธิภาพการดำเนินการตัด MP4 ของชิ้นงานเดียว
    • เพิ่มการรองรับเพื่อให้เฟรมวิดีโอมีการประทับเวลาแรกในไฟล์เอาต์พุต แก้ไขไฟล์เอาต์พุตที่ขึ้นต้นด้วยเฟรมสีดําในโปรแกรมเล่น iOS (#829)
  • การเลือกแทร็ก:
    • เพิ่ม DefaultTrackSelector.selectImageTrack เพื่อเปิดใช้การเลือกแทร็กรูปภาพ
    • เพิ่ม TrackSelectionParameters.isPrioritizeImageOverVideoEnabled เพื่อระบุว่าจะเลือกแทร็กรูปภาพหรือไม่หากมีทั้งแทร็กรูปภาพและแทร็กวิดีโอ ค่าเริ่มต้นคือ false ซึ่งหมายความว่าระบบจะให้ความสำคัญกับการเลือกแทร็กวิดีโอ
  • เครื่องมือแยกข้อมูล:
    • เพิ่มการแยกวิเคราะห์ AV1C เพิ่มเติมลงในโปรแกรมแยก MP4 เพื่อดึงค่า ColorInfo.colorSpace, ColorInfo.colorTransfer และ ColorInfo.colorRange (#692)
    • MP3: ใช้การค้นหาอัตราบิตคงที่ (CBR) สำหรับไฟล์ที่มีส่วนหัว Info (เทียบเท่า CBR ของส่วนหัว Xing) ก่อนหน้านี้เราใช้ตารางการกรอจากส่วนหัว Info แต่การกรอนี้มีความแม่นยำน้อยกว่าการละเว้นและถือว่าไฟล์เป็น CBR
    • MPEG2-TS: เพิ่มการรองรับ DTS, DTS-LBR และ DTS:X Profile2 (#275)
    • ดึงข้อมูลประเภทเสียงจากตัวระบุ TS และจับคู่กับ Flag บทบาท ซึ่งจะช่วยให้ผู้ใช้เลือกแทร็กเสียงได้อย่างมีข้อมูลมากขึ้น (#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 ควรถือว่าทั้ง 2 ค่าเป็นจริง โดยไม่คำนึงถึงค่าที่มีอยู่ในสตรีม (ระบบไม่ได้รองรับ columnLock จึงถือว่าค่านี้เป็นเท็จเสมอ)
  • รูปภาพ:
    • เพิ่มการรองรับภาพปก DASH ระบบจะครอบตัดรูปภาพในตารางกริดและจัดเตรียมภาพขนาดย่อแต่ละรายการให้ImageOutputใกล้เคียงกับเวลาที่แสดง
  • DRM:
    • เล่นตัวอย่างเพลงที่ "นำหน้าชัดเจน" ซึ่งไม่มีการเข้ารหัสในเนื้อหา DRM โดยค่าเริ่มต้นทันที แม้ว่าคีย์สำหรับตัวอย่างเพลงที่เข้ารหัสในภายหลังจะยังไม่พร้อมใช้งานก็ตาม ซึ่งอาจทำให้การเล่นหยุดชะงักกลางคันหากคีย์ยังไม่พร้อมเมื่อตำแหน่งการเล่นถึงตัวอย่างที่เข้ารหัส (แต่ก่อนหน้านี้การเล่นจะไม่เริ่มต้นเลยเมื่อถึงจุดนี้) ลักษณะการทำงานนี้สามารถปิดใช้ได้ด้วย MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey หรือ DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
  • ส่วนขยาย IMA
    • แก้ไขปัญหาที่เล่นโฆษณา DASH และ HLS ที่ไม่มีนามสกุลไฟล์ที่เหมาะสมไม่ได้
  • เซสชัน:
    • ปิดใช้การตรวจจับการคลิกสองครั้งสำหรับแอปทีวี (#962)
    • แก้ไขปัญหาที่ MediaItem.RequestMetadata ที่มีเพียงข้อมูลเพิ่มเติมที่ไม่ใช่ค่า Null ไม่ได้ส่งระหว่างตัวควบคุมสื่อกับเซสชัน
    • เพิ่มคอนสตรคเตอร์ใน MediaLibrarySession.Builder ที่รับเฉพาะ Context แทน MediaLibraryService
  • ส่วนขยาย HLS:
    • ลด HlsMediaPeriod เป็นระดับการเข้าถึงระดับแพ็กเกจ ไม่ควรใช้ประเภทนี้โดยตรงจากภายนอกแพ็กเกจ HLS
    • แก้ปัญหาเพื่อค้นหาจุดเริ่มต้นของกลุ่มอย่างมีประสิทธิภาพมากขึ้น (#1031)
  • ส่วนขยายโปรแกรมถอดรหัส (FFmpeg, VP9, AV1, MIDI ฯลฯ)
    • ตัวถอดรหัส MIDI: ละเว้นข้อความเหตุการณ์ SysEx (#710)
  • ยูทิลิตีการทดสอบ
    • อย่าหยุดเล่นชั่วคราวใน TestPlayerRunHelper.playUntilPosition การทดสอบจะเล่นวิดีโอต่อไปในสถานะเล่น แต่หยุดความคืบหน้าไว้จนกว่าการทดสอบจะเพิ่มการยืนยันและการดําเนินการเพิ่มเติมได้
  • แอปเดโม:
    • เพิ่มโมดูลสาธิตแบบสั้นเพื่อสาธิตการใช้งาน PreloadMediaSource กับ Use Case ของเนื้อหาแบบสั้น

เวอร์ชัน 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)
    • แก้ไขปัญหาที่การเลือกแทร็กหลังจากกรอไป 0 วินาทีในสตรีมแบบสดทำให้สตรีมเริ่มเล่นที่ตำแหน่งเริ่มต้นอย่างไม่ถูกต้อง (#9347)
    • แก้ไขปัญหาที่อินสแตนซ์ใหม่ของ CmcdData.Factory ได้รับค่าเชิงลบสำหรับ bufferedDurationUs จากแหล่งที่มาของข้อมูลโค้ด ทำให้ IllegalArgumentException (#888)
  • Transformer:
    • แก้ปัญหาที่โปรแกรมเปลี่ยนไฟล์จะแสดงขึ้นเมื่อถึงเวลากําหนดค่าเนื่องจากตั้งค่าอัตราการทํางานสูง
  • เครื่องมือแยกข้อมูล:
    • ทำเครื่องหมายแทร็ก HEVC รอง (เล่นไม่ได้) ในรูปภาพเคลื่อนไหว JPEG เป็นROLE_FLAG_ALTERNATEเพื่อป้องกันไม่ให้ระบบเลือกแทร็กดังกล่าวให้เล่นโดยอัตโนมัติเนื่องจากมีความละเอียดสูงกว่า
    • แก้ไขการตรวจจับคีย์เฟรมที่ไม่ถูกต้องสำหรับสตรีม TS H264 (#864)
    • แก้ไขการประมาณระยะเวลาของสตรีม TS ที่ยาวกว่า 47721 วินาที (#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 ใบอนุญาต https://default.url ของ ClearKey ที่ผิดพลาดไปยัง 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) method ในอินเทอร์เฟซ ChunkSource เป็น ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
    • เพิ่มช่องเพิ่มเติมในการบันทึกข้อมูลไคลเอ็นต์สื่อทั่วไป (CMCD) ได้แก่ บัฟเฟอร์ที่ขาดแคลน (bs), กำหนดเวลา (dl), อัตราการเล่น (pr) และเวลาเริ่มต้น (su) (#8699)
    • เพิ่มความลึกของบิตของค่าความสว่างและค่าสีเป็น 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
    • คุณเปิดใช้การย้ายข้อมูลไปยัง SD Card ผ่าน 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 ภายใน
    • เพิ่มการเรียกกลับ onAudioTrackInitialized และ onAudioTrackReleased ไปยัง AnalyticsListener, AudioRendererEventListener และ AudioSink.Listener
    • แก้ไขปัญหาบัฟเฟอร์เสียง DTS Express ต่ำกว่าเกณฑ์ (#650)
    • แก้ไขข้อบกพร่องที่การตรวจสอบความสามารถของ E-AC3-JOC แสดงข้อผิดพลาด IllegalArgumentException (#677)
  • วิดีโอ:
    • อนุญาตให้ MediaCodecVideoRenderer ใช้ VideoFrameProcessor.Factory ที่กําหนดเอง
    • แก้ไขข้อบกพร่องที่ไม่สามารถแสดงผลเฟรมแรกได้หากสตรีมเสียงเริ่มต้นด้วยการประทับเวลาเชิงลบ (#291)
  • ข้อความ:
    • นำ ExoplayerCuesDecoder ออก ตอนนี้ TextRenderer จะจัดการแทร็กข้อความที่มี sampleMimeType = application/x-media3-cues โดยตรงโดยไม่ต้องใช้อินสแตนซ์ SubtitleDecoder
  • ข้อมูลเมตา:
    • ระบบจะไม่เรียกใช้ MetadataDecoder.decode สำหรับตัวอย่าง "decode-only" อีกต่อไป เนื่องจากการติดตั้งใช้งานต้องแสดงผลเป็น 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 โดยเปิดกล่องโต้ตอบของระบบเพื่อให้ผู้ใช้เชื่อมต่อเอาต์พุตเสียงที่เหมาะสม (เช่น หูฟังบลูทูธ) เครื่องเล่นจะเล่นต่อโดยอัตโนมัติหากมีอุปกรณ์ที่เหมาะสมเชื่อมต่ออยู่ภายในระยะหมดเวลาที่กําหนดได้ (ค่าเริ่มต้นคือ 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 แบบกำหนดเองในส่วนหัวสาธารณะของการตอบกลับตัวเลือก (#613)
    • ใช้ค่าระยะหมดเวลาของคำตอบการตั้งค่า RTSP ในช่วงเวลาที่ส่งคำขอตัวเลือก RTSP แบบ "Keep-Alive" (#662)
  • ส่วนขยายโปรแกรมถอดรหัส (FFmpeg, VP9, AV1, MIDI ฯลฯ)
    • เปิดตัวโมดูลตัวถอดรหัส MIDI ซึ่งรองรับการเล่นไฟล์ MIDI มาตรฐานโดยใช้ไลบรารี Jsyn เพื่อสังเคราะห์เสียง
    • เพิ่ม DecoderOutputBuffer.shouldBeSkipped เพื่อทําเครื่องหมายบัฟเฟอร์เอาต์พุตที่ไม่ต้องแสดงโดยตรง ซึ่งวิธีนี้แนะนำมากกว่า C.BUFFER_FLAG_DECODE_ONLY ที่จะเลิกใช้งาน
    • เพิ่ม Decoder.setOutputStartTimeUs และ SimpleDecoder.isAtLeastOutputStartTimeUs เพื่ออนุญาตให้โปรแกรมถอดรหัสส่งตัวอย่างที่ถอดรหัสเท่านั้นก่อนเวลาเริ่มต้น ซึ่งควรใช้แทน Buffer.isDecodeOnly ที่จะเลิกใช้งาน
    • แก้ไขข้อบกพร่องในการเผยแพร่อาร์ติแฟกต์ตัวถอดรหัส MIDI ไปยังที่เก็บ Maven เปลี่ยนชื่ออาร์ติแฟกต์เป็น media3-exoplayer-midi (#734)
  • ส่วนขยาย Leanback
    • แก้ไขข้อบกพร่องที่การปิดใช้แพลตฟอร์มอาจทำให้เกิด ArithmeticException ในรหัส Leanback (#617)
  • ยูทิลิตีการทดสอบ
    • ทําให้ TestExoPlayerBuilder และ FakeClock เข้ากันได้กับการทดสอบ 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

  • คลังทั่วไป:
    • นำข้อกำหนด 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
  • เซสชัน:
    • เพิ่มเลย์เอาต์ที่กำหนดเองลงในสถานะของตัวควบคุมและระบุตัวรับเพื่อเข้าถึง เมื่อเลย์เอาต์ที่กำหนดเองมีการเปลี่ยนแปลง ระบบจะเรียกใช้ 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)
    • เพิ่มคำสั่งลงในโปรแกรมเล่น
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • เพิ่มเมธอดที่โอเวอร์โหลดลงใน Player ซึ่งช่วยให้ผู้ใช้ระบุ Flag ระดับเสียงได้ ดังนี้
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • เพิ่ม Builder สำหรับ DeviceInfo และเลิกใช้งานคอนสตรัคเตอร์ที่มีอยู่
    • เพิ่ม DeviceInfo.routingControllerId เพื่อระบุตัวควบคุมการกำหนดเส้นทางสำหรับการเล่นจากระยะไกล
    • เพิ่ม Player.replaceMediaItem(s) เป็นทางลัดสำหรับเพิ่มและนำรายการออกที่ตำแหน่งเดียวกัน (#8046)
  • ExoPlayer:
    • อนุญาตให้ ExoPlayer ควบคุมวิธีการควบคุมระดับเสียงของอุปกรณ์ก็ต่อเมื่อเลือกใช้อย่างชัดเจนเท่านั้น ใช้ ExoPlayer.Builder.setDeviceVolumeControlEnabled เพื่อเข้าถึงสิ่งต่อไปนี้
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) และ setDeviceVolume(int, int)
      • increaseDeviceVolume(int) และ increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) และ decreaseDeviceVolume(int, int)
    • เพิ่ม FilteringMediaSource ที่อนุญาตให้กรองประเภทแทร็กที่ใช้ได้จาก MediaSource
    • เพิ่มการรองรับการรวมข้อมูลไคลเอ็นต์สื่อทั่วไป (CMCD) ในคำขอขาออกของรูปแบบสตรีมมิงแบบปรับเปลี่ยนได้ ได้แก่ DASH, HLS และ SmoothStreaming เราได้รวมช่องต่อไปนี้ br, bl, cid, rtp และ sid (#8699) โครงสร้าง API และเมธอด API
      • การบันทึก CMCD จะปิดอยู่โดยค่าเริ่มต้น ให้ใช้ MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) เพื่อเปิดใช้
      • ระบบจะเปิดใช้คีย์ทั้งหมดโดยค่าเริ่มต้น ให้ลบล้าง CmcdConfiguration.RequestConfig.isKeyAllowed(String key) เพื่อกรองคีย์ที่จะบันทึก
      • ลบล้าง CmcdConfiguration.RequestConfig.getCustomData() เพื่อเปิดใช้การบันทึกคีย์ที่กำหนดเอง
    • เพิ่มการดำเนินการเพิ่มเติมลงในไฟล์ Manifest ของเดโมหลักเพื่อให้เริ่มแอปเดโมด้วยไฟล์ *.exolist.json ที่กําหนดเองได้ง่ายขึ้น (#439)
    • เพิ่ม ExoPlayer.setVideoEffects() สำหรับการใช้ Effect ระหว่างการเล่นวิดีโอ
    • อัปเดต SampleQueue เพื่อจัดเก็บ sourceId เป็น long แทน int ซึ่งจะเปลี่ยนลายเซ็นของเมธอดสาธารณะ SampleQueue.sourceId และ SampleQueue.peekSourceId
    • เพิ่มพารามิเตอร์ลงในLoadControlเมธอด shouldStartPlayback และ onTracksSelected ที่อนุญาตให้เชื่อมโยงเมธอดเหล่านี้กับ MediaPeriod ที่เกี่ยวข้อง
    • เปลี่ยนลายเซ็นของ ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) โดยเพิ่มพารามิเตอร์ไทม์ไลน์ที่มีช่วงเวลาที่มี UID ที่ใช้เป็นตัวคีย์ในแผนที่ ซึ่งจำเป็นต้องทำเพื่อหลีกเลี่ยงปัญหาการเรียกใช้พร้อมกันในสตรีมแบบสดหลายช่วงเวลา
    • เลิกใช้งาน EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) และ BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs) คุณเรียกใช้ตัวแปรของเมธอดที่ไม่มี mediaTimeOffsetUs แทนได้ โปรดทราบว่าแม้จะใช้ตัวแปรที่เลิกใช้งานแล้ว ระบบก็จะไม่เพิ่มออฟเซตลงใน startTimeUs และ endTimeUs ของออบเจ็กต์ MediaLoadData ที่ตัวจัดเตรียมข้อมูลส่ง
    • เปลี่ยนชื่อ ExoTrackSelection.blacklist เป็น excludeTrack และ isBlacklisted เป็น isTrackExcluded
    • แก้ไขลักษณะการทำงานที่ไม่สอดคล้องกันระหว่าง ExoPlayer.setMediaItem(s) และ addMediaItem(s) เมื่อเรียกใช้ในเพลย์ลิสต์ว่าง
  • Transformer:
    • นำ Transformer.Builder.setMediaSourceFactory(MediaSource.Factory) ออก ให้ใช้ ExoPlayerAssetLoader.Factory(MediaSource.Factory) และ Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory) แทน
    • นำ Transformer.startTransformation(MediaItem, ParcelFileDescriptor) ออก
    • แก้ไขข้อบกพร่องที่การเปลี่ยนรูปแบบอาจค้าง (ส่งผลให้ตัวรวมข้อมูลหมดเวลา) หากมีการส่งสัญญาณสิ้นสุดสตรีมวิดีโอในขณะที่เฟรมอินพุตกำลังรอการประมวลผล
    • ค้นหาตัวแปลงรหัสผ่าน MediaCodecList แทนการใช้ยูทิลิตี findDecoder/EncoderForFormat เพื่อขยายการรองรับ
    • นำการกำหนดค่าเฟรม B ใน DefaultEncoderFactory ออกเนื่องจากใช้ไม่ได้ในอุปกรณ์บางเครื่อง
  • การเลือกแทร็ก:
    • เพิ่ม DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange ซึ่งปิดอยู่โดยค่าเริ่มต้น เมื่อเปิดใช้ DefaultTrackSelector จะทริกเกอร์การเลือกแทร็กใหม่เมื่อความสามารถของโปรแกรมแสดงผลมีการเปลี่ยนแปลง
  • เครื่องมือแยกข้อมูล:
    • Ogg: แก้ไขข้อบกพร่องเมื่อกรอไฟล์ที่มีระยะเวลานาน (#391)
    • FMP4: แก้ไขปัญหาที่ TimestampAdjuster เริ่มต้นการประทับเวลาที่ผิดซึ่งออฟเซตกับเวลาตัวอย่างข้อมูลเมตาจากอะตอม emsg (#356)
  • เสียง:
    • แก้ไขข้อบกพร่องที่การเล่นบางอย่างไม่สำเร็จเมื่อเปิดใช้การทําอุโมงค์และAudioProcessorsทํางานอยู่ เช่น สำหรับการตัดต่อแบบไม่มีช่วงพัก (#10847)
    • บรรจุเฟรม Opus ในแพ็กเก็ต Ogg ในการเล่นโดยตรง (การโอน)
    • คาดคะเนตำแหน่งปัจจุบันขณะอยู่ในโหมดสลีปด้วยการกำหนดเวลาการโอน
    • เพิ่ม Renderer.release() และ AudioSink.release() เพื่อเผยแพร่ทรัพยากรเมื่อสิ้นสุดวงจรชีวิตของผู้เล่น
    • ฟังการเปลี่ยนแปลงความสามารถของเสียงใน DefaultAudioSink เพิ่มพารามิเตอร์ context ที่จําเป็นในคอนสตรคเตอร์ของ DefaultAudioSink ซึ่ง DefaultAudioSink จะลงทะเบียนเป็นผู้ฟังของ 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)
  • ตัวรวมสัญญาณ:
    • เพิ่มคลังตัวรวมไฟล์ใหม่ซึ่งสามารถใช้สร้างไฟล์คอนเทนเนอร์ 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 Response (#302)
    • ใช้ URI ฐานสำหรับการแปลงเส้นทางแบบสัมพัทธ์จากเซสชัน 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() และ copyWithMaxInputSize แทน
    • นำ ExoPlayer.retry() ที่เลิกใช้งานแล้วออก โปรดใช้ prepare() แทน
    • นำตัวสร้าง DefaultTrackSelector ที่มีอาร์กิวเมนต์เป็น 0 ซึ่งเลิกใช้งานแล้วออก โปรดใช้ 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 มี Flag C.BUFFER_FLAG_LAST_SAMPLE หรือไม่
    • แก้ไขปัญหาที่อาจไม่แสดงผลเฟรมสุดท้ายหากนำตัวอย่างที่มีเฟรมสุดท้ายออกจากคิวโดยไม่อ่านตัวอย่าง "สิ้นสุดสตรีม" (#11079)
  • เครื่องมือแยกข้อมูล:
    • แก้ไขการแยกวิเคราะห์ SPS ของ H.265 ในไฟล์ MPEG-TS โดยใช้ตรรกะการแยกวิเคราะห์ที่ใช้ซ้ำแล้วโดยโปรแกรมแยก RTSP และ MP4 (#303)
  • ข้อความ:
    • SSA: เพิ่มการรองรับไฟล์ UTF-16 หากเริ่มต้นด้วยเครื่องหมายลำดับไบต์ (#319)
  • เซสชัน:
    • แก้ไขข้อผิดพลาดที่ MediaController ไม่อัปเดตคำสั่งที่ใช้ได้เมื่อเชื่อมต่อกับ MediaSessionCompat รุ่นเดิมที่อัปเดตการดำเนินการ
    • แก้ไขข้อบกพร่องที่ทำให้ MediaLibraryService แสดงผลเป็นค่าว่างสําหรับการเรียกจาก 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 ใหม่
    • อนุญาตให้ล้างตัวช่วยของเครื่องมือจัดการการดาวน์โหลด (#10776)
    • เพิ่มพารามิเตอร์ลงใน BasePlayer.seekTo เพื่อระบุคําสั่งที่ใช้สําหรับการกรอ
    • ใช้ธีมเมื่อโหลด drawable ใน API 21 ขึ้นไป (#220)
    • เพิ่ม ConcatenatingMediaSource2 ที่ช่วยให้รวมรายการสื่อหลายรายการไว้ในหน้าต่างเดียวได้ (#247)
  • เครื่องมือแยกข้อมูล:
    • แสดง ParserException แทน NullPointerException หากตารางตัวอย่าง (stbl) ไม่มีคำอธิบายตัวอย่าง (stsd) ที่จำเป็นเมื่อแยกวิเคราะห์อะตอม trak
    • ข้ามตัวอย่างอย่างถูกต้องเมื่อกรอไปยังเฟรมการซิงค์ใน fMP4 โดยตรง (#10941)
  • เสียง:
    • ใช้อัตราบิตของรูปแบบเสียงที่บีบอัดเพื่อคำนวณขนาดบัฟเฟอร์ขั้นต่ำสำหรับ AudioTrack ในการเล่นโดยตรง (การส่งผ่าน)
  • ข้อความ:
    • แก้ไข TextRenderer ส่งอินเด็กซ์ที่ไม่ถูกต้อง (ติดลบ) ไปยัง Subtitle.getEventTime หากไฟล์คำบรรยายไม่มีคำบอกทาง
    • SubRip: เพิ่มการรองรับไฟล์ UTF-16 หากเริ่มต้นด้วยเครื่องหมายการจัดลำดับไบต์
  • ข้อมูลเมตา:
    • แยกวิเคราะห์ค่าหลายค่าที่คั่นด้วยค่า Null จากเฟรม 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)
    • เพิ่ม onSetMediaItems Listener ของคอลแบ็กเพื่อให้มีวิธีแก้ไข/ตั้งค่ารายการ ดัชนีเริ่มต้น และตำแหน่งตามเซสชันก่อนที่จะตั้งค่าในเพลเยอร์ (#156)MediaItem
    • หลีกเลี่ยงการตรวจจับการแตะสองครั้งสำหรับเหตุการณ์ปุ่มสื่อที่ไม่ใช่บลูทูธ (#233)
    • ทําให้ QueueTimeline มีประสิทธิภาพมากขึ้นในกรณีที่สถานะเซสชันเดิมไม่ชัดเจน (#241)
  • ข้อมูลเมตา:
    • แยกวิเคราะห์ค่าหลายค่าที่คั่นด้วยค่า Null จากเฟรม ID3 ตามที่ ID3 v2.4 อนุญาต
    • เพิ่ม MediaMetadata.mediaType เพื่อระบุประเภทเนื้อหาหรือประเภทโฟลเดอร์ที่ข้อมูลเมตาอธิบาย
    • เพิ่ม MediaMetadata.isBrowsable แทน MediaMetadata.folderType เราจะเลิกใช้งานประเภทโฟลเดอร์นี้ในรุ่นถัดไป
  • ส่วนขยายแคสต์
    • อัปเกรด Cast SDK เป็นเวอร์ชัน 21.2.0
  • ส่วนขยาย IMA
    • นำโปรแกรมฟังเสียงของ 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)
    • ส่งการเรียกกลับ onMediaItemTransition ที่ขาดหายไปเมื่อเรียก seekToNext หรือ seekToPrevious ในเพลย์ลิสต์ที่มีรายการเดียว (#10667)
    • เพิ่ม Player.getSurfaceSize ที่จะแสดงผลขนาดของพื้นผิวที่แสดงผลวิดีโอ
    • แก้ไขข้อบกพร่องที่การนำผู้ฟังออกระหว่างการเผยแพร่เพลเยอร์อาจทำให้เกิดข้อผิดพลาด 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 ทําให้เกิด IllegalStateException (#49)
  • RTSP:
    • เพิ่มการจัดการแพ็กเก็ตที่กระจัดกระจายของ H263 (#119)
    • เพิ่มการรองรับ MP4A-LATM (#162)
  • IMA:
    • เพิ่มการหมดเวลาในการโหลดข้อมูลโฆษณาเพื่อจัดการกรณีที่ IMA SDK ค้างในการโหลดโฆษณา (#10510)
    • ป้องกันไม่ให้ข้ามโฆษณาตอนกลางเมื่อกรอไปยังส่วนท้ายของเนื้อหา (#10685)
    • คํานวณระยะเวลากรอบเวลาสําหรับสตรีมแบบสดที่มีโฆษณาที่แทรกฝั่งเซิร์ฟเวอร์อย่างถูกต้อง เช่น IMA DAI (#10764)
  • ส่วนขยาย FFmpeg
    • เพิ่ม Flag ที่จำเป็นใหม่เพื่อลิงก์ไลบรารี FFmpeg กับ NDK 23.1.7779620 ขึ้นไป (#9933)
  • ส่วนขยาย AV1
    • อัปเดตเวอร์ชัน CMake เพื่อหลีกเลี่ยงการทำงานร่วมกันไม่ได้กับ Android Studio เวอร์ชันล่าสุด (#9933)
  • ส่วนขยายแคสต์
    • ใช้ getDeviceInfo() เพื่อให้สามารถระบุ CastPlayer เมื่อควบคุมการเล่นด้วย MediaController (#142)
  • Transformer:
    • เพิ่มตัวจับเวลาเฝ้าติดตามตัวรวมสัญญาณเพื่อตรวจหาว่าการสร้างตัวอย่างเอาต์พุตช้าเกินไปหรือไม่
  • นำสัญลักษณ์ที่เลิกใช้งานออก
    • นำ Transformer.Builder.setOutputMimeType(String) ออก ฟีเจอร์นี้ถูกนําออกแล้ว ประเภท MIME จะเป็น MP4 เสมอเมื่อใช้โปรแกรมรวมไฟล์เริ่มต้น

เวอร์ชัน 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)
    • สำหรับสื่อแบบ Progressive ให้ใส่เฉพาะแทร็กที่กำหนดไว้ในตำแหน่งที่บัฟเฟอร์ไว้ (#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 จะตรวจสอบการเปลี่ยนแปลงในพร็อพเพอร์ตี้การจัดวางเสียง และเรียกใช้การเลือกแทร็กใหม่ตามการเปลี่ยนแปลงเหล่านี้ อุปกรณ์ที่มีtelevision โหมด UI จะยกเว้นจากข้อจำกัดเหล่านี้และระบบจะเลือกรูปแบบที่มีจำนวนแชแนลสูงสุด หากต้องการเปิดใช้ฟีเจอร์นี้ อินสแตนซ์ DefaultTrackSelector ต้องสร้างขึ้นด้วย Context
  • วิดีโอ:
    • เปลี่ยนชื่อ DummySurface เป็น PlaceholderSurface
    • เพิ่มการรองรับ AV1 ลงใน MediaCodecVideoRenderer.getCodecMaxInputSize
  • เสียง:
    • ใช้โปรแกรมถอดรหัสเสียง AC3 ของ LG ที่โฆษณาประเภท MIME ที่ไม่เป็นไปตามมาตรฐาน
    • เปลี่ยนประเภทผลลัพธ์ของ AudioAttributes.getAudioAttributesV21() จาก android.media.AudioAttributes เป็นคลาส AudioAttributesV21 wrapper ใหม่ เพื่อป้องกันไม่ให้การยืนยัน 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:
    • เปลี่ยนกลับไปใช้การเตรียมแบบเป็นกลุ่มหากแอตทริบิวต์ CODECS ของเพลย์ลิสต์ไม่มีตัวแปลงรหัสเสียง (#10065)
    • ไม่อนุญาตให้ส่ง null ไปยัง HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory และ HlsMediaSource.Factory.setPlaylistTrackerFactory คุณสามารถส่งอินสแตนซ์ของ DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory หรือการอ้างอิงถึง DefaultHlsPlaylistTracker.FACTORY อย่างชัดเจนได้หากจำเป็น
  • สตรีมมิงแบบราบรื่น:
    • ไม่อนุญาตให้ส่ง null ไปยัง SsMediaSource.Factory.setCompositeSequenceableLoaderFactory คุณสามารถส่งอินสแตนซ์ของ DefaultCompositeSequenceableLoaderFactory อย่างชัดเจนได้หากจำเป็น
  • RTSP:
    • เพิ่มโปรแกรมอ่าน RTP สำหรับ H263 (#63)
    • เพิ่มโปรแกรมอ่าน RTP สำหรับ MPEG4 (#35)
    • เพิ่มโปรแกรมอ่าน RTP สำหรับ HEVC (#36)
    • เพิ่มโปรแกรมอ่าน RTP สำหรับ AMR ปัจจุบันรองรับเฉพาะสตรีม AMR แบบโมโนแชแนลที่ไม่มีการสับเปลี่ยนเท่านั้น ระบบไม่รองรับเพย์โหลด AMR RTP แบบคอมโพเนนต์ (#46)
    • เพิ่มโปรแกรมอ่าน RTP สำหรับ VP8 (#47)
    • เพิ่มโปรแกรมอ่าน RTP สำหรับ WAV (#56)
    • แก้ไขส่วนหัวของการตรวจสอบสิทธิ์พื้นฐาน RTSP (#9544)
    • หยุดตรวจสอบฟิลด์ SDP ที่ต้องกรอกเนื่องจาก ExoPlayer ไม่จำเป็นต้องใช้ (#10049)
    • Throw checked exception when parsing RTSP timing (#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)
    • อัปเดตข้อมูลตำแหน่งเซสชันในไทม์ไลน์ change(#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) instead.
    • นำ Player.getCurrentTrackGroups และ Player.getCurrentTrackSelections ออก ให้ใช้ Player.getCurrentTracks instead. นอกจากนี้ คุณยังใช้ 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 ไม่สําเร็จ วิธีนี้ช่วยแก้ปัญหาที่เกิดขึ้นในอุปกรณ์บางเครื่องเมื่อเปลี่ยนแพลตฟอร์มจากตัวแปลงรหัสที่ปลอดภัยเป็นตัวแปลงรหัสอื่น (#8696)
    • เพิ่ม MediaCodecAdapter.getMetrics() เพื่ออนุญาตให้ผู้ใช้รับข้อมูลเมตริกจาก MediaCodec (#9766)
    • แก้ไขการแก้ไขข้อกำหนดของ Maven (#8353)
    • ปิดใช้การปรับความเร็วอัตโนมัติสำหรับสตรีมแบบสดที่ไม่มีฟีเจอร์เวลาในการตอบสนองต่ำหรือคำขอของผู้ใช้ในการตั้งค่าความเร็ว (#9329)
    • เปลี่ยนชื่อ DecoderCounters#inputBufferCount เป็น queuedInputBufferCount
    • ทำให้ SimpleExoPlayer.renderers เป็นส่วนตัว คุณสามารถเข้าถึงโปรแกรมแสดงผลได้ผ่าน ExoPlayer.getRenderer
    • อัปเดตค่าคงที่ AnalyticsListener.EventFlags บางค่าให้ตรงกับค่าใน Player.EventFlags
    • แยก AnalyticsCollector ออกเป็นอินเทอร์เฟซและการใช้งานเริ่มต้นเพื่อให้ R8 นำออกได้หากแอปไม่ต้องการ
  • การเลือกแทร็ก
    • รองรับการแจ้งว่าวิดีโอมีบทบาทที่ต้องการในการเลือกแทร็ก (#9402)
    • อัปเดตตรรกะการเลือกแทร็กวิดีโอให้พิจารณาประเภท MIME และ Flag บทบาทที่ต้องการเมื่อเลือกแทร็กวิดีโอหลายรายการสำหรับการปรับเปลี่ยน (#9519)
    • อัปเดตตรรกะการเลือกแทร็กวิดีโอและเสียงเพื่อเลือกเฉพาะรูปแบบสำหรับตัวเลือกแบบปรับเปลี่ยนได้ซึ่งรองรับโปรแกรมถอดรหัสและฮาร์ดแวร์ในระดับเดียวกัน (#9565)
    • อัปเดตตรรกะการเลือกแทร็กวิดีโอเพื่อเลือกใช้ตัวแปลงรหัสที่มีประสิทธิภาพมากขึ้นหากตัวถอดรหัสหลักที่เร่งฮาร์ดแวร์รองรับตัวแปลงรหัสหลายรายการ (#4835)
    • โปรดใช้ค่ากำหนดเนื้อหาเสียง (เช่น แทร็กเสียง "เริ่มต้น" หรือแทร็กซึ่งตรงกับภาษาของภาษาที่แสดงของระบบ) แทนข้อจำกัดทางเทคนิคในการเลือกแทร็ก (เช่น ประเภท MIME ที่ต้องการ หรือจำนวนช่องสูงสุด)
    • แก้ไขปัญหาการเลือกแทร็กซึ่งการลบล้างกลุ่มแทร็กหนึ่งไม่ได้ปิดใช้กลุ่มแทร็กอื่นๆ ประเภทเดียวกัน (#9675)
    • แก้ไขปัญหาการเลือกแทร็กที่ไม่ใช้การลบล้างแทร็กแบบผสมกันทั้งแบบว่างเปล่าและแบบไม่ว่างเปล่าอย่างถูกต้อง (#9649)
    • ห้ามใช้ TrackGroup ซ้ำใน TrackGroupArray TrackGroups สามารถทำให้แยกแยะกันได้เสมอโดยการตั้งค่า 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 หากมีทั้งสองวิธี (#9800)
    • จัดการเมื่อไม่มีการกำหนดเวลาแทร็ก RTSP (#9775)
    • ละเว้นค่าส่วนหัว RTP-Info ที่ไม่ถูกต้อง (#9619)
  • Transformer:
    • เพิ่มเวอร์ชัน API ขั้นต่ำที่จำเป็นเป็น 21
    • ตอนนี้ TransformationException ใช้เพื่ออธิบายข้อผิดพลาดที่เกิดขึ้นระหว่างการเปลี่ยนรูปแบบ
    • เพิ่ม TransformationRequest เพื่อระบุตัวเลือกการเปลี่ยนรูปแบบ
    • อนุญาตให้ลงทะเบียนผู้ฟังได้หลายราย
    • แก้ไข Transformer ค้างเมื่ออ่านเอาต์พุตของโค้ดได้เพียงบางส่วน
    • แก้ไข NPE ที่อาจเกิดขึ้นใน Transformer.getProgress เมื่อปล่อยตัวรวมไฟล์ throw
    • เพิ่มแอปสาธิตเพื่อใช้การเปลี่ยนรูปแบบ
  • ส่วนขยาย MediaSession
    • โดยค่าเริ่มต้น MediaSessionConnector จะล้างเพลย์ลิสต์เมื่อหยุดเล่น แอปที่ต้องการเก็บเพลย์ลิสต์ไว้สามารถเรียกใช้ setClearMediaItemsOnStop(false) ในเครื่องมือเชื่อมต่อ
  • ส่วนขยายแคสต์
    • แก้ไขข้อบกพร่องที่ทำให้ CastPlayer โทรหา onIsPlayingChanged อย่างไม่ถูกต้อง (#9792)
    • รองรับข้อมูลเมตาของเสียง รวมถึงอาร์ตเวิร์กด้วย DefaultMediaItemConverter (#9663)
  • ส่วนขยาย FFmpeg
    • ทําให้ build_ffmpeg.sh ขึ้นกับ utils ของ bin ของ 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 เวอร์ชันอัลฟ่าแรกมีการใช้งานไลบรารีที่ใช้งานได้ในช่วงต้นสําหรับการใช้งานกรณีการใช้งานสื่อ ซึ่งรวมถึง

  • ExoPlayer ซึ่งเป็นโปรแกรมเล่นสื่อระดับแอปพลิเคชันสำหรับ Android ที่ปรับแต่งและขยายการทำงานได้ง่าย
  • ฟังก์ชันการทำงานของเซสชันสื่อสำหรับแสดงและควบคุมการเล่น โมดูลเซสชันใหม่นี้ใช้อินเทอร์เฟซ Player เดียวกันกับ ExoPlayer
  • คอมโพเนนต์ UI สำหรับการสร้างอินเทอร์เฟซผู้ใช้การเล่นสื่อ
  • โมดูลที่รวมฟังก์ชันการทำงานในไลบรารีอื่นๆ เพื่อใช้กับ ExoPlayer เช่น การแทรกโฆษณาผ่าน IMA SDK

ดูข้อมูลเพิ่มเติมได้ที่โปรเจ็กต์ Media3 ใน GitHub

ก่อนหน้านี้ ExoPlayer โฮสต์อยู่ในโปรเจ็กต์ GitHub ของ ExoPlayer แยกต่างหาก ใน Media3 ชื่อแพ็กเกจคือ androidx.media3.exoplayer เราวางแผนที่จะดูแลรักษาและเผยแพร่โปรเจ็กต์ ExoPlayer ใน GitHub ต่อไปอีกระยะหนึ่งเพื่อให้แอปมีเวลาในการย้ายข้อมูลไปยัง Media3 Media3 มีโมดูลทดแทนสำหรับโมดูล ExoPlayer ทั้งหมด ยกเว้นส่วนขยาย media2 และ mediasession รุ่นเดิม ซึ่งถูกแทนที่ด้วยโมดูล media3-session ใหม่ ซึ่งจะผสานรวมโปรแกรมเล่นกับเซสชันสื่อโดยตรงโดยไม่ต้องใช้คลาสอะแดปเตอร์/คอนเน็กเตอร์