คลิป ใช้เอฟเฟกต์วิดีโอ และเพิ่มประสิทธิภาพการส่งออก keywords_public: Media3, Transformer, แปลงรหัส, การตัดต่อวิดีโอ, การตัด, การประมวลผลเสียง, สื่อ Android
แปลงระหว่างรูปแบบต่างๆ
คุณสามารถระบุรูปแบบเสียงและวิดีโอเอาต์พุตที่ต้องการสร้างเมื่อ สร้าง 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( MediaItem.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 นี้ โปรดดูแอปสาธิตเอฟเฟกต์
แอปเดโมมีตัวอย่างเอฟเฟกต์วิดีโอที่กำหนดเอง
การป้อนรูปภาพ
Transformer รองรับอินพุตรูปภาพโดยถือว่าเป็นวิดีโอคลิปแบบคงที่ หากต้องการ กำหนดค่ารูปภาพเป็นแหล่งที่มาของอินพุต ให้ทำตามขั้นตอนต่อไปนี้
สร้าง
MediaItemโดยใช้MediaItem.Builderระบุระยะเวลาการแสดง ของรูปภาพในวิดีโอเอาต์พุตโดยเรียกใช้setImageDurationMsสร้าง
EditedMediaItemโดยการห่อMediaItemระบุอัตราเฟรมเป้าหมายสำหรับสตรีมวิดีโอที่สร้างขึ้นโดยใช้EditedMediaItem.Builder#setFrameRate
ตัวอย่างต่อไปนี้แสดงวิธีกำหนดค่าอินพุตรูปภาพเพื่อสร้างวิดีโอความยาว 5 วินาทีที่ 30 เฟรมต่อวินาที
Kotlin
val imageMediaItem = MediaItem.Builder() .setUri(imageUri) .setImageDurationMs(5000) // 5 seconds .build() val editedImageItem = EditedMediaItem.Builder(imageMediaItem) .setFrameRate(30) // 30 frames per second .build()
Java
MediaItem imageMediaItem = new MediaItem.Builder() .setUri(imageUri) .setImageDurationMs(5000) // 5 seconds .build(); EditedMediaItem editedImageItem = new EditedMediaItem.Builder(imageMediaItem) .setFrameRate(30) // 30 frames per second .build();
การแก้ไขเสียง
เอฟเฟกต์เสียงจะใช้งานโดยการใช้ลำดับของAudioProcessor
อินสแตนซ์กับเสียงดิบ (PCM) ExoPlayer รองรับการส่งต่อตัวประมวลผลเสียงไปยัง
DefaultAudioSink.Builder ซึ่งช่วยให้คุณดูตัวอย่างการแก้ไขเสียงได้