Media3

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

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

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

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

ดึงดูด

dependencies {
    def media3_version = "1.8.0"

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

    // 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.9.0

เวอร์ชัน 1.9.0-alpha01

22 ตุลาคม 2025

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

  • คลังทั่วไป
    • อัปเดต minSdk เป็น 23 ให้สอดคล้องกับไลบรารี AndroidX อื่นๆ
    • เพิ่ม PlayerTransferState ซึ่งช่วยให้โอนสถานะการเล่น ระหว่างอินสแตนซ์ Player ได้
    • เพิ่มเมธอด void mute() และ void unmute() ลงใน Player เพื่อรักษา และคืนค่าระดับเสียงของ Player ก่อนและหลังการตั้งค่าเป็น ศูนย์
    • เผยแพร่คลาสยูทิลิตี WakeLockManager, WifiLockManager, AudioFocusManager, AudioBecomingNoisyManager และ StuckPlayerDetector ที่ก่อนหน้านี้ใช้โดย ExoPlayer ภายในเพื่ออนุญาต การนำกลับมาใช้ซ้ำสำหรับผู้เล่นรายอื่น (#1893)
    • แก้ไขการจัดการ Listener เมื่อเครื่องเล่นที่มอบสิทธิ์พื้นฐานใช้ความเท่าเทียมกันของการอ้างอิงเพื่อเปรียบเทียบอินสแตนซ์ Listener (#2675)ForwardingPlayer
    • เพิ่มPlayer.listenToฟังก์ชันส่วนขยายการระงับใน media3-common-ktx ไลบรารีที่ระบุPlayer.Eventsที่ควรดำเนินการ
    • แก้ไขข้อขัดข้องใน BasePlayer.getBufferedPercentage ที่เกิดจากจำนวนเต็ม ล้นเมื่อตำแหน่งบัฟเฟอร์ที่รายงานมีค่ามากกว่าระยะเวลาที่รายงานอย่างไม่น่าเชื่อ (#2750)
  • ExoPlayer:
    • เพิ่มการตรวจหาโปรแกรมเล่นที่ค้างซึ่งจะทริกเกอร์StuckPlayerException ข้อผิดพลาดของโปรแกรมเล่นหากโปรแกรมเล่นดูเหมือนจะค้าง กรณีนี้จะเกิดขึ้นในกรณีต่อไปนี้ โดยคุณสามารถกำหนดค่าการหมดเวลาเริ่มต้นแต่ละรายการได้ใน ExoPlayer.Builder หากจำเป็น
      • หลังจากSTATE_BUFFERING 10 นาทีขณะพยายามเล่นและไม่มีความคืบหน้าในการบัฟเฟอร์
      • หลังจากผ่านไป 10 วินาทีขณะพยายามเล่นและไม่มีความคืบหน้าในการเล่นSTATE_READY
      • หลังจาก STATE_READY นาทีที่เกินระยะเวลาที่ประกาศไว้โดยที่ ยังไม่ถึงจุดสิ้นสุดของรายการ
      • หลังจากผ่านไป 10 นาทีโดยมีเหตุผลในการระงับการเล่นขณะพยายาม เล่น
    • เปิดใช้การจัดการ Wake Lock โดยค่าเริ่มต้นเพื่อแก้ไขปัญหาเกี่ยวกับการบัฟเฟอร์ระหว่าง การเล่นในเบื้องหลัง ซึ่งเทียบเท่ากับการตั้งค่า ExoPlayer.Builder.setWakeMode เป็น C.WAKE_MODE_LOCAL
    • เพิ่มตรรกะการฟังเพื่ออัปเดตรหัสอุปกรณ์เสมือนโดยอัตโนมัติเมื่อมีการรายงานการเปลี่ยนแปลงไปยัง Context ที่ส่งไปยัง ExoPlayer.Builder ในตอนแรก
    • เพิ่ม ExoPlayer.setVirtualDeviceId เพื่ออัปเดตรหัสอุปกรณ์เสมือนที่ได้รับจาก Context ที่ส่งไปยัง ExoPlayer.Builder ด้วยตนเอง
    • ตรวจสอบว่าโปรแกรมแสดงผลไม่ได้ใช้ข้อมูลจากรายการในเพลย์ลิสต์ถัดไปนานกว่า 10 วินาทีก่อนที่รายการปัจจุบันจะสิ้นสุด
    • เพิ่ม setSeekBackIncrementMs, setSeekForwardIncrementMs และ setMaxSeekToPreviousPositionMs ลงใน ExoPlayer เพื่ออัปเดตการตั้งค่าเหล่านี้ หลังการก่อสร้าง (#2736)
    • เพิ่มฟังก์ชันการแคชล่วงหน้าใน DefaultPreloadManager ตอนนี้แอปสามารถ ส่งคืน DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs) หรือ DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs) ผ่าน TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData) เพื่อระบุว่าต้องแคชล่วงหน้าสำหรับรายการสื่อ
    • ใช้ฟังก์ชันการแคชล่วงหน้าของ DefaultPreloadManager ในแอปเดโมแบบวิดีโอสั้น
    • เพิ่ม DefaultLoadControl.Builder ตัวตั้งค่าสำหรับการเล่นในเครื่องและปรับ ค่าเริ่มต้นของ DefaultLoadControl ให้ทำงานได้ดีกับไฟล์ในเครื่อง ที่หลากหลาย
    • แก้ไขข้อบกพร่องที่การตั้งค่าเพลย์ลิสต์ว่างเปล่าอาจทำให้เพลเยอร์อยู่ในสถานะ STATE_READYหรือSTATE_BUFFERING
    • ปรับปรุง API ของเครื่องมือจัดการการโหลดล่วงหน้า
      • เพิ่ม addMediaItems(List<MediaItem>, List<T>) และ addMediaSources(List<MediaSource>, List<T>) ที่เพิ่มรายการสื่อ หรือแหล่งที่มาของสื่อเป็นชุด และเรียกใช้ invalidate() โดยอัตโนมัติในภายหลัง
      • เพิ่ม removeMediaItems((List<MediaItem>) และ removeMediaSources(List<MediaSource>) ที่นำรายการสื่อ หรือแหล่งที่มาของสื่อออกเป็นชุด และตรวจสอบว่าเครื่องมือจัดการการโหลดล่วงหน้า จะไม่เริ่มโหลดล่วงหน้าหรือโหลดล่วงหน้าต่อสำหรับรายการใดๆ หลังจาก นำออก
      • อนุญาตให้ DefaultPreloadManager.setCurrentPlayingIndex(int) ยกเลิกตัวเองโดยอัตโนมัติ แอปไม่จำเป็นต้องเรียกใช้ invalidate() อย่างชัดเจนอีกต่อไปหลังจากอัปเดตดัชนี การเล่นปัจจุบัน
    • เพิ่มความสามารถในการข้ามการรีเซ็ตคีย์เฟรมสำหรับการกรอไปข้างหน้าภายในกลุ่มรูปภาพเดียวกันขณะอยู่ในโหมดการลาก
    • เพิ่ม DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) เพื่อให้แอปตั้งค่าไบต์บัฟเฟอร์เป้าหมายสำหรับเพลเยอร์ที่มี playerName ที่ระบุ ตอนนี้ DefaultLoadControl สามารถตัดสินใจ ของผู้เล่นแต่ละคนแยกกันได้โดยอิงตามไบต์ที่จัดสรรและไบต์ บัฟเฟอร์เป้าหมายของตนเอง
    • เพิ่ม SkipInfo ลงใน AdPlaybackState.AdGroup เพื่อส่งข้อมูลการข้าม สำหรับโฆษณาแต่ละรายการในกลุ่มโฆษณา
    • แก้ไขข้อบกพร่องที่การเรียกใช้ removeMediaItems(List) ระหว่างเล่น โฆษณาหลังม้วนฟิล์มทำให้เกิดข้อขัดข้อง (#2746)
    • แก้ไขการเล่นเพลย์ลิสต์ที่กระตุกบางครั้งซึ่งเกิดจากการตั้งค่าเฟรมเป็นตัวอย่างสุดท้ายและแสดงผลอย่างไม่ถูกต้อง เสมอ
    • เปิดใช้เส้นทางการลองอีกครั้งหากเพลเยอร์สร้างรหัสเซสชันเสียงไม่สำเร็จ (#2382, #2678)
    • เพิ่มการรองรับเพื่อควบคุมไบต์บัฟเฟอร์ทั้งหมดสำหรับแหล่งที่มาใน DefaultPreloadManager เพื่อหลีกเลี่ยงไม่ให้ไบต์บัฟเฟอร์ทั้งหมดสำหรับการโหลดล่วงหน้าจาก เพิ่มขึ้นโดยพลการ หากต้องการใช้ตรรกะการควบคุมเริ่มต้น แอปสามารถตั้งค่า ไบต์ของบัฟเฟอร์เป้าหมายสำหรับการโหลดล่วงหน้าผ่าน DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) สำหรับ playerName ของ PlayerId.Preload.name ("preload") และแทรก DefaultLoadControl ที่สร้างขึ้นผ่าน DefaultPreloadManager.Builder.setLoadControl(LoadControl)
  • CompositionPlayer:
    • เผยแพร่ CompositionPlayer ภายใต้คำอธิบายประกอบ @ExperimentalApi ใหม่เพื่อ ระบุว่าพร้อมสำหรับการทดสอบ แต่ยังอยู่ระหว่าง การพัฒนา API บางรายการมีแนวโน้มที่จะเปลี่ยนแปลงอย่างมากในรุ่น ต่อๆ ไป และมีปัญหาและข้อจำกัดที่ทราบเกี่ยวกับกรณีการใช้งานบางอย่าง (บางอย่างไม่มีในเอกสาร)
    • เพิ่มการรองรับ COMMAND_SET_AUDIO_ATTRIBUTES และการจัดการโฟกัสเสียง ใน CompositionPlayer
    • เพิ่มการรองรับการเปลี่ยนความเร็วในลำดับรองใน CompositionPlayer
  • Transformer
    • ใช้ InAppMp4Muxer เป็นตัวมัลติเพล็กซ์เริ่มต้น
    • เพิ่ม EditedMediaItem.Builder#setSpeed() และเลิกใช้งาน Effects#createExperimentalSpeedChangingEffects()
    • แทนที่ forceAudioTrack และ forceVideoTrack ด้วย trackTypes ใน EditedMediaItemSequence
  • การเลือกแทร็ก
    • เพิ่ม TrackSelectionParameters.selectTextByDefault เพื่อเลือกแทร็กข้อความใดก็ได้โดยไม่ต้องระบุค่ากำหนดอื่นๆ ที่เฉพาะเจาะจงกว่า
    • เพิ่ม preferredVideoLabels, preferredAudioLabels และ preferredTextLabels ใน TrackSelectionParameters เพื่อระบุ ค่ากำหนดสำหรับแทร็กที่มีป้ายกำกับเฉพาะ เช่น แทร็กที่อ่านจาก แท็ก HLS NAME (#1666)
  • โปรแกรมแยกข้อมูล
    • FLAC: ปรับปรุงการตรวจหาส่วนหัวเพื่อลดโอกาสที่จะพบส่วนหัวที่ไม่ถูกต้องในข้อมูล FLAC ที่เข้ารหัส ซึ่งจะส่งผลให้เกิดข้อผิดพลาดในการถอดรหัส (#558)
    • MP3: อนุญาตให้มีช่องว่างระหว่าง (และก่อน) แท็ก ID3 ที่จุดเริ่มต้นของไฟล์ MP3 (#811, #5718)
    • MP4: แยกความแตกต่างระหว่างประเภท MIME ของ audio/mpeg (MP3), audio/mpeg-L1 และ audio/mpeg-L2 โดยการดูค่าเลเยอร์ของตัวอย่างแรก ก่อนที่จะปล่อยรูปแบบแทร็กจากตัวแยก (#2683)
    • MP4: ปรับปรุงประสิทธิภาพการดมกลิ่นของไฟล์ขนาดใหญ่มากโดยถือว่ากล่อง stbl ที่มีขนาดใหญ่กว่า 1 MB หมายความว่าไฟล์ต้องไม่เป็นแบบแยกส่วน (#2650)
    • Matroska: เพิ่มการรองรับการตรวจหา DTS-HD (#6225)
    • แก้ไขปัญหาใน MatroskaExtractor ที่การกรออาจไม่ถูกต้อง สำหรับไฟล์ที่มีหลายแทร็ก ตอนนี้ระบบจะเชื่อมโยงคิวพอยต์กับแทร็กที่เกี่ยวข้องอย่างถูกต้อง ซึ่งจะช่วยให้การกรอแม่นยำยิ่งขึ้น
    • MP4: เพิ่มการรองรับข้อมูลเมตา ©mvn (ชื่อการเคลื่อนไหว) และ ©mvi (ดัชนีการเคลื่อนไหว) ซึ่งตอนนี้จะแสดงเป็นออบเจ็กต์ TextInformationFrame ใน Format.metadata โดยมีรหัสเป็น MVNM และ MVIN ตามลำดับ (#2754)
    • MPEG-TS: แก้ไข IllegalArgumentException จาก ReorderingBufferQueue ที่เกิดจากแพ็กเก็ต PES ที่ไม่มีการประทับเวลา (#2764)
    • MP4: ละเว้นแทร็กที่ไม่มีกล่อง stsd (แทนที่จะแยกวิเคราะห์ทั้งไฟล์ไม่สำเร็จ)
    • เพิ่มการรองรับการแยกรูปภาพเคลื่อนไหว HEIC HeifExtractor สามารถ แยกวิเคราะห์ไฟล์ HEIC ที่มีแทร็กวิดีโอและเสียงที่ฝังอยู่ได้แล้ว
    • MP3: เปลี่ยน FLAG_ENABLE_INDEX_SEEKING เพื่อให้ต้องการค้นหาข้อมูล จากส่วนหัวของข้อมูลเมตา (เช่น Xing และ VBRI) เมื่อมี และกลับไปใช้ การค้นหาตามดัชนีหากไม่มีข้อมูลการค้นหาอื่นๆ ซึ่งจะ ปรับปรุงประสิทธิภาพสำหรับไฟล์ที่มีข้อมูลเมตาการค้นหา (#2839)
  • Inspector:
    • เปิดตัวโมดูล :media3-inspector ใหม่เพื่อเป็นหน้าแรกเฉพาะสำหรับยูทิลิตีการตรวจสอบสื่อ ตอนนี้โมดูลนี้มีandroidx.media3.inspector.MetadataRetrieverใหม่ ซึ่งจะให้ API แบบรวมสําหรับทั้งข้อมูลเมตาและการแยกเฟรม ตอนนี้เราเลิกใช้งาน androidx.media3.exoplayer.MetadataRetriever ที่มีอยู่แล้วและหันมาใช้ เวอร์ชันใหม่นี้แทน
    • เปิดตัว androidx.media3.inspector.FrameExtractor ซึ่งเป็น API สาธารณะใหม่ สำหรับการแยกเฟรม AutoCloseable คลาสนี้มีวิธี แยกเฟรมที่รองรับวิดีโอ HDR, เอฟเฟกต์วิดีโอ และการเลือกตัว ถอดรหัสที่กำหนดเอง โดยควรสร้างผ่าน Builder สำหรับ MediaItemที่เฉพาะเจาะจง
    • FrameExtractor: เพิ่ม getThumbnail() เพื่อดึงเฟรมภาพขนาดย่อที่เป็นตัวแทนจากไฟล์สื่อโดยไม่ต้องระบุการประทับเวลาที่เฉพาะเจาะจง
  • เสียง:
    • ทำให้AudioProcessorอินสแตนซ์รับรู้การกรอ
    • อนุญาตให้แทรกอินเทอร์เฟซ AudioOutputProvider ใหม่ลงใน DefaultAudioSink.Builder เพื่อรองรับเส้นทางเอาต์พุตเสียงที่กำหนดเอง ค่าเริ่มต้นคือ AudioTrackAudioOutputProvider
    • การเลื่อนโดยใช้แฮนเดิลในGainProcessor
    • ใช้ความสามารถของโปรไฟล์และระดับตัวถอดรหัส AC-4 ในการประเมินการรองรับรูปแบบแทร็ก (#2580)
    • หลีกเลี่ยงความล่าช้าที่อาจเกิดขึ้นจากการจัดการการเรียกกลับการเปลี่ยนแปลงการกำหนดเส้นทางที่ จุดเริ่มต้นของการเล่น (#2646)
    • อนุญาตให้ใช้ตัวแปลงรหัสซ้ำสำหรับรูปแบบ EAC3, EAC3-JOC และ AC-4 (#1346)
    • เพิ่มการรองรับตัวอย่าง PCM แบบลอยใน Sonic
    • เพิ่มการรองรับตัวอย่าง PCM 16 บิตใน ToFloatPcmAudioProcessor
  • วิดีโอ
    • ปิดใช้การนำตัวแปลงรหัสกลับมาใช้ซ้ำสำหรับเนื้อหา Dolby Vision ที่มีโปรไฟล์ต่างกัน
  • ข้อความ:
    • แก้ไขการแยกวิเคราะห์คำบรรยายแทนเสียง CEA-6/708 ในเนื้อหา Dolby Vision (#2775)
  • รูปภาพ:
    • แก้ไขปัญหา ScrubbingMode ที่ทำให้เพลเยอร์ค้างขณะกรอแทร็กภาพขนาดย่อ DASH (#2815)
  • DRM:
    • เปลี่ยนประเภทการคืนค่าของเมธอด MediaDrmCallback จาก byte[] เป็นประเภท MediaDrmCallback.Response ใหม่ เพื่อให้ส่งคืนข้อมูลเพิ่มเติมที่ไม่บังคับได้ นี่เป็นการเปลี่ยนแปลงที่ทำให้เกิดข้อขัดข้องในแหล่งที่มา แต่สามารถแก้ไขข้อขัดข้องได้ง่ายๆ โดยการห่อbyte[]ค่าที่ส่งคืนก่อนหน้าด้วย new Response ก่อนที่จะส่งคืน
    • เพิ่มข้อมูลคำขอคีย์ เช่น URL และเวลาในการตอบสนอง ไปยัง AnalyticsListener.onDrmKeysLoaded (#1001)
    • ย้ายข้อมูลคำขอการจัดสรรจากพารามิเตอร์ URL ไปยังเนื้อหา POST
  • Muxers:
    • เพิ่ม MediaMuxerCompat ซึ่งเป็นตัวแทนที่ใช้แทนเฟรมเวิร์ก MediaMuxer ได้
    • เพิ่ม MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo() เพื่ออนุญาต การสร้างภาพเคลื่อนไหว
    • เพิ่ม WebmMuxer เพื่ออนุญาตให้มัลติเพล็กซ์สตรีมสื่อ OPUS, VORBIS, VP8 และ VP9 ลงในรูปแบบไฟล์ webm
  • ส่วนขยาย IMA
    • การนำกฎ ProGuard ที่กำหนดเองออก เพื่อให้แอปสามารถใช้กฎที่เผยแพร่ใน ที่เก็บถาวรของ IMA สำหรับ Android แทนได้
    • เพิ่ม ImaServerSideAdInsertionUriBuilder.setNetworkCode ซึ่งเป็น API ใหม่สำหรับ การตั้งรหัสเครือข่าย Google Ad Manager ให้ IMA SDK จัดการตัวระบุโฆษณา ตามที่ระบุในการตั้งค่า Google Ad Manager รหัสเครือข่าย ไม่บังคับ แต่แนะนำสำหรับคำขอสตรีมแบบ Full Service หากต้องการค้นหารหัสเครือข่าย โปรดดูบทความนี้
    • อัปเดตการขึ้นต่อกันของ IMA เป็น 3.37.0 ซึ่งต้องเปิดใช้การลบการอ้างอิงไลบรารีหลัก แอปที่ขึ้นต่อกันจะต้องเปิดใช้ฟีเจอร์นี้ด้วย ดูหมายเหตุเกี่ยวกับการกำหนดค่าของ IMA
    • รองรับตัวเลือก UI ที่กำหนดเองของ IMA DAI ในเครื่องมือสร้าง URI ของ SSAI ตัวเลือก UI ที่กำหนดเอง สำหรับการแทรกโฆษณาฝั่งเซิร์ฟเวอร์ประกอบด้วยการรองรับการแสดงผล "ข้ามได้" และ "เกี่ยวกับโฆษณานี้" ปัจจุบันฟีเจอร์นี้พร้อมให้บริการแก่ผู้เผยแพร่โฆษณาบางรายที่อยู่ในรายการที่อนุญาต การเปลี่ยนแปลงนี้ยังอัปเกรด IMA SDK เป็นเวอร์ชัน 3.38.0 (หมายเหตุประจำรุ่น) เพื่อเข้าถึง API ตัวเลือก UI ที่กำหนดเองด้วย
  • เซสชัน:
    • เพิ่มพารามิเตอร์ใหม่ใน MediaSession.Callback.onPlaybackResumption เพื่อ ระบุว่าการเรียกเกิดขึ้นเพื่อรวบรวมข้อมูลเท่านั้นหรือเพื่อเริ่ม การเล่น (#1764)
    • อัปเดต MediaSession.ControllerInfo.isTrusted เพื่อประกาศ คอนโทรลเลอร์จากแอปของตัวเองเป็นคอนโทรลเลอร์ที่เชื่อถือได้ด้วย (#2542)
    • เพิ่ม MediaSessionService.triggerNotificationUpdate เพื่อทริกเกอร์การอัปเดต การแจ้งเตือนด้วยตนเอง (#1833)
    • เพิ่ม ProgressListener ลงในวิธีการคำสั่งที่กำหนดเอง
    • เปลี่ยนค่าเริ่มต้นสำหรับ MediaLibrarySession.Builder.setLibraryErrorReplicationMode เป็นไม่ ร้ายแรง
    • เพิ่มContextพารามิเตอร์ไปยัง MediaButtonReceiver.onForegroundServiceStartNotAllowedException (#2625)
    • อ่านรหัสควบคุมระดับเสียงจากแพลตฟอร์ม PlaybackInfo แทนที่จะ ดึงข้อมูลผ่าน Binder ซึ่งจะช่วยให้มั่นใจได้ว่าระบบจะอ่านประเภทการเล่นและระดับเสียง รหัสควบคุมแบบอะตอมและตรงกัน
    • แก้ไขข้อบกพร่องที่กรองACTION_UPเหตุการณ์สำคัญออกก่อนส่ง ไปยังการเรียกกลับเพื่อการจัดการที่กำหนดเอง ซึ่งจะทำให้การทำงานสอดคล้องกับสิ่งที่ media1 ทำและสิ่งที่แพลตฟอร์มทำ (#2637)
    • แก้ไขข้อบกพร่องที่ getCurrentTimeline() ถูกเรียกใช้โดย PlayerWrapper แม้ว่าคำสั่งจะไม่พร้อมใช้งานก็ตาม (#2665)
    • แก้ไขข้อบกพร่องที่ทำให้ข้อความยังคงอยู่ในคิวข้อความของ Looper หลัก ซึ่งทำให้เกิดการรั่วไหลของหน่วยความจำหลังจากที่บริการสิ้นสุดลง (#2692)
    • เมื่อเชื่อมต่อกับแอปเซสชันเดิมที่มี MediaBrowser ระบบจะส่งคำสั่งที่กำหนดเองไปยังเซสชันก็ต่อเมื่อมีการโฆษณาการดำเนินการที่กำหนดเองเป็นการดำเนินการที่กำหนดเองใน PlaybackStateCompat ของเซสชันเดิม ระบบจะส่งการกระทำที่กำหนดเองอื่นๆ ทั้งหมดไปยังบริการ
    • ใช้ onAudioSessionIdChanged เพื่อแจ้งตัวควบคุมสื่อเมื่อเซสชันตั้งค่ารหัสเซสชันเสียง (#244)
    • แก้ไขข้อบกพร่องที่ KEYCODE_HEADSETHOOK ไม่ได้เริ่มโปรแกรมเล่นเมื่อมีเหตุการณ์คีย์สื่อ Intent มาถึงใน onStartCommand() ปัญหานี้ได้รับการแก้ไขแล้ว โดยการจัดการ "KEYCODE_HEADSETHOOK" เช่นเดียวกับ KEYCODE_MEDIA_PLAY_PAUSE (#2816)
    • แก้ไขข้อบกพร่องที่ไม่ได้สื่อสารขนาดของ Surface ระหว่างเซสชัน และตัวควบคุม ซึ่งส่งผลให้ใช้เอฟเฟกต์วิดีโอใน เซสชันเดโมไม่สำเร็จ หากคุณใช้ตัวควบคุม นี่อาจเป็นการเปลี่ยนแปลงที่ทำให้เกิดข้อผิดพลาดหากเพลเยอร์ของคุณจัดการการเรียกใช้ setVideoSurfaceHolder ไม่ได้
    • แก้ไขการส่งต่อค่าข้อมูลเมตาที่ไม่ใช่ String CharSequence เช่น สตริงที่จัดรูปแบบด้วยแท็ก span (#2853)
  • UI:
    • เพิ่มคลาส ProgressStateWithTickInterval และ Composable ที่เกี่ยวข้องลงในโมดูล media3-ui-composerememberProgressStateWithTickInterval โดยใช้ตัวยึดสถานะนี้ใน demo-compose เพื่อแสดงตำแหน่งปัจจุบันและระยะเวลาในรูปแบบข้อความ
    • เพิ่ม MuteButtonState ไปยัง ui-compose ที่จัดการการปิดเสียงของ Player ระดับเสียง โดยจะใช้ตัวยึดสถานะนี้ใน demo-compose เพื่อแสดง ปุ่มเปิด/ปิดเสียง
    • เพิ่มคลาส ProgressStateWithTickCount และ Composable ที่เกี่ยวข้อง rememberProgressStateWithTickCount ลงในโมดูล media3-ui-compose โดยจะใช้ตัวยึดสถานะนี้ใน demo-compose เพื่อแสดงความคืบหน้า เป็นแถบความคืบหน้าแบบอ่านอย่างเดียวแนวนอน
    • เพิ่ม ContentFrame Composable ไปยัง media3-ui-compose ซึ่งรวมการจัดการ PlayerSurface เข้ากับการปรับขนาดสัดส่วนภาพและการครอบด้วยชัตเตอร์
    • แก้ไขข้อบกพร่องที่ทราบในแพลตฟอร์ม API 34 ซึ่งทำให้วิดีโอถูกยืด/ครอบตัด เมื่อใช้ SurfaceView ภายใน Compose AndroidView และส่งผลต่อ Composables ContentFrame และ PlayerSurface ที่มี SURFACE_TYPE_SURFACE_VIEW (#1237, #2811)
    • สร้างmedia3-ui-compose-material3โมดูลใหม่และเพิ่ม Composables ที่มีธีม Material3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton) ลงในโมดูล
    • เพิ่มการรองรับการวางปุ่มเส้นทางสื่อใน PlayerView
  • ส่วนขยาย HLS
    • แยกวิเคราะห์แอตทริบิวต์การข้ามโฆษณาคั่นระหว่างหน้าของ HLS
    • แมปแอตทริบิวต์การควบคุมการข้ามจากเพลย์ลิสต์ HLS และเอกสารรายการเนื้อหา ลงใน AdPlaybackState เพื่อการเข้าถึงแบบสาธารณะ
    • แก้ไขข้อบกพร่องที่เวลาเริ่มต้นของเพลย์ลิสต์หายไปเมื่อนำแท็ก EXT-X-PROGRAM-START-DATE ที่กำหนดเวลาเริ่มต้นออกจาก เพลย์ลิสต์ (#2760)
    • ใช้การค้นหาแบบไบนารีเพื่อค้นหาดัชนีกลุ่มของตำแหน่งที่กำหนดใน เพลย์ลิสต์ (#2826
  • ส่วนขยาย DASH
    • แก้ไขปัญหา UnsupportedOperationException เมื่อเล่นสตรีม DASH ที่มีไฟล์ Manifest URI data: แบบไม่ลำดับชั้น (#2688)
    • รีเซ็ต LiveConfiguration เป็นค่าที่ระบุโดย MediaItem ของ DashMediaSource เมื่อเผยแพร่และเมื่อผู้ใช้อัปเดตรายการสื่อ (#2606)
    • หลีกเลี่ยงการขัดข้องที่เกิดจากการอัปเดต Manifest ที่ไม่ถูกต้องซึ่งไม่ได้รายงาน เป็นข้อผิดพลาดของเพลเยอร์ (#2805)
  • ส่วนขยาย RTSP
    • จัดการข้อผิดพลาดของแพ็กเก็ต RTP ที่ขาดหายไปเมื่อประมวลผลหน่วย NAL ที่แยกส่วน สำหรับ H264 และ H265 (#2613)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ)
    • ส่วนขยาย AV1: ตอนนี้ตัวถอดรหัสซอฟต์แวร์ AV1 ใช้ไลบรารีdav1dประสิทธิภาพสูง แทนการติดตั้งใช้งานlibgav1ก่อนหน้านี้เพื่อ ปรับปรุงความเร็วในการถอดรหัส
  • ส่วนขยาย Cast
    • เพิ่ม CastPlayer.Builder ซึ่งจะช่วยให้ CastPlayer เล่นทั้งไฟล์ในเครื่อง และไฟล์ที่แคสต์ได้ หากต้องการคงลักษณะการทำงานแบบเดิมของ CastPlayer ที่รองรับเฉพาะการเล่นผ่าน Cast คุณสามารถใช้ RemoteCastPlayer ได้ ตัวสร้างที่มีอยู่ก่อนหน้า CastPlayerจะยังคงมีลักษณะการทำงานแบบเดิม แต่จะเลิกใช้งานเพื่อหันไปใช้ตัวสร้าง CastPlayer หรือ RemoteCastPlayer แทน
    • หยุดบังคับใช้ประเภท MIME ที่ไม่ใช่ Null ใน DefaultMediaItemConverter
    • ใช้ MediaItem.mediaMetadata.mediaType เพื่ออนุมาน MEDIA_TYPE ของ Cast ที่จะใช้ใน DefaultCastOptionsProvider#toMediaQueueItem เมื่อมี
    • เปิดใช้การโอนจากระยะไกลไปยังเครื่องใน DefaultCastOptionsProvider
    • เพิ่มการรองรับ Cast ในการสาธิตเซสชัน
    • เพิ่มการรองรับการแสดงปุ่มเส้นทางสื่อใน Composable UI
    • เพิ่มการรองรับการแสดงปุ่มเส้นทางสื่อในเมนูแถบการทำงาน
    • เพิ่มการรองรับการแสดงปุ่มเส้นทางสื่อเป็น UI ของมุมมอง
  • โปรแกรมทดสอบ:
    • เพิ่มความแตกต่างของเวลาสูงสุดสำหรับลักษณะการทำงานของการเลื่อนอัตโนมัติของ FakeClock โดยค่าเริ่มต้นจะเป็น 1 วินาที แต่กำหนดค่าได้ผ่าน FakeClock.Builder
    • เพิ่มความแตกต่างของเวลาสูงสุดระหว่างข้อความสำหรับ RobolectricUtil.runMainLooperUntil (และ runLooperUntil) โดยค่าเริ่มต้นจะเป็น 1 วินาที แต่กำหนดค่าได้ผ่านการโอเวอร์โหลดใหม่ของเมธอดเหล่านี้
    • ย้าย CapturingRenderersFactory จาก test-utils ไปยัง test-utils-robolectric
  • นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
    • นำตัวสร้าง DefaultPreloadManager ที่เลิกใช้งานแล้วออก โปรดใช้ DefaultPreloadManager.Builder แทน
    • นำตัวสร้าง EditedMediaItemSequence ที่เลิกใช้งานแล้วออก โปรดใช้ EditedMediaItemSequence.Builder แทน

เวอร์ชัน 1.8.0

เวอร์ชัน 1.8.0

30 กรกฎาคม 2025

เวอร์ชัน 1.8.0 มีการเปลี่ยนแปลงเหล่านี้

  • คลังทั่วไป
    • เพิ่มการรองรับการแทนที่เพลเยอร์ใน ForwardingSimpleBasePlayer
  • ExoPlayer:
    • เพิ่ม Getter สำหรับโหมดสุ่มไปยังอินเทอร์เฟซ ExoPlayer (#2522)
    • ส่งข้อยกเว้นให้ชัดเจนยิ่งขึ้นหากมีการเข้าถึง DefaultAudioSink จาก หลายเธรด หากเกิดกรณีนี้เนื่องจากการเรียกใช้ RendererCapabilities.getFormatSupport นอกเพลเยอร์ โปรดตรวจสอบ ว่าได้เรียกใช้เมธอดนี้ในเธรดเดียวกันกับเธรดการเล่นของ ExoPlayer หรือ ใช้อินสแตนซ์อื่นที่ไม่ใช่อินสแตนซ์ที่ใช้สำหรับการเล่น (#1191)
    • แก้ไขข้อบกพร่องที่ระบบอาจทำเครื่องหมายรูปแบบเสียงที่ไม่ใช่สเตอริโอบนทีวีว่าDefaultTrackSelectorไม่รองรับ
    • ตรวจสอบว่าเฟรมสุดท้ายได้รับการแสดงผลอย่างถูกต้องเมื่อใช้แฟล็ก DECODE_ONLY ของ MediaCodec (ซึ่งเปิดใช้โดยค่าเริ่มต้นในโหมดการกวาด)
    • เพิ่มการรองรับการใช้รหัสอุปกรณ์เสมือนจาก Context ที่ส่งไปยัง ExoPlayer.Builder
    • เปิดใช้การจัดเวลาแบบไดนามิกโดยค่าเริ่มต้นในโหมดขัด
    • หลีกเลี่ยงการโหลดแหล่งที่มาซ้ำโดยไม่จำเป็นเมื่อกรอรายการไปจนถึงตอนท้าย
    • ใช้ MediaCodec.BUFFER_FLAG_DECODE_ONLY โดยค่าเริ่มต้นในโหมดการลาก
    • ส่ง IllegalStateException เมื่อ PreloadMediaSource เล่นโดย ExoPlayer ที่มีเธรดการเล่นต่างจากเธรดการโหลดล่วงหน้า (#2495)
    • เพิ่ม cloneAndMove ลงใน ShuffleMode ด้วยการติดตั้งใช้งานเริ่มต้น (#2226)
    • เปลี่ยนลักษณะการทำงานเริ่มต้นของ Renderer.getMinDurationToProgressUs เพื่อ แสดงค่าที่ใหญ่ขึ้นหากไม่จำเป็นต้องเรียกใช้ render
    • แก้ไขข้อบกพร่องที่การจัดกำหนดการภายในทำให้เฟรมสุดท้ายล่าช้าเมื่อกรอไปยัง จุดสิ้นสุดขณะหยุดชั่วคราว ตอนนี้การแก้ไขข้อบกพร่องจะมีผลก็ต่อเมื่อเปิดใช้ ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled
    • เพิ่มExoPlayer.setScrubbingModeEnabled(boolean)วิธีการ ซึ่งจะเพิ่มประสิทธิภาพ เพลเยอร์สำหรับการกรอหลายครั้ง (เช่น จากผู้ใช้ที่ลาก แถบเลื่อนไปมา) คุณปรับแต่งลักษณะการทำงานของโหมดการกวาดได้ ด้วย setScrubbingModeParameters(..) ใน ExoPlayer และ ExoPlayer.Builder
    • อนุญาตให้ปรับแต่งความคลาดเคลื่อนในการกรอแบบเศษส่วนในโหมดการลากผ่าน
    • เพิ่มอัตราการทำงานของตัวแปลงรหัสในโหมดการกรอ
    • แก้ไขข้อบกพร่องที่อาจทำให้ไม่มีการรายงานข้อผิดพลาดในการเตรียมเนื้อหาของ AdsMediaSource (#2337)
    • แก้ไขการรั่วไหลของหน่วยความจำใน MergingMediaSource เช่น เมื่อใช้ การโหลดคำบรรยายแทนเสียงจากภายนอก (#2338)
    • อนุญาตให้ CmcdConfiguration.Factory ส่งคืน null เพื่อปิดใช้การบันทึก CMCD สำหรับรายการสื่อที่เฉพาะเจาะจง (#2386)
    • เพิ่มขนาดบัฟเฟอร์รูปภาพเริ่มต้นจาก 128 KB (ข้อผิดพลาดจากการคัดลอกและวางจาก แทร็กข้อความ) เป็น 26 MB ซึ่งมีขนาดใหญ่พอสำหรับรูปภาพ Ultra HDR ขนาด 50 MP (#2417)
    • เพิ่ม PreCacheHelper ที่อนุญาตให้แอปแคชสื่อรายการเดียวล่วงหน้าโดยมี ตำแหน่งเริ่มต้นและระยะเวลาที่ระบุ
    • เพิ่มการรองรับการโหลดล่วงหน้าจากตำแหน่งที่ระบุใน DefaultPreloadManager
  • Transformer
    • เพิ่ม CodecDbLite ที่ช่วยให้การตั้งค่าการเข้ารหัสวิดีโอได้รับการเพิ่มประสิทธิภาพเฉพาะชิปเซ็ต
    • เพิ่มแฟล็ก setEnableCodecDbLite ลงใน DefaultEncoderFactory เพื่อเปิดใช้ การเพิ่มประสิทธิภาพการตั้งค่า CodecDB Lite โดยค่าเริ่มต้น ระบบจะตั้งค่าสถานะนี้เป็น false
    • การเติมช่องว่างเริ่มต้น (เพิ่มผ่าน addGap()) ด้วยเสียงเงียบในตอนนี้ ต้องตั้งค่า experimentalSetForceAudioTrack(true) อย่างชัดเจนใน EditedMediaItemSequence.Builder หากช่องว่างอยู่ตรงกลางของ ลำดับ ก็ไม่จำเป็นต้องใช้แฟล็กนี้
    • ย้ายอินเทอร์เฟซ Muxer จาก media3-transformer ไปยัง media3-muxer
    • กำหนดให้ต้องตั้งค่า MediaItem.Builder().setImageDuration(long) เพื่อ นำเข้ารายการสื่อเป็นรูปภาพ
    • เพิ่ม Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean) ซึ่งรวมถึงรายการแก้ไข MP4 เมื่อตัดเพื่อสั่งให้เพลเยอร์ ไม่สนใจตัวอย่างระหว่างคีย์เฟรมก่อนจุดเริ่มต้นของการตัด และ จุดเริ่มต้นของการตัด
    • อัปเดตแอป Composition Demo ให้ใช้ Kotlin และ Jetpack Compose แล้วเพิ่ม VideoCompositorSettings ที่กำหนดเองเพื่อจัดเรียงลำดับเป็นเลย์เอาต์ 2x2 หรือ PIP
  • โปรแกรมแยกข้อมูล
    • แยกวิเคราะห์ข้อมูลเมตาจากไฟล์ MP4 ที่แยกส่วน (#2084)
    • JPEG: รองรับรูปภาพเคลื่อนไหวที่ไม่มีกลุ่ม Exif ที่จุดเริ่มต้น (#2552)
    • เพิ่มการรองรับการกรอใน MP4 แบบแยกส่วนที่มีอะตอม sidx หลายรายการ คุณเปิดใช้ลักษณะการทำงานนี้ได้โดยใช้ฟีเจอร์FLAG_MERGE_FRAGMENTED_SIDXใน FragmentedMp4Extractor (#9373)
    • ไม่สนใจตารางการค้นหาที่ว่างเปล่าในไฟล์ FLAC (รวมถึงไฟล์ที่มีเฉพาะจุดค้นหาตัวยึดตำแหน่ง ) และกลับไปใช้การค้นหาแบบไบนารีหากทราบ ระยะเวลาของไฟล์ (#2327)
    • แก้ไขการแยกวิเคราะห์หน่วย SEI ของ H.265 เพื่อข้ามประเภท SEI ที่ไม่รู้จักโดยสมบูรณ์ (#2456)
    • อัปเดต WavExtractor เพื่อใช้ข้อมูล SubFormat ของส่วนขยายส่วนหัวสำหรับ รูปแบบเสียงเมื่อแยกวิเคราะห์ไฟล์ประเภท WAVE_FORMAT_EXTENSIBLE
    • MP4: เพิ่มการรองรับกล่อง ipcm และ fpcm ที่กำหนดแทร็กเสียง PCM ดิบ (ไม่รองรับ PCM แบบจุดลอยตัว 64 บิต)
    • MP4: จัดการส่วนการหมุนของtkhdเมทริกซ์การแปลงที่ ทั้งหมุนและพลิกวิดีโอ ซึ่งจะช่วยให้วิดีโอที่สะท้อน ซึ่งถ่ายด้วยกล้องหน้าของ iPhone แสดงผลได้อย่างถูกต้อง แต่ สะท้อนในแกน y อย่างไม่ถูกต้อง (#2012)
    • MP3: ใช้ระยะเวลาและขนาดข้อมูลจากข้อมูลเมตาอัตราบิตแปรผัน Xing, VBRI และที่คล้ายกันซึ่งค้นหาไม่ได้ เมื่อเปลี่ยนกลับไปใช้การค้นหาอัตราบิตคงที่ เนื่องจาก FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) (#2194)
  • เสียง:
    • แก้ไขข้อบกพร่องที่ไม่ได้เรียกใช้ AnalyticsListener.onAudioPositionAdvancing เมื่อเริ่มเล่นเสียงใกล้กับจุดสิ้นสุดของสื่อมาก
    • เพิ่มการรองรับรูปแบบตัวอย่าง PCM เชิงเส้นทั้งหมดใน ChannelMappingAudioProcessor และ TrimmingAudioProcessor
    • เพิ่มการรองรับช่องว่างของเสียงใน CompositionPlayer
    • นำการโทรที่น่าสงสัยไปยัง BaseAudioProcessor#flush() ออกจาก BaseAudioProcessor#reset()
    • อนุญาตการอัปมิกซ์/ดาวน์มิกซ์กำลังคงที่ใน DefaultAudioMixer
    • ตั้งค่า ChannelMappingAudioProcessor, TrimmingAudioProcessor และ ToFloatPcmAudioProcessor เป็นสาธารณะ (#2339)
    • ใช้ AudioTrack#getUnderrunCount() ใน AudioTrackPositionTracker เพื่อ ตรวจหาการทำงานไม่ต่อเนื่องใน DefaultAudioSink แทนการประมาณค่า แบบสุดความสามารถ
    • ปรับปรุงการปรับค่าการประทับเวลาของเสียงให้ราบรื่นขึ้นในกรณีที่ตำแหน่งของ อุปกรณ์เอาต์พุตเสียงมีการเปลี่ยนแปลงโดยไม่คาดคิด
    • แก้ไขข้อบกพร่องที่ทำให้การซิงค์ภาพและเสียงไม่ทำงานในช่วง 10 วินาทีแรกหลังจากกลับมาเล่นต่อ จากหยุดชั่วคราวเมื่อเชื่อมต่อกับอุปกรณ์บลูทูธ
    • แก้ไขข้อบกพร่องที่ทำให้ AnalyticsListener.onAudioPositionAdvancing ไม่ได้ รายงานเวลาที่เสียงเริ่มเลื่อน แต่รายงานเวลาของการวัดครั้งแรก
    • แก้ไขการกู้คืนเป็นเสียงหลายช่องหลังจากเปลี่ยนกลับเป็นเสียงสเตอริโอบนอุปกรณ์บางเครื่อง (#2258)
  • วิดีโอ
    • ขยายการแก้ปัญหาชั่วคราวสำหรับ Surface ที่ถอดออกไปยังอุปกรณ์ "lenovo" และ "motorola" (#2059)
    • ปรับปรุงการปล่อยเฟรมวิดีโอที่ราบรื่นเมื่อเริ่มต้นระบบในกรณีที่ตัวอย่างเสียงไม่ได้ เริ่มที่ตำแหน่งที่ขออย่างแน่นอน
    • ขยายการแก้ปัญหาชั่วคราวสำหรับ Surface ที่ถอดออกไปยังอุปกรณ์ "realme" (#2059)
    • เพิ่ม ExoPlayer API เวอร์ชันทดลองเพื่อรวมแฟล็ก MediaCodec.BUFFER_FLAG_DECODE_ONLY เมื่อจัดคิวบัฟเฟอร์อินพุตแบบถอดรหัสเท่านั้น โดยแฟล็กนี้จะส่งสัญญาณให้ตัวถอดรหัสข้ามบัฟเฟอร์ที่ถอดรหัสได้อย่างเดียว จึงทำให้การค้นหาเร็วขึ้น เปิดใช้ด้วย DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag
    • ปรับปรุงการตรวจสอบประสิทธิภาพตัวแปลงรหัสสำหรับตัวแปลงรหัสวิดีโอซอฟต์แวร์ ซึ่งอาจส่งผลให้มีการทำเครื่องหมายแทร็กเพิ่มเติมบางรายการเป็น EXCEEDS_CAPABILITIES
    • แก้ไขข้อผิดพลาดในการเล่น VP9 Widevine ในอุปกรณ์บางรุ่น (#2408)
  • ข้อความ:
    • เพิ่มการรองรับแทร็ก VobSub ในไฟล์ MP4 (#2510)
    • แก้ไขการหยุดเล่นชั่วคราวเมื่อโหลดส่วนคำบรรยายแทนเสียงไม่สำเร็จในตอนแรกและ โหลดสำเร็จในภายหลัง ตามด้วยส่วนคำบรรยายแทนเสียงที่ว่างเปล่าหลายส่วน (#2517)
    • แก้ไข SSA และ SubRip เพื่อแสดงคิวที่กำลังดำเนินการเมื่อเปิดใช้คำบรรยายแทนเสียง (#2309)
    • แก้ไขการเล่นที่หยุดชะงักเมื่อเปลี่ยนจากสตรีมที่มีข้อผิดพลาดของคำบรรยายแทนเสียง เป็นไลฟ์สดที่มีแทร็กคำบรรยายแทนเสียงว่างเปล่า (#2328)
    • แก้ไขคำบรรยายแทนเสียง CEA-608 ที่อ่านไม่ออกเมื่อเล่นสตรีม H.262 ที่มีเฟรม B (#2372)
    • เพิ่มการรองรับคำบรรยาย SSA ที่มี CodecId = S_TEXT/SSA ในไฟล์ Matroska ก่อนหน้านี้ MatroskaExtractor รองรับเฉพาะ CodecId = S_TEXT/ASS ซึ่งหมายถึงตัวแปร "ขั้นสูง" (v4 ขึ้นไป) ของ คำบรรยายแทนเสียง SubStation Alpha (แต่ตรรกะการแยกวิเคราะห์ของ ExoPlayer เหมือนกัน สำหรับทั้ง 2 ตัวแปร) (#2384)
    • เพิ่มการรองรับพร็อพเพอร์ตี้ layer ในไฟล์คำบรรยายแทนเสียง SubStation Alpha (SSA) ซึ่งใช้เพื่อกำหนดลำดับ Z ของคิวเมื่อมีคิวมากกว่า 1 รายการแสดงบนหน้าจอพร้อมกัน (#2124)
  • ข้อมูลเมตา
    • เพิ่มการรองรับการดึงข้อมูลระยะเวลาของสื่อและ Timeline ไปยัง MetadataRetriever และย้ายข้อมูลไปยัง API AutoCloseable ที่อิงตามอินสแตนซ์ ใช้ Builder ใหม่เพื่อสร้างอินสแตนซ์สำหรับ MediaItem จากนั้นเรียกใช้ retrieveTrackGroups(), retrieveTimeline() และ retrieveDurationUs() เพื่อรับ ListenableFuture สำหรับข้อมูลเมตา ตอนนี้เราเลิกใช้งานเมธอดแบบคงที่ก่อนหน้าแล้ว (#2462)
  • รูปภาพ:
    • จำกัดบิตแมปที่ถอดรหัสแล้วให้มีขนาดเท่ากับขนาดการแสดงผลใน BitmapFactoryImageDecoder เพื่อหลีกเลี่ยงไม่ให้แอปขัดข้องเนื่องจาก Canvas: trying to draw too large bitmap. จาก PlayerView เมื่อพยายาม แสดงรูปภาพขนาดใหญ่มาก (เช่น 50MP)
    • เปลี่ยนลายเซ็นของ DefaultRenderersFactory.getImageDecoderFactory() เพื่อใช้Context พารามิเตอร์
    • ปรับขนาดเอาต์พุตบิตแมปสูงสุดที่ใช้ใน CompositionPlayer ให้ตรงกับขนาดที่ใช้ใน Transformer (หมายความว่า CompositionPlayer จะไม่พิจารณาขนาดการแสดงผลเมื่อถอดรหัสบิตแมป ซึ่งต่างจาก ExoPlayer)
  • DRM:
    • เพิ่มการโอเวอร์โหลดใหม่ของ OfflineLicenseHelper.newWidevineInstance ที่ยอมรับ MediaItem.DrmConfiguration เพื่อให้ใช้ส่วนหัวของคำขอ HTTP ได้อย่างถูกต้อง (#2169)
  • ผลลัพธ์
    • เพิ่ม Presentation.createForShortSide(int) ที่สร้าง Presentation ซึ่งช่วยให้ด้านที่สั้นที่สุดตรงกับค่าที่ระบุเสมอ โดยไม่คำนึงถึงการวางแนวของอินพุต
  • Muxers:
    • แก้ไขข้อบกพร่องที่ไม่ได้ตั้งค่าสถานะตัวอย่างที่ถูกต้องสำหรับตัวอย่างเสียงใน MP4 ที่แยกส่วน
    • writeSampleData() ตอนนี้ API ใช้คลาส BufferInfo เฉพาะของ Muxer แทน MediaCodec.BufferInfo แล้ว
    • เพิ่ม Muxer.Factory#supportsWritingNegativeTimestampsInEditList ซึ่ง ค่าเริ่มต้นเป็น false
  • ส่วนขยาย IMA
    • แก้ไขข้อบกพร่องที่ข้อผิดพลาดในการโหลดในโฆษณาหนึ่งอาจทำให้กลุ่มโฆษณาอื่นไม่ถูกต้องโดยไม่ตั้งใจ
    • แก้ไขข้อบกพร่องที่กลุ่มโฆษณาหลังจากสิ้นสุดช่วงเวลา VOD ทำให้การเล่นหยุดชะงัก ระบบจะไม่จัดคิวกลุ่มโฆษณาที่มีเวลาเริ่มต้นหลังจากช่วงเวลาที่กำหนดไว้ใน MediaPeriodQueue อีกต่อไป (#2215)
  • เซสชัน:
    • แก้ไขข้อบกพร่องที่ระบบไม่สนใจการเชื่อมต่อจากตัวควบคุม Media3 ของบุคคลที่สามที่ไม่มีสิทธิ์
    • นำเครื่องหมายถูกสำหรับคำสั่งที่ใช้ได้ออกเมื่อส่งคำสั่งที่กำหนดเองไปยัง MediaBrowserServiceCompat รุ่นเดิม ซึ่งจะสอดคล้องกับลักษณะการทำงาน ของตัวควบคุม/เบราว์เซอร์เดิมเมื่อเชื่อมต่อกับแอปเดิม
    • แก้ไขข้อบกพร่องที่ทำให้ระบบ ถือว่าข้อผิดพลาดในการเล่นครั้งแรกของผู้เล่นเป็นข้อยกเว้นที่กำหนดเองแบบถาวรอย่างไม่ถูกต้อง ซึ่งจะทำให้แอปพลิเคชัน กู้คืนไม่ได้
    • แก้ไขข้อบกพร่องที่การเปลี่ยนแปลงตัวควบคุมบางอย่างซึ่งไม่ได้จัดการโดย เซสชันอาจทำให้เกิด IllegalStateExceptions
    • แก้ไขข้อบกพร่องที่การดำเนินการของตัวควบคุมซึ่งเซสชันไม่ได้จัดการอาจ ทำให้ตัวควบคุมอยู่ในสถานะที่ไม่ถูกต้อง
    • แก้ไขคำเตือนการละเมิดการเปิดใช้ที่ไม่ปลอดภัยของ StrictMode (#2330)
    • แก้ไขข้อบกพร่องที่การเรียกใช้ setSessionExtras จากเทรดหลักเมื่อ เรียกใช้เพลเยอร์จากเทรดแอปพลิเคชันอื่นที่ไม่ใช่เทรดหลัก ทำให้เกิด IllegalStateException (#2265)
    • ไม่แสดงการแจ้งเตือนโดยอัตโนมัติหากตั้งค่าเพลเยอร์ด้วยรายการสื่อโดยไม่ได้เตรียมหรือเล่นรายการเหล่านั้น (#2423https://github.com/androidx/media/issues/2423) ลักษณะการทำงานนี้ กำหนดค่าได้ผ่าน MediaSessionService.setShowNotificationForIdlePlayer
    • เพิ่ม PlaybackException ที่กำหนดเองสำหรับคอนโทรลเลอร์ทั้งหมดหรือบางตัว
    • แก้ไขข้อบกพร่องที่การกรอในไลฟ์สดบน MediaController อาจทำให้เกิดIllegalArgumentException
    • สำหรับไลฟ์สด ให้หยุดเผยแพร่ตำแหน่งการเล่นและความสามารถในการ กรอในรายการปัจจุบันสำหรับตัวควบคุมสื่อของแพลตฟอร์ม เพื่อหลีกเลี่ยง อาร์ติแฟกต์ตำแหน่งใน UI ของ Android Auto (และตัวควบคุมอื่นๆ ที่ใช้ ข้อมูลนี้จากเซสชันสื่อของแพลตฟอร์ม) (#1758)
    • แก้ไขข้อบกพร่องที่การส่งค่า Null ไปยัง getLibraryRoot ของ MediaBrowser ที่เชื่อมต่อกับ MediaBrowserServiceCompat รุ่นเดิมทำให้เกิด NullPointerException
    • แก้ไขข้อบกพร่องที่การส่งการดำเนินการที่กำหนดเอง ผลการค้นหา หรือคำขอ getItem ทำให้แอปเซสชันเดิมขัดข้องพร้อมกับ ClassNotFoundException
    • แก้ไขข้อบกพร่องที่ทำให้มีการแชร์ MediaItem.LocalConfiguration.uri ไปยัง MediaMetadata ของเซสชันแพลตฟอร์ม หากต้องการแชร์ URI โดยเจตนาเพื่อ อนุญาตให้ตัวควบคุมส่งคำขอสื่ออีกครั้ง ให้ตั้งค่า MediaItem.RequestMetadata.mediaUri แทน
  • UI:
    • แก้ไขข้อบกพร่องที่ PlayerSurface ภายในคอมโพเนนต์ที่นำกลับมาใช้ใหม่ เช่น LazyColumn ทำงานไม่ถูกต้อง (#2493)
    • แก้ไขข้อบกพร่องของ Compose ซึ่งทำให้เกิดช่องว่างระหว่างการตั้งค่าสถานะปุ่มเริ่มต้นกับการสังเกตการเปลี่ยนแปลงสถานะ (เช่น รูปร่างไอคอนหรือการเปิดใช้) ตอนนี้ระบบจะตรวจจับการเปลี่ยนแปลงใดๆ ที่เกิดขึ้นกับผู้เล่นนอก ระยะเวลาสังเกตการณ์ (#2313)
    • เพิ่มตัวยึดสถานะและ Composable ลงในโมดูล media3-ui-compose สำหรับ SeekBackButtonState และ SeekForwardButtonState
    • เพิ่มการรองรับโหมดการกรอของ ExoPlayer ไปยัง PlayerControlView เมื่อ เปิดใช้แล้ว ระบบจะเปลี่ยนเพลเยอร์เป็นโหมดกรอเมื่อผู้ใช้เริ่ม ลากแถบตัวควบคุมการกรอ เรียกใช้ player.seekTo ทุกครั้งที่มี การเคลื่อนไหว แล้วออกจากโหมดกรอเมื่อปล่อยการสัมผัสจาก หน้าจอ คุณเปิดใช้การผสานรวมนี้ได้โดยใช้ time_bar_scrubbing_enabled = true ใน XML หรือเมธอด setTimeBarScrubbingEnabled(boolean) จาก Java/Kotlin
    • ทำให้ PlayerSurface ยอมรับอาร์กิวเมนต์ Player ที่เป็น Null ได้
  • การดาวน์โหลด
    • เพิ่มการรองรับการดาวน์โหลดบางส่วนสำหรับสตรีมแบบต่อเนื่อง แอปสามารถเตรียมสตรีมแบบ โปรเกรสซีฟด้วย DownloadHelper และขอ DownloadRequest จากผู้ช่วยโดยระบุตำแหน่งเริ่มต้นและสิ้นสุดของสื่อตามเวลาที่การดาวน์โหลดควรครอบคลุม DownloadRequestที่ส่งกลับมาจะมีช่วงไบต์ที่แก้ไขแล้ว ซึ่งใช้สร้างProgressiveDownloaderและดาวน์โหลดเนื้อหาที่เกี่ยวข้องได้
    • เพิ่ม DownloadHelper.Factory ซึ่งจะแทนที่เมธอดแบบคงที่ DownloadHelper.forMediaItem()
    • เพิ่ม Factory สำหรับการติดตั้งใช้งาน SegmentDownloader
    • เพิ่มการรองรับการดาวน์โหลดบางส่วนสำหรับสตรีมแบบปรับอัตโนมัติ แอปสามารถเตรียมสตรีมแบบปรับอัตราการส่งข้อมูลได้ด้วย DownloadHelper และขอ DownloadRequest จากตัวช่วยโดยระบุตำแหน่งเริ่มต้นและสิ้นสุดของสื่อตามเวลาที่การดาวน์โหลดควรครอบคลุม DownloadRequestที่ส่งคืนมา จะมีช่วงเวลาที่แก้ไขแล้ว ซึ่งใช้สร้างSegmentDownloaderที่เฉพาะเจาะจง และดาวน์โหลดเนื้อหา ที่เกี่ยวข้องได้
  • ส่วนขยาย Cronet
    • เพิ่มการจัดการคุกกี้อัตโนมัติ (#5975)
  • ส่วนขยาย HLS
    • แก้ไขข้อบกพร่องที่ HlsSampleStreamWrapper พยายามค้นหาภายในบัฟเฟอร์ เมื่อไม่มี Chunk ในบัฟเฟอร์ #2598
    • แก้ไขข้อบกพร่องที่การเลือกแทร็กเปลี่ยนแปลงหลังจากโหลดส่วนที่มีเวลาในการตอบสนองต่ำ และคำแนะนำในการโหลดล่วงหน้าอาจทำให้การเล่นค้างหรือหยุดชะงัก (#2299)
    • ป้องกันการโหลดซ้ำมากเกินไปโดยรอครึ่งหนึ่งของระยะเวลาเป้าหมายเมื่อเซิร์ฟเวอร์ไม่ยอมรับ CAN-BLOCK-RELOAD=YES (#2317)
    • แก้ไขข้อบกพร่องที่ทำให้การเล่นหยุดชะงักเมื่อเริ่มสตรีมโฆษณาคั่นระหว่างหน้า ก่อนโฆษณากลางม้วน และพยายามแก้ไขรายการชิ้นงานสำหรับโฆษณาที่ไม่ถูกต้อง (#2558)
    • แก้ไขการแยกวิเคราะห์เพลย์ลิสต์เพื่อยอมรับ \f (ฟีดแบบฟอร์ม) ในค่าแอตทริบิวต์สตริงที่ยกมา (#2420)
    • รองรับการอัปเดตโฆษณาคั่นที่มีรหัสเดียวกัน (#2427)
    • แก้ไขข้อบกพร่องที่บางครั้งข้อผิดพลาดในการโหลดเพลย์ลิสต์ไม่ได้รับการเผยแพร่เมื่อ ไลฟ์สดไม่มีกลุ่มให้โหลด (#2401https://github.com/androidx/media/issues/2401)
    • จัดกลุ่มการแสดงผลคำบรรยายแทนเสียงตามแท็ก NAME ในลักษณะเดียวกับที่จัดกลุ่มการแสดงผลเสียงอยู่แล้ว (#1666)
    • รองรับ X-ASSET-LIST และสตรีมแบบสดด้วย HlsInterstitialsAdsLoader
  • ส่วนขยาย DASH
    • แก้ไขปัญหาที่ชุดการปรับเปลี่ยนการกรอวิดีโอจะผสานกับชุดการปรับเปลี่ยนหลัก เพื่อสร้าง TrackGroup ที่ไม่ถูกต้อง (#2148)
    • แก้ไขข้อบกพร่องที่การลดระยะเวลาของช่วง DASH อาจทำให้เกิดข้อยกเว้น เมื่อไปป์ไลน์การแสดงผล อ่านตัวอย่างที่อยู่นอกเหนือระยะเวลาใหม่แล้ว (#2440)
    • แก้ไขข้อบกพร่องที่ระบบไม่เปลี่ยนเส้นทางเมื่อใช้พารามิเตอร์การค้นหา CMCD (#2475)
  • ส่วนขยาย RTSP
    • เพิ่มการรองรับแพ็กเก็ตการรวม RTP สำหรับ H265 ตาม RFC 7798#4.4.2 (#2413)
    • แก้ไข RtspClient เพื่อใช้ URI ของตำแหน่งตามที่ระบุเมื่อประมวลผลการตอบกลับ HTTP 302 (#2398)
    • เพิ่มการรองรับการแยกวิเคราะห์สำหรับ SessionDescription ที่มีบรรทัดที่มี อักขระช่องว่างต่อท้าย (#2357)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ)
    • แก้ไขข้อบกพร่องที่ DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange ไม่มีผลกับส่วนขยายตัวถอดรหัสเสียง (#2258)
  • ส่วนขยาย Cast
    • เพิ่มการรองรับ setVolume() และ getVolume() (#2279)
    • ป้องกันไม่ให้ CastPlayer เข้าสู่ STATE_BUFFERING ขณะที่ไทม์ไลน์ว่างเปล่า
    • เพิ่มการรองรับ getDeviceVolume(), setDeviceVolume(), getDeviceMuted() และ setDeviceMuted() (#2089)
  • โปรแกรมทดสอบ:
    • เพิ่ม advance(player).untilPositionAtLeast และ untilMediaItemIndex ไปยัง TestPlayerRunHelper เพื่อให้ผู้เล่นเลื่อนไปจนกว่าจะถึง ตำแหน่งที่ระบุ ในกรณีส่วนใหญ่ วิธีการเหล่านี้มีความน่าเชื่อถือมากกว่าวิธีการ untilPosition และ untilStartOfMediaItem ที่มีอยู่
    • ย้าย FakeDownloader ไปยังโมดูล test-utils-robolectric เพื่อนำไปใช้ซ้ำในการทดสอบอื่นๆ
    • นำ transformer.TestUtil.addAudioDecoders(String...) transformer.TestUtil.addAudioEncoders(String...) และ transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...) ออกแล้ว ใช้ ShadowMediaCodecConfig เพื่อกำหนดค่าตัวเข้ารหัส และตัวถอดรหัสเงาแทน
    • แทนที่คำนำหน้า "exotest" ด้วย "media3" ในชื่อตัวแปลงรหัสที่รายงานโดย ShadowMediaCodecConfig
  • นำสัญลักษณ์ที่เลิกใช้งานแล้วออก
    • นำตัวสร้าง SegmentDownloader ที่เลิกใช้งานแล้ว SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) และตัวสร้างที่เกี่ยวข้องในคลาสย่อย DashDownloader, HlsDownloader และ SsDownloader ออกแล้ว
    • นำ Player.hasNext() และ Player.hasNextWindow() ที่เลิกใช้งานแล้วออก โปรดใช้ Player.hasNextMediaItem() แทน
    • นำ Player.next() ที่เลิกใช้งานแล้วออก โปรดใช้ Player.seekToNextMediaItem() แทน
    • นำ Player.seekToPreviousWindow() ที่เลิกใช้งานแล้วออก โปรดใช้ Player.seekToPreviousMediaItem() แทน
    • นำ Player.seekToNextWindow() ที่เลิกใช้งานแล้วออก โปรดใช้ Player.seekToNextMediaItem() แทน
    • นำ BaseAudioProcessor ที่เลิกใช้งานแล้วออกในโมดูล exoplayer ใช้ BaseAudioProcessor ในโมดูล common
    • นำตัวสร้าง MediaCodecVideoRenderer ที่เลิกใช้งานแล้วออก MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider)

เวอร์ชัน 1.8.0-rc02

24 กรกฎาคม 2025

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

เวอร์ชัน 1.8.0-rc01

16 กรกฎาคม 2025

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

เวอร์ชัน 1.8.0-beta01

2 กรกฎาคม 2025

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

เวอร์ชัน 1.8.0-alpha01

19 พฤษภาคม 2025

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

เวอร์ชัน 1.7.0

เวอร์ชัน 1.7.1

16 พฤษภาคม 2025

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

เวอร์ชัน 1.7.0

16 พฤษภาคม 2025

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

เวอร์ชัน 1.6.0

1.6.1

14 เมษายน 2025

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

  • คลังทั่วไป
    • เพิ่ม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)
    • แก้ไขข้อบกพร่องที่เซสชันแสดงไทม์ไลน์แบบ 1 รายการเมื่อ โปรแกรมเล่นสรุปไม่มีรายการ กรณีนี้เกิดขึ้นเมื่อเพลเยอร์ที่ห่อหุ้มไม่มี 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) ยอมรับค่า Null (#2109)
    • แก้ไขข้อบกพร่องที่ทำให้การแจ้งเตือนที่ล้าสมัยยังคงแสดงอยู่เมื่อล้างเพลย์ลิสต์ (#2211)
  • UI:
    • เพิ่มตัวยึดสถานะและ Composable ลงในโมดูล media3-ui-compose สำหรับ PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState และ PlaybackSpeedState
  • การดาวน์โหลด
    • แก้ไขข้อบกพร่องใน CacheWriter ที่ทำให้แหล่งข้อมูลเปิดอยู่และพื้นที่แคช ล็อกไว้ในกรณีที่แหล่งข้อมูลส่ง Exception อื่นที่ไม่ใช่ IOException (#9760)
  • ส่วนขยาย HLS
    • เพิ่มHlsInterstitialsAdsLoader เวอร์ชันแรก โปรแกรมโหลดโฆษณาจะอ่าน โฆษณาคั่นระหว่างหน้า HLS ของเพลย์ลิสต์สื่อ HLS และแมปโฆษณาเหล่านั้นกับ AdPlaybackState ที่ส่งไปยัง AdsMediaSource เวอร์ชันเริ่มต้นนี้รองรับเฉพาะสตรีม VOD ของ HLS ที่มีแอตทริบิวต์ X-ASSET-URI
    • เพิ่ม HlsInterstitialsAdsLoader.AdsMediaSourceFactory แอปสามารถใช้เพื่อสร้างอินสแตนซ์ AdsMediaSource ที่ใช้ HlsInterstitialsAdsLoader ได้อย่างสะดวกและปลอดภัย
    • แยกวิเคราะห์แท็ก SUPPLEMENTAL-CODECS จากเพลย์ลิสต์ HLS เพื่อตรวจหา Dolby Vision รูปแบบ (#1785)
    • ผ่อนปรนเงื่อนไขสำหรับการค้นหาเพื่อซิงค์ตำแหน่งในสตรีม HLS (#2209)
  • ส่วนขยาย DASH
    • เพิ่มการรองรับรูปแบบ AC-4 ระดับ 4 สำหรับ DASH (#1898)
    • แก้ไขปัญหาเมื่อคำนวณช่วงเวลาการอัปเดตสำหรับการแทรกโฆษณาใน ไลฟ์สดแบบหลายช่วงเวลา (#1698)
    • แยกวิเคราะห์แอตทริบิวต์ scte214:supplementalCodecs จากไฟล์ Manifest DASH เพื่อ ตรวจหาฟอแมต Dolby Vision (#1785)
    • ปรับปรุงการจัดการการเปลี่ยนช่วงเวลาในไลฟ์สดที่ช่วงเวลามีตัวอย่างสื่อที่อยู่นอกเหนือระยะเวลาของช่วงเวลาที่ประกาศไว้ (#1698)
    • แก้ไขปัญหาที่ชุดการดัดแปลงซึ่งทำเครื่องหมายด้วย adaptation-set-switching แต่มีภาษาหรือค่าสถานะบทบาทที่แตกต่างกันจะผสานรวมกัน (#2222)
  • ส่วนขยายตัวถอดรหัส (FFmpeg, VP9, AV1 ฯลฯ)
    • เพิ่มโมดูลตัวถอดรหัส MPEG-H ซึ่งใช้ตัวถอดรหัส MPEG-H ในตัว เพื่อถอดรหัสเสียง MPEG-H (#1826)
  • ส่วนขยาย MIDI
    • เชื่อมต่ออินสแตนซ์ AudioSink และ AudioRendererEventListener ที่กำหนดเองเข้ากับ MidiRenderer
  • ส่วนขยาย Cast
    • เพิ่ม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 Suspending Extension Function เพื่อเรียกใช้ Coroutine เพื่อ ฟัง 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 ใน Mp4Extractor และ FragmentedMp4Extractor (#1531)
    • แก้ไขการปรับขนาดที่ไม่ถูกต้องของ media_time ในรายการแก้ไข MP4 แม้ว่าก่อนหน้านี้ segment_duration จะได้รับการปรับขนาดอย่างถูกต้องโดยใช้ไทม์สเกลของภาพยนตร์ แต่ตอนนี้ media_time ได้รับการปรับขนาดอย่างถูกต้องโดยใช้ไทม์สเกลของแทร็กตามที่ระบุไว้ในมาตรฐานรูปแบบ 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 ดูใช้การดำเนินการเรียกดูที่กำหนดเอง
    • แก้ไขข้อบกพร่องที่บางครั้งตัวควบคุม 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 มีการคอมมิตเหล่านี้

  • คลังทั่วไป
    • ส่งต่อการเรียกฟังก์ชัน seek ที่คาดว่าไม่มีการดำเนินการไปยังเมธอด 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)
    • แก้ไขการอ่านแท็กตัวเลข gnre (ประเภท) และ tmpo (เทมโป) ของ MP4 (/iTunes) เมื่อค่ามีความยาวมากกว่า 1 ไบต์
    • ส่งต่อเฟรม ID3 TCON ไปยัง MediaMetadata.genre (#1305)
  • รูปภาพ:
    • เพิ่มการรองรับตารางภาพปก DASH ที่ไม่ใช่สี่เหลี่ยมจัตุรัส (#1300)
    • เพิ่มการรองรับ AVIF สำหรับ API 34 ขึ้นไป
    • อนุญาต null เป็นพารามิเตอร์สำหรับ ExoPlayer.setImageOutput() เพื่อล้าง ImageOutput ที่ตั้งค่าไว้ก่อนหน้านี้
  • DataSource:
    • รองรับ android.resource://package/id URI ของทรัพยากรดิบ ที่ package แตกต่างจากแพ็กเกจของแอปพลิเคชันปัจจุบัน ก่อนหน้านี้ไม่ได้มีการบันทึกไว้ว่าวิธีนี้ใช้ได้ แต่เป็นวิธีที่มีประสิทธิภาพมากกว่า ในการเข้าถึงทรัพยากรในแพ็กเกจอื่นที่ไม่ใช่ชื่อ
    • ตรวจสอบว่า url ไม่ใช่ค่าว่างในตัวสร้าง 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 ในแอปเดโมแบบสั้น
    • อนุญาตให้ตั้งค่าโหมดเล่นซ้ำด้วยอาร์กิวเมนต์ 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สามารถสร้างอินสแตนซ์ของ 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:
    • เล่นตัวอย่างที่ไม่มีการเข้ารหัส "ส่วนนำที่ชัดเจน" ในเนื้อหา 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 ซึ่งจะเลิกใช้งาน
    • เพิ่ม 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

  • คลังทั่วไป
    • นำทรัพยากร Dependency 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 ที่จัดส่งโดยตัวจัดส่งอีกต่อไป
    • เปลี่ยนชื่อ 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เหตุการณ์แรก (และในกรณีที่ไม่มีโฆษณา เหตุการณ์นี้จะเป็นเหตุการณ์เดียว)

เวอร์ชัน 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 เพื่อให้วิธีแก้ไข/ตั้งค่า 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

  • Core Library
    • เพิ่มเมธอดที่ได้รับการป้องกัน 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 ที่เข้ากันได้หากจำเป็น
    • เปลี่ยน API ของ AudioCapabilities ให้กำหนดการส่งอย่างชัดแจ้ง AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES แทน null
    • อนุญาตให้ปรับแต่งการคำนวณขนาดบัฟเฟอร์ AudioTrack โดย แทรก AudioTrackBufferSizeProvider ไปยัง DefaultAudioSink (#8891)
    • ลองสร้างอีกครั้งหากขนาดบัฟเฟอร์ที่ขอมีขนาดมากกว่า 1 MBAudioTrack (#9712)
  • โปรแกรมแยกข้อมูล
    • WAV: เพิ่มการรองรับสตรีม RF64 (#9543)
    • แก้ไขการแยกวิเคราะห์หน่วย NAL ของ SPS ใน 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 เมื่อรีลีสมัลติเพล็กเซอร์ 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 ทั้งหมด ยกเว้นส่วนขยาย legacy media2 และ mediasession ซึ่งจะแทนที่ด้วยโมดูล media3-session ใหม่ ซึ่งช่วยให้ผสานรวมโดยตรงระหว่างเพลเยอร์กับ เซสชันสื่อได้โดยไม่ต้องใช้คลาสอะแดปเตอร์/ตัวเชื่อมต่อ