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

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

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

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

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

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

Kotlin

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

Groovy

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

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

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

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

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