ข่าวสารเกี่ยวกับผลิตภัณฑ์

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

อ่าน 6 นาที
ดูโปรไฟล์ของ Kristina Simakova
Kristina Simakova ผู้จัดการฝ่ายวิศวกรรม

Media3 1.9.0 พร้อมให้บริการแล้ว นอกจากการแก้ไขข้อบกพร่องและการปรับปรุงประสิทธิภาพตามปกติแล้ว รุ่นล่าสุดยังมีโมดูลใหม่หรือโมดูลที่เขียนขึ้นใหม่เป็นส่วนใหญ่ 4 โมดูลดังนี้

  • media3-inspector - แยกข้อมูลเมตาและเฟรมภายนอกการเล่น
  • media3-ui-compose-material3 - สร้าง UI สื่อ Compose ของ Material3 พื้นฐานได้ในไม่กี่ขั้นตอน
  • media3-cast - จัดการการเปลี่ยนระหว่างการเล่นในอุปกรณ์และการเล่นผ่าน 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 กับอินสแตนซ์ Player ใน 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)
    }
  }
}

 

image.png

UI ของเพลเยอร์ Compose แบบง่ายที่มีองค์ประกอบที่ใช้ได้ทันที

จัดการการเปลี่ยนระหว่างการเล่นผ่าน 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()

}
image.png

การผสานรวม CastPlayer ใหม่ในแอปเดโมเซสชัน Media3

การเล่น AV1 ที่สอดคล้องกันด้วยส่วนขยายที่เขียนขึ้นใหม่โดยอิงตาม dav1d

รุ่น 1.9.0 มีโมดูลส่วนขยาย AV1 ที่เขียนขึ้นใหม่ทั้งหมดโดยอิงตามไลบรารี dav1d ที่ได้รับความนิยม

เช่นเดียวกับโมดูลตัวถอดรหัสส่วนขยายทั้งหมด โปรดทราบว่าโมดูลนี้ต้องสร้างจากแหล่งที่มา เพื่อรวมโค้ดแบบเนทีฟที่เกี่ยวข้องอย่างถูกต้อง การรวมตัวถอดรหัสไว้ด้วยกันจะช่วยให้การรองรับรูปแบบมีความสอดคล้องกันในทุกอุปกรณ์ แต่เนื่องจากตัวถอดรหัสจะทำงานในกระบวนการของคุณเอง จึงเหมาะที่สุดสำหรับเนื้อหาที่คุณเชื่อถือได้

ผสานรวมการแคชและการจัดการหน่วยความจำเข้ากับ PreloadManager

เราได้ปรับปรุง PreloadManager ให้ดียิ่งขึ้น โดยก่อนหน้านี้ `PreloadManager` ช่วยให้คุณโหลดสื่อล่วงหน้าลงในหน่วยความจำภายนอกการเล่น แล้วส่งต่อสื่อไปยังเพลเยอร์ได้อย่างราบรื่นเมื่อจำเป็น แม้ว่าจะมีประสิทธิภาพค่อนข้างดี แต่คุณก็ยังต้องระมัดระวังไม่ให้โหลดล่วงหน้ามากเกินไปโดยไม่ได้ตั้งใจจนเกินขีดจำกัดหน่วยความจำ ดังนั้นใน Media3 1.9.0 เราจึงได้เพิ่มฟีเจอร์ 2 อย่างที่จะช่วยให้การดำเนินการนี้ง่ายขึ้นและมีเสถียรภาพมากขึ้น

  1. การรองรับการแคช – เมื่อกำหนดระยะทางที่จะโหลดล่วงหน้า ตอนนี้คุณสามารถเลือกPreloadStatus.specifiedRangeCached(0, 5000) เป็นสถานะเป้าหมายสำหรับรายการที่โหลดล่วงหน้า การดำเนินการนี้จะเพิ่มช่วงที่ระบุลงในแคชบนดิสก์แทนที่จะโหลดข้อมูลลงในหน่วยความจำ ด้วยวิธีนี้ คุณจะระบุรายการที่จะโหลดล่วงหน้าได้มากขึ้น เนื่องจากรายการที่อยู่ไกลจากรายการปัจจุบันจะไม่จำเป็นต้องใช้หน่วยความจำอีกต่อไป โปรดทราบว่าการดำเนินการนี้ต้องตั้งค่า Cache ใน DefaultPreloadManager.Builder
  2. การจัดการหน่วยความจำอัตโนมัติ – เรายังได้อัปเดตอินเทอร์เฟซ LoadControl เพื่อจัดการกรณีการโหลดล่วงหน้าได้ดียิ่งขึ้น ตอนนี้คุณจึงสามารถกำหนดขีดจำกัดหน่วยความจำสูงสุดที่ชัดเจนสำหรับรายการที่โหลดล่วงหน้าทั้งหมดในหน่วยความจำได้ โดยค่าเริ่มต้นคือ 144 MB และคุณสามารถกำหนดค่าขีดจำกัดได้ใน DefaultLoadControl.Builder DefaultPreloadManager จะหยุดการโหลดล่วงหน้าโดยอัตโนมัติเมื่อถึงขีดจำกัด และจะปล่อยหน่วยความจำของรายการที่มีลำดับความสำคัญต่ำกว่าโดยอัตโนมัติหากจำเป็น

ใช้ลักษณะการทำงานเริ่มต้นที่ปรับปรุงให้ง่ายขึ้นใน ExoPlayer

เช่นเคย เราได้เพิ่มการปรับปรุงทีละเล็กละน้อยมากมายลงใน ExoPlayer ด้วย ตัวอย่างเช่น

  • ปิดเสียงและเปิดเสียง – เรามีเมธอด setVolume อยู่แล้ว แต่ตอนนี้ได้เพิ่มเมธอด mute และ unmute ที่สะดวกสบายเพื่อให้คุณกู้คืนระดับเสียงก่อนหน้าได้อย่างง่ายดายโดยไม่ต้องติดตามระดับเสียงด้วยตนเอง
  • การตรวจหาเพลเยอร์ที่ค้าง \- ในบางกรณีที่พบได้ไม่บ่อย เพลเยอร์อาจค้างอยู่ในสถานะบัฟเฟอร์หรือเล่นโดยไม่คืบหน้า เช่น เนื่องจากปัญหาเกี่ยวกับตัวแปลงสัญญาณหรือการกำหนดค่าที่ไม่ถูกต้อง ผู้ใช้จะรู้สึกรำคาญ แต่คุณจะไม่เห็นปัญหาเหล่านี้ในข้อมูลวิเคราะห์ เพลเยอร์จึงรายงาน StuckPlayerException เมื่อตรวจพบสถานะค้างเพื่อให้เห็นได้ชัดเจนยิ่งขึ้น
  • Wakelock โดยค่าเริ่มต้น \- ก่อนหน้านี้การจัดการ Wakelock เป็นแบบเลือกใช้ ซึ่งทำให้เกิดกรณีที่พบได้ไม่บ่อยซึ่งความคืบหน้าในการเล่นอาจล่าช้ามากเมื่อทำงานในเบื้องหลัง ตอนนี้ฟีเจอร์นี้เป็นแบบเลือกไม่ใช้แล้ว คุณจึงไม่ต้องกังวลและสามารถนำการจัดการ 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()
))
image.png

ค่ากำหนดปุ่มสื่อที่มีปุ่มกรอไปข้างหน้า

CompositionPlayer สำหรับการแสดงตัวอย่างแบบเรียลไทม์

รุ่น 1.9.0 ขอแนะนำ CompositionPlayer ภายใต้คำอธิบายประกอบ @ExperimentalApi ใหม่ คำอธิบายประกอบนี้ระบุว่าคอมโพเนนต์พร้อมให้ทดลองใช้แล้ว แต่ยังอยู่ระหว่างการพัฒนา

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

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