กำหนดองค์ประกอบของรายการสื่อ

ไลบรารี Transformer ของ Media3 มีชุดเครื่องมือสำหรับแก้ไขและ จัดการสื่อ คอมโพเนนต์หลักสำหรับการแก้ไขเนื้อหาหลายรายการคือ API ของ Composition API นี้ช่วยให้คุณจัดเรียงรายการสื่ออินพุตหลายรายการ เช่น คลิปวิดีโอ รูปภาพ และแทร็กเสียง ให้เป็นโครงสร้างที่สอดคล้องกัน ซึ่งสามารถประมวลผล แสดงตัวอย่าง หรือส่งออกได้ Composition สามารถ ถือเป็นไทม์ไลน์ที่เก็บลำดับสื่ออย่างน้อย 1 ลำดับ แต่ละลำดับ (กำหนดโดย EditedMediaItemSequence) จะมีรายการสื่อแต่ละรายการ (กำหนดเป็นอินสแตนซ์ EditedMediaItem) การเปลี่ยนรูปแบบและเอฟเฟกต์สามารถใช้กับEditedMediaItemแต่ละรายการหรือCompositionทั้งรายการได้

โครงสร้างของออบเจ็กต์ Composition
โครงสร้างของออบเจ็กต์ Composition

Composition คือจุดเริ่มต้นสำหรับกรณีการใช้งานที่หลากหลายด้วย Media3 Transformer เช่น

  • การรวมชิ้นงานเสียง รูปภาพ และวิดีโอตามลำดับ
  • การวางวิดีโอซ้อนทับบนวิดีโออื่น (การแสดงภาพซ้อนภาพ)
  • การมิกซ์แทร็กเสียงพื้นหลังกับลำดับวิดีโอ
  • การใช้เอฟเฟกต์ภาพหรือเสียงกับผลงานที่ตัดต่อแล้วทั้งชิ้น
  • การจัดการสถานการณ์ที่ซับซ้อน เช่น การประมวลผลวิดีโอ HDR

คู่มือนี้มุ่งเน้นที่วิธีสร้างและกำหนดออบเจ็กต์ Composition รวมถึง คลาสหลักที่เกี่ยวข้อง วิธีสร้างองค์ประกอบพื้นฐานและซับซ้อนมากขึ้น ด้วยลำดับเดียวหรือหลายลำดับ และวิธีใช้เอฟเฟกต์ในระดับต่างๆ

แนวคิดและคลาสหลัก

หากต้องการใช้ Composition API อย่างมีประสิทธิภาพ คุณควรทำความเข้าใจคลาสหลัก ที่เกี่ยวข้องกับการสร้างองค์ประกอบสื่อ

Effects:

  • วัตถุประสงค์: ออบเจ็กต์ Effects คือคอลเล็กชันของโปรแกรมประมวลผลเสียง และเอฟเฟกต์วิดีโอ
  • วิธีใช้: ในบริบทของComposition คุณสามารถตั้งค่าEffects ในอินสแตนซ์EditedMediaItemแต่ละรายการเพื่อแก้ไขคลิปที่เฉพาะเจาะจง หรือตั้งค่าใน Compositionทั้งชุด (โดยปกติจะใช้กับเอฟเฟกต์ Presentation ที่ ส่งผลต่อเอาต์พุตสุดท้าย เช่น การปรับความละเอียดในการแสดงผลหรืออัตราเฟรม)
  • เหตุผลที่สำคัญ: Effects เป็นกลไกในการใช้ การเปลี่ยนรูปแบบ ตัวกรอง และการประมวลผลอื่นๆ กับสื่อทั้งใน ระดับรายการแต่ละรายการและระดับองค์ประกอบโดยรวม ดูข้อมูลเพิ่มเติมได้ที่ Transformations

EditedMediaItem:

EditedMediaItemSequence:

  • วัตถุประสงค์: แสดงลำดับเชิงเส้นของออบเจ็กต์ EditedMediaItem ที่ ตั้งใจให้เล่นต่อกัน
  • วิธีใช้: สร้าง EditedMediaItemSequence ด้วยรายการออบเจ็กต์ EditedMediaItem ลำดับแต่ละรายการภายใน Composition จะคล้ายกับ แทร็กหรือเลเยอร์ในไทม์ไลน์การตัดต่อวิดีโอแบบหลายแทร็ก เช่น ลำดับหนึ่งอาจมีคลิปวิดีโอหลัก ขณะที่อีกหนึ่งลำดับซึ่งทับซ้อนกันในเวลาอาจมีคลิปวิดีโอที่จะซ้อนทับบนคลิปแรก และอีกหนึ่งลำดับอาจมีเพียงแทร็กเสียงสำหรับเพลงประกอบ
  • เหตุผลที่สำคัญ: EditedMediaItemSequence จัดกลุ่มรายการสื่อที่เกี่ยวข้อง ซึ่งควรติดตามกันโดยตรง การใช้ลำดับหลายรายการจะช่วยให้คุณสร้างการจัดเรียงที่ซับซ้อนมากขึ้นได้ เช่น การวางเลเยอร์เสียงหรือการสร้างภาพซ้อนทับ

Composition:

สร้างและส่งออก 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