ไลบรารี Transformer ของ Media3 มีชุดเครื่องมือสำหรับแก้ไขและ
จัดการสื่อ คอมโพเนนต์หลักสำหรับการแก้ไขเนื้อหาหลายรายการคือ API ของ Composition API นี้ช่วยให้คุณจัดเรียงรายการสื่ออินพุตหลายรายการ
เช่น คลิปวิดีโอ รูปภาพ และแทร็กเสียง ให้เป็นโครงสร้างที่สอดคล้องกัน
ซึ่งสามารถประมวลผล แสดงตัวอย่าง หรือส่งออกได้ Composition สามารถ
ถือเป็นไทม์ไลน์ที่เก็บลำดับสื่ออย่างน้อย 1 ลำดับ แต่ละลำดับ (กำหนดโดย EditedMediaItemSequence) จะมีรายการสื่อแต่ละรายการ (กำหนดเป็นอินสแตนซ์ EditedMediaItem)
การเปลี่ยนรูปแบบและเอฟเฟกต์สามารถใช้กับEditedMediaItemแต่ละรายการหรือCompositionทั้งรายการได้
Composition คือจุดเริ่มต้นสำหรับกรณีการใช้งานที่หลากหลายด้วย Media3
Transformer เช่น
- การรวมชิ้นงานเสียง รูปภาพ และวิดีโอตามลำดับ
- การวางวิดีโอซ้อนทับบนวิดีโออื่น (การแสดงภาพซ้อนภาพ)
- การมิกซ์แทร็กเสียงพื้นหลังกับลำดับวิดีโอ
- การใช้เอฟเฟกต์ภาพหรือเสียงกับผลงานที่ตัดต่อแล้วทั้งชิ้น
- การจัดการสถานการณ์ที่ซับซ้อน เช่น การประมวลผลวิดีโอ HDR
คู่มือนี้มุ่งเน้นที่วิธีสร้างและกำหนดออบเจ็กต์ Composition รวมถึง คลาสหลักที่เกี่ยวข้อง วิธีสร้างองค์ประกอบพื้นฐานและซับซ้อนมากขึ้น ด้วยลำดับเดียวหรือหลายลำดับ และวิธีใช้เอฟเฟกต์ในระดับต่างๆ
แนวคิดและคลาสหลัก
หากต้องการใช้ Composition API อย่างมีประสิทธิภาพ คุณควรทำความเข้าใจคลาสหลัก
ที่เกี่ยวข้องกับการสร้างองค์ประกอบสื่อ
Effects:
- วัตถุประสงค์: ออบเจ็กต์
Effectsคือคอลเล็กชันของโปรแกรมประมวลผลเสียง และเอฟเฟกต์วิดีโอ - วิธีใช้: ในบริบทของ
Compositionคุณสามารถตั้งค่าEffectsในอินสแตนซ์EditedMediaItemแต่ละรายการเพื่อแก้ไขคลิปที่เฉพาะเจาะจง หรือตั้งค่าในCompositionทั้งชุด (โดยปกติจะใช้กับเอฟเฟกต์Presentationที่ ส่งผลต่อเอาต์พุตสุดท้าย เช่น การปรับความละเอียดในการแสดงผลหรืออัตราเฟรม) - เหตุผลที่สำคัญ:
Effectsเป็นกลไกในการใช้ การเปลี่ยนรูปแบบ ตัวกรอง และการประมวลผลอื่นๆ กับสื่อทั้งใน ระดับรายการแต่ละรายการและระดับองค์ประกอบโดยรวม ดูข้อมูลเพิ่มเติมได้ที่Transformations
EditedMediaItem:
- วัตถุประสงค์: คลาสนี้แสดงถึงสื่อ 1 ชิ้น (เช่น วิดีโอ รูปภาพ หรือไฟล์เสียง) และการแก้ไขที่จะใช้กับสื่อนั้น
- วิธีใช้:
EditedMediaItemจะจัดกลุ่มMediaItem(ซึ่งชี้ไปยังเนื้อหาสื่อจริง) กับออบเจ็กต์Effects - ความสำคัญ: องค์ประกอบที่ใช้สร้างสรรค์นี้เป็นพื้นฐานสำคัญของ การจัดวาง ซึ่งช่วยให้คุณกำหนดได้อย่างแม่นยำว่าจะรวมสื่อใดบ้างและแต่ละชิ้นควรมีลักษณะอย่างไรก่อนที่จะรวมกับชิ้นอื่นๆ ในลำดับ
EditedMediaItemSequence:
- วัตถุประสงค์: แสดงลำดับเชิงเส้นของออบเจ็กต์
EditedMediaItemที่ ตั้งใจให้เล่นต่อกัน - วิธีใช้: สร้าง
EditedMediaItemSequenceด้วยรายการออบเจ็กต์EditedMediaItemลำดับแต่ละรายการภายในCompositionจะคล้ายกับ แทร็กหรือเลเยอร์ในไทม์ไลน์การตัดต่อวิดีโอแบบหลายแทร็ก เช่น ลำดับหนึ่งอาจมีคลิปวิดีโอหลัก ขณะที่อีกหนึ่งลำดับซึ่งทับซ้อนกันในเวลาอาจมีคลิปวิดีโอที่จะซ้อนทับบนคลิปแรก และอีกหนึ่งลำดับอาจมีเพียงแทร็กเสียงสำหรับเพลงประกอบ - เหตุผลที่สำคัญ:
EditedMediaItemSequenceจัดกลุ่มรายการสื่อที่เกี่ยวข้อง ซึ่งควรติดตามกันโดยตรง การใช้ลำดับหลายรายการจะช่วยให้คุณสร้างการจัดเรียงที่ซับซ้อนมากขึ้นได้ เช่น การวางเลเยอร์เสียงหรือการสร้างภาพซ้อนทับ
Composition:
- วัตถุประสงค์: นี่คือออบเจ็กต์ระดับบนสุดที่แสดงไทม์ไลน์ทั้งหมด ของสื่อที่จะประมวลผล โดยจะทำหน้าที่เป็นคอนเทนเนอร์สำหรับลำดับสื่อทั้งหมด และการตั้งค่าหรือเอฟเฟกต์ส่วนกลางที่ใช้กับเอาต์พุตทั้งหมด
- วิธีการใช้งาน:
Compositionประกอบด้วยออบเจ็กต์EditedMediaItemSequenceอย่างน้อย 1 รายการ นอกจากนี้ คุณยังใช้เอฟเฟกต์ทั่วทั้งองค์ประกอบ และตั้งค่าส่วนกลาง เช่น โหมด HDR ได้โดยตรงในCompositionหากCompositionมีออบเจ็กต์EditedMediaItemSequenceหลายรายการ คุณสามารถจัดเรียง ลำดับเหล่านี้ให้เล่นตามลำดับหรือซ้อนทับกันได้ ซึ่งจะช่วยให้เลย์เอาต์ซ้อนทับกันได้ เช่น ภาพซ้อนภาพหรือการเปลี่ยนจาก ลำดับหนึ่งไปยังอีกลำดับหนึ่ง - เหตุผลที่สำคัญ:
Compositionจะกำหนดโครงสร้างโดยรวมของ สื่ออินพุตที่จะประมวลผล และเป็นออบเจ็กต์ทั่วไปที่คุณใช้ได้ทั้งสำหรับการแสดงตัวอย่างการแก้ไขด้วยCompositionPlayerและการส่งออกวิดีโอเอาต์พุต ที่มีการแก้ไขโดยใช้Transformer
สร้างและส่งออก Composition
ตัวอย่างการสร้างชิ้นงานวิดีโอที่ประกอบด้วยวิดีโอคลิปที่ตัดต่อแล้ว 2 คลิป ซ้อนทับด้วยแทร็กเสียง และการส่งออกมีดังนี้
Kotlin
val video1 = EditedMediaItem.Builder(MediaItem.fromUri(video1Uri)).build() val video2 = EditedMediaItem.Builder(MediaItem.fromUri(video2Uri)).build() val videoSequence = EditedMediaItemSequence.withAudioAndVideoFrom(listOf(video1, video2)) val backgroundAudio = EditedMediaItem.Builder(MediaItem.fromUri(audioUri)).build() val backgroundAudioSequence = EditedMediaItemSequence.withAudioFrom(listOf(backgroundAudio)) .buildUpon() .setIsLooping(true) // Loop audio track through duration of videoSequence .build() val composition = Composition.Builder(videoSequence, backgroundAudioSequence).build() transformer.start(composition, filePath)
Java
EditedMediaItem video1 = new EditedMediaItem.Builder(MediaItem.fromUri(video1Uri)).build(); EditedMediaItem video2 = new EditedMediaItem.Builder(MediaItem.fromUri(video2Uri)).build(); EditedMediaItemSequence videoSequence = EditedMediaItemSequence.withAudioAndVideoFrom(ImmutableList.of(video1, video2)); EditedMediaItem backgroundAudio = new EditedMediaItem.Builder(MediaItem.fromUri(audioUri)).build(); EditedMediaItemSequence backgroundAudioSequence = EditedMediaItemSequence.withAudioFrom(ImmutableList.of(backgroundAudio)) .buildUpon() .setIsLooping(true) // Loop audio track through duration of videoSequence .build(); Composition composition = new Composition.Builder(videoSequence, backgroundAudioSequence).build(); transformer.start(composition, filePath);
ตัวอย่างกรณีการใช้งานที่รองรับ
ต่อไปนี้เป็นรายการ Use Case โดยสังเขปที่ Transformer API
รองรับด้วย Composition
- การรวมชิ้นงานเสียง รูปภาพ และวิดีโอตามลำดับ
- การเพิ่มเสียงพื้นหลังลงในชิ้นงานวิดีโอ
- การเพิ่มเอฟเฟกต์ลงในคอมโพสิต
- การแมปโทนสีอินพุต HDR กับ SDR เพื่อสร้างเอาต์พุต SDR ที่มีคุณภาพภาพดียิ่งขึ้น
ข้อจำกัดในปัจจุบัน
ลำดับภายในองค์ประกอบต้องเป็นไปตามเงื่อนไขที่ระบุไว้ใน
Transformer.start()
นอกจากนี้ ระบบยังไม่รองรับการดำเนินการต่อไปนี้เมื่อใช้
Compositions
- การครอสเฟดแทร็กวิดีโอหรือแทร็กเสียง
คำขอฟีเจอร์
หากมีคำขอฟีเจอร์สำหรับ Transformer API โปรดแจ้งปัญหาในที่เก็บ Media3 บน GitHub