Media3 1.11 พร้อมใช้งานแล้ว เวอร์ชันนี้ขับเคลื่อนแอปสื่อยอดนิยมของ Android ส่วนใหญ่ และมาพร้อมฟีเจอร์ใหม่ การแก้ไขข้อบกพร่อง และการปรับปรุงในส่วนประกอบการเล่น การตัดต่อ และ UI เรากำลังขยายโมดูล UI ของ Jetpack Compose ด้วยช่อง Player ที่ปรับแต่งได้ ค่าเริ่มต้นที่ใช้งานง่าย ท่าทางสัมผัสแบบโต้ตอบ ตัวสังเกตสถานะ และการโหลดวิดีโอแบบสั้นล่วงหน้าโดยใช้ PlayerPool นอกจากนี้ เรายังปรับปรุงการผสานรวม Media3 Cast ให้ทันสมัยด้วยการรองรับตัวสลับเอาต์พุต SystemUI, แนะนำส่วนขยายเครือข่ายไคลเอ็นต์ HTTP ของ Ktor ใหม่ และเพิ่มยูทิลิตีการมัลติเพล็กซ์ใหม่สำหรับไฟล์ Ogg และ WAV
อ่านไฮไลต์สำคัญและดูรายการการเปลี่ยนแปลงทั้งหมดได้ใน บันทึกประจำรุ่น
UI การเล่นและ Compose
เนื่องจาก Android กำลังเปลี่ยนไปใช้ Compose เป็นหลัก เราจึงขยายโมดูล media3-ui-compose และ media3-ui-compose-material3 ต่อไป การอัปเดตนี้มาพร้อมการควบคุมเลย์เอาต์ของเพลเยอร์ที่ละเอียดยิ่งขึ้น รูปแบบการโต้ตอบที่สมบูรณ์ยิ่งขึ้น และการผสานรวมกับ Material3 ที่ลึกซึ้งยิ่งขึ้น
เลย์เอาต์ของเพลเยอร์ที่ปรับแต่งได้
ตอนนี้ Material 3 Player Composable รองรับช่องเนื้อหาเฉพาะสำหรับ topControls, centerControls, bottomControls และ errorOverlay แล้ว คุณสามารถวาง Composables ของคุณเองหรือใช้ค่าเริ่มต้นที่พร้อมใช้งานซึ่งเผยแพร่ใน PlayerDefaults ได้
Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, )
นอกจากนี้ Player Composable ยังผสานรวมการรองรับ FocusRequester ซึ่งช่วยให้การนำทางด้วย D-pad และคีย์บอร์ดใน Android TV, อุปกรณ์พับได้ และสภาพแวดล้อมเดสก์ท็อปเป็นไปอย่างราบรื่น
ท่าทางสัมผัสและการควบคุมความเร็วในการเล่น
ตอนนี้ PlaybackSpeedState มี API การกรอไปข้างหน้า/สโลว์โมชันแล้ว demo-compose app แสดงให้เห็นถึงฟีเจอร์นี้ด้วยท่าทางสัมผัสแบบกดค้างเพื่อกรอการเล่นไปข้างหน้าและการค้นหาด้วยการแตะ 2 ครั้ง เมื่อรวมกับ ProgressSlider ที่เปิดตัวในเวอร์ชัน 1.10 แล้ว ตอนนี้ UI ของเพลเยอร์ Compose จึงมีการโต้ตอบด้วยการสัมผัสและท่าทางสัมผัสที่สมบูรณ์แบบ
การโหลดวิดีโอแบบสั้นล่วงหน้าด้วย PlayerPool
สำหรับแอปที่มีฟีดสื่อแบบหน้าต่างเลื่อน (เช่น วิดีโอแนวตั้งแบบสั้น) การจัดการอินสแตนซ์ ExoPlayer หลายรายการอย่างมีประสิทธิภาพเป็นความท้าทายที่พบได้ทั่วไป Media3 1.11 ขอแนะนำ PlayerPool (ใน common-ktx) และ rememberPooledPlayer (ใน ui-compose) เพื่อจัดการการรีไซเคิลและการโหลดเพลเยอร์ล่วงหน้าโดยอัตโนมัติ
ShortFormPlayerScreen ใหม่ใน demo-compose แสดงให้เห็นถึงการทำงานของฟีเจอร์นี้ในฟีดการแบ่งหน้าแนวตั้งที่เพลเยอร์ได้รับการจัดกลุ่ม โหลดล่วงหน้า และรีไซเคิลอย่างราบรื่นเมื่อผู้ใช้เลื่อน
MiniController
MiniController Composable ใหม่ใน media3-ui-compose-material3 มีแถบการเล่นขนาดกะทัดรัดที่แสดงชื่อ ศิลปิน อาร์ตเวิร์ก และความคืบหน้าของรายการปัจจุบัน รวมถึงการควบคุมการเล่น/หยุดชั่วคราว MiniController รองรับการผสานรวมสีแบบไดนามิกของ Material3 เช่นเดียวกับ Composables เริ่มต้นทั้งหมดของเราใน media3-ui-compose-material3 ซึ่งช่วยให้ปรับให้เข้ากับธีมวอลเปเปอร์ของผู้ใช้ได้โดยอัตโนมัติ ฟีเจอร์นี้เหมาะอย่างยิ่งสำหรับชีตด้านล่างแบบถาวรหรือฟีเจอร์มินิเพลเยอร์ เช่น ขณะที่ผู้ใช้เรียกดูเนื้อหาหรือระหว่างเซสชันการแคสต์ที่ใช้งานอยู่
ตัวยึดสถานะที่ขยายแล้วสำหรับข้อมูลเมตาและข้อผิดพลาด
เราได้เพิ่มตัวยึดสถานะแบบ Reactive ใหม่หลายรายการลงใน media3-ui-compose ดังนี้
rememberCurrentMediaItemState- สังเกตข้อมูลเมตาเกี่ยวกับรายการที่กำลังเล่นrememberPlaylistState- สังเกตเพลย์ลิสต์ทั้งหมดและดัชนีที่ใช้งานอยู่rememberErrorState- ติดตามข้อผิดพลาดในการเล่นด้วยErrorTextComposable ที่ตรงกันและErrorOverlayเริ่มต้นใน Material3
เราจะเพิ่มฟีเจอร์ใหม่และตัวเลือกการปรับแต่งเพิ่มเติมในเวอร์ชันที่จะเปิดตัวในอนาคต โปรดแชร์ความคิดเห็นของคุณใน เครื่องมือติดตามปัญหาของโปรเจ็กต์
การผสานรวม Cast ที่ปรับปรุงให้ทันสมัย
Media3 1.11 อัปเดตส่วนขยาย Cast ด้วยตัวเลือกการกำหนดค่าแบบเป็นโปรแกรมและการรองรับการกำหนดเส้นทางระดับระบบปฏิบัติการ
CastParams และตัวสลับเอาต์พุต SystemUI
ตอนนี้คุณกำหนดค่าส่วนขยาย Cast ได้แล้วโดยใช้ CastParams
val castParams = CastParams.Builder() .setShowSystemOutputSwitcherOnCastButtonClick(true) .build() Cast.getSingletonInstance(context).initialize(castParams)
การตั้งค่า setShowSystemOutputSwitcherOnCastIconClick(true) จะกำหนดค่า MediaRouteButton ให้เปิดตัวสลับเอาต์พุต SystemUI ดั้งเดิมของ Android ในเวอร์ชันแพลตฟอร์มที่รองรับ ซึ่งจะมอบประสบการณ์การเลือกเอาต์พุตแบบรวม
สถานะ MediaRouteButton แบบ Reactive ใน Compose
ตอนนี้แอปที่ใช้ Jetpack Compose สามารถเพิ่มปุ่มการกำหนดเส้นทางสื่อ (หรือที่เรียกว่าปุ่มแคสต์) ได้อย่างง่ายดาย ซึ่งจะสังเกตสถานะกล่องโต้ตอบและอัปเดตตามนั้นโดยอัตโนมัติ ไม่จำเป็นต้องใช้ตรรกะเพิ่มเติมเมื่อใช้ร่วมกับ CastPlayer ของ Media3!
@Composable fun TopAppBarWithCast() { Row { Text(text = "App Title") MediaRouteButton() } }
การปรับปรุงการเล่นและเซสชันหลัก
Eclipsa Video - ข้อมูลเมตา HDR แบบไดนามิกของ HAGC (API 37 ขึ้นไป)
Eclipsa Video สัญญาว่าจะมอบประสบการณ์ HDR ที่สอดคล้องกันมากขึ้นในอุปกรณ์ต่างๆ ด้วยสีขาว HDR พื้นฐานที่สอดคล้องกัน พื้นที่ว่างแบบปรับได้ตามหน้าจอและสภาพแวดล้อม เพื่อให้มั่นใจว่าเจตนาสร้างสรรค์จะยังคงอยู่บนอุปกรณ์ทุกเครื่อง
ตอนนี้ ExoPlayer รองรับการเล่นข้อมูลเมตาแบบกำหนดเวลา HAGC (ST 2094-50) ที่จำเป็นสำหรับสื่อแบบโปรเกรสซีฟ (MP4, Matroska) แล้ว เพลเยอร์จะผสานแทร็กข้อมูลเมตา HAGC กับแทร็กวิดีโอที่เชื่อมโยงโดยอัตโนมัติ และส่งข้อมูลเมตาแบบนอกแบนด์ไปยังตัวถอดรหัสในอุปกรณ์ API 37 ขึ้นไป ในอุปกรณ์รุ่นเก่า ExoPlayer จะกลับไปใช้ประสบการณ์การเล่น HDR มาตรฐานโดยไม่มีการปรับเปลี่ยนอย่างราบรื่น
ส่วนขยายไคลเอ็นต์ HTTP ของ Ktor ใหม่
โมดูลส่วนขยาย media3-datasource-ktor ใหม่มี KtorDataSource ซึ่งขับเคลื่อนโดยสแต็ก HTTP ของ Ktor ซึ่งเป็นทางเลือกที่เน้น Kotlin เป็นหลักและใช้งานร่วมกับโครูทีนได้ดีสำหรับโมดูลแหล่งข้อมูล Cronet และ OkHttp ที่มีอยู่
การเชื่อมต่อ MediaSession แบบอะซิงโครนัส
ตอนนี้ MediaSession.Callback มี onConnectAsync() ซึ่งช่วยให้คุณประมวลผลความพยายามในการเชื่อมต่อของคอนโทรลเลอร์แบบอะซิงโครนัสได้ เช่น เพื่อยืนยันการให้สิทธิ์ก่อนที่จะยอมรับการเชื่อมต่อ คุณสามารถส่งคืน Future ทันทีด้วย Futures.immediateFuture(ConnectionResult) เพื่อให้มีลักษณะการทำงานเหมือนกับ onConnect ที่มีอยู่
override fun onConnectAsync( session: MediaSession, controller: MediaSession.ControllerInfo ): ListenableFuture<MediaSession.ConnectionResult> { return authenticateControllerAsync(controller) }
ค่าเริ่มต้น MediaSession ที่ปลอดภัยยิ่งขึ้น
สำหรับแอปที่ไม่ได้ลบล้าง onConnect หรือ onConnectAsync ใน MediaSession.Callback ตอนนี้ไลบรารีจะใช้การกำหนดค่าที่ปลอดภัยยิ่งขึ้นเป็นค่าเริ่มต้น โดยเฉพาะอย่างยิ่ง ระบบจะไม่แชร์ข้อมูลเซสชันกับคอนโทรลเลอร์ที่ไม่น่าเชื่อถือเป็นค่าเริ่มต้น ซึ่งหมายความว่าแอปของบุคคลที่สามหรือแอปที่ไม่ใช่ระบบที่ไม่มีสิทธิ์เข้าถึงการแจ้งเตือนจะถูกจำกัดไม่ให้เข้าถึงข้อมูลเซสชัน เว้นแต่คุณจะใช้เมธอดเรียกกลับเหล่านี้อย่างชัดเจนเพื่อให้สิทธิ์การเชื่อมต่อ
การใช้งาน Muxer ใหม่และการแยกวิเคราะห์คอนเทนเนอร์
OggMuxer และ WavMuxer
เราได้เพิ่ม Muxer เฉพาะ 2 รายการใหม่ ได้แก่ OggMuxer สำหรับการมัลติเพล็กซ์สตรีม OPUS และ VORBIS ลงในไฟล์ .ogg มาตรฐาน และ WavMuxer สำหรับการสร้างไฟล์เสียง PCM .wav ที่ไม่มีการบีบอัดและเป็นจุดลอยตัว
การแยกวิเคราะห์คอนเทนเนอร์และการอ้างอิงแทร็ก
- การอ้างอิงแทร็ก MP4 (
tref):Mp4Muxer.addTrackReferenceช่วยให้ลิงก์ข้อมูลเมตาหรือแทร็กเสริมที่ขึ้นอยู่กับแทร็กหลักไปยังสตรีมวิดีโอหลักได้ - การแยกบท: ตอนนี้ระบบจะแยกบท QuickTime และ Nero จากไฟล์ MP4 (
.m4a,.m4b) และบท Matroska เป็นรายการข้อมูลเมตาChapterสำหรับการนำทางหนังสือเสียงและพอดแคสต์
โปรดใช้ เครื่องมือติดตามปัญหาเพื่อรายงานข้อบกพร่อง หรือหากมีคำถามหรือคำขอฟีเจอร์ เราหวังว่าจะได้รับความคิดเห็นจากคุณ
-
วิธีใช้ยินดีต้อนรับกลับสู่ซีรีส์บล็อกโพสต์ "สร้างแอป Android ที่ชาญฉลาด" ซึ่งเราจะนำแอป Android พื้นฐานมาเปลี่ยนให้เป็นประสบการณ์การใช้งานที่ปรับเปลี่ยนตามผู้ใช้ ชาญฉลาด และเป็นตัวแทนของผู้ใช้ ในโพสต์ก่อนหน้านี้ เราได้แนะนำ Jetpacker ซึ่งเป็นแอปเดโมที่เราจะใช้ตลอดซีรีส์นี้
Caren Chang • อ่าน 6 นาที -
วิธีใช้Jetpacker เป็นแอปสาธิตทางเทคนิคที่ทีมของเราสร้างขึ้นตั้งแต่ต้นสำหรับงาน Google I/O ปีนี้ (สร้างขึ้นโดยใช้ Antigravity) โดยหลักๆ แล้ว Jetpacker ช่วยให้ผู้ใช้วางแผน สำรวจ และเพลิดเพลินกับการผจญภัยครั้งใหญ่ครั้งต่อไป
Jolanda Verhoef • อ่าน 4 นาที -
วิธีใช้ยินดีต้อนรับกลับสู่ซีรีส์บล็อกโพสต์ "สร้างแอป Android ที่ชาญฉลาด" ซึ่งเราจะนำแอป Android พื้นฐานมาเปลี่ยนให้เป็นประสบการณ์การใช้งานที่ปรับเปลี่ยนตามผู้ใช้ ชาญฉลาด และเป็นตัวแทนของผู้ใช้ ในโพสต์ก่อนหน้านี้ เราได้สำรวจวิธีใช้ประโยชน์จาก Firebase AI Logic เพื่อสร้างฟีเจอร์ AI ที่โฮสต์บนระบบคลาวด์และแบบไฮบริด
Ben Weiss • อ่าน 6 นาที
รับข้อมูลเชิงลึกล่าสุดเกี่ยวกับการพัฒนา Android ส่งตรงถึงกล่องจดหมายของคุณ ทุกสัปดาห์