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

แปลงระหว่างรูปแบบต่างๆ

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