แปลงระหว่างรูปแบบต่างๆ
คุณสามารถระบุรูปแบบเสียงและวิดีโอเอาต์พุตที่ต้องการสร้างเมื่อ สร้าง Transformer ตัวอย่างเช่น โค้ดต่อไปนี้แสดงวิธี กำหนดค่า Transformer เพื่อส่งออกวิดีโอ H.264/AVC และเสียง AAC
Kotlin
Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build()
Java
new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build();
หากรูปแบบสื่ออินพุตตรงกับการกำหนดค่าสำหรับเสียง หรือวิดีโออยู่แล้ว Transformer จะเปลี่ยนไปใช้การแปลงมัลติเพล็กซ์โดยอัตโนมัติ ซึ่งก็คือการคัดลอก ตัวอย่างที่บีบอัดจากคอนเทนเนอร์อินพุตไปยังคอนเทนเนอร์เอาต์พุตโดยไม่มี การแก้ไข วิธีนี้ช่วยหลีกเลี่ยงต้นทุนด้านการคำนวณและคุณภาพที่อาจลดลงจากการ ถอดรหัสและเข้ารหัสซ้ำในรูปแบบเดียวกัน
นำเสียงหรือวิดีโอออก
นำเสียงหรือวิดีโอออกโดยใช้ EditedMediaItem.Builder
เช่น
Kotlin
EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
Java
new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
ตัดคลิป
คุณนำสื่อที่อยู่นอกการประทับเวลาเริ่มต้นและสิ้นสุดที่ระบุออกได้โดยการตั้งค่า การตัดต่อในรายการสื่ออินพุต เช่น หากต้องการสร้างคลิปที่มีเฉพาะสื่อระหว่าง 10 วินาทีถึง 20 วินาที ให้ทำดังนี้
Kotlin
val inputMediaItem = MediaItem.Builder() .setUri(uri) .setClippingConfiguration( ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build()
Java
MediaItem inputMediaItem = new MediaItem.Builder() .setUri(uri) .setClippingConfiguration( new MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build();
รายการแก้ไข MP4
Transformer รองรับรายการแก้ไข MP4 เพื่อให้ตัดต่อได้เร็วขึ้น ซึ่งช่วยให้การแก้ไขแบบ "ตัดต่อเท่านั้น" มีประสิทธิภาพมากขึ้นโดยไม่ต้องแปลงรหัสวิดีโอทั้งหมดอีกครั้ง วิธีนี้ จะใช้ตัวอย่างที่เข้ารหัสที่มีอยู่และ "โฆษณาก่อนวิดีโอ" ภายในรายการแก้ไข ซึ่ง จะสั่งให้เพลเยอร์เริ่มเล่นที่จุดหนึ่งๆ ซึ่งเป็นการข้าม ส่วนเริ่มต้นที่ไม่ต้องการอย่างมีประสิทธิภาพ
หากต้องการแก้ไขเฉพาะการตัดต่อให้เร็วขึ้นอย่างมาก ให้เรียกใช้
experimentalSetMp4EditListTrimEnabled(true)
Kotlin
Transformer.Builder(context) .experimentalSetMp4EditListTrimEnabled(true) .build()
Java
new Transformer.Builder(context) .experimentalSetMp4EditListTrimEnabled(true) .build();
โปรดทราบว่ามีเดียเพลเยอร์บางตัวไม่รองรับตำแหน่ง "โฆษณาตอนต้น" ซึ่งหมายความว่าเมื่อใช้เพลเยอร์ดังกล่าว ไฟล์จะเริ่มเล่นตั้งแต่ จุดเริ่มต้นที่แน่นอนของตัวอย่างที่เข้ารหัส ไม่ว่าข้อมูลรายการแก้ไข จะระบุจุดเริ่มต้นอื่นก็ตาม
การเพิ่มประสิทธิภาพการตัด
หากต้องการลดเวลาในการตอบสนองของการตัดช่วงต้นของวิดีโอ ให้เปิดใช้การเพิ่มประสิทธิภาพการตัด
Kotlin
Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build()
Java
new Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build();
ซึ่งจะช่วยเร่งความเร็วในการส่งออกด้วยการถอดรหัสและเข้ารหัสวิดีโออีกครั้งให้น้อยที่สุด
เท่าที่จะเป็นไปได้ จากนั้นจึงต่อข้อมูลที่เข้ารหัสอีกครั้งเข้ากับวิดีโอต้นฉบับส่วนที่เหลือ
การเพิ่มประสิทธิภาพขึ้นอยู่กับการต่อส่วนหนึ่งของไฟล์อินพุต
กับเอาต์พุตที่เข้ารหัสใหม่ ซึ่งหมายความว่ารูปแบบเอาต์พุตของตัวเข้ารหัสและ
รูปแบบอินพุตต้องเข้ากันได้ ดังนั้น ตัวอย่างเช่น หากไฟล์เดิมสร้างขึ้นในอุปกรณ์ที่มีการติดตั้งใช้งานตัวเข้ารหัสที่แตกต่างกัน ก็เป็นไปได้ว่าคุณจะใช้การเพิ่มประสิทธิภาพไม่ได้
เพื่อให้การเพิ่มประสิทธิภาพสำเร็จ ตัวเข้ารหัสที่ระบุให้กับ Transformer ผ่าน
EncoderFactory
ต้องมีระดับและโปรไฟล์ที่เข้ากันได้กับรูปแบบอินพุต
การเพิ่มประสิทธิภาพนี้ใช้ได้กับอินพุต MP4 แบบชิ้นงานเดียวที่ไม่มีเอฟเฟกต์ ยกเว้น
เอฟเฟกต์วิดีโอที่ไม่มีการดำเนินการและการหมุนที่หารด้วย 90 องศาลงตัว หากการเพิ่มประสิทธิภาพล้มเหลว Transformer จะกลับไปใช้การส่งออกปกติโดยอัตโนมัติ และรายงานผลลัพธ์ของการเพิ่มประสิทธิภาพใน ExportResult.OptimizationResult
เรากำลังตรวจสอบฟังก์ชันนี้และคาดว่าจะเลิกใช้สถานะทดลอง ในรุ่นต่อๆ ไป
การแก้ไขวิดีโอ
EditedMediaItems
มีรายการโปรแกรมประมวลผลเสียงและเอฟเฟกต์วิดีโอที่จะใช้ตามลำดับ ไลบรารีประกอบด้วยการติดตั้งใช้งานเอฟเฟกต์วิดีโอสำหรับกรณีการใช้งานทั่วไป
หรือคุณจะเขียนเอฟเฟกต์ที่กำหนดเองและส่งผ่านเมื่อสร้างรายการสื่อที่แก้ไขแล้วก็ได้
คุณสามารถปรับขนาดสื่อ ซึ่งอาจมีประโยชน์ในการประหยัดทรัพยากรการประมวลผลหรือ แบนด์วิดท์เมื่อต้องจัดการกับอินพุตที่มีความละเอียดสูงมาก เช่น วิดีโอ 4K หรือ 8K เช่น หากต้องการปรับขนาดตามสัดส่วนให้สูง 480 พิกเซล ให้ทำดังนี้
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf(Presentation.createForHeight(480)) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480)))) .build();
หรือจะปรับขนาดตามปัจจัยที่กำหนดก็ได้ เช่น หากต้องการลดขนาดลงครึ่งหนึ่ง ให้ทำดังนี้
Kotlin
val editedMediaItem = EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()))) .build();
คุณกําหนดค่าการหมุนเวียนได้ในลักษณะเดียวกัน ดังนี้
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder() .setRotationDegrees(90f) .build()) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build()))) .build();
เอฟเฟกต์วิดีโอที่กำหนดเอง
Effects
ตัวสร้างยอมรับรายการเอฟเฟกต์เสียงและวิดีโอที่จะใช้
ภายใน เฟรมเวิร์กเอฟเฟกต์ของ Transformer จะแปลงรายการเอฟเฟกต์วิดีโอ
เป็นลำดับของโปรแกรม GL Shader ที่ใช้ตามลำดับ ในบางกรณี
เฟรมเวิร์กเอฟเฟกต์จะใช้เอฟเฟกต์หลายรายการกับโปรแกรม Shader เดียวได้
เช่น โปรแกรม Shader หนึ่งโปรแกรมสามารถใช้การแปลงเมทริกซ์หลายรายการติดต่อกันได้ ซึ่งจะช่วยปรับปรุงประสิทธิภาพและคุณภาพ
นอกจากนี้ ExoPlayer ยังรองรับเอฟเฟกต์วิดีโอสำหรับการแสดงตัวอย่างด้วยโดยใช้
ExoPlayer.setVideoEffects
หากต้องการดูตัวอย่างวิธีใช้ API นี้ โปรดดูแอปสาธิตเอฟเฟกต์
แอปเดโมมีตัวอย่างเอฟเฟกต์วิดีโอที่กำหนดเอง
การแก้ไขเสียง
เอฟเฟกต์เสียงจะใช้งานได้โดยการใช้ลำดับของAudioProcessor
อินสแตนซ์กับเสียงดิบ (PCM) ExoPlayer รองรับการส่งโปรเซสเซอร์เสียงไปยัง
DefaultAudioSink.Builder
ซึ่งช่วยให้คุณดูตัวอย่างการแก้ไขเสียงได้