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

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