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 ของคุณเอง คุณสามารถใช้ Building Block ที่ดูแลตรรกะการอัปเดตและการเชื่อมต่อทั้งหมด เพื่อให้คุณมุ่งเน้นไปที่การออกแบบองค์ประกอบ 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 ของเพลเยอร์สำหรับฟีเจอร์แต่งเพลงแบบเรียบง่ายพร้อมองค์ประกอบสำเร็จรูป
จัดการการเปลี่ยนระหว่างการแคสต์และการเล่นในเครื่องโดยอัตโนมัติ
เราได้เขียน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เมื่อตรวจพบสถานะค้างเพื่อให้เห็นได้ชัดเจนยิ่งขึ้น - Wake Lock โดยค่าเริ่มต้น - ก่อนหน้านี้การจัดการ 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 หากพบข้อบกพร่อง หรือหากมีคำถามหรือคำขอฟีเจอร์ เราหวังเป็นอย่างยิ่งว่าจะได้รับการติดต่อจากคุณ
-
ข่าวสารเกี่ยวกับผลิตภัณฑ์ใน Google Play เราขยายแพลตฟอร์มการสมัครใช้บริการอย่างต่อเนื่องเพื่อช่วยให้คุณขับเคลื่อนการเติบโต ปรับตัวให้เข้ากับโมเดลธุรกิจใหม่ๆ และเข้าถึงผู้ใช้ได้ตรงจุด
Sheenam Mittal • อ่าน 4 นาที -
ข่าวสารเกี่ยวกับผลิตภัณฑ์เมื่อปีที่แล้ว Android Studio ได้เปิดให้ใช้โมเดล AI ใดก็ได้ วันนี้เราจะก้าวไปอีกขั้นด้วยการเปิดตัวการรองรับเอเจนต์การเขียนโค้ดที่คุณเลือก
Matthew Warner • ใช้เวลาอ่าน 3 นาที -
ข่าวสารเกี่ยวกับผลิตภัณฑ์Googlebook เปิดตัวแล็ปท็อปหมวดหมู่ใหม่ที่สร้างขึ้นบนพื้นฐาน Android ที่ใช้ร่วมกัน ฮาร์ดแวร์ประสิทธิภาพสูงจากพาร์ทเนอร์ เช่น HP, Dell, Lenovo, Acer และ Asus ผสานความสะดวกในการใช้งานบนอุปกรณ์เคลื่อนที่เข้ากับประสิทธิภาพของเดสก์ท็อป
Fahd Imtiaz, Loryn Hairston • อ่าน 4 นาที
รับข้อมูลเชิงลึกด้านการพัฒนา Android ล่าสุดส่งตรงถึงกล่องจดหมายของคุณทุกสัปดาห์