การเปลี่ยนรูปแบบ

คลิป ใช้เอฟเฟกต์วิดีโอ และเพิ่มประสิทธิภาพการส่งออก 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 ซึ่งช่วยให้คุณดูตัวอย่างการแก้ไขเสียงได้