Quy trình bắt đầu sử dụng Transformer
bao gồm các bước sau:
- Thêm Media3 Transformer làm phần phụ thuộc trong dự án.
- Tạo một
EditedMediaItem
đại diện cho nội dung nghe nhìn cần xử lý và chỉnh sửa để áp dụng cho nội dung đó. - Tạo một
Transformer
, mô tả đầu ra bắt buộc và trình nghe cho các sự kiện hoàn tất và lỗi. - Bắt đầu thao tác xuất, truyền vào
EditedMediaItem
để chỉnh sửa và một đường dẫn đầu ra. Trong quá trình xuất, bạn có thể truy vấn tiến trình hiện tại hoặc huỷ thao tác. - Khi quá trình xuất kết thúc, hãy xử lý đầu ra nếu cần. Ví dụ: bạn có thể chia sẻ kết quả với một ứng dụng khác hoặc tải lên máy chủ.
Hãy đọc tiếp để biết thêm thông tin chi tiết về các bước này và xem TransformerActivity
trong ứng dụng minh hoạ trình chuyển đổi để biết ví dụ đầy đủ.
Thêm Media3 Transformer làm phần phụ thuộc
Cách dễ nhất để bắt đầu sử dụng Transformer là thêm các phần phụ thuộc gradle vào thư viện trong tệp build.gradle
của mô-đun ứng dụng:
Kotlin
implementation("androidx.media3:media3-transformer:1.4.1") implementation("androidx.media3:media3-effect:1.4.1") implementation("androidx.media3:media3-common:1.4.1")
Groovy
implementation "androidx.media3:media3-transformer:1.4.1" implementation "androidx.media3:media3-effect:1.4.1" implementation "androidx.media3:media3-common:1.4.1"
trong đó 1.4.1 là phiên bản bạn muốn dùng. Bạn có thể tìm thấy phiên bản mới nhất bằng cách tham khảo ghi chú phát hành.
Bạn có thể tìm thêm thông tin về các mô-đun thư viện hiện có trên trang Google Maven AndroidX Media3.
Bật tính năng hỗ trợ Java 8
Nếu chưa bật tính năng này, bạn cần bật tính năng hỗ trợ Java 8 trong tất cả các tệp build.gradle
phụ thuộc vào Transformer bằng cách thêm đoạn mã sau vào phần android
:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
Bắt đầu một phép biến đổi
Dưới đây là ví dụ về cách tạo EditedMediaItem
để xoá âm thanh cho một tệp đầu vào, sau đó tạo và định cấu hình một thực thể Transformer
để xuất video H.265/HEVC, xuất kết quả sang outputPath
.
Kotlin
val inputMediaItem = MediaItem.fromUri("path_to_input_file") val editedMediaItem = EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build() val transformer = Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H265) .addListener(transformerListener) .build() transformer.start(editedMediaItem, outputPath)
Java
MediaItem inputMediaItem = MediaItem.fromUri("path_to_input_file"); EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build(); Transformer transformer = new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H265) .addListener(transformerListener) .build(); transformer.start(editedMediaItem, outputPath);
Để biết thêm thông tin về các mục nội dung nghe nhìn, hãy xem trang về các mục nội dung đa phương tiện của ExoPlayer. Dữ liệu đầu vào có thể là luồng tăng tiến hoặc luồng thích ứng, nhưng dữ liệu đầu ra luôn là luồng tăng tiến. Đối với dữ liệu đầu vào thích ứng, các kênh có độ phân giải cao nhất luôn được chọn để chuyển đổi. Đầu vào có thể ở bất kỳ định dạng vùng chứa nào được ExoPlayer hỗ trợ, nhưng đầu ra luôn là tệp MP4.
Bạn có thể thực thi nhiều thao tác xuất theo tuần tự trên cùng một phiên bản Transformer
, nhưng không hỗ trợ xuất đồng thời với cùng một phiên bản.
Lưu ý về việc tạo luồng
Bạn phải truy cập vào các thực thể của biến áp từ một luồng ứng dụng duy nhất và các phương thức trình nghe được gọi trên cùng một luồng. Trong hầu hết các trường hợp, luồng ứng dụng chỉ có thể là luồng chính của ứng dụng. Trong nội bộ, Transformer thực hiện công việc ở chế độ nền và đăng các lệnh gọi đến các phương thức trình nghe trên luồng ứng dụng.
Nghe các sự kiện
Phương thức start
không đồng bộ. Phương thức này trả về ngay lập tức và ứng dụng sẽ được thông báo về các sự kiện thông qua trình nghe được truyền đến trình tạo Transformer
.
Kotlin
val transformerListener: Transformer.Listener = object : Transformer.Listener { override fun onCompleted(composition: Composition, result: ExportResult) { playOutput() } override fun onError(composition: Composition, result: ExportResult, exception: ExportException) { displayError(exception) } }
Java
Transformer.Listener transformerListener = new Transformer.Listener() { @Override public void onCompleted(Composition composition, ExportResult result) { playOutput(); } @Override public void onError(Composition composition, ExportResult result, ExportException exception) { displayError(exception); } };
ExportResult
bao gồm thông tin về tệp đầu ra, bao gồm cả kích thước tệp và tốc độ bit trung bình cho âm thanh và video (nếu có).
Nhận thông tin cập nhật về tiến trình
Gọi Transformer.getProgress
để truy vấn tiến trình hiện tại của một phép biến đổi. Giá trị được trả về cho biết trạng thái tiến trình. Nếu trạng thái tiến trình là PROGRESS_STATE_AVAILABLE
, thì ProgressHolder
được cung cấp sẽ được cập nhật theo tỷ lệ phần trăm tiến trình hiện tại. Ví dụ sau đây cho thấy cách định kỳ truy vấn tiến trình của một phép biến đổi, trong đó có thể triển khai phương thức updateProgressInUi
để cập nhật thanh tiến trình.
Kotlin
transformer.start(inputMediaItem, outputPath) val progressHolder = ProgressHolder() mainHandler.post( object : Runnable { override fun run() { val progressState: @ProgressState Int = transformer.getProgress(progressHolder) updateProgressInUi(progressState, progressHolder) if (progressState != Transformer.PROGRESS_STATE_NOT_STARTED) { mainHandler.postDelayed(/* r= */this, /* delayMillis= */500) } } } )
Java
transformer.start(inputMediaItem, outputPath); ProgressHolder progressHolder = new ProgressHolder(); mainHandler.post( new Runnable() { @Override public void run() { @Transformer.ProgressState int progressState = transformer.getProgress(progressHolder); updateProgressInUi(progressState, progressHolder); if (progressState != PROGRESS_STATE_NOT_STARTED) { mainHandler.postDelayed(/* r= */ this, /* delayMillis= */ 500); } } });
Huỷ phép biến đổi
Nếu người dùng chọn thoát khỏi luồng xuất, hãy huỷ thao tác xuất bằng Transformer.cancel
. Các tài nguyên như bộ mã hoá và giải mã phần cứng dành cho video bị hạn chế, đặc biệt là trên các thiết bị cấp thấp hơn. Vì vậy, bạn cần thực hiện việc này để giải phóng tài nguyên nếu không cần đầu ra.