วิธีใช้

Media3 1.11 - มีอะไรใหม่

อ่าน 3 นาที
ดูโปรไฟล์ของ Toni Heidenreich
Toni Heidenreich วิศวกรซอฟต์แวร์, Android

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, อุปกรณ์พับได้ และสภาพแวดล้อมเดสก์ท็อปเป็นไปอย่างราบรื่น

player_video.png
ตัวอย่างเพลเยอร์ Composable ที่มีการควบคุมที่ปรับแต่งเอง

ท่าทางสัมผัสและการควบคุมความเร็วในการเล่น

ตอนนี้ 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 ซึ่งช่วยให้ปรับให้เข้ากับธีมวอลเปเปอร์ของผู้ใช้ได้โดยอัตโนมัติ ฟีเจอร์นี้เหมาะอย่างยิ่งสำหรับชีตด้านล่างแบบถาวรหรือฟีเจอร์มินิเพลเยอร์ เช่น ขณะที่ผู้ใช้เรียกดูเนื้อหาหรือระหว่างเซสชันการแคสต์ที่ใช้งานอยู่

mini_player.png
Media3 MiniController แสดงปกอัลบั้ม ข้อมูลเมตาของสื่อ และการควบคุมพื้นฐาน

ตัวยึดสถานะที่ขยายแล้วสำหรับข้อมูลเมตาและข้อผิดพลาด

เราได้เพิ่มตัวยึดสถานะแบบ Reactive ใหม่หลายรายการลงใน media3-ui-compose ดังนี้

  • rememberCurrentMediaItemState - สังเกตข้อมูลเมตาเกี่ยวกับรายการที่กำลังเล่น
  • rememberPlaylistState - สังเกตเพลย์ลิสต์ทั้งหมดและดัชนีที่ใช้งานอยู่
  • rememberErrorState - ติดตามข้อผิดพลาดในการเล่นด้วย ErrorText Composable ที่ตรงกันและ 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()
  }
}
cast_button_2.png
ปุ่มการกำหนดเส้นทางสื่อ Media3 ในแอปที่เปิดกล่องโต้ตอบตัวสลับเอาต์พุตเริ่มต้น

การปรับปรุงการเล่นและเซสชันหลัก

Eclipsa Video - ข้อมูลเมตา HDR แบบไดนามิกของ HAGC (API 37 ขึ้นไป)

Eclipsa Video สัญญาว่าจะมอบประสบการณ์ HDR ที่สอดคล้องกันมากขึ้นในอุปกรณ์ต่างๆ ด้วยสีขาว HDR พื้นฐานที่สอดคล้องกัน พื้นที่ว่างแบบปรับได้ตามหน้าจอและสภาพแวดล้อม เพื่อให้มั่นใจว่าเจตนาสร้างสรรค์จะยังคงอยู่บนอุปกรณ์ทุกเครื่อง

ตอนนี้ ExoPlayer รองรับการเล่นข้อมูลเมตาแบบกำหนดเวลา HAGC (ST 2094-50) ที่จำเป็นสำหรับสื่อแบบโปรเกรสซีฟ (MP4, Matroska) แล้ว เพลเยอร์จะผสานแทร็กข้อมูลเมตา HAGC กับแทร็กวิดีโอที่เชื่อมโยงโดยอัตโนมัติ และส่งข้อมูลเมตาแบบนอกแบนด์ไปยังตัวถอดรหัสในอุปกรณ์ API 37 ขึ้นไป ในอุปกรณ์รุ่นเก่า ExoPlayer จะกลับไปใช้ประสบการณ์การเล่น HDR มาตรฐานโดยไม่มีการปรับเปลี่ยนอย่างราบรื่น  

eclipsa.png
ภาพประกอบเพื่อแสดงประโยชน์ของ Eclipsa Video 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 สำหรับการนำทางหนังสือเสียงและพอดแคสต์

โปรดใช้ เครื่องมือติดตามปัญหาเพื่อรายงานข้อบกพร่อง หรือหากมีคำถามหรือคำขอฟีเจอร์ เราหวังว่าจะได้รับความคิดเห็นจากคุณ

เขียนโดย
อ่านต่อ