การเริ่มต้นใช้งาน 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.10.1")
implementation("androidx.media3:media3-effect:1.10.1")
implementation("androidx.media3:media3-common:1.10.1")
ดึงดูด
implementation "androidx.media3:media3-transformer:1.10.1"
implementation "androidx.media3:media3-effect:1.10.1"
implementation "androidx.media3:media3-common:1.10.1"
โดย 1.10.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 ที่ส่งไปยัง Builder ของ 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 ทรัพยากรต่างๆ เช่น ตัวแปลงสัญญาณวิดีโอฮาร์ดแวร์มีจำกัด โดยเฉพาะในอุปกรณ์ระดับล่าง ดังนั้นคุณควรดำเนินการนี้เพื่อปล่อยทรัพยากรหากไม่จำเป็นต้องใช้เอาต์พุต