Chuyển mã giữa các định dạng
Bạn có thể chỉ định định dạng âm thanh đầu ra và video mà bạn muốn sản xuất khi xây dựng Transformer. Ví dụ: mã sau đây cho biết cách để định cấu hình Bộ chuyển đổi để 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 transmuxing (chuyển đổi), tức là sao chép các mẫu được nén từ vùng chứa đầu vào đến vùng chứa đầu ra mà không nội dung sửa đổi. Điều này giúp tránh chi phí tính toán và khả năng làm giảm chất lượng của giải mã và mã hoá lại theo cùng một định dạng.
Xoá âm thanh hoặc video
Xoá âm thanh hoặc video bằ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 đặt cấu hình cắt xén trên mục nội dung đa phương tiện đầu vào. Ví dụ: để tạo ra một đoạn video chỉ chứa nội dung nghe nhìn dài 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();
Tối ưu hoá phần cắt
Để giảm độ trễ khi cắt phần đầu video, hãy bật tính năng cắt bỏ tối ưu hoá.
Kotlin
Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build()
Java
new Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build();
Việc này giúp tăng tốc độ xuất video bằng cách giải mã và mã hoá lại video mà không cần quá nhiều
có thể, sau đó ghép dữ liệu được mã hoá lại với phần còn lại của
video. Quá trình tối ưu hoá phụ thuộc vào khả năng ghép một phần của tệp nhập
với đầu ra mới được mã hoá, 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ó triển khai bộ mã hoá khác thì có khả năng
rằng không thể áp dụng tối ưu hoá.
Để tối ưu hóa thành công, bộ mã hóa được cung cấp cho Transformer thông qua
EncoderFactory
phải có trình độ và hồ sơ tương thích với định dạng đầu vào.
Tính năng tối ưu hoá này chỉ hoạt động với đầu vào MP4 một tài sản mà không có hiệu ứng ngoại trừ
không có hiệu ứng video hoạt động và hướng xoay chia hết cho 90 độ. Nếu phương pháp 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à hy vọng chức năng này sẽ không ở giai đoạn thử nghiệm trong bản phát hành sau này.
Chỉnh sửa video
EditedMediaItems
có danh sách các trình xử lý âm thanh và hiệu ứng video để áp dụng
đơn đặt hàng. Thư viện này bao gồm các phương pháp 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 hiệu ứng tuỳ chỉnh rồi truyền vào khi tạo nội dung nghe nhìn đã chỉnh sửa
mục.
Bạn có thể điều chỉnh kích thước của nội dung nghe nhìn. Điều này có thể hữu ích để tiết kiệm tài nguyên hoặc khi xử lý đầ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ệ theo tỷ lệ 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 khởi tạo Effects
chấp nhận danh sách hiệu ứng âm thanh và video để áp dụng.
Về phía 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 trình tự 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 ma trận liên tiếp
chuyển đổi, giúp cải thiện hiệu quả và chất lượng.
Hiệu ứng video cũng được hỗ trợ cho việc xem trước trong ExoPlayer, sử dụng
ExoPlayer.setVideoEffects
.
Ứng dụng minh hoạ có các ví dụ về hiệu ứng tuỳ chỉnh cho video.
Chỉnh sửa âm thanh
Hiệu ứng âm thanh được triển khai bằng cách áp dụng một trình tự AudioProcessor
sang âm thanh thô (PCM). ExoPlayer hỗ trợ truyền bộ xử lý âm thanh đến
DefaultAudioSink.Builder
cho phép xem trước nội dung chỉnh sửa âm thanh.