Phép biến đổi

Chuyển mã giữa các định dạng

Bạn có thể chỉ định định dạng âm thanh và video đầu ra mà bạn muốn tạo khi xây dựng Transformer. Ví dụ: đoạn mã sau đây cho biết cách định cấu hình Transformer để xuất video H.264/AVC và âm thanh 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();

Nếu định dạng nội dung nghe nhìn đầu vào đã khớp với cấu hình cho âm thanh hoặc video, Transformer sẽ tự động chuyển sang chế độ transmuxing (truyền tải đa phương tiện), tức là sao chép các mẫu đã nén từ vùng chứa đầu vào sang vùng chứa đầu ra mà không cần sửa đổi. Điều này giúp tránh được chi phí tính toán và nguy cơ giảm chất lượng khi giải mã và mã hoá lại ở cùng một định dạng.

Xoá âm thanh hoặc video

Xoá âm thanh hoặc video bằng biểu tượng EditedMediaItem.Builder, ví dụ:

Kotlin

EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()

Java

new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();

Cắt một đoạn video

Bạn có thể xoá mọi nội dung nghe nhìn nằm ngoài dấu thời gian bắt đầu và kết thúc đã chỉ định bằng cách thiết lập cấu hình cắt trên mục nội dung nghe nhìn đầu vào. Ví dụ: để tạo một đoạn trích chỉ chứa nội dung nghe nhìn từ 10 giây đến 20 giây:

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();

Danh sách chỉnh sửa MP4

Để cắt nhanh hơn, Transformer hỗ trợ danh sách chỉnh sửa MP4, cho phép chỉnh sửa "chỉ cắt" hiệu quả hơn mà không cần chuyển mã lại toàn bộ video. Phương thức này sử dụng các mẫu được mã hoá hiện có và "đoạn quảng cáo trước video" trong danh sách chỉnh sửa, hướng dẫn trình phát bắt đầu phát tại một điểm cụ thể, nhờ đó bỏ qua phân đoạn ban đầu không mong muốn một cách hiệu quả.

Để chỉnh sửa chỉ cắt nhanh hơn đáng kể, hãy gọi experimentalSetMp4EditListTrimEnabled(true).

Kotlin

Transformer.Builder(context)
    .experimentalSetMp4EditListTrimEnabled(true)
    .build()

Java

new Transformer.Builder(context)
    .experimentalSetMp4EditListTrimEnabled(true)
    .build();

Điều quan trọng cần lưu ý là không phải trình phát đa phương tiện nào cũng hỗ trợ vị trí "đầu video". Điều này có nghĩa là khi sử dụng trình phát như vậy, tệp sẽ bắt đầu phát từ đầu tuyệt đối của mẫu được mã hoá, bất kể thông tin danh sách chỉnh sửa nào có thể chỉ định một điểm bắt đầu khác.

Tối ưu hoá đoạn cắt

Để giảm độ trễ khi cắt bỏ phần đầu của video, hãy bật tính năng tối ưu hoá thao tác cắt.

Kotlin

Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build()

Java

new Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build();

Điều này giúp tăng tốc quá trình xuất bằng cách giải mã và mã hoá lại video ít nhất có thể, sau đó ghép dữ liệu được mã hoá lại với phần còn lại của video gốc. Quá trình tối ưu hoá dựa vào khả năng ghép một phần của tệp đầu vào với đầu ra được mã hoá mới. Điều này có nghĩa là định dạng đầu ra của bộ mã hoá và định dạng đầu vào phải tương thích. Ví dụ: nếu tệp ban đầu được tạo trên một thiết bị có cách triển khai bộ mã hoá khác, thì có thể bạn sẽ không áp dụng được quy trình tối ưu hoá. Để quá trình tối ưu hoá thành công, bộ mã hoá được cung cấp cho Transformer thông qua EncoderFactory phải có cấp độ và hồ sơ tương thích với định dạng đầu vào.

Quy trình tối ưu hoá này chỉ hoạt động với dữ liệu đầu vào MP4 có một thành phần và không có hiệu ứng nào, ngoại trừ hiệu ứng video không hoạt động và các góc xoay chia hết cho 90 độ. Nếu quá trình tối ưu hoá không thành công, Transformer sẽ tự động quay lại chế độ xuất bình thường và báo cáo kết quả tối ưu hoá trong ExportResult.OptimizationResult.

Chúng tôi đang xác thực chức năng này và dự kiến chức năng này sẽ không còn là chức năng thử nghiệm trong một bản phát hành sau này.

Chỉnh sửa video

EditedMediaItems có danh sách các bộ xử lý âm thanh và hiệu ứng video để áp dụng theo thứ tự. Thư viện này bao gồm các cách triển khai hiệu ứng video cho các trường hợp sử dụng phổ biến, hoặc bạn có thể viết các hiệu ứng tuỳ chỉnh và truyền chúng vào khi tạo các mục nội dung nghe nhìn đã chỉnh sửa.

Bạn có thể điều chỉnh tỷ lệ của nội dung nghe nhìn. Việc này có thể hữu ích khi bạn muốn tiết kiệm tài nguyên xử lý hoặc băng thông khi xử lý nội dung đầu vào có độ phân giải rất cao, chẳng hạn như video 4K hoặc 8K. Ví dụ: để điều chỉnh tỷ lệ tương ứng thành chiều cao 480 pixel:

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();

Ngoài ra, bạn có thể điều chỉnh tỷ lệ theo một hệ số nhất định, chẳng hạn như giảm một nửa kích thước:

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();

Bạn có thể định cấu hình chế độ xoay theo cách tương tự:

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();

Hiệu ứng video tuỳ chỉnh

Hàm dựng Effects chấp nhận một danh sách các hiệu ứng âm thanh và video để áp dụng. Về nội bộ, khung hiệu ứng của Transformer sẽ chuyển đổi danh sách hiệu ứng video thành một chuỗi các chương trình đổ bóng GL được áp dụng theo thứ tự. Trong một số trường hợp, khung hiệu ứng có thể áp dụng nhiều hiệu ứng bằng một chương trình đổ bóng. Ví dụ: một chương trình đổ bóng có thể áp dụng nhiều phép biến đổi ma trận liên tiếp, giúp cải thiện hiệu quả và chất lượng.

Hiệu ứng video cũng được hỗ trợ để xem trước trong ExoPlayer bằng cách sử dụng ExoPlayer.setVideoEffects. Để biết ví dụ về cách sử dụng API này, hãy xem ứng dụng minh hoạ hiệu ứng.

Ứng dụng minh hoạ có các ví dụ về hiệu ứng video tuỳ chỉnh.

Chỉnh sửa âm thanh

Các hiệu ứng âm thanh được triển khai bằng cách áp dụng một chuỗi các thực thể AudioProcessor cho âm thanh thô (PCM). ExoPlayer hỗ trợ truyền các trình xử lý âm thanh đến DefaultAudioSink.Builder, cho phép xem trước nội dung chỉnh sửa âm thanh.