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

การเริ่มต้นใช้งาน 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.11.1")
implementation("androidx.media3:media3-effect:1.11.1")
implementation("androidx.media3:media3-common:1.11.1")

ดึงดูด

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

โดย 1.11.1 คือเวอร์ชันที่คุณต้องการ คุณดูเวอร์ชันล่าสุดได้โดยอ่านบันทึก ประจำรุ่น

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

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

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