Media3 1.9.0 พร้อมใช้งานแล้ว นอกจากการแก้ไขข้อบกพร่องและการปรับปรุงประสิทธิภาพตามปกติแล้ว รุ่นล่าสุดยังมีโมดูลใหม่หรือโมดูลที่เขียนใหม่เป็นส่วนใหญ่4 โมดูล ได้แก่
media3-inspector- แยกข้อมูลเมตาและเฟรมภายนอกการเล่นmedia3-ui-compose-material3- สร้าง UI สื่อ Compose ของ Material3 พื้นฐานได้ในไม่กี่ขั้นตอนmedia3-cast- จัดการการเปลี่ยนระหว่างการแคสต์และการเล่นในเครื่องโดยอัตโนมัติmedia3-decoder-av1- การเล่น AV1 ที่สม่ำเสมอด้วยตัวถอดรหัสส่วนขยายที่เขียนใหม่โดยอิงตามไลบรารี dav1d
นอกจากนี้ เรายังได้เพิ่มการปรับปรุงการแคชและการจัดการหน่วยความจำใน PreloadManager รวมถึงการปรับปรุง ExoPlayer, Transformer และ MediaSession ใหม่หลายรายการ
นอกจากนี้ การเปิดตัวนี้ยังให้สิทธิ์เข้าถึงเวอร์ชันทดลองแรกของ CompositionPlayer เพื่อดูตัวอย่างการแก้ไขสื่อด้วย
อ่านต่อเพื่อดูข้อมูลเพิ่มเติม และโปรดดูบันทึกประจำรุ่นฉบับเต็มเพื่อดูภาพรวมการเปลี่ยนแปลงในรุ่นนี้
ดึงข้อมูลเมตาและเฟรมภายนอกการเล่น
มีหลายกรณีที่คุณต้องการตรวจสอบสื่อโดยไม่ต้องเริ่มเล่น เช่น คุณอาจต้องการตรวจหารูปแบบของวิดีโอหรือระยะเวลาของวิดีโอ หรือดึงข้อมูลภาพปก
media3-inspectorโมดูลใหม่จะรวมยูทิลิตีทั้งหมดไว้ในที่เดียวเพื่อตรวจสอบสื่อโดยไม่ต้องเล่น
MetadataRetrieverเพื่ออ่านระยะเวลา รูปแบบ และข้อมูลเมตาแบบคงที่จากMediaItemFrameExtractorเพื่อรับเฟรมหรือภาพขนาดย่อจากรายการMediaExtractorCompatเพื่อใช้แทนคลาส MediaExtractor ของแพลตฟอร์ม Android โดยตรง เพื่อดูข้อมูลโดยละเอียดเกี่ยวกับตัวอย่างในไฟล์
MetadataRetriever และ FrameExtractor เป็นไปตามAutoCloseable รูปแบบง่ายๆ ดูรายละเอียดเพิ่มเติมได้ในหน้าคำแนะนำใหม่
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}
สร้าง UI ของสื่อ Compose ที่เป็น Material3 พื้นฐานได้ในไม่กี่ขั้นตอน
ในรุ่นก่อนๆ เราได้เริ่มให้โค้ดตัวเชื่อมต่อระหว่างองค์ประกอบ UI ของ Compose กับอินสแตนซ์ของเพลเยอร์ ใน Media3 1.9.0 เราได้เพิ่มโมดูลใหม่ media3-ui-compose-material3 ที่มีปุ่มและองค์ประกอบเนื้อหา Material3 ที่จัดรูปแบบอย่างเต็มที่ ซึ่งช่วยให้คุณสร้าง UI ของสื่อได้ในไม่กี่ขั้นตอน พร้อมทั้งให้ความยืดหยุ่นในการปรับแต่งสไตล์ทั้งหมด หากต้องการสร้างสไตล์ UI ของคุณเอง คุณสามารถใช้องค์ประกอบที่ใช้สร้างสรรค์ที่ดูแลตรรกะการอัปเดตและการเชื่อมต่อทั้งหมด เพื่อให้คุณมุ่งเน้นไปที่การออกแบบองค์ประกอบ UI ได้เท่านั้น โปรดดูโมดูล UI ของ Compose ในหน้าคู่มือฉบับขยาย
นอกจากนี้ เรายังคงพัฒนาคอมโพเนนต์ Compose อื่นๆ เช่น แถบเลื่อนที่สร้างไว้ล่วงหน้า ซึ่งเป็นตัวแทนที่สมบูรณ์แบบสำหรับ PlayerView รวมถึงการผสานรวมคำบรรยายแทนเสียงและโฆษณา
@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
Column(modifier) {
ContentFrame(player) // Video surface and shutter logic
Row (Modifier.align(Alignment.CenterHorizontally)) {
SeekBackButton(player) // Simple controls
PlayPauseButton(player)
SeekForwardButton(player)
}
}
}
UI ของเพลเยอร์ Compose ที่เรียบง่ายพร้อมองค์ประกอบสำเร็จรูป
จัดการการเปลี่ยนระหว่างการแคสต์และการเล่นในเครื่องโดยอัตโนมัติ
เราได้เขียนCastPlayer ในโมดูล media3-cast ใหม่เพื่อจัดการการเปลี่ยนระหว่างการเล่นในเครื่อง (เช่น ด้วย ExoPlayer) กับการเล่นผ่าน Cast จากระยะไกลโดยอัตโนมัติ
เมื่อตั้งค่า MediaSession แล้ว เพียงสร้าง CastPlayer รอบ ExoPlayer และเพิ่ม MediaRouteButton ลงใน UI ก็เป็นอันเสร็จสิ้น
// MediaSession setup with CastPlayer
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, castPlayer).build()
// MediaRouteButton in UI
@Composable fun UIWithMediaRouteButton() {
MediaRouteButton()
}
การผสานรวม CastPlayer ใหม่ในแอปเดโมเซสชัน Media3
การเล่น AV1 ที่สม่ำเสมอด้วยส่วนขยายที่เขียนใหม่โดยอิงตาม dav1d
รุ่น 1.9.0 มีโมดูลส่วนขยาย AV1 ที่เขียนใหม่ทั้งหมดโดยอิงตามไลบรารี dav1d ยอดนิยม
เช่นเดียวกับโมดูลตัวถอดรหัสส่วนขยายทั้งหมด โปรดทราบว่าต้องสร้างจากแหล่งที่มา เพื่อรวมโค้ดแบบเนทีฟที่เกี่ยวข้องอย่างถูกต้อง การรวมตัวถอดรหัสจะช่วยให้การรองรับรูปแบบมีความสอดคล้องกันในทุกอุปกรณ์ แต่เนื่องจากตัวถอดรหัสจะทำงานในกระบวนการของคุณ จึงเหมาะสำหรับเนื้อหาที่คุณเชื่อถือได้
ผสานรวมการแคชและการจัดการหน่วยความจำเข้ากับ PreloadManager
เรายังปรับปรุง PreloadManager ให้ดียิ่งขึ้นด้วย ซึ่งช่วยให้คุณโหลดสื่อล่วงหน้าลงในหน่วยความจำภายนอกการเล่นได้อยู่แล้ว จากนั้นจึงส่งต่อให้เพลเยอร์อย่างราบรื่นเมื่อจำเป็น แม้ว่าจะมีประสิทธิภาพดี แต่คุณก็ยังต้องระมัดระวังไม่ให้หน่วยความจำเกินขีดจำกัดโดยการโหลดล่วงหน้ามากเกินไปโดยไม่ตั้งใจ เราจึงเพิ่มฟีเจอร์ 2 อย่างใน Media3 1.9.0 เพื่อให้การดำเนินการนี้ง่ายขึ้นและเสถียรมากขึ้น
- รองรับการแคช – เมื่อกำหนดระยะเวลาที่จะโหลดล่วงหน้า ตอนนี้คุณสามารถเลือก
PreloadStatus.specifiedRangeCached(0, 5000)เป็นสถานะเป้าหมายสำหรับรายการที่โหลดล่วงหน้าได้แล้ว ซึ่งจะเป็นการเพิ่มช่วงที่ระบุลงในแคชบนดิสก์แทนที่จะโหลดข้อมูลลงในหน่วยความจำ ซึ่งจะช่วยให้คุณระบุช่วงของรายการที่ใหญ่ขึ้นมากสำหรับการโหลดล่วงหน้าได้ เนื่องจากรายการที่อยู่ไกลจากรายการปัจจุบันจะไม่จำเป็นต้องใช้หน่วยความจำอีกต่อไป โปรดทราบว่าการดำเนินการนี้ต้องตั้งค่าCacheในDefaultPreloadManager.Builder - การจัดการหน่วยความจำอัตโนมัติ - เรายังได้อัปเดตอินเทอร์เฟซ
LoadControlเพื่อจัดการกรณีการโหลดล่วงหน้าได้ดียิ่งขึ้น ตอนนี้คุณจึงตั้งค่าขีดจำกัดหน่วยความจำสูงสุดที่ชัดเจนสำหรับรายการที่โหลดล่วงหน้าทั้งหมดในหน่วยความจำได้แล้ว โดยค่าเริ่มต้นจะมีขนาด 144 MB และคุณกำหนดค่าขีดจำกัดได้ในDefaultLoadControl.BuilderDefaultPreloadManagerจะหยุดโหลดล่วงหน้าโดยอัตโนมัติเมื่อถึงขีดจำกัด และจะปล่อยหน่วยความจำของรายการที่มีลำดับความสำคัญต่ำกว่าโดยอัตโนมัติหากจำเป็น
ใช้ลักษณะการทำงานเริ่มต้นแบบใหม่ที่ง่ายขึ้นใน ExoPlayer
และเช่นเคย เราได้เพิ่มการปรับปรุงทีละเล็กทีละน้อยมากมายให้กับ ExoPlayer ด้วย ตัวอย่างเช่น
- ปิดและเปิดเสียง - ก่อนหน้านี้เรามี
setVolumeวิธีอยู่แล้ว แต่ตอนนี้ได้เพิ่มวิธีที่สะดวกอย่างmuteและunmuteเพื่อให้คุณกู้คืนระดับเสียงก่อนหน้าได้อย่างง่ายดายโดยไม่ต้องจดจำระดับเสียงด้วยตนเอง - การตรวจหาเพลเยอร์ที่หยุดทำงาน - ในบางกรณีที่พบได้ไม่บ่อย เพลเยอร์อาจหยุดทำงานในสถานะบัฟเฟอร์หรือเล่นโดยไม่คืบหน้า เช่น เนื่องจากปัญหาเกี่ยวกับตัวแปลงรหัสหรือการกำหนดค่าที่ไม่ถูกต้อง ผู้ใช้จะรู้สึกรำคาญ แต่คุณจะไม่เห็นปัญหาเหล่านี้ในข้อมูลวิเคราะห์ ตอนนี้เพลเยอร์จะรายงาน
StuckPlayerExceptionเมื่อตรวจพบสถานะค้างเพื่อให้เห็นได้ชัดเจนยิ่งขึ้น - Wakelock โดยค่าเริ่มต้น - ก่อนหน้านี้การจัดการ Wake Lock ต้องเลือกใช้ ซึ่งทำให้พบเคสขอบที่ความคืบหน้าในการเล่นอาจล่าช้ามากเมื่อทำงานในเบื้องหลังได้ยาก ตอนนี้ฟีเจอร์นี้เป็นแบบเลือกไม่ใช้ คุณจึงไม่ต้องกังวลและยังนำการจัดการ Wake Lock ด้วยตนเองทั้งหมดเกี่ยวกับการเล่นออกได้ด้วย
- การตั้งค่าที่ง่ายขึ้นสำหรับตรรกะของปุ่มคำบรรยายแทนเสียง – การเปลี่ยน
TrackSelectionParametersเพื่อระบุว่า "เปิด/ปิดคำบรรยาย" นั้นทำได้ยากกว่าที่คิด เราจึงเพิ่มตัวเลือกบูลีนอย่างง่ายselectTextByDefaultสำหรับกรณีการใช้งานนี้
ลดความซับซ้อนของค่ากำหนดปุ่มสื่อใน MediaSession
จนถึงตอนนี้ การกำหนดค่ากำหนดสำหรับปุ่มที่ควรแสดงในลิ้นชักการแจ้งเตือนสื่อบน Android Auto หรือ WearOS จำเป็นต้องกำหนดคำสั่งและปุ่มที่กำหนดเอง แม้ว่าคุณจะต้องการทริกเกอร์เมธอดเพลเยอร์มาตรฐานก็ตาม
Media3 1.9.0 มีฟังก์ชันใหม่ที่จะช่วยให้การดำเนินการนี้ง่ายขึ้นมาก โดยตอนนี้คุณสามารถกำหนดค่ากำหนดปุ่มสื่อด้วยคำสั่งเพลเยอร์มาตรฐานได้โดยไม่ต้องจัดการคำสั่งที่กำหนดเองเลย
session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action
.build()
))
ค่ากำหนดปุ่มสื่อที่มีปุ่มกรอไปข้างหน้า
CompositionPlayer สำหรับการแสดงตัวอย่างแบบเรียลไทม์
การเปิดตัว 1.9.0 จะแนะนำ CompositionPlayer ภายใต้@ExperimentalApiคำอธิบายประกอบใหม่ คำอธิบายประกอบระบุว่าฟีเจอร์นี้พร้อมให้ทดลองใช้ แต่ยังอยู่ระหว่างการพัฒนา
CompositionPlayer เป็นคอมโพเนนต์ใหม่ใน API การแก้ไขของ Media3 ซึ่งออกแบบมาเพื่อแสดงตัวอย่างการแก้ไขสื่อแบบเรียลไทม์ CompositionPlayer สร้างขึ้นบนPlayerอินเทอร์เฟซ Media3 ที่คุ้นเคย ซึ่งช่วยให้ผู้ใช้เห็นการเปลี่ยนแปลงที่เกิดขึ้นก่อนที่จะส่งออก โดยจะใช้Compositionออบเจ็กต์เดียวกันกับที่คุณจะส่งไปยัง Transformer เพื่อส่งออก ซึ่งจะช่วยเพิ่มประสิทธิภาพเวิร์กโฟลว์การแก้ไขด้วยการรวมโมเดลข้อมูลสำหรับการแสดงตัวอย่างและการส่งออก
เราขอแนะนำให้คุณเริ่มใช้ CompositionPlayer และแชร์ความคิดเห็นของคุณ รวมถึงติดตามโพสต์และการอัปเดตเอกสารประกอบที่จะเผยแพร่ในอนาคตเพื่อดูรายละเอียดเพิ่มเติม
InAppMuxer เป็นตัวมัลติเพล็กซ์เริ่มต้นใน Transformer
ตอนนี้ Transformer ใช้ InAppMp4Muxer เป็นตัวมัลติเพล็กซ์เริ่มต้นสำหรับการเขียนไฟล์คอนเทนเนอร์สื่อ ภายใน InAppMp4Muxer จะขึ้นอยู่กับโมดูล Muxer ของ Media3 ซึ่งให้ลักษณะการทำงานที่สอดคล้องกันใน API ทุกเวอร์ชัน
โปรดทราบว่าแม้ว่า Transformer จะไม่ได้ใช้ MediaMuxer ของแพลตฟอร์ม Android โดยค่าเริ่มต้นอีกต่อไป แต่คุณยังคงระบุ FrameworkMuxer.Factory ผ่าน setMuxerFactory ได้หากกรณีการใช้งานของคุณต้องการ
API การปรับความเร็วใหม่
การเปิดตัวเวอร์ชัน 1.9.0 ทำให้ API การปรับความเร็วสำหรับการตัดต่อสื่อง่ายขึ้น เราได้เปิดตัววิธีใหม่ๆ โดยตรงใน EditedMediaItem.Builder เพื่อควบคุมความเร็ว ซึ่งจะช่วยให้ API ใช้งานได้ง่ายขึ้น ตอนนี้คุณสามารถเปลี่ยนความเร็วของคลิปได้โดยเรียกใช้ setSpeed(SpeedProvider provider) ใน EditedMediaItem.Builder ดังนี้
val speedProvider = object : SpeedProvider {
override fun getSpeed(presentationTimeUs: Long): Float {
return speed
}
override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
return C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()
แนวทางใหม่นี้จะแทนที่วิธีการเดิมในการใช้ Effects#createExperimentalSpeedChangingEffects() ซึ่งเราได้เลิกใช้งานแล้วและจะนำออกในการเปิดตัวในอนาคต
ขอแนะนำประเภทแทร็กสำหรับ EditedMediaItemSequence
ในรุ่น 1.9.0 EditedMediaItemSequence ต้องระบุประเภทแทร็กเอาต์พุตที่ต้องการในระหว่างการสร้างลำดับ การเปลี่ยนแปลงนี้จะช่วยให้การจัดการแทร็กมีความชัดเจนและมีประสิทธิภาพมากขึ้นในทั้งเพลง
โดยทำผ่านตัวสร้าง EditedMediaItemSequence.Builder ใหม่ที่ยอมรับชุดประเภทแทร็ก (เช่น C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO)
เราได้เพิ่มวิธีการแบบคงที่ใหม่ๆ เพื่ออำนวยความสะดวกในการสร้าง ดังนี้
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
เราขอแนะนำให้คุณย้ายข้อมูลไปยังเครื่องมือสร้างใหม่หรือวิธีการที่สะดวกเพื่อให้คำจำกัดความของลำดับที่ชัดเจนและเชื่อถือได้มากขึ้น
ตัวอย่างการสร้างลำดับที่มีเฉพาะวิดีโอ
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()
โปรดติดต่อเราผ่านเครื่องมือติดตามปัญหาของ Media3 หากพบข้อบกพร่อง หรือหากมีคำถามหรือคำขอฟีเจอร์ เราหวังเป็นอย่างยิ่งว่าจะได้รับการติดต่อจากคุณ
อ่านต่อ
-
ข่าวสารผลิตภัณฑ์
Android กำลังเปลี่ยนจากระบบปฏิบัติการไปเป็นระบบอัจฉริยะ ซึ่งจะสร้างโอกาสในการมีส่วนร่วมกับแอปของคุณมากขึ้น โดยเราได้ประกาศเรื่องนี้ใน The Android Show วันนี้
Matthew McCullough • ใช้เวลาอ่าน 4 นาที
-
ข่าวสารผลิตภัณฑ์
ระบบนิเวศบนอุปกรณ์เคลื่อนที่พัฒนาอยู่เสมอ ซึ่งนำมาทั้งโอกาสใหม่ๆ และภัยคุกคามใหม่ๆ การเปลี่ยนแปลงเหล่านี้จะช่วยให้ Android และ Google Play ยังคงมุ่งมั่นที่จะดูแลให้ผู้ใช้หลายพันล้านคนสามารถใช้แอปได้อย่างมั่นใจและนักพัฒนาแอปสามารถสร้างสรรค์นวัตกรรมต่อไปได้
Vijaya Kaza • ใช้เวลาอ่าน 3 นาที
-
ข่าวสารผลิตภัณฑ์
Jetpack Compose เวอร์ชันเดือนเมษายน 2026 พร้อมให้ใช้งานอย่างเสถียรแล้ว รุ่นนี้มีโมดูลหลักของ Compose เวอร์ชัน 1.11 (ดูการแมป BOM แบบเต็ม), เครื่องมือแก้ไขข้อบกพร่องขององค์ประกอบที่แชร์, เหตุการณ์แทร็กแพด และอื่นๆ
Meghan Mehta • ใช้เวลาอ่าน 5 นาที
รับข่าวสาร
รับข้อมูลเชิงลึกด้านการพัฒนาแอป Android ล่าสุดส่งตรงถึงกล่องจดหมายของคุณทุกสัปดาห์