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

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

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

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

เพิ่ม Media3 Transformer เป็นส่วนที่ต้องพึ่งพา

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

Kotlin

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

ดึงดูด

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

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