เริ่มต้นใช้งาน

การเริ่มต้นใช้งาน Transformer มีขั้นตอนดังนี้

  1. เพิ่ม Media3 Transformer เป็นทรัพยากร Dependency ในโปรเจ็กต์
  2. สร้าง EditedMediaItem ที่แสดงถึงสื่อเพื่อประมวลผลและแก้ไข แล้วนำไปปรับใช้
  3. สร้าง Transformer ซึ่งอธิบายเอาต์พุตที่จำเป็นและ Listener สำหรับเหตุการณ์การเสร็จสมบูรณ์และข้อผิดพลาด
  4. เริ่มการดำเนินการส่งออก ส่งผ่านใน EditedMediaItem เพื่อแก้ไข เส้นทางเอาต์พุตได้ ในระหว่างการส่งออก คุณสามารถค้นหาความคืบหน้าปัจจุบันหรือยกเลิก
  5. เมื่อส่งออกเรียบร้อยแล้ว ให้จัดการเอาต์พุตตามต้องการ ตัวอย่างเช่น คุณสามารถ แชร์เอาต์พุตไปยังแอปอื่นหรืออัปโหลดไปยังเซิร์ฟเวอร์

อ่านต่อเพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับขั้นตอนเหล่านี้ และดู TransformerActivity ใน การสาธิต Transformer สำหรับ ตัวอย่างที่สมบูรณ์

เพิ่ม Media3 Transformer เป็นทรัพยากร Dependency

วิธีที่ง่ายที่สุดในการเริ่มต้นใช้งาน Transformer คือการเพิ่มทรัพยากร Dependency ของ Gradle ในไลบรารีในไฟล์ build.gradle ของโมดูลแอป

Kotlin

implementation("androidx.media3:media3-transformer:1.4.0")
implementation("androidx.media3:media3-effect:1.4.0")
implementation("androidx.media3:media3-common:1.4.0")

ดึงดูด

implementation "androidx.media3:media3-transformer:1.4.0"
implementation "androidx.media3:media3-effect:1.4.0"
implementation "androidx.media3:media3-common:1.4.0"

โดยใช้เวอร์ชันที่คุณต้องการ 1.4.0 เวอร์ชันล่าสุดสามารถ ที่พบเมื่อดูรุ่น หมายเหตุ

สามารถดูข้อมูลเพิ่มเติมเกี่ยวกับโมดูลไลบรารีที่มีอยู่ได้ที่ Google Maven AndroidX Media3

เปิดการสนับสนุน Java 8

หากยังไม่ได้เปิดใช้ คุณต้องเปิดการสนับสนุน Java 8 ใน build.gradle ทั้งหมด ที่ขึ้นอยู่กับ Transformer ด้วยการเพิ่มค่าต่อไปนี้ลงใน android ส่วน:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

เริ่มการเปลี่ยนรูปแบบ

ต่อไปนี้คือตัวอย่างของการสร้าง EditedMediaItem เพื่อนำเสียงสำหรับอินพุตออก แล้วสร้างและกำหนดค่าอินสแตนซ์ Transformer เพื่อส่งออก วิดีโอ H.265/HEVC แสดงผลผลลัพธ์เป็น outputPath

Kotlin

val inputMediaItem = MediaItem.fromUri("path_to_input_file")
val editedMediaItem =
    EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
val transformer = Transformer.Builder(context)
    .setVideoMimeType(MimeTypes.VIDEO_H265)
    .addListener(transformerListener)
    .build()
transformer.start(editedMediaItem, outputPath)

Java

MediaItem inputMediaItem = MediaItem.fromUri("path_to_input_file");
EditedMediaItem editedMediaItem =
    new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
Transformer transformer =
    new Transformer.Builder(context)
        .setVideoMimeType(MimeTypes.VIDEO_H265)
        .addListener(transformerListener)
        .build();
transformer.start(editedMediaItem, outputPath);

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

คุณสามารถดำเนินการส่งออกหลายรายการตามลำดับได้เหมือนกัน Transformer แต่ไม่ส่งออกพร้อมกันด้วยอินสแตนซ์เดียวกัน ที่รองรับ

หมายเหตุเกี่ยวกับการแยกชุดข้อความ

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

ฟังเหตุการณ์

เมธอด start เป็นแบบไม่พร้อมกัน ระบบจะแสดงผลทันทีและแอป การแจ้งเตือนเหตุการณ์ผ่าน Listener ที่ส่งผ่านไปยังเครื่องมือสร้าง Transformer

Kotlin

val transformerListener: Transformer.Listener =
    object : Transformer.Listener {
  override fun onCompleted(composition: Composition, result: ExportResult) {
    playOutput()
  }

  override fun onError(composition: Composition, result: ExportResult,
                       exception: ExportException) {
    displayError(exception)
  }
}

Java

Transformer.Listener transformerListener =
    new Transformer.Listener() {
      @Override
      public void onCompleted(Composition composition, ExportResult result) {
        playOutput();
      }

      @Override
      public void onError(Composition composition, ExportResult result,
          ExportException exception) {
        displayError(exception);
      }
    };

ExportResult มีข้อมูลเกี่ยวกับไฟล์เอาต์พุต รวมถึงไฟล์ ขนาดและอัตราบิตเฉลี่ยของเสียงและวิดีโอ หากมี

รับข้อมูลอัปเดตเกี่ยวกับความคืบหน้า

โทรหา Transformer.getProgress เพื่อสอบถามความคืบหน้าปัจจุบันของ การเปลี่ยนรูปแบบ ค่าที่แสดงผลจะระบุสถานะความคืบหน้า หากความคืบหน้า สถานะคือ PROGRESS_STATE_AVAILABLE ดังนั้น ProgressHolder ที่ระบุคือ อัปเดตด้วยเปอร์เซ็นต์ความคืบหน้าปัจจุบันแล้ว ตัวอย่างต่อไปนี้จะแสดงวิธีการ ค้นหาความคืบหน้าของการเปลี่ยนรูปแบบเป็นระยะ โดยที่ นำเมธอด updateProgressInUi ไปใช้เพื่ออัปเดตแถบความคืบหน้าได้

Kotlin

transformer.start(inputMediaItem, outputPath)
val progressHolder = ProgressHolder()
mainHandler.post(
    object : Runnable {
      override fun run() {
        val progressState: @ProgressState Int = transformer.getProgress(progressHolder)
        updateProgressInUi(progressState, progressHolder)
        if (progressState != Transformer.PROGRESS_STATE_NOT_STARTED) {
          mainHandler.postDelayed(/* r= */this,  /* delayMillis= */500)
        }
      }
    }
)

Java

transformer.start(inputMediaItem, outputPath);
ProgressHolder progressHolder = new ProgressHolder();
mainHandler.post(
    new Runnable() {
      @Override
      public void run() {
        @Transformer.ProgressState int progressState = transformer.getProgress(progressHolder);
        updateProgressInUi(progressState, progressHolder);
        if (progressState != PROGRESS_STATE_NOT_STARTED) {
          mainHandler.postDelayed(/* r= */ this, /* delayMillis= */ 500);
        }
      }
    });

ยกเลิกการเปลี่ยนรูปแบบ

หากผู้ใช้เลือกยกเลิกขั้นตอนการส่งออก ให้ยกเลิกการดำเนินการส่งออก ด้วย Transformer.cancel ทรัพยากรมีจำกัด เช่น ตัวแปลงรหัสวิดีโอฮาร์ดแวร์ โดยเฉพาะบนอุปกรณ์ระดับล่าง ดังนั้น คุณจะต้องดำเนินการนี้เพื่อเพิ่มพื้นที่ว่าง ทรัพยากรเพิ่มเติมหากไม่จำเป็นต้องมีเอาต์พุต