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