Media3 1.9.0 พร้อมให้บริการแล้ว นอกจากการแก้ไขข้อบกพร่องและการปรับปรุงประสิทธิภาพตามปกติแล้ว รุ่นล่าสุดนี้ยังมีโมดูลใหม่หรือโมดูลที่เขียนขึ้นใหม่เป็นส่วนใหญ่ 4 โมดูล ได้แก่
media3-inspector- แยกข้อมูลเมตาและเฟรมภายนอกการเล่นmedia3-ui-compose-material3- สร้าง UI สื่อสื่อสารประกอบ Material3 พื้นฐานได้ในไม่กี่ขั้นตอนmedia3-cast- จัดการการเปลี่ยนระหว่างการเล่นในอุปกรณ์และการเล่นผ่าน 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 สื่อสารประกอบ Material3 พื้นฐานได้ในไม่กี่ขั้นตอน
ในรุ่นก่อนๆ เราได้เริ่มให้โค้ดตัวเชื่อมต่อระหว่างองค์ประกอบ UI สื่อสารประกอบกับอินสแตนซ์ Player ของคุณ ใน Media3 1.9.0 เราได้เพิ่มโมดูลใหม่ media3-ui-compose-material3 ที่มีปุ่มและองค์ประกอบเนื้อหา Material3 ที่จัดสไตล์อย่างเต็มรูปแบบ ซึ่งช่วยให้คุณสร้าง UI สื่อได้ในไม่กี่ขั้นตอน พร้อมทั้งให้ความยืดหยุ่นอย่างเต็มที่ในการปรับแต่งสไตล์ หากต้องการสร้างสไตล์ UI ของคุณเอง คุณสามารถใช้องค์ประกอบที่ใช้สร้างสรรค์ที่ดูแลตรรกะการอัปเดตและการเชื่อมต่อทั้งหมด คุณจึงมีหน้าที่เพียงมุ่งเน้นไปที่การออกแบบองค์ประกอบ UI โปรดดูหน้าคู่มือแบบขยายสำหรับโมดูล UI สื่อสารประกอบ
นอกจากนี้ เรายังคงพัฒนาคอมโพเนนต์สื่อสารประกอบเพิ่มเติม เช่น แถบเลื่อนที่สร้างไว้ล่วงหน้า, การแทนที่ 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 Player สื่อสารประกอบแบบง่ายที่มีองค์ประกอบแบบสำเร็จรูป
จัดการการเปลี่ยนระหว่างการเล่นผ่าน Cast และการเล่นในอุปกรณ์โดยอัตโนมัติ
เราได้เขียน 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 ให้ดียิ่งขึ้น โดยก่อนหน้านี้เครื่องมือนี้ช่วยให้คุณโหลดสื่อล่วงหน้าลงในหน่วยความจำภายนอกการเล่น แล้วส่งต่อสื่อไปยัง Player ได้อย่างราบรื่นเมื่อจำเป็น แม้ว่าจะมีประสิทธิภาพสูง แต่คุณก็ยังต้องระมัดระวังไม่ให้โหลดล่วงหน้ามากเกินไปโดยไม่ได้ตั้งใจจนเกินขีดจำกัดหน่วยความจำ ดังนั้นใน Media3 1.9.0 เราจึงได้เพิ่ม 2 ฟีเจอร์ที่จะช่วยให้การดำเนินการนี้ง่ายขึ้นและเสถียรมากขึ้น
- การรองรับการแคช – เมื่อกำหนดระยะทางที่จะโหลดล่วงหน้า ตอนนี้คุณสามารถเลือก
PreloadStatus.specifiedRangeCached(0, 5000)เป็นสถานะเป้าหมายสำหรับรายการที่โหลดล่วงหน้า ซึ่งจะเพิ่มช่วงที่ระบุลงในแคชบนดิสก์แทนที่จะโหลดข้อมูลลงในหน่วยความจำ ด้วยวิธีนี้ คุณจะระบุรายการที่จะโหลดล่วงหน้าได้มากขึ้น เนื่องจากรายการที่อยู่ไกลจากรายการปัจจุบันจะไม่จำเป็นต้องใช้หน่วยความจำอีกต่อไป โปรดทราบว่าการดำเนินการนี้ต้องตั้งค่าCacheในDefaultPreloadManager.Builder - การจัดการหน่วยความจำอัตโนมัติ – เรายังได้อัปเดตอินเทอร์เฟซ
LoadControlเพื่อจัดการกรณีการโหลดล่วงหน้าได้ดียิ่งขึ้น ตอนนี้คุณจึงสามารถกำหนดขีดจำกัดหน่วยความจำสูงสุดที่ชัดเจนสำหรับรายการที่โหลดล่วงหน้าทั้งหมดในหน่วยความจำได้ โดยค่าเริ่มต้นคือ 144 MB และคุณสามารถกำหนดค่าขีดจำกัดได้ในDefaultLoadControl.BuilderDefaultPreloadManagerจะหยุดการโหลดล่วงหน้าโดยอัตโนมัติเมื่อถึงขีดจำกัด และจะปล่อยหน่วยความจำของรายการที่มีลำดับความสำคัญต่ำกว่าโดยอัตโนมัติหากจำเป็น
ใช้ลักษณะการทำงานเริ่มต้นที่เรียบง่ายขึ้นใหม่ใน ExoPlayer
เช่นเคย เราได้เพิ่มการปรับปรุงทีละเล็กละน้อยมากมายลงใน ExoPlayer ด้วย ตัวอย่างเช่น
- ปิดเสียงและเปิดเสียง – เรามีเมธอด
setVolumeอยู่แล้ว แต่ตอนนี้ได้เพิ่มเมธอดmuteและunmuteที่สะดวกสบายเพื่อให้คุณกู้คืนระดับเสียงก่อนหน้าได้อย่างง่ายดายโดยไม่ต้องติดตามระดับเสียงด้วยตนเอง - การตรวจหา Player ที่ค้าง \- ในบางกรณีที่พบได้ไม่บ่อย Player อาจค้างอยู่ในสถานะบัฟเฟอร์หรือเล่นโดยไม่มีความคืบหน้าใดๆ เช่น เนื่องจากปัญหาเกี่ยวกับตัวแปลงสัญญาณหรือการกำหนดค่าที่ไม่ถูกต้อง ผู้ใช้จะรู้สึกรำคาญ แต่คุณจะไม่เห็นปัญหาเหล่านี้ในข้อมูลวิเคราะห์ Player จะรายงาน
StuckPlayerExceptionเมื่อตรวจพบสถานะค้างเพื่อให้เห็นได้ชัดเจนยิ่งขึ้น - Wakelock โดยค่าเริ่มต้น \- ก่อนหน้านี้การจัดการ Wakelock เป็นแบบเลือกใช้ ซึ่งทำให้เกิดกรณีที่พบได้ไม่บ่อยซึ่งความคืบหน้าในการเล่นอาจล่าช้ามากเมื่อทำงานในเบื้องหลัง ตอนนี้ฟีเจอร์นี้เป็นแบบเลือกไม่ใช้แล้ว คุณจึงไม่ต้องกังวลและสามารถนำการจัดการ Wake Lock ด้วยตนเองทั้งหมดเกี่ยวกับการเล่นออกได้
- การตั้งค่าที่ง่ายขึ้นสำหรับตรรกะปุ่มคำบรรยาย \- การเปลี่ยน
TrackSelectionParametersให้พูดว่า "เปิด/ปิดคำบรรยาย" นั้นทำได้ยากอย่างน่าประหลาดใจ เราจึงได้เพิ่มตัวเลือกบูลีนselectTextByDefaultแบบง่ายสำหรับกรณีการใช้งานนี้
ทำให้ค่ากำหนดปุ่มสื่อใน MediaSession ง่ายขึ้น
จนถึงตอนนี้ การกำหนดค่ากำหนดว่าควรแสดงปุ่มใดในลิ้นชักการแจ้งเตือนสื่อใน Android Auto หรือ WearOS จำเป็นต้องกำหนดคำสั่งและปุ่มที่กำหนดเอง แม้ว่าคุณจะเพียงต้องการเรียกใช้เมธอด Player มาตรฐานก็ตาม
Media3 1.9.0 มีฟังก์ชันการทำงานใหม่ที่จะทำให้การดำเนินการนี้ง่ายขึ้นมาก ตอนนี้คุณสามารถกำหนดค่ากำหนดปุ่มสื่อด้วยคำสั่ง Player มาตรฐานได้แล้ว โดยไม่จำเป็นต้องจัดการคำสั่งที่กำหนดเองเลย
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 เป็นคอมโพเนนต์ใหม่ใน Media3 Editing API ที่ออกแบบมาเพื่อแสดงตัวอย่างการแก้ไขสื่อแบบเรียลไทม์ CompositionPlayer สร้างขึ้นจากอินเทอร์เฟซ Player ที่คุ้นเคยของ Media3 และช่วยให้ผู้ใช้เห็นการเปลี่ยนแปลงที่เกิดขึ้นจริงก่อนที่จะยืนยันกระบวนการส่งออก โดยใช้ Composition ออบเจ็กต์เดียวกันกับที่คุณจะส่งไปยัง Transformer เพื่อส่งออก ซึ่งจะช่วยเพิ่มประสิทธิภาพเวิร์กโฟลว์การแก้ไขด้วยการรวมโมเดลข้อมูลสำหรับการแสดงตัวอย่างและการส่งออกเข้าด้วยกัน
เราขอแนะนำให้คุณเริ่มใช้ CompositionPlayer และแชร์ความคิดเห็น รวมถึงติดตามดูโพสต์และการอัปเดตเอกสารที่จะเผยแพร่ในอนาคตเพื่อดูรายละเอียดเพิ่มเติม
InAppMuxer เป็นตัวมัลติเพล็กเซอร์เริ่มต้นใน Transformer
ตอนนี้ Transformer ใช้ InAppMp4Muxer เป็นตัวมัลติเพล็กเซอร์เริ่มต้นสำหรับการเขียนไฟล์คอนเทนเนอร์สื่อ ภายใน InAppMp4Muxer จะขึ้นอยู่กับโมดูล Media3 Muxer ซึ่งให้ลักษณะการทำงานที่สอดคล้องกันใน 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 กำหนดให้ระบุประเภทแทร็กเอาต์พุตที่ต้องการในระหว่างการสร้างลำดับ การเปลี่ยนแปลงนี้ช่วยให้การจัดการแทร็กมีความชัดเจนและมีประสิทธิภาพมากขึ้นใน Composition ทั้งหมด
การดำเนินการนี้ทำผ่านคอนสตรักเตอร์ 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 หากพบข้อบกพร่อง หรือหากมีคำถามหรือคำขอฟีเจอร์ เรายินดีให้ความช่วยเหลือ
อ่านต่อ
-
ข่าวสารเกี่ยวกับผลิตภัณฑ์
เรายินดีที่จะประกาศว่าการรองรับ Unreal Engine และ Godot อย่างเป็นทางการสำหรับ Android XR พร้อมให้บริการแล้ว นอกจากนี้ เรายังเปิดตัวเครื่องมือใหม่ที่ออกแบบมาเพื่อเพิ่มประสิทธิภาพในการทำงานและเปิดใช้ความสามารถใหม่ๆ ของ XR ได้แก่ Android XR Engine Hub และ Android XR Interaction Framework
Luke Hopkins • ใช้เวลาอ่าน 4 นาที
-
ข่าวสารเกี่ยวกับผลิตภัณฑ์
เมื่อเปิดตัว Android 17 เราจะเปลี่ยนไปใช้มาตรฐานการพัฒนาแบบปรับอัตโนมัติเป็นอันดับแรก ผู้ใช้ไม่ได้พึ่งพาฟอร์มแฟกเตอร์เดียวอีกต่อไป แต่จะเปลี่ยนไปใช้อุปกรณ์ต่างๆ เช่น โทรศัพท์, อุปกรณ์พับได้, แท็บเล็ต, แล็ปท็อป, จอแสดงผลในรถยนต์ และสภาพแวดล้อม XR แบบสมจริงตลอดทั้งวัน
Fahd Imtiaz • ใช้เวลาอ่าน 4 นาที
-
ข่าวสารเกี่ยวกับผลิตภัณฑ์
เรายินดีที่จะแชร์ฟีเจอร์ของ Google TV และเครื่องมือสำหรับนักพัฒนาแอปที่ออกแบบมาเพื่อเพิ่มการค้นพบเนื้อหาของคุณและเตรียมแอปให้พร้อมสำหรับประสบการณ์การใช้งานทีวีในอนาคต
Paul Lammertsma • ใช้เวลาอ่าน 4 นาที
รับข่าวสาร
รับข้อมูลเชิงลึกล่าสุดเกี่ยวกับการพัฒนา Android ส่งตรงถึงกล่องจดหมายของคุณ ทุกสัปดาห์