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