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เพื่ออ่านระยะเวลา รูปแบบ และข้อมูลเมตาแบบคงที่จากMediaItem -
FrameExtractorเพื่อรับเฟรมหรือภาพปกจากรายการ -
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 สร้างขึ้นบนอินเทอร์เฟซ Media3 Player ที่คุ้นเคย ซึ่งช่วยให้ผู้ใช้เห็นการเปลี่ยนแปลงที่เกิดขึ้นก่อนที่จะส่งออก โดยจะใช้ออบเจ็กต์ 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 Studio Panda 4 พร้อมให้คุณใช้ในเวอร์ชันที่ใช้งานจริงแล้ว การเปิดตัวครั้งนี้มาพร้อมโหมดการวางแผน การคาดการณ์การแก้ไขครั้งถัดไป และอื่นๆ ซึ่งจะช่วยให้การสร้างแอป Android คุณภาพสูงง่ายกว่าที่เคย
Matt Dyor • ใช้เวลาอ่าน 5 นาที
-
ข่าวสารผลิตภัณฑ์
หากคุณเป็นนักพัฒนาแอป Android ที่ต้องการใช้ฟีเจอร์ AI ที่เป็นนวัตกรรมใหม่ในแอป เราได้เปิดตัวการอัปเดตใหม่ที่มีประสิทธิภาพไปเมื่อเร็วๆ นี้
Thomas Ezan • ใช้เวลาอ่าน 3 นาที
-
ข่าวสารผลิตภัณฑ์
Android 17 ได้เปิดตัวเบต้า 4 ซึ่งเป็นเบต้าสุดท้ายที่กำหนดไว้ในรอบการเผยแพร่นี้ ซึ่งเป็นเป้าหมายสำคัญสำหรับความเข้ากันได้ของแอปและความเสถียรของแพลตฟอร์ม
Daniel Galpin • ใช้เวลาอ่าน 4 นาที
รับข่าวสาร
รับข้อมูลเชิงลึกด้านการพัฒนาแอป Android ล่าสุดส่งตรงถึงกล่องจดหมายของคุณทุกสัปดาห์