Media3

ไลบรารีสนับสนุนสำหรับกรณีการใช้งานสื่อ
อัปเดตล่าสุด รุ่นที่เสถียร รุ่นที่อาจได้รับการเผยแพร่ รุ่นเบต้า รุ่นอัลฟ่า
2 กรกฎาคม 2025 1.7.1 - 1.8.0-beta01 1.8.0-alpha01

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

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

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

Groovy

dependencies {
    def media3_version = "1.6.1"

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

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

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

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

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

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

    // For 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.6.1"

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

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

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

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

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

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

    // For 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.8.0

เวอร์ชัน 1.8.0-เบต้า01

2 กรกฎาคม 2025

androidx.media3:media3-*:1.8.0-beta01 ได้รับการเผยแพร่แล้ว เวอร์ชัน 1.8.0-beta01 มีการเปลี่ยนแปลงเหล่านี้

  • คลังทั่วไป
    • เพิ่มการรองรับการแทนที่เพลเยอร์ใน ForwardingSimpleBasePlayer
  • ExoPlayer:
    • เพิ่มการรองรับการใช้รหัสอุปกรณ์เสมือนจาก Context ที่ส่งไปยัง ExoPlayer.Builder
    • เปิดใช้การจัดเวลาแบบไดนามิกโดยค่าเริ่มต้นในโหมดขัด
    • หลีกเลี่ยงการโหลดแหล่งที่มาซ้ำโดยไม่จำเป็นเมื่อกรอรายการไปจนถึงตอนท้าย
    • ใช้ MediaCodec.BUFFER_FLAG_DECODE_ONLY โดยค่าเริ่มต้นในโหมดการลาก
    • ส่ง IllegalStateException เมื่อ PreloadMediaSource เล่นโดย ExoPlayer ที่มีเธรดการเล่นต่างจากเธรดการโหลดล่วงหน้า (#2495)
    • เพิ่ม cloneAndMove ลงใน ShuffleMode ด้วยการติดตั้งใช้งานเริ่มต้น (#2226)
    • เปลี่ยนลักษณะการทำงานเริ่มต้นของ Renderer.getMinDurationToProgressUs เพื่อ แสดงค่าที่ใหญ่ขึ้นหากไม่จำเป็นต้องเรียกใช้ render
    • แก้ไขข้อบกพร่องที่การจัดกำหนดการภายในทำให้เฟรมสุดท้ายล่าช้าเมื่อกรอไปยัง จุดสิ้นสุดขณะหยุดชั่วคราว ตอนนี้การแก้ไขข้อบกพร่องจะมีผลก็ต่อเมื่อเปิดใช้ ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled
  • Transformer
    • เพิ่ม CodecDbLite ที่ช่วยให้การเพิ่มประสิทธิภาพเฉพาะชิปเซ็ตของการตั้งค่าการเข้ารหัสวิดีโอ
    • เพิ่มแฟล็ก setEnableCodecDbLite ลงใน DefaultEncoderFactory เพื่อเปิดใช้ การเพิ่มประสิทธิภาพการตั้งค่า CodecDB Lite โดยค่าเริ่มต้น ระบบจะตั้งค่าสถานะนี้เป็น false
  • โปรแกรมแยกข้อมูล
    • เพิ่มการรองรับการกรอใน MP4 แบบแยกส่วนที่มี sidx หลายรายการ คุณเปิดใช้ลักษณะการทำงานนี้ได้โดยใช้ฟีเจอร์FLAG_MERGE_FRAGMENTED_SIDXใน FragmentedMp4Extractor (#9373)
    • ไม่สนใจตารางการค้นหาที่ว่างเปล่าในไฟล์ FLAC (รวมถึงไฟล์ที่มีเฉพาะจุดค้นหาตัวยึดตำแหน่ง ) และกลับไปใช้การค้นหาแบบไบนารีหากทราบ ระยะเวลาของไฟล์ (#2327)
    • แก้ไขการแยกวิเคราะห์หน่วย SEI ของ H.265 เพื่อข้ามประเภท SEI ที่ไม่รู้จักทั้งหมด (#2456)
    • อัปเดต WavExtractor เพื่อใช้ข้อมูล SubFormat ของส่วนขยายส่วนหัวสำหรับ รูปแบบเสียงเมื่อแยกวิเคราะห์ไฟล์ประเภท WAVE_FORMAT_EXTENSIBLE
    • MP4: เพิ่มการรองรับกล่อง ipcm และ fpcm ที่กำหนดแทร็กเสียง PCM ดิบ (ไม่รองรับ PCM แบบจุดลอยตัว 64 บิต)
    • MP4: จัดการส่วนการหมุนของtkhdเมทริกซ์การแปลงที่ ทั้งหมุนและพลิกวิดีโอ ซึ่งจะช่วยให้วิดีโอที่สะท้อน ซึ่งถ่ายด้วยกล้องหน้าของ iPhone แสดงผลได้อย่างถูกต้อง แต่ สะท้อนในแกน y อย่างไม่ถูกต้อง (#2012)
  • เสียง:
    • เพิ่มการรองรับรูปแบบตัวอย่าง PCM เชิงเส้นทั้งหมดใน ChannelMappingAudioProcessor และ TrimmingAudioProcessor
    • เพิ่มการรองรับช่องว่างของเสียงใน CompositionPlayer
    • นำการโทรที่น่าสงสัยไปยัง BaseAudioProcessor#flush() ออกจาก BaseAudioProcessor#reset()
  • วิดีโอ
    • ปรับปรุงการปล่อยเฟรมวิดีโออย่างราบรื่นเมื่อเริ่มต้นทำงานในกรณีที่ตัวอย่างเสียงไม่ได้ เริ่มที่ตำแหน่งที่ขออย่างแม่นยำ
    • ขยายการแก้ปัญหาชั่วคราวสำหรับ Surface ที่ถอดออกไปยังอุปกรณ์ "realme" (#2059)
  • ข้อความ:
    • แก้ไขการหยุดเล่นชั่วคราวเมื่อโหลดส่วนคำบรรยายแทนเสียงไม่สำเร็จในตอนแรกและ โหลดสำเร็จในภายหลัง ตามด้วยส่วนคำบรรยายแทนเสียงที่ว่างเปล่าหลายส่วน (#2517)
  • ข้อมูลเมตา
    • เพิ่มการรองรับการดึงข้อมูลระยะเวลาของสื่อและ Timeline ไปยัง MetadataRetriever และย้ายข้อมูลไปยัง API AutoCloseable ที่อิงตามอินสแตนซ์ ใช้ Builder ใหม่เพื่อสร้างอินสแตนซ์สำหรับ MediaItem จากนั้นเรียกใช้ retrieveTrackGroups(), retrieveTimeline() และ retrieveDurationUs() เพื่อรับ ListenableFuture สำหรับข้อมูลเมตา ตอนนี้เราเลิกใช้งานเมธอดแบบคงที่ก่อนหน้าแล้ว (#2462)
  • รูปภาพ:
    • จำกัดบิตแมปที่ถอดรหัสแล้วให้มีขนาดเท่ากับขนาดการแสดงผลใน BitmapFactoryImageDecoder เพื่อหลีกเลี่ยงไม่ให้แอปขัดข้องเนื่องจาก Canvas: trying to draw too large bitmap. จาก PlayerView เมื่อพยายาม แสดงรูปภาพขนาดใหญ่มาก (เช่น 50MP)
    • เปลี่ยนลายเซ็นของ DefaultRenderersFactory.getImageDecoderFactory() เพื่อใช้Context พารามิเตอร์
    • ปรับขนาดเอาต์พุตบิตแมปสูงสุดที่ใช้ใน CompositionPlayer ให้ตรงกับขนาดที่ใช้ใน Transformer อยู่แล้ว (หมายความว่า CompositionPlayer จะไม่พิจารณาขนาดการแสดงผลเมื่อถอดรหัสบิตแมป ซึ่งต่างจาก ExoPlayer)
  • Muxers:
    • แก้ไขข้อบกพร่องที่ไม่ได้ตั้งค่าแฟล็กตัวอย่างที่ถูกต้องสำหรับตัวอย่างเสียงใน MP4 ที่แยกส่วน
  • เซสชัน:
    • แก้ไขข้อบกพร่องที่การเรียกใช้ setSessionExtras จากเทรดหลักเมื่อ เรียกใช้เพลเยอร์จากเทรดแอปพลิเคชันอื่นที่ไม่ใช่เทรดหลัก ทำให้เกิด IllegalStateException (#2265)
    • ไม่แสดงการแจ้งเตือนโดยอัตโนมัติหากตั้งค่าเพลเยอร์ด้วยรายการสื่อ โดยไม่ได้เตรียมหรือเล่น (#2423https://github.com/androidx/media/issues/2423) ลักษณะการทำงานนี้ กำหนดค่าได้ผ่าน MediaSessionService.setShowNotificationForIdlePlayer
    • เพิ่มPlaybackExceptionที่กำหนดเองสำหรับคอนโทรลเลอร์ทั้งหมดหรือบางตัว
    • แก้ไขข้อบกพร่องที่การกรอในไลฟ์สดบน MediaController อาจทำให้เกิดIllegalArgumentException
    • สำหรับไลฟ์สด ให้หยุดเผยแพร่ตำแหน่งการเล่นและความสามารถในการ กรอรายการปัจจุบันสำหรับตัวควบคุมสื่อของแพลตฟอร์ม เพื่อหลีกเลี่ยง อาร์ติแฟกต์ตำแหน่งใน UI ของ Android Auto (และตัวควบคุมอื่นๆ ที่ใช้ ข้อมูลนี้จากเซสชันสื่อของแพลตฟอร์ม) (#1758)
  • ส่วนขยาย Cronet
    • เพิ่มการจัดการคุกกี้อัตโนมัติ (#5975)
  • ส่วนขยาย HLS
    • แก้ไขการแยกวิเคราะห์เพลย์ลิสต์เพื่อยอมรับ \f (ฟีดแบบฟอร์ม) ในค่าแอตทริบิวต์สตริงที่ยกมา (#2420)
    • รองรับการอัปเดตโฆษณาคั่นที่มีรหัสเดียวกัน (#2427)
    • แก้ไขข้อบกพร่องที่บางครั้งข้อผิดพลาดในการโหลดเพลย์ลิสต์จะไม่แพร่กระจายเมื่อ ไลฟ์สดไม่มีกลุ่มให้โหลด (#2401https://github.com/androidx/media/issues/2401)
    • จัดกลุ่มการแสดงผลคำบรรยายแทนเสียงตามแท็ก NAME ในลักษณะเดียวกับที่จัดกลุ่มการแสดงผลเสียงอยู่แล้ว (#1666)
  • ส่วนขยาย DASH
    • แก้ไขข้อบกพร่องที่การลดระยะเวลาของช่วง DASH อาจทำให้เกิดข้อยกเว้น เมื่อไปป์ไลน์การแสดงผล อ่านตัวอย่างที่อยู่นอกเหนือระยะเวลาใหม่แล้ว (#2440)
    • แก้ไขข้อบกพร่องที่ระบบไม่เปลี่ยนเส้นทางเมื่อใช้พารามิเตอร์การค้นหา CMCD (#2475)
  • ส่วนขยาย RTSP
    • แก้ไข RtspClient เพื่อใช้ URI ของตำแหน่งตามที่ระบุเมื่อประมวลผลการตอบกลับ HTTP 302 (#2398)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ)
    • แก้ไขข้อบกพร่องที่ DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange ไม่มีผลกับส่วนขยายตัวถอดรหัสเสียง (#2258)
  • ส่วนขยาย Cast
    • เพิ่มการรองรับ setVolume() และ getVolume() (#2279)
    • ป้องกันไม่ให้ CastPlayer เข้าสู่ STATE_BUFFERING ขณะที่ไทม์ไลน์ว่างเปล่า
  • โปรแกรมอรรถประโยชน์สำหรับการทดสอบ
    • เพิ่ม advance(player).untilPositionAtLeast และ untilMediaItemIndex ไปยัง TestPlayerRunHelper เพื่อให้ผู้เล่นเลื่อนไปจนกว่าจะถึงตำแหน่งที่ระบุ ในกรณีส่วนใหญ่ วิธีการเหล่านี้เชื่อถือได้มากกว่าวิธีการ untilPosition และ untilStartOfMediaItem ที่มีอยู่
    • ย้าย FakeDownloader ไปยังโมดูล test-utils-robolectric เพื่อนำไปใช้ซ้ำในการทดสอบอื่นๆ

เวอร์ชัน 1.8.0-alpha01

19 พฤษภาคม 2025

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

  • ExoPlayer:
    • เพิ่มExoPlayer.setScrubbingModeEnabled(boolean)วิธีการ ซึ่งจะเพิ่มประสิทธิภาพ เพลเยอร์สำหรับการกรอหลายครั้ง (เช่น จากผู้ใช้ที่ลากแถบ ตัวเลื่อนไปมา) คุณปรับแต่งลักษณะการทำงานของโหมดการกวาดได้ ด้วย setScrubbingModeParameters(..) ใน ExoPlayer และ ExoPlayer.Builder
    • อนุญาตให้ปรับแต่งความคลาดเคลื่อนในการกรอแบบเศษส่วนในโหมดการถู
    • เพิ่มอัตราการทำงานของตัวแปลงรหัสในโหมดการกวาด
    • แก้ไขข้อบกพร่องที่อาจทำให้ไม่มีการรายงานข้อผิดพลาดในการเตรียมเนื้อหาของ AdsMediaSource (#2337)
    • แก้ไขปัญหาหน่วยความจำรั่วใน MergingMediaSource เช่น เมื่อใช้ การโหลดคำบรรยายแทนเสียงจากภายนอก (#2338)
    • อนุญาตให้ CmcdConfiguration.Factory ส่งคืน null เพื่อปิดใช้การบันทึก CMCD สำหรับรายการสื่อที่เฉพาะเจาะจง (#2386)
    • เพิ่มขนาดบัฟเฟอร์รูปภาพเริ่มต้นจาก 128 KB (ข้อผิดพลาดจากการคัดลอกและวางจากแทร็กข้อความ) เป็น 26 MB ซึ่งมีขนาดใหญ่พอสำหรับรูปภาพ Ultra HDR ขนาด 50 MP (#2417)
    • เพิ่ม PreCacheHelper ที่อนุญาตให้แอปแคชล่วงหน้าสื่อรายการเดียวที่มี ตำแหน่งเริ่มต้นและระยะเวลาที่ระบุ
  • Transformer
    • การเติมช่องว่างเริ่มต้น (เพิ่มผ่าน addGap()) ด้วยเสียงเงียบในตอนนี้ ต้องตั้งค่า experimentalSetForceAudioTrack(true) อย่างชัดเจนใน EditedMediaItemSequence.Builder หากช่องว่างอยู่ตรงกลาง ลำดับ ก็ไม่จำเป็นต้องใช้แฟล็กนี้
    • ย้ายอินเทอร์เฟซ Muxer จาก media3-transformer ไปยัง media3-muxer
    • กำหนดให้ต้องตั้งค่า MediaItem.Builder().setImageDuration(long) เพื่อ นำเข้ารายการสื่อเป็นรูปภาพ
    • เพิ่ม Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean) ซึ่งรวมถึงรายการแก้ไข MP4 เมื่อตัดเพื่อสั่งให้เพลเยอร์ ไม่สนใจตัวอย่างระหว่างคีย์เฟรมก่อนจุดเริ่มต้นของการตัด และ จุดเริ่มต้นของการตัด
    • อัปเดตแอป Composition Demo ให้ใช้ Kotlin และ Jetpack Compose แล้วเพิ่ม VideoCompositorSettings ที่กำหนดเองเพื่อจัดเรียงลำดับเป็นเลย์เอาต์ 2x2 หรือ PIP
  • โปรแกรมแยกข้อมูล
    • MP3: ใช้ระยะเวลาและขนาดข้อมูลจากข้อมูลเมตาอัตราบิตแปรผัน Xing, VBRI และที่คล้ายกันซึ่งค้นหาไม่ได้ เมื่อเปลี่ยนกลับไปใช้การค้นหาอัตราบิตคงที่ เนื่องจาก FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) (#2194)
  • เสียง:
    • อนุญาตการอัปมิกซ์/ดาวน์มิกซ์เสียงแบบคงที่ใน DefaultAudioMixer
    • ตั้งค่า ChannelMappingAudioProcessor, TrimmingAudioProcessor และ ToFloatPcmAudioProcessor เป็นสาธารณะ (#2339)
    • ใช้ AudioTrack#getUnderrunCount() ใน AudioTrackPositionTracker เพื่อ ตรวจหาการทำงานไม่ต่อเนื่องใน DefaultAudioSink แทนการประมาณค่า แบบสุดความสามารถ
    • ปรับปรุงการปรับค่าการประทับเวลาของเสียงให้ราบรื่นขึ้นในกรณีที่ตำแหน่งของ อุปกรณ์เอาต์พุตเสียงมีการเปลี่ยนแปลงที่ไม่คาดคิด
    • แก้ไขข้อบกพร่องที่ทำให้การซิงค์ภาพและเสียงไม่ทำงานในช่วง 10 วินาทีแรกหลังจากกลับมาเล่นต่อ จากหยุดชั่วคราวเมื่อเชื่อมต่อกับอุปกรณ์บลูทูธ
    • แก้ไขข้อบกพร่องที่ทำให้ AnalyticsListener.onAudioPositionAdvancing ไม่ได้ รายงานเวลาที่เสียงเริ่มเลื่อน แต่รายงานเวลาของการวัดครั้งแรก
  • วิดีโอ
    • เพิ่ม ExoPlayer API เวอร์ชันทดลองเพื่อรวมแฟล็ก MediaCodec.BUFFER_FLAG_DECODE_ONLY เมื่อจัดคิวบัฟเฟอร์อินพุตแบบถอดรหัสเท่านั้น โดยแฟล็กนี้จะส่งสัญญาณให้ตัวถอดรหัสข้ามบัฟเฟอร์ที่ถอดรหัสได้อย่างเดียว จึงทำให้การค้นหาเร็วขึ้น เปิดใช้ด้วย DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag
    • ปรับปรุงการตรวจสอบประสิทธิภาพตัวแปลงรหัสสำหรับตัวแปลงรหัสวิดีโอซอฟต์แวร์ ซึ่งอาจส่งผลให้มีการทำเครื่องหมายแทร็กเพิ่มเติมบางรายการเป็น EXCEEDS_CAPABILITIES
    • แก้ไขข้อผิดพลาดในการเล่น VP9 Widevine ในอุปกรณ์บางรุ่น (#2408)
  • ข้อความ:
    • แก้ไข SSA และ SubRip เพื่อแสดงคิวที่กำลังดำเนินการเมื่อเปิดใช้คำบรรยายแทนเสียง (#2309)
    • แก้ไขการเล่นที่หยุดชะงักเมื่อเปลี่ยนจากสตรีมที่มีข้อผิดพลาดเกี่ยวกับคำบรรยายแทนเสียง เป็นไลฟ์สดที่มีแทร็กคำบรรยายแทนเสียงว่างเปล่า (#2328)
    • แก้ไขปัญหาคำบรรยายแทนเสียง CEA-608 ที่อ่านไม่ออกเมื่อเล่นสตรีม H.262 ที่มี B-Frame (#2372)
    • เพิ่มการรองรับคำบรรยาย SSA ด้วย CodecId = S_TEXT/SSA ในไฟล์ Matroska ก่อนหน้านี้ MatroskaExtractor รองรับเฉพาะ CodecId = S_TEXT/ASS ซึ่งหมายถึงตัวแปร "ขั้นสูง" (v4 ขึ้นไป) ของ คำบรรยายแทนเสียง SubStation Alpha (แต่ตรรกะการแยกวิเคราะห์ของ ExoPlayer เหมือนกัน สำหรับทั้ง 2 ตัวแปร) (#2384)
    • เพิ่มการรองรับพร็อพเพอร์ตี้ layer ในไฟล์คำบรรยายแทนเสียง SubStation Alpha (SSA) ซึ่งใช้เพื่อกำหนดลำดับ Z ของคิวเมื่อมีคิวมากกว่า 1 รายการแสดงบนหน้าจอพร้อมกัน (#2124)
  • ผลลัพธ์
    • เพิ่ม Presentation.createForShortSide(int) ที่สร้าง Presentation ซึ่งช่วยให้ด้านที่สั้นที่สุดตรงกับค่าที่ระบุเสมอ โดยไม่คำนึงถึงการวางแนวของอินพุต
  • Muxers:
    • writeSampleData() ตอนนี้ API ใช้คลาส BufferInfo เฉพาะของ Muxer แทน MediaCodec.BufferInfo แล้ว
    • เพิ่ม Muxer.Factory#supportsWritingNegativeTimestampsInEditList ซึ่ง ค่าเริ่มต้นเป็น false
  • ส่วนขยาย IMA
    • แก้ไขข้อบกพร่องที่ข้อผิดพลาดในการโหลดในโฆษณาหนึ่งอาจทำให้กลุ่มโฆษณาอื่นไม่ถูกต้องโดยไม่ตั้งใจ
    • แก้ไขข้อบกพร่องที่กลุ่มโฆษณาหลังจากสิ้นสุดช่วงเวลา VOD ทำให้การเล่นหยุดชะงัก ระบบจะไม่จัดคิวกลุ่มโฆษณาที่มีเวลาเริ่มต้นหลังจากช่วงเวลาที่กำหนดไว้ใน MediaPeriodQueue อีกต่อไป (#2215)
  • เซสชัน:
    • แก้ไขข้อบกพร่องที่การส่งค่า Null ไปยัง getLibraryRoot ของ MediaBrowser ที่เชื่อมต่อกับ MediaBrowserServiceCompat รุ่นเดิมทำให้เกิด NullPointerException
    • แก้ไขข้อบกพร่องที่ทำให้การส่งการดำเนินการที่กำหนดเอง ผลการค้นหา หรือคำขอ getItem ทำให้แอปเซสชันเดิมขัดข้องพร้อมข้อความ ClassNotFoundException
    • แก้ไขข้อบกพร่องที่ทำให้มีการแชร์ MediaItem.LocalConfiguration.uri ไปยัง MediaMetadata ของเซสชันแพลตฟอร์ม หากต้องการแชร์ URI โดยเจตนาเพื่อ อนุญาตให้ตัวควบคุมส่งคำขอสื่ออีกครั้ง ให้ตั้งค่า MediaItem.RequestMetadata.mediaUri แทน
  • UI:
    • แก้ไขข้อบกพร่องของ Compose ซึ่งทำให้เกิดช่องว่างระหว่างการตั้งค่าสถานะปุ่มเริ่มต้นกับการสังเกตการเปลี่ยนแปลงสถานะ (เช่น รูปร่างไอคอนหรือการเปิดใช้) ตอนนี้ระบบจะตรวจจับการเปลี่ยนแปลงใดๆ ที่เกิดขึ้นกับเพลเยอร์นอก ระยะเวลาสังเกตการณ์ (#2313)
    • เพิ่มที่เก็บสถานะและ Composable ลงในโมดูล media3-ui-compose สำหรับ SeekBackButtonState และ SeekForwardButtonState
    • เพิ่มการรองรับโหมดการกรอของ ExoPlayer ไปยัง PlayerControlView เมื่อ เปิดใช้แล้ว ระบบจะเปลี่ยนเพลเยอร์เป็นโหมดกรอเมื่อผู้ใช้เริ่ม ลากแถบตัวควบคุมการกรอ เรียกใช้ player.seekTo ทุกครั้งที่มี การเคลื่อนไหว แล้วออกจากโหมดกรอเมื่อปล่อยการสัมผัสจาก หน้าจอ คุณเปิดใช้การผสานรวมนี้ได้โดยใช้ time_bar_scrubbing_enabled = true ใน XML หรือเมธอด setTimeBarScrubbingEnabled(boolean) จาก Java/Kotlin
    • ทำให้ PlayerSurface รับอาร์กิวเมนต์ Player ที่เป็น Null ได้
  • การดาวน์โหลด
    • เพิ่มการรองรับการดาวน์โหลดบางส่วนสำหรับสตรีมแบบต่อเนื่อง แอปสามารถเตรียมสตรีมแบบ โปรเกรสซีฟด้วย DownloadHelper และขอ DownloadRequest จากผู้ช่วยโดยระบุตำแหน่งเริ่มต้นและสิ้นสุดของสื่อตามเวลาที่การดาวน์โหลดควรครอบคลุม DownloadRequestที่ส่งกลับมาจะมีช่วงไบต์ที่แก้ไขแล้ว ซึ่งใช้สร้างProgressiveDownloaderและดาวน์โหลดเนื้อหาที่เกี่ยวข้องได้
    • เพิ่ม DownloadHelper.Factory ซึ่งจะแทนที่เมธอดแบบคงที่ DownloadHelper.forMediaItem()
    • เพิ่ม Factory สำหรับการติดตั้งใช้งาน SegmentDownloader
    • เพิ่มการรองรับการดาวน์โหลดบางส่วนสำหรับสตรีมแบบปรับอัตราการส่งข้อมูล แอปสามารถเตรียมสตรีมแบบปรับอัตราการส่งข้อมูลได้ด้วย DownloadHelper และขอ DownloadRequest จากตัวช่วยโดยระบุตำแหน่งเริ่มต้นและสิ้นสุดของสื่อตามเวลาที่การดาวน์โหลดควรครอบคลุม DownloadRequestที่ส่งคืนจะมีช่วงเวลาที่แก้ไขแล้ว ซึ่งใช้สร้างSegmentDownloaderที่เฉพาะเจาะจงและดาวน์โหลดเนื้อหาที่เกี่ยวข้องได้
  • ส่วนขยาย HLS
    • รองรับ X-ASSET-LIST และสตรีมแบบสดด้วย HlsInterstitialsAdsLoader
  • ส่วนขยาย RTSP
    • เพิ่มการรองรับการแยกวิเคราะห์สำหรับ SessionDescription ที่มีบรรทัดที่มี อักขระช่องว่างต่อท้าย (#2357)
  • ส่วนขยาย Cast
    • เพิ่มการรองรับ getDeviceVolume(), setDeviceVolume(), getDeviceMuted() และ setDeviceMuted() (#2089)
  • โปรแกรมอรรถประโยชน์สำหรับการทดสอบ
    • นำ transformer.TestUtil.addAudioDecoders(String...) transformer.TestUtil.addAudioEncoders(String...) และ transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...) ออกแล้ว ใช้ ShadowMediaCodecConfig เพื่อกำหนดค่าตัวเข้ารหัส และตัวถอดรหัสเงาแทน
    • แทนที่คำนำหน้า "exotest" ด้วย "media3" ในชื่อตัวแปลงรหัสที่รายงานโดย ShadowMediaCodecConfig
  • นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
    • นำตัวสร้าง SegmentDownloader ที่เลิกใช้งานแล้ว SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) และตัวสร้างที่เกี่ยวข้องในคลาสย่อย DashDownloader, HlsDownloader และ SsDownloader ออกแล้ว
    • นำ Player.hasNext() Player.hasNextWindow() ที่เลิกใช้งานแล้วออก โปรดใช้ Player.hasNextMediaItem() แทน
    • นำ Player.next() ที่เลิกใช้งานแล้วออก โปรดใช้ Player.seekToNextMediaItem() แทน
    • นำ Player.seekToPreviousWindow() ที่เลิกใช้งานแล้วออก โปรดใช้ Player.seekToPreviousMediaItem() แทน
    • นำ Player.seekToNextWindow() ที่เลิกใช้งานแล้วออก โปรดใช้ Player.seekToNextMediaItem() แทน
    • นำ BaseAudioProcessor ที่เลิกใช้งานแล้วออกในโมดูล exoplayer ใช้ BaseAudioProcessor ในโมดูล common
    • นำตัวสร้าง MediaCodecVideoRenderer ที่เลิกใช้งานแล้วออก MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider)

เวอร์ชัน 1.7.0

เวอร์ชัน 1.7.1

16 พฤษภาคม 2025

รุ่นนี้มีโค้ดเหมือนกับ 1.6.1 และเราเผยแพร่รุ่นนี้เพื่อให้มั่นใจว่ารุ่นนี้จะปรากฏเป็นรุ่นที่ "ใหม่กว่า" 1.7.0 ซึ่งเป็นรุ่นอัลฟ่าที่ติดแท็กเป็นรุ่นเสถียรโดยไม่ตั้งใจ (ดูด้านล่าง)

เวอร์ชัน 1.7.0

16 พฤษภาคม 2025

รุ่นนี้ควรเป็น 1.7.0-alpha01 แต่มีการติดแท็กเป็น 1.7.0 (เช่น เสถียร) โดยไม่ตั้งใจใน maven.google.com โปรดอย่าใช้ ใช้เวอร์ชัน 1.6.1 ต่อไปหรืออัปเกรดเป็น 1.7.1 (ซึ่งมีโค้ดเดียวกับ 1.6.1)

เวอร์ชัน 1.6.0

1.6.1

14 เมษายน 2025

androidx.media3:media3-*:1.6.1 ได้รับการเผยแพร่แล้ว เวอร์ชัน 1.6.1 มี การเปลี่ยนแปลงเหล่านี้

  • คลังทั่วไป
    • เพิ่มPlaybackParameters.withPitch(float)วิธีคัดลอกPlaybackParametersอย่างง่ายดายด้วยpitchค่าใหม่ (#2257)
  • ExoPlayer:
    • แก้ไขปัญหาที่การเปลี่ยนรายการสื่อไม่สำเร็จเนื่องจากข้อผิดพลาดของโปรแกรมแสดงผลที่กู้คืนได้ ระหว่างการเริ่มต้นรายการสื่อถัดไป (#2229)
    • แก้ไขปัญหาที่ ProgressiveMediaPeriod แสดง IllegalStateException เมื่อ PreloadMediaSource พยายามเรียกใช้ getBufferedDurationUs() ก่อนที่จะเตรียมใช้งาน (#2315)
    • แก้ไขการส่ง CmcdData ในคำขอไฟล์ Manifest สำหรับ DASH, HLS และ SmoothStreaming (#2253)
    • ตรวจสอบว่าใช้ AdPlaybackState.withAdDurationsUs(long[][]) ได้หลังจาก นำกลุ่มโฆษณาออกแล้ว ผู้ใช้ยังคงต้องส่งอาร์เรย์ของ ระยะเวลาสำหรับกลุ่มโฆษณาที่นำออก ซึ่งอาจเป็นค่าว่างหรือ Null (#2267)
  • โปรแกรมแยกข้อมูล
    • MP4: แยกวิเคราะห์ alternate_group จากกล่อง tkhd และแสดงเป็นรายการ Mp4AlternateGroupData ใน Format.metadata ของแต่ละแทร็ก (#2242)
  • เสียง:
    • แก้ไขปัญหาการออฟโหลดที่ตำแหน่งอาจค้างเมื่อเล่น เพลย์ลิสต์เนื้อหาสั้น (#1920)
  • เซสชัน:
    • ลดระยะหมดเวลาการรวบรวมข้อมูลสำหรับการเรียกกลับของแพลตฟอร์ม MediaSession จาก 500 เป็น 100 มิลลิวินาที และเพิ่มตัวตั้งค่าเวอร์ชันทดลองเพื่อให้แอปกำหนดค่านี้ได้
    • แก้ไขปัญหาที่การแจ้งเตือนปรากฏขึ้นอีกครั้งหลังจากที่ผู้ใช้ปิดไปแล้ว (#2302)
    • แก้ไขข้อบกพร่องที่เซสชันแสดงไทม์ไลน์แบบรายการเดียวเมื่อ โปรแกรมเล่นสรุปนั้นว่างเปล่า กรณีนี้เกิดขึ้นเมื่อเพลเยอร์ที่ห่อหุ้มไม่มี COMMAND_GET_TIMELINE ขณะที่ COMMAND_GET_CURRENT_MEDIA_ITEM พร้อมใช้งานและเพลเยอร์ที่ห่อหุ้มว่างเปล่า (#2320)
    • แก้ไขข้อบกพร่องที่ทำให้ระบบไม่สนใจการเรียกใช้ MediaSessionService.setMediaNotificationProvider หลังจากมีการโต้ตอบอื่นๆ กับบริการ เช่น setForegroundServiceTimeoutMs (#2305)
  • UI:
    • เปิดใช้ PlayerSurface เพื่อทำงานร่วมกับ ExoPlayer.setVideoEffects และ CompositionPlayer
    • แก้ไขข้อบกพร่องที่PlayerSurfaceไม่สามารถเรียบเรียงใหม่ด้วยPlayerใหม่
  • ส่วนขยาย HLS
    • แก้ไขปัญหาที่ไม่ได้ตั้งค่าระยะเวลาของก้อนข้อมูลใน CmcdData สำหรับสื่อ HLS ซึ่งทำให้การยืนยันไม่สำเร็จเมื่อประมวลผลกลุ่มสื่อที่เข้ารหัส (#2312)
  • ส่วนขยาย RTSP
    • เพิ่มการรองรับ URI ที่มีรูปแบบ RTSPT เป็นวิธีในการกำหนดค่าเซสชัน RTSP ให้ใช้ TCP (#1484)
  • ส่วนขยาย Cast
    • เพิ่มการรองรับข้อมูลเมตาของเพลย์ลิสต์ (#2235)

1.6.0

26 มีนาคม 2025

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

  • คลังทั่วไป
    • เพิ่ม AudioManagerCompat และ AudioFocusRequestCompat เพื่อแทนที่ ชั้นเรียนที่เทียบเท่าใน androidx.media
    • อัปเกรด Kotlin จาก 1.9.20 เป็น 2.0.20 และใช้ปลั๊กอิน Compose Compiler Gradle อัปเกรดไลบรารี KotlinX Coroutines จาก 1.8.1 เป็น 1.9.0
    • นำวิธีการ Format.toBundle(boolean excludeMetadata) ออก แล้วใช้ Format.toBundle() แทน
    • แก้ไขข้อบกพร่องใน SimpleBasePlayer ซึ่งการตั้งค่าใหม่ currentMediaItemIndex ใน State หลังจาก setPlaylist ด้วย null MediaMetadata จะไม่ประเมินข้อมูลเมตาอีกครั้ง (#1940)
    • เปลี่ยนสิทธิ์เข้าถึง SimpleBasePlayer.Stateจากแบบป้องกันเป็นแบบสาธารณะเพื่อให้จัดการการอัปเดตในชั้นเรียนอื่นๆ ได้ง่ายขึ้น (#2128)
  • ExoPlayer:
    • เพิ่ม MediaExtractorCompat ซึ่งเป็นคลาสใหม่ที่มีฟีเจอร์เทียบเท่ากับแพลตฟอร์ม MediaExtractor
    • เพิ่มการรองรับการวอร์มล่วงหน้าของ "ExoPlayer" เวอร์ชันทดลองสำหรับการเล่นโดยใช้ MediaCodecVideoRenderer คุณสามารถกำหนดค่า DefaultRenderersFactory ผ่าน experimentalSetEnableMediaCodecVideoRendererPrewarming เพื่อ ให้ MediaCodecVideoRenderer รองแก่ ExoPlayer หากเปิดใช้ ExoPlayer จะประมวลผลวิดีโอของรายการสื่อที่ต่อเนื่องกันล่วงหน้า ในระหว่างการเล่นเพื่อลดเวลาในการตอบสนองของการเปลี่ยนรายการสื่อ
    • ลดค่าเริ่มต้นสำหรับ bufferForPlaybackMs และ bufferForPlaybackAfterRebufferMs ใน DefaultLoadControl เป็น 1,000 และ 2,000 มิลลิวินาทีตามลำดับ
    • เริ่มต้น DeviceInfo และระดับเสียงของอุปกรณ์แบบไม่พร้อมกัน (หากเปิดใช้ โดยใช้ setDeviceVolumeControlEnabled) ค่าเหล่านี้จะใช้ไม่ได้ ทันทีหลังจาก ExoPlayer.Builder.build() และ Player.Listener จะแจ้งการเปลี่ยนแปลงผ่าน onDeviceInfoChanged และ onDeviceVolumeChanged
    • รหัสเซสชันเสียงเริ่มต้นจะไม่พร้อมใช้งานทันทีหลังจาก สร้างเพลเยอร์อีกต่อไป คุณใช้ AnalyticsListener.onAudioSessionIdChanged เพื่อฟัง การอัปเดตครั้งแรกได้หากต้องการ
    • โปรดพิจารณาเรื่องภาษาเมื่อเลือกแทร็กวิดีโอ โดยค่าเริ่มต้น ให้เลือกแทร็กวิดีโอ "หลัก" ที่ตรงกับภาษาของแทร็กเสียงที่เลือก หากมี คุณระบุค่ากำหนดภาษาของวิดีโออย่างชัดเจนได้โดยใช้ TrackSelectionParameters.Builder.setPreferredVideoLanguage(s)
    • เพิ่มพารามิเตอร์ selectedAudioLanguage ไปยังเมธอด DefaultTrackSelector.selectVideoTrack()
    • เพิ่มพารามิเตอร์ retryCount ลงใน MediaSourceEventListener.onLoadStarted และเมธอด MediaSourceEventListener.EventDispatcher ที่เกี่ยวข้อง
    • แก้ไขข้อบกพร่องที่รายการเพลย์ลิสต์หรือช่วงในสตรีม DASH แบบหลายช่วง ที่มีระยะเวลาไม่ตรงกับเนื้อหาจริงอาจทำให้เฟรม ค้างที่ส่วนท้ายของรายการ (#1698)
    • ย้าย BasePreloadManager.Listener ไปยังระดับบนสุด PreloadManagerListener
    • RenderersFactory.createSecondaryRenderer สามารถนำไปใช้เพื่อจัดเตรียม โปรแกรมแสดงผลรองสำหรับการอุ่นเครื่องล่วงหน้าได้ การเตรียมข้อมูลล่วงหน้าช่วยให้การเปลี่ยน รายการสื่อระหว่างการเล่นเร็วขึ้น
    • เปิดใช้การส่ง CmcdData สำหรับคำขอไฟล์ Manifest ในการสตรีมแบบปรับอัตราการส่งข้อมูล รูปแบบ DASH, HLS และ SmoothStreaming (#1951)
    • ระบุ MediaCodecInfo ของตัวแปลงรหัสที่จะเริ่มต้นใน MediaCodecRenderer.onReadyToInitializeCodec (#1963)
    • เปลี่ยน AdsMediaSource เพื่อให้ AdPlaybackStates เติบโตได้โดย การผนวกกลุ่มโฆษณา ระบบจะตรวจพบการแก้ไขที่ไม่ถูกต้องและส่ง ข้อยกเว้น
    • แก้ไขปัญหาที่เฟรมเพิ่มเติมแบบถอดรหัสอย่างเดียวอาจแสดงขึ้นอย่างรวดเร็วต่อเนื่องเมื่อเปลี่ยนไปใช้สื่อเนื้อหาหลังจากโฆษณาตอนกลาง
    • สร้าง DefaultRenderersFactory เพิ่มอินสแตนซ์ MetadataRenderer 2 รายการเพื่อ เปิดใช้แอปให้รับรูปแบบข้อมูลเมตาที่แตกต่างกัน 2 รูปแบบโดยค่าเริ่มต้น
    • ประเมินใหม่ว่าควรยกเลิกการโหลดก้อนข้อมูลที่กำลังดำเนินการอยู่เมื่อ หยุดเล่นชั่วคราวหรือไม่ (#1785)
    • เพิ่มตัวเลือกใน ClippingMediaSource เพื่ออนุญาตให้ตัดคลิปในสื่อที่กรอไม่ได้
    • แก้ไขข้อบกพร่องที่การกรอไปข้างหน้าหรือย้อนกลับด้วยการวอร์มอัปล่วงหน้าอาจบล็อกการเปลี่ยนรายการสื่อถัดไป
    • แก้ไขข้อบกพร่องที่ทำให้ ExoPlayer.isLoading() ยังคงเป็น true แม้ว่าจะเปลี่ยนเป็น STATE_IDLE หรือ STATE_ENDED แล้วก็ตาม (#2133)
    • เพิ่ม lastRebufferRealtimeMs ลงใน LoadControl.Parameter (#2113)
  • Transformer
    • เพิ่มการรองรับการแปลงมัลติเพล็กซ์เป็นรูปแบบอื่นที่เข้ากันได้แบบย้อนหลัง
    • เพิ่มการรองรับการแปลงรหัสและการแปลงมัลติเพล็กซ์รูปแบบ Dolby Vision (โปรไฟล์ 8)
    • อัปเดตพารามิเตอร์ของ VideoFrameProcessor.registerInputStream และ VideoFrameProcessor.Listener.onInputStreamRegistered เพื่อใช้ Format
    • สร้างข้อมูลเมตาแบบคงที่ของ HDR เมื่อใช้ DefaultEncoderFactory
    • เปิดใช้การรองรับการวินิจฉัยแพลตฟอร์ม Android โดยใช้ MediaMetricsManager Transformer จะส่งต่อเหตุการณ์การแก้ไขและ ข้อมูลประสิทธิภาพไปยังแพลตฟอร์ม ซึ่งจะช่วยให้ข้อมูลประสิทธิภาพของระบบ และข้อมูลการแก้ไขข้อบกพร่องในอุปกรณ์ นอกจากนี้ Google อาจเก็บรวบรวมข้อมูลนี้ด้วย หากผู้ใช้อุปกรณ์เปิดใช้การแชร์ข้อมูลการใช้งานและการวินิจฉัย แอปสามารถเลือกไม่ให้ข้อมูลเพื่อช่วยในการวินิจฉัยแพลตฟอร์ม สำหรับ Transformer ด้วย Transformer.Builder.setUsePlatformDiagnostics(false)
    • แยก InAppMuxer เป็น InAppMp4Muxer และ InAppFragmentedMp4Muxer คุณใช้ InAppMp4Muxer เพื่อสร้างไฟล์ MP4 ที่ไม่แยกส่วน ส่วน InAppFragmentedMp4Muxer ใช้สร้างไฟล์ MP4 ที่แยกส่วน
    • ย้ายอินเทอร์เฟซ Muxer จาก media3-muxer ไปยัง media3-transformer
    • เพิ่ม MediaProjectionAssetLoader ซึ่งมีสื่อจาก MediaProjection สำหรับการบันทึกหน้าจอ และเพิ่มการรองรับการบันทึกหน้าจอลงในแอปเดโม Transformer
    • เพิ่ม #getInputFormat() ลงในอินเทอร์เฟซ Codec
    • เปลี่ยนความรับผิดชอบในการปล่อยGlObjectsProviderให้แก่ผู้โทรใน DefaultVideoFrameProcessor และ DefaultVideoCompositor เมื่อเป็นไปได้
  • โปรแกรมแยกข้อมูล
    • AVI: แก้ไขการจัดการไฟล์ที่มีเสียงบีบอัดแบบอัตราบิตคงที่ ซึ่งส่วนหัวของสตรีมจะจัดเก็บจำนวนไบต์แทนจำนวน ก้อน
    • แก้ไขการจัดการหน่วย NAL ที่มีความยาวแสดงเป็น 1 หรือ 2 ไบต์ (แทนที่จะเป็น 4)
    • แก้ไข ArrayIndexOutOfBoundsException ในรายการการแก้ไข MP4 เมื่อรายการการแก้ไข เริ่มต้นที่เฟรมที่ไม่ได้ซิงค์โดยไม่มีเฟรมที่ซิงค์ก่อนหน้า (#2062)
    • แก้ไขปัญหาที่สตรีม TS ค้างในอุปกรณ์บางเครื่อง (#2069)
    • FLAC: เพิ่มการรองรับไฟล์ FLAC 32 บิต ก่อนหน้านี้วิดีโอเหล่านี้จะเล่นไม่ได้กับ IllegalStateException: Playback stuck buffering and not loading (#2197)
  • เสียง:
    • แก้ไขให้มีการเรียกใช้ onAudioPositionAdvancing เมื่อกลับมาเล่นอีกครั้ง (ก่อนหน้านี้จะมีการเรียกใช้เมื่อหยุดเล่นชั่วคราว)
    • อย่าข้าม SonicAudioProcessor เมื่อกำหนดค่า SpeedChangingAudioProcessor ด้วยพารามิเตอร์เริ่มต้น
    • แก้ไขการไหลเข้าไม่เพียงพอใน Sonic#getOutputSize() ซึ่งอาจทำให้ DefaultAudioSink หยุดทำงาน
    • แก้ไข MediaCodecAudioRenderer.getDurationToProgressUs() และ DecoderAudioRenderer.getDurationToProgressUs() เพื่อให้การค้นหาทำงานได้อย่างถูกต้อง รีเซ็ตระยะเวลาที่ระบุ
    • ทำเครื่องหมาย androidx.media3.common.audio.SonicAudioProcessor ว่าเสร็จสิ้น
    • เพิ่มการรองรับ PCM แบบลอยไปยัง ChannelMappingAudioProcessor และ TrimmingAudioProcessor
  • วิดีโอ
    • เปลี่ยน MediaCodecVideoRenderer.shouldUsePlaceholderSurface เป็น protected เพื่อให้แอปพลิเคชันสามารถลบล้างเพื่อบล็อกการใช้งาน พื้นผิวตัวยึดตำแหน่ง (#1905)
    • เพิ่มการแยกวิเคราะห์การขึ้นต่อกันของตัวอย่าง ExoPlayer AV1 ที่เป็นเวอร์ชันทดลองเพื่อเพิ่มความเร็ว ในการกรอ เปิดใช้ด้วย API ใหม่ DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies
    • เพิ่ม ExoPlayerAPI แบบทดลองMediaCodecVideoRendererเพื่อทิ้งบัฟเฟอร์อินพุตของตัวถอดรหัสMediaCodecVideoRenderer ที่ล่าช้าซึ่งไม่ได้ขึ้นอยู่กับบัฟเฟอร์อื่น เปิดใช้ด้วย DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs
    • แก้ไขปัญหาที่เพลเยอร์ที่ไม่มีพื้นผิวพร้อมใช้งานทันทีและ ถอดรหัสเฟรมที่รอดำเนินการช้ามาก (#1973)
    • ยกเว้นอุปกรณ์ Xiaomi และ OPPO จากโหมดพื้นผิวที่แยกออกเพื่อหลีกเลี่ยง หน้าจอกระพริบ (#2059)
  • ข้อความ:
    • เพิ่มการรองรับคำบรรยาย VobSub (#8260)
    • หยุดโหลดไฟล์คำบรรยายทั้งหมดที่กำหนดค่าด้วย MediaItem.Builder.setSubtitleConfigurationsล่วงหน้า และโหลดเพียงไฟล์เดียวแทน หากมีการเลือกโดยการเลือกแทร็ก (#1721)
    • TTML: เพิ่มการรองรับการอ้างอิง tts:origin และ tts:extent โดยใช้ style (#2953)
    • จำกัดการประทับเวลา WebVTT และ SubRip ให้มีทศนิยม 3 ตำแหน่งเท่านั้น ก่อนหน้านี้เราแยกวิเคราะห์จำนวนทศนิยมอย่างไม่ถูกต้อง แต่จะถือว่าค่าเป็นมิลลิวินาทีเสมอ ซึ่งทำให้เกิดการประทับเวลาที่ไม่ถูกต้อง (#1997)
    • แก้ไขการเล่นที่หยุดชะงักเมื่อเพลย์ลิสต์มีรายการที่ตัดต่อพร้อมคำบรรยายแทนเสียง CEA-608 หรือ CEA-708
    • แก้ไข IllegalStateException เมื่อไฟล์ SSA มีคิวที่มีระยะเวลาเป็น 0 (เวลาเริ่มต้นและเวลาสิ้นสุดเท่ากัน) (#2052)
    • ระงับ (และบันทึก) ข้อผิดพลาดในการแยกวิเคราะห์คำบรรยายแทนเสียงเมื่อมีการมัลติเพล็กซ์คำบรรยายแทนเสียงลงใน คอนเทนเนอร์เดียวกับเสียงและวิดีโอ (#2052)
    • แก้ไขการจัดการอักขระ UTF-8 แบบหลายไบต์ในไฟล์ WebVTT โดยใช้การสิ้นสุดบรรทัด CR (#2167)
  • DRM:
    • แก้ไขข้อผิดพลาด MediaCodec$CryptoException: Operation not supported in this configuration เมื่อเล่นเนื้อหา ClearKey ในอุปกรณ์ที่ใช้ API เวอร์ชันต่ำกว่า 27 (#1732)
  • ผลลัพธ์
    • ย้ายฟังก์ชันของ OverlaySettings ไปยัง StaticOverlaySettings OverlaySettings สามารถสร้างคลาสย่อยเพื่ออนุญาต การตั้งค่าการซ้อนทับแบบไดนามิกได้
  • Muxers:
    • ย้าย MuxerException ออกจากอินเทอร์เฟซ Muxer เพื่อหลีกเลี่ยงชื่อที่ยาวมาก แบบเต็ม
    • เปลี่ยนชื่อเมธอด setSampleCopyEnabled() เป็น setSampleCopyingEnabled() ทั้งใน Mp4Muxer.Builder และ FragmentedMp4Muxer.Builder
    • ตอนนี้ Mp4Muxer.addTrack() และ FragmentedMp4Muxer.addTrack() จะแสดง รหัสแทร็ก int แทน TrackToken
    • Mp4Muxer และ FragmentedMp4Muxer ไม่ได้ใช้Muxer อินเทอร์เฟซอีกต่อไป
    • ปิดใช้การจัดกลุ่มและการคัดลอกตัวอย่าง Mp4Muxer โดยค่าเริ่มต้น
    • แก้ไขข้อบกพร่องใน FragmentedMp4Muxer ที่สร้าง Fragment จำนวนมากเมื่อ เขียนเฉพาะแทร็กเสียง
  • เซสชัน:
    • รักษาสถานะของบริการที่ทำงานอยู่เบื้องหน้าต่อไปอีก 10 นาทีเมื่อการเล่น หยุดชั่วคราว หยุด หรือล้มเหลว ซึ่งช่วยให้ผู้ใช้เล่นต่อได้ภายใน ระยะหมดเวลานี้โดยไม่ต้องเสี่ยงต่อการถูกจำกัดบริการที่ทำงานอยู่เบื้องหน้าในอุปกรณ์ต่างๆ โปรดทราบว่าคุณไม่สามารถใช้การโทรหา player.pause() เพื่อหยุดบริการที่ทำงานอยู่เบื้องหน้าก่อน stopSelf() เมื่อลบล้าง onTaskRemoved ให้ใช้ MediaSessionService.pauseAllPlayersAndStopSelf() แทน
    • แสดงการแจ้งเตือนเมื่อการเล่นเกิดข้อผิดพลาดหรือหยุด ระบบจะนำการแจ้งเตือนออกก็ต่อเมื่อมีการล้างเพลย์ลิสต์หรือ มีการปล่อยตัวผู้เล่น
    • ปรับปรุงการจัดการการดำเนินการ MediaSession ของแพลตฟอร์ม Android ACTION_PLAY และ ACTION_PAUSE เพื่อตั้งค่าเพียงรายการเดียวตามคำสั่งที่มี และยอมรับหากมีการตั้งค่าเพียงรายการเดียว
    • เพิ่ม Context เป็นพารามิเตอร์ใน MediaButtonReceiver.shouldStartForegroundService (#1887)
    • แก้ไขข้อบกพร่องที่การเรียกใช้เมธอด Player ใน MediaController ที่เชื่อมต่อ กับเซสชันเดิมจะทำให้การเปลี่ยนแปลงจากการอัปเดตที่รอดำเนินการหายไป
    • ทำให้ MediaSession.setSessionActivity(PendingIntent) accept null (#2109)
    • แก้ไขข้อบกพร่องที่ทำให้การแจ้งเตือนที่ล้าสมัยยังคงแสดงอยู่เมื่อล้างเพลย์ลิสต์ (#2211)
  • UI:
    • เพิ่มตัวยึดสถานะและ Composable ลงในโมดูล media3-ui-compose สำหรับ PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState และ PlaybackSpeedState
  • การดาวน์โหลด
    • แก้ไขข้อบกพร่องใน CacheWriter ที่ทำให้แหล่งข้อมูลเปิดอยู่และพื้นที่แคช ล็อกไว้ในกรณีที่แหล่งข้อมูลส่ง Exception อื่นที่ไม่ใช่ IOException (#9760)
  • ส่วนขยาย HLS
    • เพิ่มHlsInterstitialsAdsLoader เวอร์ชันแรก AdLoader จะอ่านโฆษณาคั่นระหว่างหน้า HLS ของเพลย์ลิสต์สื่อ HLS และแมปโฆษณาเหล่านั้นกับ AdPlaybackState ที่ส่งไปยัง AdsMediaSource เวอร์ชันเริ่มต้นนี้รองรับเฉพาะสตรีม VOD ของ HLS ที่มีแอตทริบิวต์ X-ASSET-URI
    • เพิ่ม HlsInterstitialsAdsLoader.AdsMediaSourceFactory แอปสามารถใช้เพื่อสร้างอินสแตนซ์ AdsMediaSource ที่ใช้ HlsInterstitialsAdsLoader ได้อย่างสะดวกและปลอดภัย
    • แยกวิเคราะห์แท็ก SUPPLEMENTAL-CODECS จากเพลย์ลิสต์ HLS เพื่อตรวจหา Dolby Vision รูปแบบ (#1785)
    • ผ่อนปรนเงื่อนไขสำหรับการค้นหาเพื่อซิงค์ตำแหน่งในสตรีม HLS (#2209)
  • ส่วนขยาย DASH
    • เพิ่มการรองรับรูปแบบ AC-4 ระดับ 4 สำหรับ DASH (#1898)
    • แก้ไขปัญหาเมื่อคำนวณช่วงเวลาการอัปเดตสำหรับการแทรกโฆษณาใน ไลฟ์สดแบบหลายช่วงเวลา (#1698)
    • แยกวิเคราะห์แอตทริบิวต์ scte214:supplementalCodecs จากไฟล์ Manifest DASH เพื่อ ตรวจหาฟอแมต Dolby Vision (#1785)
    • ปรับปรุงการจัดการการเปลี่ยนช่วงเวลาในไลฟ์สดที่ช่วงเวลามีตัวอย่างสื่อที่อยู่นอกเหนือระยะเวลาของช่วงเวลาที่ประกาศไว้ (#1698)
    • แก้ไขปัญหาที่ชุดการดัดแปลงซึ่งทำเครื่องหมายด้วย adaptation-set-switching แต่มีการผสานภาษาหรือค่าสถานะบทบาทที่แตกต่างกันเข้าด้วยกัน (#2222)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ)
    • เพิ่มโมดูลตัวถอดรหัส MPEG-H ซึ่งใช้ตัวถอดรหัส MPEG-H ในตัว เพื่อถอดรหัสเสียง MPEG-H (#1826)
  • ส่วนขยาย MIDI
    • เชื่อมต่ออินสแตนซ์ AudioSink และ AudioRendererEventListener ที่กำหนดเองเข้ากับ MidiRenderer
  • ส่วนขยาย Cast
    • อัปเดตplay-services-cast-frameworkการอ้างอิงเป็น 21.5.0 เพื่อแก้ไขข้อผิดพลาดที่ทำให้แอปFLAG_MUTABLEขัดข้องในแอปที่กำหนดเป้าหมายเป็น API 34 ขึ้นไปในอุปกรณ์ที่ติดตั้งแต่ปิดใช้บริการ Google Play (#2178)
  • แอปเดโม
    • ขยาย demo-compose ด้วยปุ่มเพิ่มเติมและปรับปรุง การผสานรวม PlayerSurface ด้วยการรองรับการปรับขนาดและชัตเตอร์
  • นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
    • นำเมธอด AudioMixer.create() ที่เลิกใช้งานแล้วออก โปรดใช้ DefaultAudioMixer.Factory().create() แทน
    • นำTransformer.Builderเมธอดที่เลิกใช้งานแล้วต่อไปนี้ออก
      • setTransformationRequest() ให้ใช้ setAudioMimeType(), setVideoMimeType() และ setHdrMode() แทน
      • setAudioProcessors() ตั้งค่าโปรเซสเซอร์เสียงใน EditedMediaItem.Builder.setEffects() แล้วส่งไปยัง Transformer.start() แทน
      • setVideoEffects() ตั้งค่าเอฟเฟกต์วิดีโอใน EditedMediaItem.Builder.setEffects() แล้วส่งไปยัง Transformer.start() แทน
      • setRemoveAudio() ให้ใช้ EditedMediaItem.Builder.setRemoveAudio() เพื่อนำเสียงออกจาก EditedMediaItem ที่ส่งไปยัง Transformer.start() แทน
      • setRemoveVideo() ให้ใช้ EditedMediaItem.Builder.setRemoveVideo() เพื่อนำวิดีโอออกจาก EditedMediaItem ที่ส่งไปยัง Transformer.start() แทน
      • setFlattenForSlowMotion() ให้ใช้ EditedMediaItem.Builder.setFlattenForSlowMotion() เพื่อทำให้ EditedMediaItem ที่ส่งไปยัง Transformer.start() แบนราบแทน
      • setListener() ให้ใช้ addListener(), removeListener() หรือ removeAllListeners() แทน
    • นำTransformer.Listenerเมธอดที่เลิกใช้งานแล้วต่อไปนี้ออก
      • onTransformationCompleted(MediaItem) โปรดใช้ onCompleted(Composition, ExportResult) แทน
      • onTransformationCompleted(MediaItem, TransformationResult) โปรดใช้ onCompleted(Composition, ExportResult) แทน
      • onTransformationError(MediaItem, Exception) โปรดใช้ onError(Composition, ExportResult, ExportException) แทน
      • onTransformationError(MediaItem, TransformationException) โปรดใช้ onError(Composition, ExportResult, ExportException) แทน
      • onTransformationError(MediaItem, TransformationResult, TransformationException) โปรดใช้ onError(Composition, ExportResult, ExportException) แทน
      • onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest) โปรดใช้ onFallbackApplied(Composition, TransformationRequest, TransformationRequest) แทน
    • นำคลาส TransformationResult ที่เลิกใช้งานแล้วออก โปรดใช้ ExportResult แทน
    • นำคลาส TransformationException ที่เลิกใช้งานแล้วออก โปรดใช้ ExportException แทน
    • นำ Transformer.PROGRESS_STATE_NO_TRANSFORMATION ที่เลิกใช้งานแล้วออก โปรดใช้ Transformer.PROGRESS_STATE_NOT_STARTED แทน
    • นำ Transformer.setListener() ที่เลิกใช้งานแล้วออก โปรดใช้ Transformer.addListener(), Transformer.removeListener() หรือ Transformer.removeAllListeners() แทน
    • นำ Transformer.startTransformation() ที่เลิกใช้งานแล้วออก โปรดใช้ Transformer.start(MediaItem, String) แทน
    • นำ SingleFrameGlShaderProgram ที่เลิกใช้งานแล้วออก โปรดใช้ BaseGlShaderProgram แทน
    • นำ Transformer.flattenForSlowMotion ออก โปรดใช้ EditedMediaItem.flattenForSlowMotion แทน
    • นำ ExoPlayer.VideoComponent, ExoPlayer.AudioComponent, ExoPlayer.TextComponent และ ExoPlayer.DeviceComponent ออกแล้ว
    • นำ androidx.media3.exoplayer.audio.SonicAudioProcessor ออกแล้ว
    • นำเมธอด DownloadHelper ที่เลิกใช้งานแล้วต่อไปนี้ออก
      • Constructor DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), use DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList) instead.
      • getRendererCapabilities(RenderersFactory) คุณสามารถใช้ฟังก์ชันการทำงานที่เทียบเท่าได้โดยการสร้าง DefaultRendererCapabilitiesList ที่มี RenderersFactory และ เรียกใช้ DefaultRendererCapabilitiesList.getRendererCapabilities()
    • นำ PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat) เมธอดออกแล้ว ให้ใช้ PlayerNotificationManager.setMediaSessionToken(MediaSession.Token) และ ส่งใน (MediaSession.Token) compatToken.getToken() แทน

1.6.0-rc02

19 มีนาคม 2025

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

1.6.0-rc01

12 มีนาคม 2025

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

1.6.0-beta01

26 กุมภาพันธ์ 2025

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

เวอร์ชัน 1.6.0-alpha03

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

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

เวอร์ชัน 1.6.0-alpha02

30 มกราคม 2025

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

เวอร์ชัน 1.6.0-alpha01

20 ธันวาคม 2024

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

รุ่น 1.5

รุ่น 1.5.1

19 ธันวาคม 2024

androidx.media3:media3-*:1.5.1 ได้รับการเผยแพร่แล้ว เวอร์ชัน 1.5.1 มีการเปลี่ยนแปลงเหล่านี้

  • ExoPlayer:
    • ปิดใช้การถอดรหัสแบบอะซิงโครนัสใน MediaCodec เพื่อหลีกเลี่ยงปัญหาการหมดเวลาของตัวแปลงรหัสที่รายงานด้วย API ของแพลตฟอร์มนี้ (#1641)
  • โปรแกรมแยกข้อมูล
    • MP3: อย่าหยุดเล่นก่อนเวลาอันควรเมื่อสารบัญของVBRIเฟรม ไม่ครอบคลุมข้อมูล MP3 ทั้งหมดในไฟล์ (#1904)
  • วิดีโอ
    • การย้อนกลับการใช้MediaCodecAdapterค่าสัดส่วนภาพพิกเซลที่ระบุ เมื่อระบุขณะประมวลผล onOutputFormatChanged (#1371)
  • ข้อความ:
    • แก้ไขข้อบกพร่องใน ReplacingCuesResolver.discardCuesBeforeTimeUs ที่คิว ที่ใช้งานอยู่ที่ timeUs (เริ่มก่อนหน้านี้แต่ยังไม่สิ้นสุด) ถูกทิ้งอย่างไม่ถูกต้อง (#1939)
  • ข้อมูลเมตา
    • ดึงหมายเลขดิสก์/แทร็กและประเภทจากความคิดเห็น Vorbis ไปยัง MediaMetadata (#1958)

เวอร์ชัน 1.5.0

27 พฤศจิกายน 2024

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

  • คลังทั่วไป
    • เพิ่ม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ฟังก์ชันส่วนขยายการระงับเพื่อหมุนโครูทีนเพื่อ ฟัง Player.Events ไปยังไลบรารี media3-common-ktx
    • นำคำอธิบายประกอบ @DoNotInline ออกจากคลาสภายในที่ไม่ได้อยู่ในบรรทัดด้วยตนเอง ซึ่งออกแบบมาเพื่อหลีกเลี่ยงความล้มเหลวในการยืนยันคลาสรันไทม์ ตอนนี้ R8 เวอร์ชันล่าสุดจะทำให้การเรียกใช้แบบอินไลน์โดยอัตโนมัติเหมือนกับตัวอย่างนี้เพื่อหลีกเลี่ยงข้อผิดพลาดรันไทม์ (จึงไม่จำเป็นต้องใช้การเรียกใช้แบบอินไลน์ด้วยตนเองอีกต่อไป) ผู้ใช้ Gradle ทั้งหมดของไลบรารีต้องใช้ Android Gradle Plugin เวอร์ชันที่ใช้ 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 ในโหมดอะซิงโครนัส (ลักษณะการทำงานเริ่มต้นใน API 31 ขึ้นไป)
    • ส่ง bufferedDurationUs แทน bufferedPositionUs พร้อม PreloadMediaSource.PreloadControl.onContinueLoadingRequested() นอกจากนี้ การเปลี่ยน DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS เป็น DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS ยังทำให้แอป ต้องส่งค่าที่แสดงถึงระยะเวลาที่เฉพาะเจาะจงจากตำแหน่งเริ่มต้น เริ่มต้น ซึ่งแหล่งที่มาของสื่อที่เกี่ยวข้องจะต้องโหลดล่วงหน้าด้วย IntDef นี้ แทนที่จะเป็นตำแหน่ง
    • เพิ่มการติดตั้งใช้งาน ForwardingRenderer ที่ส่งต่อการเรียกใช้เมธอดทั้งหมด ไปยังโปรแกรมแสดงผลอื่น (1703)
    • เพิ่มการโหลดเพลย์ลิสต์ล่วงหน้าสำหรับรายการถัดไปในเพลย์ลิสต์ แอปสามารถ เปิดใช้การโหลดล่วงหน้าได้โดยการเรียกใช้ ExoPlayer.setPreloadConfiguration(PreloadConfiguration) ตามนั้น โดยค่าเริ่มต้น ระบบจะปิดใช้การโหลดล่วงหน้า เมื่อเลือกใช้และเพื่อไม่ให้รบกวนการเล่น DefaultLoadControl จะจำกัดการโหลดล่วงหน้าให้เริ่มและ ดำเนินการต่อเมื่อเพลเยอร์ไม่ได้โหลดเพื่อเล่นเท่านั้น แอปสามารถ เปลี่ยนลักษณะการทำงานนี้ได้โดยการใช้ LoadControl.shouldContinuePreloading() ตามนั้น (เช่น เมื่อ ลบล้างเมธอดนี้ใน DefaultLoadControl) การใช้งานเริ่มต้นของ LoadControl จะปิดใช้การโหลดล่วงหน้าในกรณีที่แอปใช้การใช้งาน LoadControl ที่กำหนดเอง
    • เพิ่มเมธอด MediaSourceEventListener.EventDispatcher.dispatchEvent() เพื่อ อนุญาตให้เรียกใช้เหตุการณ์ของ Listener ของคลาสย่อย (1736)
    • เพิ่ม DefaultPreloadManager.Builder ที่สร้างอินสแตนซ์ DefaultPreloadManager และ ExoPlayer ด้วยการกำหนดค่าที่แชร์อย่างสม่ำเสมอ
    • นำพารามิเตอร์ Renderer[] ออกจาก LoadControl.onTracksSelected() เนื่องจาก การติดตั้งใช้งาน DefaultLoadControl สามารถดึงข้อมูลประเภทสตรีมจาก ExoTrackSelection[] ได้
    • เลิกใช้งาน DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) และทำเครื่องหมายวิธีการเป็นขั้นสุดท้ายเพื่อป้องกันการลบล้าง โปรดใช้ DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]) แทน
    • รายงานเหตุการณ์ MediaSourceEventListener จากแหล่งข้อมูลรองใน MergingMediaSource ซึ่งจะส่งผลให้มีการรายงานเหตุการณ์ load start/error/cancelled/completed สำหรับคำบรรยายแทนเสียงที่โหลดจากภายนอก (คำบรรยายแทนเสียงที่เพิ่มด้วย MediaItem.LocalConfiguration.subtitleConfigurations) ซึ่งอาจปรากฏ เป็นเหตุการณ์การโหลดที่ซ้ำกันซึ่งปล่อยออกมาจาก AnalyticsListener
    • ป้องกันไม่ให้ข้อผิดพลาดของคำบรรยายแทนเสียงและข้อมูลเมตาหยุดการเล่นโดยสมบูรณ์ แต่ระบบจะปิดใช้แทร็กที่มีปัญหาและเล่นแทร็กที่เหลือต่อไป (#1722)
      • ในการจัดการคำบรรยายแทนเสียงใหม่ (ระหว่างการแยก) ระบบจะส่งข้อผิดพลาดในการแยกวิเคราะห์ที่เกี่ยวข้อง (เช่น ข้อมูลคำบรรยายแทนเสียงที่ไม่ถูกต้อง) และข้อผิดพลาดในการโหลด (เช่น HTTP 404) ผ่านonLoadErrorการเรียกกลับ
      • ในการจัดการคำบรรยายแทนเสียงแบบเดิม (ระหว่างการแสดงผล) ระบบจะส่งเฉพาะข้อผิดพลาดในการโหลดที่เกี่ยวข้องผ่านonLoadError Callback ขณะที่ระบบจะไม่สนใจข้อผิดพลาดในการแยกวิเคราะห์ (นี่คือลักษณะการทำงานที่มีอยู่ก่อนแล้ว)
    • แก้ไขข้อบกพร่องที่รายการเพลย์ลิสต์หรือช่วงในสตรีม DASH แบบหลายช่วง ที่มีระยะเวลาไม่ตรงกับเนื้อหาจริงอาจทำให้เฟรม ค้างที่ส่วนท้ายของรายการ (#1698)
    • เพิ่มตัวตั้งค่าลงใน SntpClient เพื่อตั้งค่าเวลาที่ผ่านไปสูงสุดนับตั้งแต่การอัปเดตครั้งล่าสุด หลังจากนั้นระบบจะเริ่มต้นไคลเอ็นต์ใหม่ (#1794)
  • Transformer
    • เพิ่ม SurfaceAssetLoader ซึ่งรองรับการจัดคิวข้อมูลวิดีโอไปยัง Transformer ผ่าน Surface
    • ImageAssetLoaderรายงานอินพุตที่ไม่รองรับผ่าน AssetLoader.onError แทนที่จะส่ง IllegalStateException
    • กำหนดให้การตั้งค่าระยะเวลาของรูปภาพโดยใช้ MediaItem.Builder.setImageDurationMs เป็นข้อบังคับสำหรับการส่งออกรูปภาพ
    • เพิ่มการรองรับการส่งออกสำหรับช่องว่างในลำดับของ EditedMediaItem ที่เป็นเสียง
  • การเลือกแทร็ก
    • DefaultTrackSelector: เลือกใช้เสียงแบบออบเจ็กต์มากกว่าเสียงแบบช่องสัญญาณ เมื่อปัจจัยอื่นๆ เท่ากัน
  • โปรแกรมแยกข้อมูล
    • อนุญาตให้ Mp4Extractor และ FragmentedMp4Extractor ระบุตัวอย่าง H264 ที่ตัวอย่างถัดไปไม่ได้ใช้เป็นข้อมูลอ้างอิง
    • เพิ่มตัวเลือกเพื่อเปิดใช้การกรอตามดัชนีใน AmrExtractor
    • ถือว่าไฟล์ MP3 ที่มีขนาดมากกว่า 128 kB ระหว่างเฟรมที่ถูกต้องเป็นไฟล์ที่ถูกตัด (แทนที่จะถือว่าไม่ถูกต้อง) ซึ่งหมายความว่าไฟล์ที่มีข้อมูลที่ไม่ใช่ MP3 อยู่ตอนท้าย โดยไม่มีข้อมูลเมตาอื่นๆ ที่ระบุความยาวของไบต์ MP3 จะหยุด การเล่นที่ส่วนท้ายของข้อมูล MP3 แทนที่จะล้มเหลวด้วยข้อผิดพลาด ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563)
    • แก้ไขการจัดการตัวอย่างโฆษณาก่อนวิดีโอสำหรับตำแหน่งเริ่มต้นของสื่อที่ไม่ใช่คีย์เฟรมเมื่อ ประมวลผลรายการแก้ไขในไฟล์ MP4 (#1659)
    • ปรับปรุงการคำนวณอัตราเฟรมโดยใช้ระยะเวลาของสื่อจาก mdhd box ใน Mp4Extractor และ FragmentedMp4Extractor (#1531)
    • แก้ไขการปรับขนาดที่ไม่ถูกต้องของ media_time ในรายการแก้ไข MP4 แม้ว่าก่อนหน้านี้ segment_duration จะได้รับการปรับขนาดอย่างถูกต้องโดยใช้ timescale ของภาพยนตร์ แต่ตอนนี้ media_time ได้รับการปรับขนาดอย่างถูกต้องโดยใช้ timescale ของแทร็ก ตามที่ระบุไว้ในมาตรฐานรูปแบบ MP4 (#1792)
    • จัดการเฟรมที่ไม่อยู่ในลำดับในการคำนวณ endIndices สำหรับ MP4 ที่มีรายการแก้ไข (#1797)
    • แก้ไขการแยกวิเคราะห์ระยะเวลาของสื่อในmdhd box ของไฟล์ MP4 เพื่อจัดการค่า -1 (#1819)
    • เพิ่มการรองรับการระบุช่อง h263 ในไฟล์ MP4 สำหรับวิดีโอ H.263 (#1821)
    • เพิ่มการรองรับรูปแบบไฟล์สื่อพื้นฐาน ISO ระดับ 4 ของ AC-4 (#1265)
  • DataSource:
    • อัปเดต HttpEngineDataSource เพื่ออนุญาตให้ใช้ได้ตั้งแต่เวอร์ชัน S extension 7 แทน API ระดับ 34 (#1262)
    • DataSourceContractTest: ยืนยันว่า DataSource.getUri() แสดงผล URI ที่แก้ไขแล้ว (ตามที่ระบุไว้ในเอกสาร) หากแตกต่างจาก URI ที่ขอ การทดสอบจะระบุได้โดยใช้DataSourceContractTest.TestResource.Builder.setResolvedUri()วิธีใหม่
    • DataSourceContractTest: ยืนยันว่า DataSource.getUri() และ getResponseHeaders() จะแสดงค่า "open" หลังจากเรียกใช้ open() ไม่สำเร็จ (เนื่องจากทรัพยากร "ไม่พบ") และก่อนการเรียกใช้ close() ครั้งถัดไป
      • การลบล้าง DataSourceContractTest.getNotFoundResources() ช่วยให้ คลาสย่อยของการทดสอบระบุทรัพยากร "ไม่พบ" หลายรายการ และระบุส่วนหัวที่คาดไว้ได้ด้วย ซึ่งช่วยให้แยกความแตกต่างระหว่าง HTTP 404 (มีส่วนหัว) กับ "ไม่พบเซิร์ฟเวอร์" (ไม่มีส่วนหัว) ได้
  • เสียง:
    • กำหนดค่าข้อมูลเมตาความดัง CTA-2075 ในตัวแปลงสัญญาณโดยอัตโนมัติหากมีอยู่ในสื่อ
    • ตรวจสอบว่าระดับเสียงลดลงอย่างราบรื่นเมื่อกรอ
    • แก้ไขเสียงป๊อปที่อาจเกิดขึ้นระหว่างการกรอ
    • แก้ไขข้อผิดพลาดในการสะสมการตัดทอนสำหรับอัลกอริทึมการยืดเวลา/การเปลี่ยนระดับเสียงของ Sonic
    • แก้ไขข้อบกพร่องใน SpeedChangingAudioProcessor ที่ทำให้เฟรมเอาต์พุตหลุด
  • วิดีโอ
    • MediaCodecVideoRenderer หลีกเลี่ยงการถอดรหัสตัวอย่างที่ไม่ได้ แสดงผลหรือใช้เป็นข้อมูลอ้างอิงโดยตัวอย่างอื่นๆ
    • ใน API 35 ขึ้นไป MediaCodecAdapter อาจได้รับ null Surface ใน configure และการเรียกใช้เมธอดใหม่ detachOutputSurface เพื่อนำ Surface ที่ตั้งค่าไว้ก่อนหน้านี้ออก หากตัวแปลงรหัสรองรับ (MediaCodecInfo.detachedSurfaceSupported)
    • ใช้ค่าอัตราส่วนพิกเซลที่ระบุ MediaCodecAdapterหากมี เมื่อประมวลผล onOutputFormatChanged (#1371)
    • เพิ่มวิธีแก้ปัญหาเกี่ยวกับอุปกรณ์ใน Galaxy Tab S7 FE ที่ทำให้ระบบทำเครื่องหมายสตรีม H264 ที่ปลอดภัย 60fps ว่าไม่รองรับ (#1619)
    • เพิ่มวิธีแก้ปัญหาสำหรับตัวแปลงรหัสที่ค้างหลังจากตัวอย่างสุดท้ายโดยไม่ ส่งสัญญาณสิ้นสุดสตรีม
  • ข้อความ:
    • เพิ่ม VoiceSpan ที่กำหนดเองและป้อนข้อมูลสำหรับ ช่วงเสียง WebVTT (#1632)
    • ตรวจสอบว่า WebVTT ใน HLS ที่มีแสตมป์เวลาของคำบรรยายขนาดใหญ่มาก (ซึ่งล้น long 64 บิตเมื่อแสดงเป็นไมโครวินาทีและคูณด้วย 90,000ไทม์เบสของ MPEG) แสดงอยู่ (#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 ที่อุปกรณ์ของผู้ผลิตบางรายส่งมาเมื่อตั้งค่า BroadcastReceiver สำหรับ 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 ครั้งเมื่อสมัครใช้บริการองค์ประกอบหลัก
  • UI:
    • สร้างวิดีโอที่ยืด/ครอบตัดในวิธีแก้ปัญหาPlayerView-in-Compose-AndroidView เนื่องจากปัญหาเกี่ยวกับทรานซิชันที่แชร์ซึ่งอิงตาม XML แอปที่ใช้ PlayerView ภายใน AndroidView ต้องเรียกใช้ PlayerView.setEnableComposeSurfaceSyncWorkaround เพื่อเลือกใช้ (#1237, #1594)
    • เพิ่ม setFullscreenButtonState ใน PlayerView เพื่ออนุญาตให้อัปเดตไอคอนของ ปุ่มเต็มหน้าจอตามต้องการ กล่าวคือ นอกแบนด์และไม่ใช่แบบรีแอ็กทีฟ ต่อการโต้ตอบด้วยการคลิก (#1590, #184)
    • แก้ไขข้อบกพร่องที่ตัวเลือก "ไม่มี" ในการเลือกข้อความไม่ทำงานหาก มีการกำหนดค่ากำหนดการเลือกแทร็กข้อความที่แอปกำหนด
  • ส่วนขยาย DASH
    • เพิ่มการรองรับระยะเวลาที่เริ่มต้นในช่วงกลางของกลุ่ม (#1440)
  • ส่วนขยาย Smooth Streaming
    • แก้ไขข้อผิดพลาด Bad magic number for Bundle เมื่อเล่นสตรีม SmoothStreaming ที่มีแทร็กข้อความ (#1779)
  • ส่วนขยาย RTSP
    • แก้ไขการนำข้อมูลผู้ใช้ออกสำหรับ URL ที่มีอักขระ @ ที่เข้ารหัส (#1138)
    • แก้ไขการขัดข้องเมื่อแยกวิเคราะห์แพ็กเก็ต RTP ที่มีส่วนขยายส่วนหัว (#1225)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ):
    • เพิ่มโมดูลตัวถอดรหัส IAMF ซึ่งรองรับการเล่นไฟล์ MP4 ที่มีแทร็ก IAMF โดยใช้ไลบรารีเนทีฟ libiamf เพื่อ สังเคราะห์เสียง
      • ระบบจะเปิดใช้การเล่นด้วยเลย์เอาต์สเตอริโอ รวมถึง 5.1 พร้อม การปรับแต่งเสียงตามตำแหน่งร่วมกับการติดตามการเคลื่อนไหวของศีรษะที่เปิดใช้ (ไม่บังคับ) แต่ ขณะนี้ยังไม่รองรับการเล่นแบบ Binaural
    • เพิ่มการรองรับหน้าขนาด 16 KB สำหรับส่วนขยายตัวถอดรหัสใน Android 15 (#1685)
  • ส่วนขยาย Cast
    • หยุดล้างไทม์ไลน์หลังจาก CastSession ยกเลิกการเชื่อมต่อ ซึ่งจะช่วยให้แอปผู้ส่งเล่นต่อในเครื่องได้หลังจากยกเลิกการเชื่อมต่อ
    • ป้อนข้อมูล DeviceInfo ของ CastPlayer เมื่อมีการระบุ Context ซึ่งจะช่วยให้ลิงก์ MediaSession กับ RoutingSession ได้ ซึ่งจำเป็นต่อการผสานรวม Output Switcher (#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
    • นำการขึ้นต่อกันในการคอมไพล์ออกจากการแยกส่วน Java 8 ที่ได้รับการปรับปรุง (#1312)
    • ตรวจสอบว่าระบบจะไม่สนใจระยะเวลาที่ส่งไปยัง MediaItem.Builder.setImageDurationMs() สำหรับ MediaItem ที่ไม่ใช่รูปภาพ (ตามที่ระบุไว้ในเอกสาร)
    • เพิ่ม Format.customData เพื่อจัดเก็บข้อมูลที่กำหนดเองซึ่งแอปให้ไว้เกี่ยวกับอินสแตนซ์ของ Format
  • ExoPlayer:
    • เพิ่ม BasePreloadManager ซึ่งประสานงานการโหลดล่วงหน้าสำหรับแหล่งที่มาหลายรายการ ตามลำดับความสำคัญที่กำหนดโดย rankingData คุณปรับแต่งได้โดยการขยายคลาสนี้ เพิ่ม DefaultPreloadManager ซึ่งใช้ PreloadMediaSource เพื่อโหลดตัวอย่างสื่อ ของแหล่งที่มาล่วงหน้าลงในหน่วยความจำ และใช้อินสแตนซ์ rankingData ที่ระบุดัชนีของรายการใน UI
    • เพิ่ม PlayerId ในวิธีการส่วนใหญ่ของ LoadControl เพื่อเปิดใช้การติดตั้งใช้งาน LoadControl ให้รองรับผู้เล่นหลายคน
    • นำ Buffer.isDecodeOnly() และ C.BUFFER_FLAG_DECODE_ONLY ออก ไม่จำเป็นต้องตั้งค่าแฟล็กนี้ เนื่องจากโปรแกรมแสดงผลและตัวถอดรหัสจะตัดสินใจข้ามบัฟเฟอร์ตามการประทับเวลา การติดตั้งใช้งาน Renderer ที่กำหนดเองควร ตรวจสอบว่าเวลาบัฟเฟอร์เป็นอย่างน้อย BaseRenderer.getLastResetPositionUs() เพื่อพิจารณาว่าจะแสดงตัวอย่าง หรือไม่ การติดตั้งใช้งานที่กำหนดเองSimpleDecoderสามารถตรวจสอบ isAtLeastOutputStartTimeUs()ได้หากจำเป็น หรือทำเครื่องหมายบัฟเฟอร์อื่นๆ ด้วย DecoderOutputBuffer.shouldBeSkippedเพื่อข้าม
    • อนุญาตให้ TargetPreloadStatusControl.getTargetPreloadStatus(T) แสดงผลค่า Null เพื่อระบุว่าไม่ ให้โหลด MediaSource ที่มี rankingData ที่ระบุไว้ล่วงหน้า
    • เพิ่ม remove(MediaSource) ไปยัง BasePreloadManager
    • เพิ่ม reset() ไปยัง BasePreloadManager เพื่อปล่อยแหล่งที่มาทั้งหมดที่ระงับไว้ ขณะที่เก็บอินสแตนซ์เครื่องมือจัดการการโหลดล่วงหน้าไว้
    • เพิ่ม ExoPlayer.setPriority() (และ Builder.setPriority()) เพื่อกำหนด ค่าลำดับความสำคัญที่ใช้ใน PriorityTaskManager และความสำคัญของ MediaCodec จาก API 35
    • แก้ไขปัญหาเกี่ยวกับการอัปเดตเวลาการหยุดบัฟเฟอร์ล่าสุด ซึ่งส่งผลให้มีคีย์ bs (บัฟเฟอร์หมด) ที่ไม่ถูกต้องใน CMCD (#1124)
    • เพิ่ม PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) เพื่อระบุว่าแหล่งข้อมูลโหลดจนจบแล้ว ซึ่งจะช่วยให้การใช้งาน DefaultPreloadManagerและ PreloadMediaSource.PreloadControlที่กำหนดเองโหลดล่วงหน้า แหล่งที่มาถัดไปหรือดำเนินการอื่นๆ ได้
    • แก้ไขข้อบกพร่องที่การข้ามช่วงเงียบที่ท้ายรายการอาจทำให้เกิดข้อยกเว้นในการเล่น
    • เพิ่ม clear ใน PreloadMediaSource เพื่อทิ้งระยะเวลาการโหลดล่วงหน้า
    • เพิ่มรหัสข้อผิดพลาดใหม่ PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED ที่ใช้ เมื่อมีการเรียกคืนทรัพยากรของตัวแปลงรหัสสำหรับงานที่มีลำดับความสำคัญสูงกว่า
    • อนุญาตให้ AdsMediaSource โหลดโฆษณาตอนต้นก่อนที่การเตรียมสื่อเนื้อหาเริ่มต้นจะเสร็จสมบูรณ์ (#1358)
    • แก้ไขข้อบกพร่องที่การเล่นย้ายไปที่ STATE_ENDED เมื่อเตรียมไลฟ์สด DASH แบบหลายช่วงเวลาอีกครั้งหลังจากที่ระบบนำช่วงเวลาเดิมออกจากไฟล์ Manifest แล้ว
    • เปลี่ยนชื่อ onTimelineRefreshed() เป็น onSourcePrepared() และ onPrepared() เป็น onTracksSelected() ใน PreloadMediaSource.PreloadControl นอกจากนี้ ให้เปลี่ยนชื่อ IntDefs ใน DefaultPreloadManager.Stage ตามความเหมาะสมด้วย
    • เพิ่มการรองรับการกำหนดเวลาแบบไดนามิกในเวอร์ชันทดลองเพื่อปรับงานให้สอดคล้องกับรอบการทำงานของ CPU และหน่วงเวลาการปลุกจนกว่าโปรแกรมแสดงผลจะทำงานต่อได้ คุณเปิดใช้ฟีเจอร์นี้ได้โดยใช้ experimentalSetDynamicSchedulingEnabled() เมื่อตั้งค่าอินสแตนซ์ ExoPlayer
    • เพิ่ม Renderer.getDurationToProgressUs() Renderer สามารถใช้ วิธีการนี้เพื่อส่งคืนระยะเวลาที่การเล่นต้อง เลื่อนไปข้างหน้าเพื่อให้ตัวแสดงผลทำงานต่อได้ไปยัง ExoPlayer หากตั้งค่า ExoPlayer เป็น experimentalSetDynamicSchedulingEnabled() ExoPlayer จะเรียกใช้ เมธอดนี้เมื่อคำนวณเวลาในการกำหนดเวลางาน
    • เพิ่ม MediaCodecAdapter#OnBufferAvailableListener เพื่อแจ้งเตือนเมื่อบัฟเฟอร์อินพุต และเอาต์พุตพร้อมให้ MediaCodecRenderer ใช้ MediaCodecRenderer จะส่งสัญญาณไปยัง ExoPlayer เมื่อได้รับ การเรียกกลับเหล่านี้ และหากตั้งค่า ExoPlayer ด้วย experimentalSetDynamicSchedulingEnabled() ExoPlayer จะ กำหนดเวลาลูปการทำงานเนื่องจากตัวแสดงผลสามารถดำเนินการต่อได้
    • ใช้คลาสข้อมูลสำหรับLoadControlเมธอดแทนพารามิเตอร์แต่ละรายการ
    • เพิ่ม ExoPlayer.isReleased() เพื่อตรวจสอบว่ามีการเรียกใช้ Exoplayer.release() หรือไม่
    • เพิ่ม ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() เพื่อกำหนดค่า ตำแหน่งสูงสุดที่ seekToPrevious() จะข้ามไปยังรายการก่อนหน้า (#1425)
    • แก้ไขความไม่สอดคล้องกันบางอย่างในการโฟกัสเสียง เช่น ไม่รายงานการสูญเสียโฟกัสแบบเต็มหรือแบบชั่วคราวขณะที่หยุดเล่นชั่วคราว (#1436)
    • แก้ไขปัญหาที่อาจเกิดขึ้นIndexOutOfBoundsExceptionซึ่งเกิดจากเครื่องมือแยกรายงานแทร็กเพิ่มเติมหลังจากขั้นตอนการเตรียมข้อมูลเบื้องต้น (#1476)
    • Effects ใน ExoPlayer.setVideoEffect() จะได้รับการประทับเวลา โดยนำออฟเซ็ตของโปรแกรมแสดงผลออก (#1098)
    • แก้ไขIllegalArgumentExceptionที่อาจเกิดขึ้นเมื่อจัดการข้อผิดพลาดของเพลเยอร์ที่เกิดขึ้นขณะอ่านรายการเพลย์ลิสต์อื่นล่วงหน้า (#1483)
  • Transformer
    • เพิ่ม audioConversionProcess และ videoConversionProcess ไปยัง ExportResult เพื่อระบุวิธีสร้างแทร็กที่เกี่ยวข้องในไฟล์เอาต์พุต
    • ยกเลิกการตรวจสอบระดับ H.264 ของการเพิ่มประสิทธิภาพการตัด
    • เพิ่มการรองรับการเปลี่ยนระหว่างสื่ออินพุต SDR และ HDR ในลำดับ
    • เพิ่มการรองรับเอฟเฟกต์เสียงระดับองค์ประกอบ
    • เพิ่มการรองรับการแปลงรหัสรูปภาพ Ultra HDR เป็นวิดีโอ HDR
    • แก้ไขปัญหาที่ DefaultAudioMixer ไม่แสดงจำนวนไบต์ที่ถูกต้อง หลังจากรีเซ็ตและนำกลับมาใช้ใหม่
    • หลีกเลี่ยงข้อบกพร่องของตัวถอดรหัสที่จำกัดจำนวนช่องเสียง ไว้ที่สเตอริโอเมื่อจัดการอินพุต PCM
    • เมื่อเลือกแทร็กใน ExoPlayerAssetLoader ให้ละเว้นข้อจำกัดของจำนวนช่องเสียง เนื่องจากข้อจำกัดดังกล่าวใช้กับการเล่นเท่านั้น
    • แทนที่อินเทอร์เฟซ androidx.media3.transformer.Muxer ด้วย androidx.media3.muxer.Muxer และนำ androidx.media3.transformer.Muxer ออก
    • แก้ไขการโหลดรูปภาพ HEIC จากรูปแบบ URI ของเนื้อหา (#1373)
    • ปรับระยะเวลาของแทร็กเสียงใน AudioGraphInput เพื่อปรับปรุงการซิงค์ภาพและเสียง
    • นำฟิลด์ ExportResult.processedInputs ออก หากใช้ฟิลด์นี้สำหรับรายละเอียดตัวแปลงรหัส ให้ใช้ DefaultDecoderFactory.listener แทน ใน กรณีที่ยกเว้นตัวแปลงรหัส รายละเอียดตัวแปลงรหัสจะอยู่ใน ExportException.codecInfo
  • โปรแกรมแยกข้อมูล
    • MPEG-TS: เปลี่ยนแปลงไปข้างหน้าเพื่อให้มั่นใจว่าเฟรมสุดท้ายจะแสดงผลโดย ส่งหน่วยการเข้าถึงสุดท้ายของสตรีมไปยังคิวตัวอย่าง (#7909) รวมการแก้ไขเพื่อแก้ปัญหาที่เกิดขึ้นในสตรีม HLS ที่มีเฉพาะ I-frame(#1150) และสตรีม HLS ของ H.262 (#1126)
    • MP3: ควรใช้ขนาดข้อมูลจากเฟรม Info มากกว่าขนาดที่รายงานโดย สตรีมพื้นฐาน (เช่น ขนาดไฟล์หรือส่วนหัว HTTP Content-Length) ซึ่งจะช่วยยกเว้นข้อมูลตัวอย่างที่เล่นไม่ได้ (เช่น อาร์ตเวิร์กของอัลบั้ม) จากการคำนวณการค้นหาบิตเรตคงที่ ทำให้การค้นหาแม่นยำยิ่งขึ้น (#1376)
    • MP3: ใช้จำนวนเฟรมและข้อมูลอื่นๆ ในเฟรม Info (หากมี) เพื่อคำนวณอัตราบิตเฉลี่ยสำหรับการค้นหาอัตราบิตคงที่ แทนที่จะ ประมาณค่าจากอัตราบิตของเฟรมหลังจากเฟรม Info ซึ่งอาจมีขนาดเล็กเกินจริง เช่น เฟรม PCUT (#1376)
    • แก้ไขการแยกรูปแบบเสียง PCM ในคอนเทนเนอร์ AVI
  • เสียง:
    • แก้ไขแอตทริบิวต์การเข้ารหัส DTS:X โปรไฟล์ 2 สำหรับการเล่นแบบส่งผ่าน (#1299)
    • สำหรับการเล่นที่ออฟโหลด ให้รีเซ็ตฟิลด์การติดตามสำหรับการดูสตรีมจนจบ ใน DefaultAudioSink ก่อนเรียกใช้ AudioTrack.stop() เพื่อให้ AudioTrack.StreamEventCallback#onPresentationEnded ระบุได้อย่างถูกต้อง เมื่อมีการเล่นข้อมูลที่รอดำเนินการทั้งหมด
    • แก้ไขข้อบกพร่องใน SilenceSkippingAudioProcessor ซึ่งการเปลี่ยนระหว่าง รูปแบบเสียงต่างๆ (เช่น สเตอริโอเป็นโมโน) อาจทำให้ โปรเซสเซอร์ส่งข้อยกเว้น (#1352)
    • ใช้ MediaCodecAudioRenderer.getDurationToProgressUs() เพื่อให้ ExoPlayer กำหนดเวลาลูปการทำงานหลักแบบไดนามิกเมื่อ MediaCodecAudioRenderer สามารถดำเนินการต่อได้
  • วิดีโอ
    • แก้ไขปัญหาที่ Listener.onRenderedFirstFrame() มาเร็วเกินไปเมื่อ เปลี่ยนพื้นผิวระหว่างการเล่น
    • แก้ไขตรรกะการสำรองข้อมูลตัวถอดรหัสสำหรับ Dolby Vision เพื่อใช้ตัวถอดรหัส AV1 ที่เข้ากันได้หากจำเป็น (#1389)
    • แก้ไขข้อยกเว้นของตัวแปลงรหัสที่อาจเกิดจากการเปิดใช้ตัวแสดงวิดีโอ ระหว่างการเล่น
  • ข้อความ:
    • แก้ไขปัญหาที่ระบบข้ามคำบรรยายแทนเสียงที่เริ่มก่อนตำแหน่งการค้นหา ปัญหานี้เกิดขึ้นใน Media3 1.4.0-alpha01 เท่านั้น
    • เปลี่ยนลักษณะการทำงานเริ่มต้นของการแยกวิเคราะห์คำบรรยายแทนเสียงให้เกิดขึ้นระหว่างการแยก แทนที่จะเกิดขึ้นระหว่างการแสดงผล (ดูความแตกต่างระหว่างการแยกและการแสดงผลได้ที่แผนภาพสถาปัตยกรรมของ ExoPlayer )
      • คุณลบล้างการเปลี่ยนแปลงนี้ได้โดยเรียกใช้ทั้ง MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) และ TextRenderer.experimentalSetLegacyDecodingEnabled(true) ดูเอกสารเกี่ยวกับการปรับแต่งเพื่อดูวิธีเชื่อมต่อคอมโพเนนต์เหล่านี้เข้ากับอินสแตนซ์ ExoPlayer เราจะนำเมธอดเหล่านี้ (และการรองรับการถอดรหัสคำบรรยายแทนเสียงรุ่นเดิมทั้งหมด) ออกในรุ่นต่อๆ ไป
      • แอปที่มีการติดตั้งใช้งาน SubtitleDecoder ที่กำหนดเองต้องอัปเดต เพื่อติดตั้งใช้งาน SubtitleParser แทน (และ SubtitleParser.Factory แทน SubtitleDecoderFactory)
    • PGS: แก้ไขการถอดรหัสแบบรันเลนส์เพื่อแก้ปัญหา 0 เป็นดัชนีสีแทน ค่าสีตามตัวอักษร (#1367)
    • CEA-708: ละเว้นค่า rowLock ข้อกำหนด CEA-708-E S-2023 ระบุว่า rowLock และ columnLock ควรมีค่าเป็นจริงทั้งคู่ ไม่ว่าค่าที่อยู่ในสตรีมจะเป็นอย่างไร (columnLock ไม่รองรับ ดังนั้นจึงถือว่ามีค่าเป็นเท็จเสมอ)
      • เดิมการเปลี่ยนแปลงนี้รวมอยู่ในบันทึกประจำรุ่น 1.3.0-alpha01 แต่การเปลี่ยนแปลงถูกเปลี่ยนกลับโดยไม่ตั้งใจก่อนการเปิดตัว 1.3.0-rc01 ตอนนี้ปัญหาได้รับการแก้ไขแล้ว การเปลี่ยนแปลงจึงกลับมาปรากฏอีกครั้ง
    • CEA-708: หลีกเลี่ยงการเพิ่มบรรทัดใหม่ที่ซ้ำกันซึ่งเกิดจากการจัดการคำสั่ง "ตั้งค่าตำแหน่งปากกา" อย่างง่ายของ ExoPlayer (#1315)
    • แก้ไข IllegalArgumentException จาก LegacySubtitleUtil เมื่อตัวอย่างคำบรรยายแทนเสียง WebVTT ไม่มีคิว เช่น เป็นส่วนหนึ่งของสตรีม DASH (#1516)
  • ข้อมูลเมตา
    • แก้ไขการแมป MP4 กับแท็กการจัดเรียง ID3 ก่อนหน้านี้ ระบบได้แมปแท็ก MP4 "album sort" (soal), "artist sort" (soar) และ "album artist sort" (soaa) อย่างไม่ถูกต้องกับแท็ก ID3 TSO2, TSOA และ TSOP (#1302)
    • แก้ไขการอ่านแท็กตัวเลข MP4 (/iTunes) gnre (ประเภท) และ tmpo (เทมโป) เมื่อค่ามีความยาวมากกว่า 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 จากอินพุตบิตแมป Ultra HDR
    • เพิ่มการรองรับ EGL_GL_COLORSPACE_BT2020_HLG_EXT ซึ่งช่วยปรับปรุงเอาต์พุตพื้นผิว HLG ใน ExoPlayer.setVideoEffect และ Debug SurfaceView ของ Transformer
    • อัปเดตการติดตั้งใช้งานเมทริกซ์ภาพซ้อนทับเพื่อให้สอดคล้องกับ เอกสารประกอบโดยการสลับค่า x และ y ที่ใช้ใน setOverlayFrameAnchor() หากใช้ OverlaySettings.Builder.setOverlayFrameAnchor() ให้สลับค่า x และ y โดยคูณด้วย -1
    • แก้ไขข้อบกพร่องที่ทำให้ TimestampWrapper ขัดข้องเมื่อใช้กับ ExoPlayer#setVideoEffects (#821)
    • เปลี่ยนพื้นที่ทำงานสี SDR เริ่มต้นจากสีเชิงเส้นเป็นวิดีโอ 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>) to 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)
    • จัดแนว Conversion ของ 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 เพื่ออนุญาตให้ใช้ Drawable ที่แตกต่างกันต่ออินสแตนซ์ PlayerView แทนการลบล้างส่วนกลาง (#1200)
    • แก้ไขข้อบกพร่องของแพลตฟอร์มที่ทำให้วิดีโอยืด/ครอบตัดเมื่อใช้ SurfaceView ภายใน Compose AndroidView ใน API 34 (#1237)
  • การดาวน์โหลด
    • ตรวจสอบว่า DownloadHelper ไม่รั่วไหลอินสแตนซ์ Renderer ที่ยังไม่ได้เผยแพร่ ซึ่งอาจส่งผลให้แอปขัดข้องพร้อมกับ IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224)
  • ส่วนขยาย Cronet
    • แก้ไข SocketTimeoutException ใน CronetDataSource ใน Cronet บางเวอร์ชัน คำขอที่ส่งโดยการเรียกกลับอาจไม่เหมือนกันเสมอไป ซึ่งจะทำให้การเรียกกลับไม่สำเร็จและคำขอหมดเวลา (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 ในแอปเดโม Shorts
    • อนุญาตให้ตั้งค่าโหมดเล่นซ้ำด้วยอาร์กิวเมนต์ Intent จากบรรทัดคำสั่ง (#1266)
    • ใช้ HttpEngineDataSource เป็น HttpDataSource เมื่ออุปกรณ์รองรับ
  • นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
    • นำ CronetDataSourceFactory ออก โปรดใช้ CronetDataSource.Factory แทน
    • โปรดนำDataSpecผู้สร้างบางรายออก โปรดใช้ DataSpec.Builder แทน
    • นำวิธีการ setContentTypePredicate(Predicate) ออกจาก DefaultHttpDataSource, OkHttpDataSource และ CronetDataSource โปรดใช้วิธีที่เทียบเท่าในแต่ละ XXXDataSource.Factory แทน
    • นำตัวสร้าง OkHttpDataSource และ OkHttpDataSourceFactory ออก โปรดใช้ OkHttpDataSource.Factory แทน
    • นำ PlayerMessage.setHandler(Handler) ออก โปรดใช้ setLooper(Looper) แทน
    • นำฟิลด์ Timeline.Window.isLive ออก ให้ใช้เมธอด isLive() แทน
    • นำตัวสร้าง DefaultHttpDataSource ออก โปรดใช้ DefaultHttpDataSource.Factory แทน
    • นำ DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS ออก โปรดใช้ DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS แทน
    • นำ MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean) ออก โปรดใช้ MediaCodecInfo.canReuseCodec(Format, Format) แทน
    • นำDrmSessionManager.DUMMYและgetDummyDrmSessionManager() ออก โปรดใช้ DrmSessionManager.DRM_UNSUPPORTED แทน
    • นำ AnalyticsListener.onAudioInputFormatChanged(EventTime, Format) AnalyticsListener.onVideoInputFormatChanged(EventTime, Format) AudioRendererEventListener.onAudioInputFormatChanged(Format) VideoRendererEventListener.onVideoInputFormatChanged(Format) ออก ใช้ โอเวอร์โหลดที่ใช้ DecoderReuseEvaluation แทน
    • นำค่าคงที่ RendererSupport.FormatSupport IntDef และ FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE, FORMAT_UNSUPPORTED_TYPE ออก ใช้ IntDef และค่าคงที่ที่เทียบเท่าใน androidx.media3.common.C แทน (เช่น C.FORMAT_HANDLED)
    • นำอินเทอร์เฟซ Bundleable ออก ซึ่งรวมถึงการนำฟิลด์ค่าคงที่ทั้งหมดของ Bundleable.Creator<Foo> CREATOR ออก ผู้โทรควรใช้วิธี Bundle toBundle() และ static Foo fromBundle(Bundle) ในแต่ละประเภทแทน

เวอร์ชัน 1.4.0-rc01

10 กรกฎาคม 2024

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

เวอร์ชัน 1.4.0-beta01

26 มิถุนายน 2024

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

เวอร์ชัน 1.4.0-alpha02

7 มิถุนายน 2024

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

เวอร์ชัน 1.4.0-alpha01

17 เมษายน 2024

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

เวอร์ชัน 1.3.0

เวอร์ชัน 1.3.1

11 เมษายน 2024

androidx.media3:media3-*:1.3.1 ได้รับการเผยแพร่แล้ว เวอร์ชัน 1.3.1 มีการเปลี่ยนแปลงเหล่านี้

  • คลังทั่วไป
    • เพิ่ม Format.labels เพื่ออนุญาตให้ใช้ป้ายกำกับที่แปลแล้วหรือป้ายกำกับอื่น
  • ExoPlayer:
    • แก้ไขปัญหาที่ PreloadMediaPeriod ไม่สามารถเก็บสตรีมไว้ได้เมื่อโหลดล่วงหน้าอีกครั้ง
    • ใช้ TrackSelectionResult ที่ถูกต้องซึ่งสอดคล้องกับระยะเวลาการเล่น เมื่อเลือกแทร็กอีกครั้ง
    • เริ่มตัวแสดงผลที่เปิดใช้ก่อนเวลาหลังจากเลื่อนระยะเวลาการเล่น เมื่อเปลี่ยนระหว่างรายการสื่อเท่านั้น (#1017)
    • เพิ่มประเภทการคืนสินค้าที่ขาดหายไปในกฎ Proguard -keepclasseswithmembers สำหรับ DefaultVideoFrameProcessor.Factory.Builder.build() (#1187)
  • Transformer
    • เพิ่มวิธีแก้ปัญหาสำหรับข้อยกเว้นที่เกิดจาก MediaMuxer ไม่รองรับ การประทับเวลาการนำเสนอที่เป็นลบก่อน API 30
  • การเลือกแทร็ก
    • DefaultTrackSelector: เลือกแทร็กวิดีโอที่มีอัตราเฟรม "สมเหตุสมผล" (>=10fps) มากกว่าแทร็กที่มีอัตราเฟรมต่ำกว่าหรือไม่ได้ตั้งค่า ซึ่งจะช่วยให้ เพลเยอร์เลือกแทร็กวิดีโอ "จริง" ใน MP4 ที่ดึงมาจากภาพเคลื่อนไหว ซึ่งอาจมีแทร็ก HEVC 2 แทร็ก โดยแทร็กหนึ่งมีความละเอียดสูงกว่า แต่มีจำนวนเฟรมน้อยมาก (#1051)
  • โปรแกรมแยกข้อมูล
    • แก้ไขปัญหาที่ไม่ได้ข้ามการเพิ่มพื้นที่เมื่ออ่านก้อนข้อมูลที่มีขนาดคี่ จากไฟล์ WAV (#1117)
    • MP3: ป้อนข้อมูล Format.averageBitrate จากเฟรมข้อมูลเมตา เช่น XING และ VBRI
    • MPEG-TS: เปลี่ยนกลับการเปลี่ยนแปลงที่มีจุดประสงค์เพื่อให้มั่นใจว่าเฟรมสุดท้ายจะได้รับการแสดงผล โดยการส่งหน่วยการเข้าถึงสุดท้ายของสตรีมไปยังคิวตัวอย่าง (#7909) เนื่องจากการเปลี่ยนแปลงทำให้เกิดปัญหาใหม่กับสตรีม HLS ที่มีเฉพาะ I-frame (#1150) และสตรีม HLS ของ H.262 (#1126)
  • เสียง:
    • อนุญาตให้กู้คืนโปรแกรมแสดงผลโดยการปิดใช้การออฟโหลดหากแทร็กเสียงเริ่มต้นในโหมดออฟโหลดไม่สำเร็จ
  • วิดีโอ
    • เพิ่มวิธีแก้ปัญหาสำหรับอุปกรณ์ใน Galaxy Tab S7 FE, Chromecast พร้อม Google TV และ Lenovo M10 FHD Plus ที่ทำให้ระบบทำเครื่องหมายสตรีม H265 ที่ 60fps ว่าไม่รองรับ
    • เพิ่มวิธีแก้ปัญหาที่ช่วยให้มั่นใจได้ว่าเฟรมแรกจะได้รับการแสดงผลเสมอขณะ ทำ Tunneling แม้ว่าอุปกรณ์จะไม่ดำเนินการนี้โดยอัตโนมัติตามที่ API กำหนด (#1169) (#966)
    • แก้ไขปัญหาที่การจัดการข้อมูลสี HDR ทำให้ตัวแปลงรหัสทำงานผิดปกติและ ป้องกันการสลับรูปแบบแบบปรับได้สำหรับแทร็กวิดีโอ SDR (#1158)
  • ข้อความ:
    • WebVTT: ป้องกันไม่ให้คิวที่ต่อเนื่องกันโดยตรงสร้างCuesWithTimingอินสแตนซ์เพิ่มเติมWebvttParser.parseที่ไม่ถูกต้อง (#1177)
  • DRM:
    • แก้ไขปัญหา NoSuchMethodError ซึ่งอาจเกิดจาก MediaDrm เฟรมเวิร์กแทน ResourceBusyException หรือ NotProvisionedException ในอุปกรณ์ Android 14 บางรุ่น (#1145)
  • ผลลัพธ์
    • ปรับปรุงการแมปโทน PQ เป็น SDR โดยการแปลงพื้นที่สี
  • เซสชัน:
    • แก้ไขปัญหาที่ตำแหน่งปัจจุบันย้อนกลับเมื่อตัวควบคุม แทนที่รายการปัจจุบัน (#951)
    • แก้ไขปัญหาที่ MediaMetadata ที่มีเฉพาะ extras ที่ไม่ใช่ค่าว่างไม่ ส่งระหว่างตัวควบคุมสื่อกับเซสชัน (#1176)
  • UI:
    • ใช้ชื่อภาษาของแทร็กเสียงเป็นข้อมูลสำรองหาก Locale ระบุชื่อที่แสดงไม่ได้ (#988)
  • ส่วนขยาย DASH
    • ป้อนข้อมูลองค์ประกอบ Label ทั้งหมดจากไฟล์ Manifest ลงใน Format.labels (#1054)
  • ส่วนขยาย RTSP
    • ข้ามค่าข้อมูลเซสชันที่ว่างเปล่า (i-tag) ในการแยกวิเคราะห์ SDP (#1087)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1, MIDI ฯลฯ)
    • ปิดใช้ส่วนขยาย MIDI เป็นการขึ้นต่อกันในเครื่องโดยค่าเริ่มต้นเนื่องจากต้องกำหนดค่าที่เก็บ Maven เพิ่มเติม ผู้ใช้ที่ต้องการ โมดูลนี้จากทรัพยากร Dependency ในเครื่อง สามารถเปิดใช้โมดูลอีกครั้ง

เวอร์ชัน 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 คอมโพเนนต์นี้เคยขยายได้ แต่ไม่เคยมีการสร้างคลาสย่อยภายในไลบรารี การปรับแต่งทำได้โดย การห่อหุ้มอินสแตนซ์โดยใช้รูปแบบ Decorator และ การใช้ CompositeSequenceableLoaderFactory ที่กำหนดเอง
    • แก้ไขปัญหาที่การทำซ้ำเวลาเดียวกันทำให้ระบบล้างข้อมูลเมตาจากรายการนี้ (#1007)
    • เปลี่ยนชื่อ experimentalSetSubtitleParserFactory methods on BundledChunkExtractor.Factory และ DefaultHlsExtractorFactory เป็น setSubtitleParserFactory และไม่อนุญาตให้ส่ง null ใช้เมธอดใหม่ของ experimentalParseSubtitlesDuringExtraction(boolean) เพื่อควบคุม ลักษณะการทำงานของการแยกวิเคราะห์
    • เพิ่มการรองรับการปรับแต่ง SubtitleParser.Factory ที่ใช้ระหว่าง การแยก ซึ่งทำได้ด้วย MediaSource.Factory.setSubtitleParserFactory()
    • เพิ่มคำนำหน้าแหล่งที่มาลงในช่อง Format.id ทั้งหมดที่สร้างจาก MergingMediaSource ซึ่งจะช่วยระบุแหล่งที่มาที่ทำให้เกิด Format (#883)
    • แก้ไขนิพจน์ทั่วไปที่ใช้ในการตรวจสอบชื่อคีย์ของข้อมูลไคลเอ็นต์สื่อทั่วไป (CMCD) ที่กำหนดเอง โดยการแก้ไขให้ตรวจสอบเฉพาะขีดกลาง (#1028)
    • หยุดการเข้ารหัสพารามิเตอร์การค้นหา CMCD ซ้ำ (#1075)
  • Transformer
    • เพิ่มการรองรับการรวมวิดีโอสโลว์โมชัน SEF ของ H.265/HEVC
    • เพิ่มความเร็วในการแปลงมัลติเพล็กซ์ โดยเฉพาะการแก้ไขแบบ "นำวิดีโอออก"
    • เพิ่ม API เพื่อให้มั่นใจว่าไฟล์เอาต์พุตจะเริ่มต้นในวิดีโอเฟรม ซึ่งจะช่วยให้เอาต์พุตของการดำเนินการตัดเข้ากันได้มากขึ้นกับการใช้งานโปรแกรมเล่นที่ไม่แสดงเฟรมวิดีโอแรกจนกว่าจะถึงการประทับเวลาการนำเสนอ (#829)
    • เพิ่มการรองรับการเพิ่มประสิทธิภาพการดำเนินการตัด MP4 ของชิ้นงานเดียว
    • เพิ่มการรองรับเพื่อให้แน่ใจว่าเฟรมวิดีโอมีการประทับเวลาแรกใน ไฟล์เอาต์พุต แก้ไขไฟล์เอาต์พุตที่ขึ้นต้นด้วยเฟรมสีดำในเพลเยอร์ที่ใช้ iOS (#829)
  • การเลือกแทร็ก
    • เพิ่ม DefaultTrackSelector.selectImageTrack เพื่อเปิดใช้การเลือกแทร็กรูปภาพ
    • เพิ่ม TrackSelectionParameters.isPrioritizeImageOverVideoEnabled เพื่อ กำหนดว่าจะเลือกแทร็กรูปภาพหรือไม่หากมีทั้งแทร็กรูปภาพและ แทร็กวิดีโอ ค่าเริ่มต้นคือ false ซึ่งหมายความว่า ระบบจะจัดลำดับความสำคัญของการเลือกแทร็กวิดีโอ
  • โปรแกรมแยกข้อมูล
    • เพิ่มการแยกวิเคราะห์ AV1C เพิ่มเติมไปยังโปรแกรมแยก MP4 เพื่อดึงค่า ColorInfo.colorSpace, ColorInfo.colorTransfer และ ColorInfo.colorRange (#692)
    • MP3: ใช้การค้นหาบิตเรตคงที่ (CBR) สำหรับไฟล์ที่มีส่วนหัว Info (ส่วนหัว Xing ที่เทียบเท่ากับ CBR) ก่อนหน้านี้เราใช้ seek table จากส่วนหัว Info แต่การทำเช่นนี้จะทำให้การกรอวิดีโอ ไม่แม่นยำเท่ากับการไม่สนใจและถือว่าไฟล์เป็น CBR
    • MPEG2-TS: เพิ่มการรองรับ DTS, DTS-LBR และ DTS:X Profile2 (#275)
    • ดึงข้อมูลประเภทเสียงจากตัวอธิบาย TS และแมปกับแฟล็กบทบาท เพื่อให้ผู้ใช้เลือกแทร็กเสียงได้อย่างมีข้อมูลมากขึ้น (#973)
  • เสียง:
    • ปรับปรุงอัลกอริทึมการข้ามช่วงเงียบด้วยการค่อยๆ เพิ่มระดับเสียง คงช่วงเงียบขั้นต่ำและระยะเวลาช่วงเงียบที่เป็นธรรมชาติมากขึ้น (#7423)
    • รายงานการข้ามช่วงเงียบได้อย่างแม่นยำมากขึ้น (#1035)
  • วิดีโอ
    • เปลี่ยนเครื่องมือสร้าง MediaCodecVideoRenderer ที่รับอาร์กิวเมนต์ VideoFrameProcessor.Factory แล้วแทนที่ด้วยเครื่องมือสร้าง ที่รับอาร์กิวเมนต์ VideoSinkProvider แอปที่ต้องการแทรก VideoFrameProcessor.Factory ที่กำหนดเอง สามารถสร้างอินสแตนซ์ของ CompositingVideoSinkProvider ที่ใช้ VideoFrameProcessor.Factory ที่กำหนดเอง และส่งผู้ให้บริการซิงก์วิดีโอไปยัง MediaCodecVideoRenderer
  • ข้อความ:
    • แก้ไขการซีเรียลไลซ์คิวบิตแมปเพื่อแก้ไขข้อผิดพลาด Tried to marshall a Parcel that contained Binder objects เมื่อใช้ DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836)
    • CEA-708: ละเว้นค่า rowLock ข้อกำหนด CEA-708-E S-2023 ระบุว่า rowLock และ columnLock ควรมีค่าเป็นจริงทั้งคู่ ไม่ว่าค่าที่อยู่ในสตรีมจะเป็นอย่างไร (columnLock ไม่รองรับ ดังนั้นจึงถือว่ามีค่าเป็นเท็จเสมอ)
  • รูปภาพ:
    • เพิ่มการรองรับภาพขนาดย่อของ DASH ระบบจะครอบตัดรูปภาพในตารางกริดและแสดงภาพปกแต่ละรายการให้แก่ImageOutputใกล้กับเวลาที่นำเสนอ
  • DRM:
    • เล่นตัวอย่างที่ไม่มีการเข้ารหัส "clear lead" ในเนื้อหา DRM ทันทีโดยค่าเริ่มต้น แม้ว่าคีย์สำหรับตัวอย่างที่เข้ารหัสในภายหลังจะยังไม่พร้อมก็ตาม ซึ่งอาจทำให้การเล่นหยุดชะงักกลางคันหากคีย์ยังไม่พร้อม เมื่อตำแหน่งการเล่นไปถึงตัวอย่างที่เข้ารหัส (แต่ก่อนหน้านี้ การเล่นจะยังไม่เริ่มเลย ณ จุดนี้) คุณปิดใช้ลักษณะการทำงานนี้ได้ด้วย MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey หรือ DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
  • ส่วนขยาย IMA
    • แก้ไขปัญหาที่โฆษณา DASH และ HLS ที่ไม่มีนามสกุลไฟล์ที่เหมาะสม เล่นไม่ได้
  • เซสชัน:
    • ปิดใช้การตรวจหาการดับเบิลคลิกสำหรับแอปทีวี (#962)
    • แก้ไขปัญหาที่ MediaItem.RequestMetadata ที่มีเพียงส่วนเสริมที่ไม่ใช่ค่าว่าง จะไม่ส่งระหว่างตัวควบคุมสื่อและเซสชัน
    • เพิ่มตัวสร้างไปยัง MediaLibrarySession.Builder ที่รับเฉพาะ Context แทนที่จะเป็น MediaLibraryService
  • ส่วนขยาย HLS:
    • ลด HlsMediaPeriod เป็นระดับการเข้าถึงแบบแพ็กเกจส่วนตัว ไม่ควรใช้ประเภทนี้ จากภายนอกแพ็กเกจ HLS โดยตรง
    • Resolve ค้นหาจุดเริ่มต้นของกลุ่มได้อย่างมีประสิทธิภาพมากขึ้น (#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 ที่ 60fps ว่าไม่รองรับ (#693)
  • ข้อมูลเมตา
    • แก้ไขข้อบกพร่องที่ MediaMetadata จะสร้างจากความคิดเห็น Vorbis เท่านั้น โดยใช้คีย์ตัวพิมพ์ใหญ่ (#876)
    • จับ OutOfMemoryError เมื่อแยกวิเคราะห์เฟรม ID3 ขนาดใหญ่มาก ซึ่งหมายความว่า การเล่นจะดำเนินต่อไปได้โดยไม่มีข้อมูลแท็กแทนที่จะเล่นไม่สำเร็จ โดยสมบูรณ์
  • DRM:
    • ขยายการแก้ปัญหาสำหรับ URL ของใบอนุญาต ClearKey https://default.url ที่ไม่ถูกต้องไปยัง API 33 ขึ้นไป (ก่อนหน้านี้การแก้ปัญหาใช้ได้กับ API 33 เท่านั้น) (#837)
    • แก้ไข ERROR_DRM_SESSION_NOT_OPENED เมื่อเปลี่ยนจากเนื้อหาที่เข้ารหัสเป็นเนื้อหาที่ไม่ได้เข้ารหัสโดยไม่มี Surface ที่แนบมากับเพลเยอร์ ข้อผิดพลาดเกิดจาก การใช้ตัวถอดรหัสที่ปลอดภัยอย่างไม่ถูกต้องเพื่อเล่นเนื้อหาที่ไม่มีการเข้ารหัส
  • เซสชัน:
    • ใส่คีย์และค่าที่กำหนดเองใน MediaMetadataCompat to MediaMetadata.extras และ MediaMetadata.extras to MediaMetadataCompat (#756, #802)
    • แก้ไขการออกอากาศ notifyChildrenChanged สำหรับคอนโทรลเลอร์เวอร์ชันเดิม (#644)
    • แก้ไขข้อบกพร่องที่การตั้งเวลาเป็นค่าลบสำหรับตัวจับเวลา setWhen ที่ปิดใช้แล้ว ของการแจ้งเตือนทำให้เกิดข้อขัดข้องในอุปกรณ์บางรุ่น (#903)
    • แก้ไข IllegalStateException เมื่อตัวควบคุมการแจ้งเตือนสื่อ เชื่อมต่อไม่เสร็จเมื่อมีการขออัปเดตการแจ้งเตือนครั้งแรก (#917)
  • UI:
    • แก้ไขปัญหาที่ปุ่มกรอไปข้างหน้าและกรอกลับไม่แสดงเมื่อใช้ กับ Material Design ใน BottomSheetDialogFragment (#511)
    • แก้ไขปัญหาที่หมายเลขในปุ่มกรอไปข้างหน้าของ PlayerControlView ไม่ตรงกัน (#547)
  • ส่วนขยาย DASH
    • แยกวิเคราะห์ "f800" เป็นจำนวนช่อง 5 ช่องสำหรับ Dolby ในไฟล์ Manifest DASH (#688)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1, MIDI ฯลฯ)
    • MIDI: แก้ไขปัญหาที่การกรอไปข้างหน้าจะข้ามเหตุการณ์การเปลี่ยนโปรแกรม (#704)
    • ย้ายข้อมูลไปยัง FFmpeg 6.0 และอัปเดต NDK ที่รองรับเป็น r26b (#707, #867)
  • ส่วนขยาย Cast
    • ล้างข้อมูลการสร้าง Timeline เพื่อไม่ให้แอปขัดข้องเมื่อโหลด สื่อไม่สำเร็จในอุปกรณ์แคสต์ (#708)

เวอร์ชัน 1.2.0

15 พฤศจิกายน 2023

  • คลังทั่วไป
    • เพิ่ม@Nullable Throwableพารามิเตอร์ลงในเมธอดในอินเทอร์เฟซ Log.Logger พารามิเตอร์ message ของเมธอดเหล่านี้จะไม่มีข้อมูลเกี่ยวกับ Throwable ที่ส่งไปยังเมธอด Log.{d,i,w,e}() อีกต่อไป ดังนั้นการติดตั้งใช้งานจะต้องผนวกข้อมูลนี้ด้วยตนเองหากต้องการ (อาจใช้ Logger.appendThrowableString(String, Throwable))
    • แก้ไขปัญหาความเข้ากันได้ของ Kotlin ที่ระบบไม่ตรวจหาพารามิเตอร์ประเภททั่วไปที่ยอมรับค่า Null และประเภทองค์ประกอบอาร์เรย์ที่ยอมรับค่า Null ว่าเป็นค่า Null ตัวอย่าง คือพารามิเตอร์เมธอด TrackSelectorResult และ SimpleDecoder (#6792)
    • เปลี่ยนลักษณะการทำงานของ UI และการแจ้งเตือนเริ่มต้นใน Util.shouldShowPlayButton เพื่อแสดงปุ่ม "เล่น" ขณะที่การเล่น ถูกระงับชั่วคราว (เช่น เนื่องจากสูญเสียโฟกัสเสียงชั่วคราว) คุณยังคงใช้ลักษณะการทำงานเดิมได้โดยใช้ PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) หรือ MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213)
    • อัปเกรด androidx.annotation:annotation-experimental เป็น 1.3.1 เพื่อแก้ไข https://issuetracker.google.com/251172715
    • ย้าย ExoPlayer.setAudioAttributes ไปยังอินเทอร์เฟซ Player
  • ExoPlayer:
    • แก้ไขปัญหาการกรอในสตรีม AC4 ที่เกิดจากการระบุตัวอย่าง ที่ถอดรหัสอย่างเดียวไม่ถูกต้อง (#11000)
    • เพิ่มการระงับการเล่นในอุปกรณ์เอาต์พุตเสียงที่ไม่เหมาะสม (เช่น ลำโพงในตัวบนอุปกรณ์ Wear OS) เมื่อเปิดใช้ฟีเจอร์นี้ผ่าน ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput ระบบจะอัปเดตเหตุผลในการระงับการเล่นเป็น Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT หากมีการพยายามเล่น เมื่อไม่มีเอาต์พุตเสียงที่เหมาะสม หรือหากเอาต์พุตที่เหมาะสมทั้งหมดถูกตัดการเชื่อมต่อระหว่างการเล่น ระบบจะนำสาเหตุของการระงับออกเมื่อเชื่อมต่อเอาต์พุตที่เหมาะสม
    • เพิ่ม MediaSource.canUpdateMediaItem และ MediaSource.updateMediaItem เพื่อยอมรับการอัปเดต MediaItem หลังจากสร้างผ่าน Player.replaceMediaItem(s)
    • อนุญาตการอัปเดต MediaItem สำหรับคลาส MediaSource ทั้งหมดที่ไลบรารี ระบุผ่าน Player.replaceMediaItem(s) (#33, #9978)
    • เปลี่ยนชื่อ MimeTypes.TEXT_EXOPLAYER_CUES เป็น MimeTypes.APPLICATION_MEDIA3_CUES
    • เพิ่ม PngExtractor ที่ส่งและอ่านไฟล์ PNG ทั้งหมดลงใน TrackOutput เป็นตัวอย่างเดียว
    • ปรับปรุงSequenceableLoader.continueLoading(long)ในอินเทอร์เฟซ SequenceableLoaderเพื่อ SequenceableLoader.continueLoading(LoadingInfo loadingInfo) LoadingInfo มีพารามิเตอร์เพิ่มเติม ซึ่งรวมถึง playbackSpeed และ lastRebufferRealtimeMs นอกเหนือจาก playbackPositionUs ที่มีอยู่
    • ปรับปรุงChunkSource.getNextChunk(long, long, List, ChunkHolder)เมธอด ในอินเทอร์เฟซ ChunkSource เพื่อChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
    • เพิ่มฟิลด์เพิ่มเติมลงในการบันทึกข้อมูลไคลเอ็นต์สื่อทั่วไป (CMCD): buffer starvation (bs), deadline (dl), playback rate (pr) และ startup (su) (#8699)
    • เพิ่มบิตดีปของความสว่างและสีลงใน ColorInfo (#491)
    • เพิ่มฟิลด์เพิ่มเติมลงในการบันทึกข้อมูลไคลเอ็นต์สื่อทั่วไป (CMCD): คำขอออบเจ็กต์ถัดไป (nor) และคำขอช่วงถัดไป (nrr) (#8699)
    • เพิ่มฟังก์ชันการทำงานเพื่อส่งข้อมูล Common Media Client Data (CMCD) โดยใช้ พารามิเตอร์การค้นหา (#553)
    • แก้ไข ConcurrentModificationException ใน ExperimentalBandwidthMeter (#612)
    • เพิ่มพารามิเตอร์ MediaPeriodId ไปยัง CompositeMediaSource.getMediaTimeForChildMediaTime
    • รองรับ ClippingMediaSource (และแหล่งที่มาอื่นๆ ที่มีออฟเซ็ตเวลาช่วง/หน้าต่าง) ใน ConcatenatingMediaSource2 (#11226)
    • เปลี่ยน BaseRenderer.onStreamChanged() เพื่อรับอาร์กิวเมนต์ MediaPeriodId ด้วย
  • Transformer
    • แยกวิเคราะห์ข้อมูลการหมุน EXIF สำหรับอินพุตรูปภาพ
    • นำTransformationRequest.HdrModeประเภทคำอธิบายประกอบและค่าคงที่ที่เกี่ยวข้องออก โปรดใช้ Composition.HdrMode และค่าคงที่ที่เกี่ยวข้อง แทน
    • ลดความซับซ้อนของ OverlaySettings เพื่อแก้ไขปัญหาการหมุน
    • เปลี่ยนพารามิเตอร์ frameRate และ durationUs ของ SampleConsumer.queueInputBitmap เป็น TimestampIterator
  • การเลือกแทร็ก
    • เพิ่ม DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness เพื่ออนุญาตหรือไม่อนุญาตการดัดแปลงที่ไม่ราบรื่นอย่างชัดเจน ค่าเริ่มต้น จะยังคงเป็นลักษณะการทำงานปัจจุบันของ true
  • โปรแกรมแยกข้อมูล
    • MPEG-TS: ตรวจสอบว่าเฟรมสุดท้ายได้รับการแสดงผลโดยการส่งหน่วยเข้าถึงสุดท้ายของสตรีมไปยังคิวตัวอย่าง (#7909)
    • แก้ไขการสะกดคำผิดเมื่อกำหนด rotationDegrees เปลี่ยน projectionPosePitch เป็น projectionPoseRoll (#461)
    • ยกเลิกสมมติฐานที่ว่าสามารถตรวจสอบอินสแตนซ์ Extractor โดยตรงด้วย instanceof หากต้องการเข้าถึงรายละเอียดการใช้งานของ Extractor ในรันไทม์ คุณต้องเรียกใช้ Extractor.getUnderlyingInstance ก่อน
    • เพิ่ม BmpExtractor
    • เพิ่ม WebpExtractor
    • เพิ่ม HeifExtractor
    • เพิ่มการรองรับ QuickTime แบบคลาสสิก ลงใน Mp4Extractor
  • เสียง:
    • เพิ่มการรองรับ PCM แบบบิ๊กเอนเดียน 24/32 บิตใน MP4 และ Matroska รวมถึงแยกวิเคราะห์ การเข้ารหัส PCM สำหรับ lpcm ใน MP4
    • เพิ่มการรองรับการแยกเสียง Vorbis ใน MP4
    • เพิ่ม AudioSink.getFormatOffloadSupport(Format) ที่ดึงข้อมูลระดับ การรองรับการออฟโหลดที่ Sink สามารถให้สำหรับรูปแบบผ่าน DefaultAudioOffloadSupportProvider โดยจะแสดงผล AudioOffloadSupport ใหม่ที่มี isFormatSupported, isGaplessSupported และ isSpeedChangeSupported
    • เพิ่ม AudioSink.setOffloadMode() ซึ่งจะกำหนดค่าการออฟโหลด ในซิงก์เสียง ค่าเริ่มต้นคือ AudioSink.OFFLOAD_MODE_DISABLED
    • คุณเปิดใช้การออฟโหลดได้ผ่าน setAudioOffloadPreference ใน TrackSelectionParameters หากตั้งค่าให้เปิดใช้ อุปกรณ์รองรับการออฟโหลดสำหรับรูปแบบ และการเลือกแทร็กเป็น แทร็กเสียงเดียว ระบบจะเปิดใช้การออฟโหลดเสียง
    • หากตั้งค่า audioOffloadModePreference เป็น AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED DefaultTrackSelector จะเลือกแทร็กเสียงก็ต่อเมื่อรูปแบบของแทร็กนั้นรองรับการออฟโหลดเท่านั้น หากไม่รองรับแทร็กเสียง ในการออฟโหลด ระบบจะไม่เลือกแทร็กใดๆ
    • ปิดใช้การรองรับการเล่นแบบไม่ขาดตอนสำหรับการออฟโหลดเมื่อเป็น API ระดับต่ำกว่า 33 เนื่องจาก ปัญหาตำแหน่งการเล่นหลังจากเปลี่ยนแทร็ก
    • นำพารามิเตอร์ enableOffload ออกจาก ลายเซ็นของเมธอด DefaultRenderersFactory.buildAudioSink
    • นำวิธีการ DefaultAudioSink.Builder.setOffloadMode ออก
    • Remove intdef value 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 จะไม่เรียกใช้สำหรับตัวอย่าง "ถอดรหัสเท่านั้น" อีกต่อไป เนื่องจากต้องมีการติดตั้งใช้งานที่แสดงผลเป็น 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
    • แก้ไข Race Condition ที่อาจทำให้เกิด IndexOutOfBoundsException เมื่อ เปลี่ยนไปใช้ TCP หรือการเล่นหยุดชะงักในบางสถานการณ์
    • ตรวจสอบสถานะในการตั้งค่า RTSP เมื่อแสดงสถานะการโหลดของ RtspMediaPeriod (#577)
    • ไม่สนใจวิธีการคำขอ Rtsp ที่กำหนดเองในส่วนหัวสาธารณะของการตอบกลับ Options (#613)
    • ใช้ค่าระยะหมดเวลาของคำตอบการตั้งค่า RTSP ในช่วงเวลาของการส่ง คำขอตัวเลือก RTSP แบบ Keep-Alive (#662)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1, MIDI ฯลฯ)
    • เปิดตัวโมดูลตัวถอดรหัส MIDI ซึ่งรองรับการเล่น ไฟล์ MIDI มาตรฐานโดยใช้ไลบรารี Jsyn เพื่อสังเคราะห์เสียง
    • เพิ่ม DecoderOutputBuffer.shouldBeSkipped เพื่อทำเครื่องหมายบัฟเฟอร์เอาต์พุตโดยตรง ซึ่งไม่จำเป็นต้องแสดง เราขอแนะนำให้ใช้C.BUFFER_FLAG_DECODE_ONLYแทน 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 ที่ไม่ถูกต้อง หลังจากล้างเพลย์ลิสต์แล้ว
    • เพิ่มฟิลด์เพิ่มเติมในการบันทึกข้อมูลไคลเอ็นต์สื่อทั่วไป (CMCD): รูปแบบการสตรีม (sf), ประเภทสตรีม (st), เวอร์ชัน (v), บิตเรตสูงสุด (tb), ระยะเวลาของออบเจ็กต์ (d), ปริมาณงานที่วัดได้ (mtp) และประเภทออบเจ็กต์ (ot) (#8699)
  • เสียง:
    • แก้ไขข้อบกพร่องที่ Player.getState() ไม่เปลี่ยนเป็น STATE_ENDED เมื่อเล่นไฟล์ที่สั้นมาก (#538)
  • การส่งต่อเสียง:
    • เพิ่มหน้าส่วนหัวของรหัส Ogg และส่วนหัวของความคิดเห็นลงในบิตสตรีมสำหรับการ เล่น Opus ที่ออฟโหลดตาม RFC 7845
  • วิดีโอ
    • H.265/HEVC: แก้ไขการแยกวิเคราะห์ข้อมูลรูปภาพอ้างอิงระยะสั้นและระยะยาวของ SPS
  • ข้อความ:
    • CEA-608: เปลี่ยนตรรกะการตัดคิวให้พิจารณาเฉพาะข้อความที่มองเห็น ก่อนหน้านี้จะมีการรวมการเยื้องและการชดเชยแท็บเมื่อจำกัดความยาวคิว ไม่เกิน 32 อักขระ (ซึ่งเป็นไปตามข้อกำหนดทางเทคนิค) (#11019)
  • ส่วนขยาย IMA
    • อัปเดตเวอร์ชัน IMA SDK เป็น 3.30.3
  • เซสชัน:
    • เพิ่มเลย์เอาต์ที่กำหนดเองลงในสถานะของตัวควบคุมและระบุ Getter เพื่อ เข้าถึง เมื่อเลย์เอาต์ที่กำหนดเองมีการเปลี่ยนแปลง ระบบจะเรียกใช้ MediaController.Listener.onCustomLayoutChanged แอปที่ ต้องการส่งเลย์เอาต์ที่กำหนดเองที่แตกต่างกันไปยังตัวควบคุม Media3 ที่แตกต่างกัน สามารถทำได้ใน MediaSession.Callback.onConnect โดยใช้ AcceptedResultBuilder เพื่อให้แน่ใจว่าเลย์เอาต์ที่กำหนดเองพร้อมใช้งานสำหรับ ตัวควบคุมเมื่อการเชื่อมต่อเสร็จสมบูรณ์
    • แก้ไขกรณีที่ MediaLibraryServiceLegacyStub ส่งข้อผิดพลาดไปยัง Result ที่ไม่รองรับฟีเจอร์นี้ ซึ่งทำให้เกิด UnsupportedOperationException (#78)
    • แก้ไขวิธีที่ PlayerWrapper สร้าง VolumeProviderCompat โดย กำหนด volumeControlType ผ่านทั้งคำสั่งเดิม (COMMAND_ADJUST_DEVICE_VOLUME และ COMMAND_SET_DEVICE_VOLUME) และคำสั่งใหม่ (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS และ COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554)

เวอร์ชัน 1.1.0

5 กรกฎาคม 2023

  • คลังทั่วไป
    • เพิ่มเหตุผลในการระงับสำหรับเส้นทางเสียงที่ไม่เหมาะสมและเล่นเมื่อพร้อม เปลี่ยนเหตุผลในการระงับว่ายาวเกินไป (#15)
    • เพิ่มคำสั่งลงในเพลเยอร์
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • เพิ่มเมธอดที่โอเวอร์โหลดลงใน Player ซึ่งอนุญาตให้ผู้ใช้ระบุแฟล็กระดับเสียง ได้ ดังนี้
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • เพิ่ม Builder สำหรับ DeviceInfo และเลิกใช้งานตัวสร้างที่มีอยู่
    • เพิ่ม DeviceInfo.routingControllerId เพื่อระบุตัวควบคุมการกำหนดเส้นทาง ID สำหรับการเล่นระยะไกล
    • เพิ่ม 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 ที่จัดส่งโดย Dispatcher อีกต่อไป
    • เปลี่ยนชื่อ ExoTrackSelection.blacklist เป็น excludeTrack และ isBlacklisted เป็น isTrackExcluded
    • แก้ไขลักษณะการทำงานที่ไม่สอดคล้องกันระหว่าง ExoPlayer.setMediaItem(s) กับ addMediaItem(s) เมื่อเรียกใช้ในเพลย์ลิสต์ที่ว่างเปล่า
  • Transformer
    • นำ Transformer.Builder.setMediaSourceFactory(MediaSource.Factory) ออก โปรดใช้ ExoPlayerAssetLoader.Factory(MediaSource.Factory) และ Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory) แทน
    • นำ Transformer.startTransformation(MediaItem, ParcelFileDescriptor) ออก
    • แก้ไขข้อบกพร่องที่ทำให้การเปลี่ยนรูปแบบค้าง (ทำให้เกิดการหมดเวลาของ Muxer ) หากมีการส่งสัญญาณสิ้นสุดสตรีมวิดีโอในขณะที่ เฟรมอินพุตอยู่ระหว่างการประมวลผล
    • ค้นหาตัวแปลงรหัสผ่าน MediaCodecList แทนการใช้ยูทิลิตี findDecoder/EncoderForFormat เพื่อขยายการรองรับ
    • นำการกำหนดค่า B-Frame ใน DefaultEncoderFactory ออกเนื่องจาก ใช้ไม่ได้ในอุปกรณ์บางเครื่อง
  • การเลือกแทร็ก
    • เพิ่ม DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange ซึ่งจะปิดใช้โดยค่าเริ่มต้น เมื่อเปิดใช้ DefaultTrackSelector จะทริกเกอร์การเลือกแทร็กใหม่เมื่อความสามารถของโปรแกรมแสดงผล มีการเปลี่ยนแปลง
  • โปรแกรมแยกข้อมูล
    • Ogg: แก้ไขข้อบกพร่องเมื่อค้นหาในไฟล์ที่มีระยะเวลานาน (#391)
    • FMP4: แก้ไขปัญหาที่ TimestampAdjuster เริ่มต้นออฟเซ็ตการประทับเวลาที่ไม่ถูกต้องด้วยเวลาตัวอย่างข้อมูลเมตาจากอะตอม emsg (#356)
  • เสียง:
    • แก้ไขข้อบกพร่องที่การเล่นบางรายการล้มเหลวเมื่อเปิดใช้การทำอุโมงค์และ AudioProcessorsทำงานอยู่ เช่น สำหรับการตัดแบบไม่เว้นช่องว่าง (#10847)
    • แคปซูลเฟรม Opus ในแพ็กเก็ต Ogg ในการเล่นโดยตรง (การออฟโหลด)
    • ประมาณตำแหน่งปัจจุบันขณะอยู่ในโหมดสลีประหว่างการกำหนดเวลาการออฟโหลด
    • เพิ่ม Renderer.release() และ AudioSink.release() เพื่อเผยแพร่ ทรัพยากรเมื่อสิ้นสุดวงจรของผู้เล่น
    • ฟังการเปลี่ยนแปลงความสามารถด้านเสียงใน DefaultAudioSink เพิ่มพารามิเตอร์ที่จำเป็น context ในตัวสร้างของ DefaultAudioSink ซึ่ง DefaultAudioSink จะลงทะเบียนเป็น Listener ของ AudioCapabilitiesReceiver และอัปเดตพร็อพเพอร์ตี้ audioCapabilities เมื่อได้รับแจ้งการเปลี่ยนแปลงความสามารถ
    • เผยแพร่การเปลี่ยนแปลงความสามารถด้านเสียงผ่านเหตุการณ์ใหม่ onAudioCapabilitiesChanged ในอินเทอร์เฟซ AudioSink.Listener และ อินเทอร์เฟซใหม่ RendererCapabilities.Listener ซึ่งทริกเกอร์เหตุการณ์ onRendererCapabilitiesChanged
    • เพิ่ม ChannelMixingAudioProcessor เพื่อใช้การปรับขนาด/การมิกซ์กับช่องเสียง
    • เพิ่มค่า int ใหม่ DISCARD_REASON_AUDIO_BYPASS_POSSIBLE ไปยัง DecoderDiscardReasons เพื่อทิ้งตัวถอดรหัสเสียงเมื่อโหมดบายพาส เป็นไปได้หลังจากความสามารถด้านเสียงเปลี่ยนแปลง
    • เพิ่มการรองรับการเล่นโดยตรงสำหรับ DTS Express และ DTS:X (#335)
  • วิดีโอ
    • ทำให้ MediaCodecVideoRenderer รายงาน VideoSize ที่มีความกว้างและความสูงเป็น 0 เมื่อปิดใช้โปรแกรมแสดงผล Player.Listener.onVideoSizeChanged จะเรียกใช้ตามนั้นเมื่อ Player.getVideoSize() มีการเปลี่ยนแปลง การเปลี่ยนแปลงนี้จะทำให้ขนาดวิดีโอของ ExoPlayer ที่มี MediaCodecVideoRenderer มีความกว้างและความสูงเป็น 0 เมื่อ Player.getCurrentTracks ไม่รองรับวิดีโอ หรือยังไม่ได้กำหนดขนาดของแทร็กวิดีโอที่รองรับ
  • DRM:
    • ลดระดับการมองเห็นของเมธอดภายในเท่านั้นหลายรายการใน DefaultDrmSession ซึ่งไม่คาดว่าจะมีการเรียกจากภายนอกแพ็กเกจ DRM ดังนี้
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • เพิ่มไลบรารี Muxer ใหม่ซึ่งใช้สร้างไฟล์คอนเทนเนอร์ MP4 ได้
  • ส่วนขยาย IMA
    • เปิดใช้สตรีม DASH แบบสดหลายช่วงเวลาสำหรับ DAI โปรดทราบว่าการใช้งานในปัจจุบันยังไม่รองรับการกรอสตรีมแบบสด (#10912)
    • แก้ไขข้อบกพร่องที่ทำให้มีการแทรกกลุ่มโฆษณาใหม่ในไลฟ์สดเนื่องจาก ตำแหน่งเนื้อหาที่คำนวณแล้วในไทม์ไลน์ที่ต่อเนื่องจะแตกต่างกันเล็กน้อย
  • เซสชัน:
    • เพิ่มเมธอดตัวช่วย MediaSession.getControllerForCurrentRequest เพื่อ รับข้อมูลเกี่ยวกับคอนโทรลเลอร์ที่เรียกใช้เมธอด Player อยู่ในขณะนี้
    • เพิ่ม androidx.media3.session.MediaButtonReceiver เพื่อให้แอป ใช้การเล่นต่อด้วยเหตุการณ์ปุ่มสื่อที่ส่งโดย เช่น ชุดหูฟังบลูทูธ (#167)
    • เพิ่มการติดตั้งใช้งานเริ่มต้นใน MediaSession.Callback.onAddMediaItems เพื่อ อนุญาตให้ส่ง MediaItems ที่ขอไปยัง Player หากมี LocalConfiguration (เช่น URI) (#282)
    • เพิ่มปุ่มคำสั่ง "ข้ามไปยังก่อนหน้า" และ "ข้ามไปยังถัดไป" ในมุมมองการแจ้งเตือนสื่อแบบกะทัดรัดโดยค่าเริ่มต้นสำหรับ Android 12 และต่ำกว่า (#410)
    • เพิ่มการติดตั้งใช้งานเริ่มต้นใน MediaSession.Callback.onAddMediaItems เพื่อ อนุญาตให้ส่ง MediaItems ที่ขอไปยัง Player หากมี LocalConfiguration (เช่น URI) (#282)
    • เพิ่มปุ่มคำสั่ง "ข้ามไปยังก่อนหน้า" และ "ข้ามไปยังถัดไป" ในมุมมองการแจ้งเตือนสื่อแบบกะทัดรัดโดยค่าเริ่มต้นสำหรับ Android 12 และต่ำกว่า (#410)
  • UI:
    • เพิ่มเมธอด Util shouldShowPlayButton และ handlePlayPauseButtonAction เพื่อเขียนองค์ประกอบ UI ที่กำหนดเองด้วย ปุ่มเล่น/หยุดชั่วคราว
  • ส่วนขยาย RTSP
    • สำหรับ MPEG4-LATM ให้ใช้ค่า profile-level-id เริ่มต้นหากไม่มีในข้อความ SDP ของการตอบกลับ Describe (#302)
    • ใช้ URI ฐานสำหรับการแก้เส้นทางแบบสัมพัทธ์จากเซสชัน 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
    • นำค่าคงที่ String ที่เลิกใช้งานแล้วสำหรับ Charsets (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME และ UTF16LE_NAME) ออก แล้วใช้ Kotlin Charsets จากแพ็กเกจ kotlin.text, java.nio.charset.StandardCharsets หรือ com.google.common.base.Charsets แทน
    • นำตัวสร้าง WorkManagerScheduler ที่เลิกใช้งานแล้วออก ให้ใช้ตัวสร้างที่ยังไม่เลิกใช้งานซึ่งมีตัวเลือกในการระบุพารามิเตอร์ Context แทน
    • นำเมธอดที่เลิกใช้งานแล้ว createVideoSampleFormat, createAudioSampleFormat, createContainerFormat และ createSampleFormat ซึ่งใช้เพื่อสร้างอินสแตนซ์ของคลาส Format ออก แต่ให้ใช้ Format.Builder เพื่อสร้างอินสแตนซ์ของ Format แทน
    • นำเมธอดที่เลิกใช้งานแล้ว copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate และ copyWithVideoSize ออก แล้วใช้เมธอด Format.buildUpon() และ setter แทน
    • นำ ExoPlayer.retry() ที่เลิกใช้งานแล้วออก แล้วใช้ prepare() แทน
    • นำตัวสร้าง DefaultTrackSelector ที่เลิกใช้งานแล้วซึ่งไม่มีอาร์กิวเมนต์ออก แล้วใช้ DefaultTrackSelector(Context) แทน
    • นำตัวสร้าง OfflineLicenseHelper ที่เลิกใช้งานแล้วออก แล้วใช้ OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher) แทน
    • นำตัวสร้าง DownloadManager ที่เลิกใช้งานแล้วออก ให้ใช้ตัวสร้าง ที่รับ Executor แทน
    • นำตัวสร้าง Cue ที่เลิกใช้งานแล้วออก แล้วใช้ Cue.Builder แทน
    • นำตัวสร้าง OfflineLicenseHelper ที่เลิกใช้งานแล้วออก แล้วใช้ OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher) แทน
    • นำเมธอด AnalyticsListener ที่เลิกใช้งานแล้ว 4 รายการออก
      • onDecoderEnabled ให้ใช้ onAudioEnabled และ/หรือ onVideoEnabled แทน
      • onDecoderInitialized ให้ใช้ onAudioDecoderInitialized และ/หรือ onVideoDecoderInitialized แทน
      • onDecoderInputFormatChanged ให้ใช้ onAudioInputFormatChanged และ/หรือ onVideoInputFormatChanged แทน
      • onDecoderDisabled ให้ใช้ onAudioDisabled และ/หรือ onVideoDisabled แทน
    • นำ Player.Listener.onSeekProcessed และ AnalyticsListener.onSeekProcessed ที่เลิกใช้งานแล้วออก แล้วใช้ onPositionDiscontinuity กับ DISCONTINUITY_REASON_SEEK แทน
    • นำ ExoPlayer.setHandleWakeLock(boolean) ออก แล้วใช้ setWakeMode(int) แทน
    • นำ DefaultLoadControl.Builder.createDefaultLoadControl() ที่เลิกใช้งานแล้วออก แล้วใช้ build() แทน
    • นำ MediaItem.PlaybackProperties ที่เลิกใช้งานแล้วออก แล้วใช้ MediaItem.LocalConfiguration แทน ฟิลด์ที่เลิกใช้งานแล้ว MediaItem.playbackProperties ตอนนี้เป็นประเภท MediaItem.LocalConfiguration

เวอร์ชัน 1.1.0-rc01

21 มิถุนายน 2023

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

เวอร์ชัน 1.1.0-beta01

7 มิถุนายน 2023

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

เวอร์ชัน 1.1.0-alpha01

10 พฤษภาคม 2023

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

เวอร์ชัน 1.0.0

เวอร์ชัน 1.0.2

18 พฤษภาคม 2023

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

รุ่นนี้สอดคล้องกับรุ่น ExoPlayer 2.18.7

รุ่นนี้มีการเปลี่ยนแปลงต่อไปนี้ตั้งแต่รุ่น 1.0.1

  • ไลบรารีหลัก
    • เพิ่ม Buffer.isLastSample() ที่ระบุว่า Buffer มีแฟล็ก C.BUFFER_FLAG_LAST_SAMPLE หรือไม่
    • แก้ไขปัญหาที่เฟรมสุดท้ายอาจไม่ได้รับการแสดงผลหากมีการนำตัวอย่างสุดท้ายที่มีเฟรม ออกจากคิวโดยไม่ได้อ่านตัวอย่าง "สิ้นสุดสตรีม" (#11079)
  • โปรแกรมแยกข้อมูล
    • แก้ไขการแยกวิเคราะห์ SPS ของ H.265 ในไฟล์ MPEG-TS โดยการนำตรรกะการแยกวิเคราะห์ ที่ตัวแยก RTSP และ MP4 ใช้ อยู่แล้วมาใช้ซ้ำ (#303)
  • ข้อความ:
    • SSA: เพิ่มการรองรับไฟล์ UTF-16 หากไฟล์เริ่มต้นด้วยเครื่องหมายลำดับไบต์ (#319)
  • เซสชัน:
    • แก้ไขปัญหาที่ MediaController ไม่อัปเดตคำสั่งที่พร้อมใช้งาน เมื่อเชื่อมต่อกับ MediaSessionCompat รุ่นเดิมที่อัปเดต การดำเนินการ
    • แก้ไขข้อบกพร่องที่ทำให้ MediaLibraryService ไม่แสดงค่า Null สำหรับ การเรียกจาก UI ของระบบไปยัง Callback.onGetLibraryRoot โดยมี params.isRecent == true ใน API 30 (#355)
    • แก้ไขปัญหาหน่วยความจำรั่วไหลของ MediaSessionService หรือ MediaLibraryService (#346)
    • แก้ไขข้อบกพร่องที่การอัปเดต Timeline และตำแหน่งร่วมกันใน MediaSession อาจทำให้ MediaController แสดง IllegalStateException

เวอร์ชัน 1.0.1

18 เมษายน 2023

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

รุ่นนี้สอดคล้องกับรุ่น ExoPlayer 2.18.6

  • ไลบรารีหลัก
    • รีเซ็ตการลบล้างไลฟ์สดเป้าหมายเมื่อกรอไปยังตำแหน่งเริ่มต้น (#11051)
    • แก้ไขข้อบกพร่องที่ทำให้สตรีมตัวอย่างที่ว่างเปล่าในสื่ออาจทำให้การเล่นค้าง
  • เซสชัน:
    • แก้ไขข้อบกพร่องที่ทำให้รายการในคิวที่เหมือนกันหลายรายการซึ่งเผยแพร่โดยรุ่นเดิม MediaSessionCompat ส่งผลให้เกิดข้อยกเว้นใน MediaController (#290)
    • เพิ่มการส่งต่อ MediaSession.broadcastCustomCommand ที่ขาดหายไปไปยัง MediaControllerCompat.Callback.onSessionEvent รุ่นเดิม (#293)
    • แก้ไขข้อบกพร่องในเรื่องที่การเรียกใช้ MediaSession.setPlayer ไม่ได้อัปเดต คำสั่งที่ใช้ได้
    • แก้ไขปัญหาที่ระบบไม่สนใจTrackSelectionOverrideอินสแตนซ์ที่ส่งจากMediaControllerหากอ้างอิงกลุ่มที่มีFormat.metadata (#296)
    • แก้ไขปัญหาที่ Player.COMMAND_GET_CURRENT_MEDIA_ITEM ต้องพร้อมใช้งานเพื่อเข้าถึงข้อมูลเมตาผ่าน MediaSessionCompat เดิม
    • แก้ไขปัญหาที่อินสแตนซ์ MediaSession ในเธรดเบื้องหลังทำให้เกิดข้อขัดข้องเมื่อใช้ใน MediaSessionService (#318)
    • แก้ไขปัญหาที่ไลบรารีประกาศตัวรับปุ่มสื่อ โดยที่แอปไม่ได้ตั้งใจให้เป็นเช่นนั้น (#314)
  • DASH:
    • แก้ไขการจัดการไทม์ไลน์ของกลุ่มที่ว่างเปล่า (#11014)
  • RTSP:
    • ลองอีกครั้งด้วย TCP หากการตั้งค่า RTSP ด้วย UDP ล้มเหลวโดยมีข้อผิดพลาด RTSP 461 UnsupportedTransport (#11069)

เวอร์ชัน 1.0.0

22 มีนาคม 2023

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

รุ่นนี้สอดคล้องกับรุ่น ExoPlayer 2.18.5

ไม่มีการเปลี่ยนแปลงตั้งแต่เวอร์ชัน 1.0.0-rc02

เวอร์ชัน 1.0.0-rc02

2 มีนาคม 2023

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

รุ่นนี้สอดคล้องกับรุ่น ExoPlayer 2.18.4

  • ไลบรารีหลัก
    • แก้ไขการตรวจหาประเภทเครือข่ายใน API 33 (#10970)
    • แก้ไข NullPointerException เมื่อโทรหา ExoPlayer.isTunnelingEnabled (#10977)
  • การดาวน์โหลด
    • กำหนดค่าความแตกต่างสูงสุดของเวลาเริ่มต้นของ 2 กลุ่มที่จะผสานได้ใน SegmentDownloader และคลาสย่อย (#248)
  • เสียง:
    • แก้ไขการเล่น MP3 แบบไม่มีช่องว่างที่ขัดข้องในอุปกรณ์ Samsung (#8594)
    • แก้ไขข้อบกพร่องที่ความเร็วในการเล่นที่ตั้งค่าทันทีหลังจากปิดใช้เสียงอาจถูกแทนที่ด้วยการเปลี่ยนความเร็วครั้งก่อนหน้า (#10882)
  • วิดีโอ
    • แมปรูปแบบ HEVC HDR10 ไปยัง HEVCProfileMain10HDR10 แทนที่จะเป็น HEVCProfileMain10
    • เพิ่มวิธีแก้ปัญหาสำหรับปัญหาเกี่ยวกับอุปกรณ์ใน Chromecast พร้อม Google TV และ Lenovo M10 FHD Plus ที่ทำให้ระบบทำเครื่องหมายสตรีม AVC ที่ 60fps ว่า ไม่รองรับ (#10898)
    • แก้ไขปัญหาด้านประสิทธิภาพการปล่อยเฟรมเมื่อเล่นสื่อที่มีอัตราเฟรมสูงกว่าอัตราการรีเฟรชหน้าจอมาก
  • แคสต์
    • แก้ไขปัญหาชั่วคราวSTATE_IDLEเมื่อเปลี่ยนระหว่างรายการสื่อ (#245)
  • RTSP:
    • ดักจับ IllegalArgumentException ที่เกิดขึ้นในการแยกวิเคราะห์ข้อความตอบกลับ RTSP Describe ที่ไม่ถูกต้อง (#10971)
  • เซสชัน:
    • แก้ไขข้อบกพร่องที่ปุ่มเล่น/หยุดชั่วคราวของการแจ้งเตือนไม่อัปเดตตาม สถานะของเพลเยอร์ (#192)
  • ส่วนขยาย IMA
    • แก้ไขข้อบกพร่องที่ทำให้สตรีม DAI ที่ไม่มีโฆษณาเริ่มต้นไม่ได้ เนื่องจากไม่ได้รับLOADEDเหตุการณ์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)
  • เซสชัน:
    • เพิ่มคลาส Abstract SimpleBasePlayer เพื่อช่วยใช้Playerอินเทอร์เฟซ สำหรับเพลเยอร์ที่กำหนดเอง
    • เพิ่มเมธอดตัวช่วยเพื่อแปลงโทเค็นเซสชันแพลตฟอร์มเป็น Media3 SessionToken (#171)
    • ใช้ onMediaMetadataChanged เพื่อทริกเกอร์การอัปเดตสื่อแพลตฟอร์ม เซสชัน (#219)
    • เพิ่มเซสชันสื่อเป็นอาร์กิวเมนต์ของ getMediaButtons() ของ DefaultMediaNotificationProvider และใช้รายการที่ไม่เปลี่ยนค่าเพื่อความชัดเจน (#216)
    • เพิ่ม onSetMediaItems callback listener เพื่อให้สามารถแก้ไข/ตั้งค่า MediaItem รายการ ดัชนีเริ่มต้น และตำแหน่งตามเซสชันก่อนที่จะตั้งค่า ในเพลเยอร์ (#156)
    • หลีกเลี่ยงการตรวจหาการแตะสองครั้งสำหรับเหตุการณ์ปุ่มสื่อที่ไม่ใช่บลูทูธ (#233)
    • ทำให้ QueueTimeline มีความเสถียรมากขึ้นในกรณีที่สถานะเซสชันเดิมไม่น่าไว้วางใจ (#241)
  • ข้อมูลเมตา
    • แยกวิเคราะห์ค่าหลายค่าที่คั่นด้วยค่า Null จากเฟรม ID3 ตามที่ ID3 v2.4 อนุญาต
    • เพิ่ม MediaMetadata.mediaType เพื่อระบุประเภทเนื้อหาหรือประเภท โฟลเดอร์ที่อธิบายโดยข้อมูลเมตา
    • เพิ่ม MediaMetadata.isBrowsable แทน MediaMetadata.folderType เราจะเลิกใช้งานประเภทโฟลเดอร์ใน รุ่นถัดไป
  • ส่วนขยาย Cast
    • อัปเกรดเวอร์ชัน Cast SDK เป็น 21.2.0
  • ส่วนขยาย IMA
    • นำเครื่องมือฟังเพลเยอร์ของ ImaServerSideAdInsertionMediaSource on the application thread ออกเพื่อหลีกเลี่ยงปัญหาเกี่ยวกับเธรด
    • เพิ่มพร็อพเพอร์ตี้ focusSkipButtonWhenAvailable ลงใน ImaServerSideAdInsertionMediaSource.AdsLoader.Builder เพื่อขอ โฟกัสปุ่มข้ามบนอุปกรณ์ทีวีและตั้งค่าเป็น true โดยค่าเริ่มต้น
    • เพิ่มเมธอด 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 สามารถโหลดบิตแมปจาก file:// URI (#108)
    • แก้ไขการยืนยันที่ทำให้ MediaController ไม่สามารถกรอโฆษณาใน ระยะเวลาหนึ่งได้ (#122)
    • เมื่อการเล่นสิ้นสุดลง ระบบจะหยุด MediaSessionService จาก เบื้องหน้าและแสดงการแจ้งเตือนให้เริ่มเล่นรายการสื่อที่เล่นล่าสุดอีกครั้ง (#112)
    • อย่าเริ่มบริการที่ทำงานอยู่เบื้องหน้าด้วย PendingIntent สำหรับการหยุดชั่วคราว (#167)
    • ซ่อน "ป้าย" ที่เชื่อมโยงกับการแจ้งเตือนที่สร้างโดย DefaultNotificationProvider ใน API 26 และ API 27 ด้วยตนเอง (ระบบจะซ่อนป้ายโดยอัตโนมัติใน API 28 ขึ้นไป) (#131)
    • แก้ไขข้อบกพร่องที่การเชื่อมต่อ Binder ที่ 2 จาก MediaSession เดิมไปยัง MediaController ของ Media3 ทำให้เกิด IllegalStateExceptions (#49)
  • RTSP:
    • เพิ่มการจัดการแพ็กเกตที่แยกส่วนของ H263 (#119)
    • เพิ่มการรองรับ MP4A-LATM (#162)
  • IMA:
    • เพิ่มการหมดเวลาสำหรับการโหลดข้อมูลโฆษณาเพื่อจัดการกรณีที่ IMA SDK โหลดโฆษณาไม่สำเร็จ (#10510)
    • ป้องกันการข้ามโฆษณาตอนกลางเมื่อกรอเนื้อหาไปจนจบ (#10685)
    • คำนวณระยะเวลาของกรอบเวลาสำหรับสตรีมแบบสดที่มีโฆษณาที่แทรกฝั่งเซิร์ฟเวอร์อย่างถูกต้อง เช่น IMA DAI (#10764)
  • ส่วนขยาย FFmpeg
    • เพิ่มแฟล็กที่จำเป็นใหม่เพื่อลิงก์ไลบรารี FFmpeg กับ NDK 23.1.7779620 ขึ้นไป (#9933)
  • ส่วนขยาย AV1
    • อัปเดตเวอร์ชัน CMake เพื่อหลีกเลี่ยงปัญหาความไม่เข้ากันกับ Android Studio เวอร์ชันล่าสุด (#9933)
  • ส่วนขยาย Cast
    • ใช้ getDeviceInfo() เพื่อระบุ CastPlayer เมื่อ ควบคุมการเล่นด้วย MediaController (#142)
  • Transformer
    • เพิ่มตัวจับเวลาการตรวจสอบ Muxer เพื่อตรวจหาเมื่อการสร้างตัวอย่างเอาต์พุตช้าเกินไป
  • นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
    • นำ 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 จะตรวจสอบการเปลี่ยนแปลงในพร็อพเพอร์ตี้ Spatializer และทริกเกอร์การเลือกแทร็กใหม่เมื่อมีการเปลี่ยนแปลง อุปกรณ์ที่มี television โหมด UI จะได้รับการยกเว้นจากข้อจำกัดเหล่านี้ และระบบจะเลือกใช้รูปแบบที่มีจำนวนช่องสูงสุด หากต้องการเปิดใช้ฟีเจอร์นี้ ต้องสร้างอินสแตนซ์ DefaultTrackSelector ด้วย Context
  • วิดีโอ
    • เปลี่ยนชื่อ DummySurface เป็น PlaceholderSurface
    • เพิ่มการรองรับ AV1 ลงใน MediaCodecVideoRenderer.getCodecMaxInputSize
  • เสียง:
    • ใช้การโฆษณาตัวถอดรหัสเสียง AC3 ของ LG ที่มีประเภท MIME ที่ไม่ใช่มาตรฐาน
    • เปลี่ยนประเภทการคืนค่าของ AudioAttributes.getAudioAttributesV21() จาก android.media.AudioAttributes เป็นคลาส Wrapper AudioAttributesV21 ใหม่ เพื่อป้องกันไม่ให้ ART ยืนยันช้าใน API < 21
    • สอบถามแพลตฟอร์ม (API 29 ขึ้นไป) หรือถือว่าจำนวนช่องการเข้ารหัสเสียง สำหรับการส่งผ่านเสียงเมื่อไม่ได้ตั้งค่าจำนวนช่องเสียงของรูปแบบ ซึ่งเกิดขึ้นกับการเตรียม HLS แบบไม่มี Chunk (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 แบบช่องเดียวและไม่แทรกสลับ ระบบไม่รองรับเพย์โหลด RTP ของ AMR แบบผสม (#46)
    • เพิ่มโปรแกรมอ่าน RTP สำหรับ VP8 (#47)
    • เพิ่มโปรแกรมอ่าน RTP สำหรับ WAV (#56)
    • แก้ไขส่วนหัวการให้สิทธิ์พื้นฐานของ RTSP (#9544)
    • หยุดตรวจสอบฟิลด์ SDP ที่บังคับเนื่องจาก ExoPlayer ไม่ต้องการฟิลด์เหล่านั้น (#10049)
    • ส่งข้อยกเว้นที่ตรวจสอบแล้วเมื่อแยกวิเคราะห์การกำหนดเวลา RTSP (#10165)
    • เพิ่มโปรแกรมอ่าน RTP สำหรับ VP9 (#47)
    • เพิ่มโปรแกรมอ่าน RTP สำหรับ OPUS (#53)
  • แหล่งข้อมูล
    • เปลี่ยนชื่อ DummyDataSource เป็น PlaceholderDataSource
    • วิธีแก้ปัญหาการจัดการการขัดจังหวะ OkHttp
  • เซสชัน:
    • แทนที่ MediaSession.MediaItemFiller ด้วย MediaSession.Callback.onAddMediaItems เพื่ออนุญาตการแก้ไขแบบอะซิงโครนัส ของคำขอ
    • รองรับเมธอด setMediaItems(s) เมื่อ MediaController เชื่อมต่อกับ เซสชันสื่อเดิม
    • นำ MediaController.setMediaUri และ MediaSession.Callback.onSetMediaUri ออก คุณสามารถใช้ฟังก์ชันการทำงานเดียวกันนี้ได้โดยใช้ MediaController.setMediaItem และ MediaSession.Callback.onAddMediaItems
    • ส่งต่อการโทรผ่าน MediaController เวอร์ชันเดิมเพื่อเล่นสื่อไปยัง MediaSession.Callback.onAddMediaItems แทน onSetMediaUri
    • เพิ่ม MediaNotification.Provider และ DefaultMediaNotificationProvider เพื่อปรับแต่งการแจ้งเตือน
    • เพิ่ม BitmapLoader และ SimpleBitmapLoader สำหรับดาวน์โหลดภาพอาร์ตเวิร์ก
    • เพิ่ม MediaSession.setCustomLayout() เพื่อให้เข้ากันได้แบบย้อนหลัง กับเซสชันเดิม
    • เพิ่ม MediaSession.setSessionExtras() เพื่อให้ฟีเจอร์เทียบเท่ากับเซสชันเดิม
    • เปลี่ยนชื่อ MediaSession.MediaSessionCallback เป็น MediaSession.Callback MediaLibrarySession.MediaLibrarySessionCallback เป็น MediaLibrarySession.Callback และ MediaSession.Builder.setSessionCallback เป็น setCallback
    • แก้ไข NPE ใน MediaControllerImplLegacy (#59)
    • อัปเดตข้อมูลตำแหน่งเซสชันในไทม์ไลน์ change(#51)
    • แก้ไข NPE ใน MediaControllerImplBase หลังจากปล่อยตัวควบคุม (#74)
  • การเล่นโฆษณา / IMA
    • ลดอัตราการสำรวจโฆษณาจากทุกๆ 100 มิลลิวินาทีเป็นทุกๆ 200 มิลลิวินาที เพื่อให้สอดคล้องกับ คำแนะนำของ Media Rating Council (MRC)
  • ส่วนขยาย FFmpeg
    • อัปเดตเวอร์ชัน CMake เป็น 3.21.0+ เพื่อหลีกเลี่ยงข้อบกพร่องของ CMake ที่ทำให้การซิงค์ Gradle ของ Android Studio ล้มเหลว (#9933)
  • นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
    • นำ Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray) ออก โปรดใช้ Player.Listener.onTracksChanged(Tracks) แทน
    • นำ Player.getCurrentTrackGroups และ Player.getCurrentTrackSelections ออก โปรดใช้ Player.getCurrentTracks แทน นอกจากนี้ คุณยังใช้ ExoPlayer.getCurrentTrackGroups และ ExoPlayer.getCurrentTrackSelections ต่อไปได้ แม้ว่าวิธีการเหล่านี้จะยังคง เลิกใช้งานแล้วก็ตาม
    • นำค่าคงที่ DownloadHelper DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT และ DEFAULT_TRACK_SELECTOR_PARAMETERS ออก โปรดใช้ getDefaultTrackSelectorParameters(Context) แทนหากเป็นไปได้ และ DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT ในกรณีอื่นๆ
    • นำตัวสร้าง DefaultTrackSelector(ExoTrackSelection.Factory) ออก โปรดใช้ DefaultTrackSelector(Context, ExoTrackSelection.Factory) แทน
    • นำ Transformer.Builder.setContext ออก ควรส่ง Context ไปยังตัวสร้าง Transformer.Builder แทน

เวอร์ชัน 1.0.0-alpha03

14 มีนาคม 2022

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

ซึ่งสอดคล้องกับการเปิดตัว ExoPlayer 2.17.1

  • เสียง:
    • แก้ไขข้อผิดพลาดในการตรวจสอบความสามารถด้านเสียงสำหรับ Dolby Atmos (E-AC3-JOC) ใน HLS
  • โปรแกรมแยกข้อมูล
    • FMP4: แก้ไขปัญหาที่อาจมีการส่งออกข้อมูลเมตาของตัวอย่าง emsg ในลำดับที่ไม่ถูกต้องสำหรับสตรีมที่มีทั้งอะตอม emsg v0 และ v1 (#9996)
  • ข้อความ:
    • แก้ไขการโต้ตอบของ SingleSampleMediaSource.Factory.setTrackId และ MediaItem.SubtitleConfiguration.Builder.setId เพื่อจัดลำดับความสำคัญของฟิลด์ SubtitleConfiguration และกลับไปใช้ค่า Factory หากไม่ได้ตั้งค่า (#10016)
  • การเล่นโฆษณา
    • แก้ไขการขาดหายของเสียงระหว่างช่วงโฆษณาในสตรีม HLS SSAI แบบสด

เวอร์ชัน 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)
    • นำคีย์ที่เป็นค่าว่างออกจาก 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 และค่าสถานะบทบาทที่ต้องการเมื่อเลือกแทร็กวิดีโอหลายรายการเพื่อการดัดแปลง (#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)
    • ลองสร้างอีกครั้งหากขนาดบัฟเฟอร์ที่ขอมีขนาดมากกว่า 1 MBAudioTrack (#9712)
  • โปรแกรมแยกข้อมูล
    • WAV: เพิ่มการรองรับสตรีม RF64 (#9543)
    • แก้ไขการแยกวิเคราะห์หน่วย SPS NAL ของ H.265 ที่ไม่ถูกต้อง (#9719)
    • แยกวิเคราะห์ความคิดเห็น Vorbis (รวมถึง METADATA_BLOCK_PICTURE) ในไฟล์ Ogg Opus และ Ogg Vorbis
  • ข้อความ:
    • เพิ่มฟิลด์ MediaItem.SubtitleConfiguration.id ซึ่งจะส่งไปยังฟิลด์ Format.id ของแทร็กคำบรรยายที่สร้างจากการกำหนดค่า (#9673)
    • เพิ่มการรองรับพื้นฐานสำหรับคำบรรยาย WebVTT ในคอนเทนเนอร์ Matroska (#9886)
    • ป้องกันไม่ให้ Cea708Decoder อ่านเกินขนาดที่ประกาศไว้ของบล็อกบริการ
  • DRM:
    • นำ playbackLooper ออกจาก DrmSessionManager.(pre)acquireSession เมื่อแอปใช้ DrmSessionManager ใน MediaSource ที่กำหนดเอง คุณจะต้องส่ง playbackLooper ไปยัง DrmSessionManager.setPlayer แทน
  • การเล่นโฆษณา / IMA
    • เพิ่มการรองรับ การแทรกโฆษณาแบบไดนามิก (DAI) ของ IMA (#8213)
    • เพิ่มวิธีการAdPlaybackStateเพื่ออนุญาตให้รีเซ็ตกลุ่มโฆษณาเพื่อให้ เล่นได้อีกครั้ง (#9615)
    • บังคับใช้ความเร็วในการเล่น 1.0 ระหว่างการเล่นโฆษณา (#9018)
    • แก้ไขปัญหาที่กลุ่มโฆษณาโหลดไม่สำเร็จทำให้เกิดการ รีเซ็ตการเล่น ทันที (#9929)
  • UI:
    • แก้ไขสีของตัวเลขในปุ่มStyledPlayerViewกรอถอยหลังและ กรอไปข้างหน้าเมื่อใช้ธีมบางธีม (#9765)
    • แปลสตริงความเร็วในการเล่นให้ถูกต้อง (#9811)
  • DASH:
    • เพิ่มพร็อพเพอร์ตี้ที่จำเป็นและเพิ่มเติมที่แยกวิเคราะห์แล้วลงใน Representation (#9579)
    • รองรับบทบาทการติดตาม forced-subtitle (#9727)
    • หยุดตีความบทบาทของแทร็ก main เป็น C.SELECTION_FLAG_DEFAULT
    • แก้ไขตรรกะการยกเว้น URL ฐานสำหรับไฟล์ Manifest ที่ไม่ได้ประกาศเนมสเปซ DVB (#9856)
    • รองรับ URL แบบสัมพัทธ์ MPD.Location (#9939)
  • HLS:
    • ป้อนข้อมูล Format.label สำหรับสตรีม HLS ที่มีเสียงเท่านั้นอย่างถูกต้อง (#9608)
    • ใช้การเตรียมข้อมูลแบบไม่มีการแบ่งกลุ่มโดยค่าเริ่มต้นเพื่อปรับปรุงเวลาเริ่มต้น หาก เวอร์ชันของคุณมีแทร็กคำบรรยายแทนเสียงแบบมัลติเพล็กซ์ที่ไม่ได้ประกาศ ในเพลย์ลิสต์หลัก คุณควรเพิ่มแทร็กเหล่านั้นลงในเพลย์ลิสต์หลักเพื่อให้ พร้อมสำหรับการเล่น หรือปิดการเตรียมข้อมูลแบบไม่มีการแบ่งกลุ่มด้วย HlsMediaSource.Factory.setAllowChunklessPreparation(false)
    • รองรับการกรอไปข้างหน้า/ย้อนกลับที่แม่นยำใน HLS (#2882)
  • RTSP:
    • ระบุ API ไคลเอ็นต์เพื่อลบล้าง SocketFactory ที่ใช้สำหรับการเชื่อมต่อเซิร์ฟเวอร์ (#9606)
    • เลือกวิธีการตรวจสอบสิทธิ์ DIGEST แทน BASIC หากมีทั้ง 2 วิธี (#9800)
    • จัดการเมื่อเวลาของแทร็ก RTSP ไม่พร้อมใช้งาน (#9775)
    • ละเว้นค่าส่วนหัว RTP-Info ที่ไม่ถูกต้อง (#9619)
  • Transformer
    • เพิ่มเวอร์ชัน API ขั้นต่ำที่จำเป็นเป็น 21
    • TransformationException ตอนนี้ใช้เพื่ออธิบายข้อผิดพลาดที่เกิดขึ้น ระหว่างการเปลี่ยนรูปแบบ
    • เพิ่ม TransformationRequest เพื่อระบุตัวเลือกการเปลี่ยนรูปแบบ
    • อนุญาตให้ลงทะเบียนผู้ฟังได้หลายคน
    • แก้ไขปัญหาที่ Transformer ค้างเมื่ออ่านเอาต์พุตของตัวแปลงรหัสบางส่วน
    • แก้ไข NPE ที่อาจเกิดขึ้นใน Transformer.getProgress เมื่อเผยแพร่ Muxer throws
    • เพิ่มแอปตัวอย่างเพื่อใช้การเปลี่ยนรูปแบบ
  • ส่วนขยาย MediaSession
    • โดยค่าเริ่มต้น MediaSessionConnector จะล้างเพลย์ลิสต์เมื่อหยุดเล่น แอปที่ต้องการเก็บเพลย์ลิสต์ไว้สามารถเรียกใช้ setClearMediaItemsOnStop(false) ในตัวเชื่อมต่อได้
  • ส่วนขยาย Cast
    • แก้ไขข้อบกพร่องที่ทำให้ CastPlayer โทรหา onIsPlayingChanged อย่างไม่ถูกต้อง (#9792)
    • รองรับข้อมูลเมตาของเสียง รวมถึงอาร์ตเวิร์กด้วย DefaultMediaItemConverter (#9663)
  • ส่วนขยาย FFmpeg
    • ทำให้ build_ffmpeg.sh ขึ้นอยู่กับ binutils ของ 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 โฮสต์อยู่ในโปรเจ็กต์ ExoPlayer GitHub แยกต่างหาก ใน Media3 ชื่อแพ็กเกจคือ androidx.media3.exoplayer เราวางแผนที่จะดูแลรักษาและ เผยแพร่โปรเจ็กต์ ExoPlayer GitHub ต่อไปอีกระยะหนึ่งเพื่อให้แอปมีเวลาในการย้ายข้อมูลไปยัง Media3 Media3 มีโมดูลทดแทนสำหรับโมดูล ExoPlayer ทั้งหมดยกเว้น ส่วนขยาย media2 และ mediasession เดิม ซึ่งจะแทนที่ด้วยโมดูล media3-session ใหม่ ซึ่งช่วยให้ผสานรวมโดยตรงระหว่างเพลเยอร์กับ เซสชันสื่อได้โดยไม่ต้องใช้คลาสอะแดปเตอร์/ตัวเชื่อมต่อ