Để bắt đầu sử dụng Transformer
, bạn cần thực hiện các bước sau:
- Thêm Media3 Transformer làm phần phụ thuộc trong dự án.
- Tạo
EditedMediaItem
đại diện cho nội dung nghe nhìn để xử lý và chỉnh sửa sẽ á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 thành 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 khi xuất, bạn có thể truy vấn tiến trình hiện tại hoặc huỷ hoạt động. - Khi xuất xong, hãy xử lý kết quả đầu ra nếu cần. Ví dụ: bạn có thể chia sẻ đầu ra với một ứng dụng khác hoặc tải lên một máy chủ.
Hãy đọc tiếp để biết thêm chi tiết về các bước này và xem TransformerActivity
trong
bản minh hoạ bộ biến áp
ứng dụng cho một
ví dụ hoàn chỉnh.
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
trên thư viện trong tệp build.gradle
của mô-đun ứng dụng:
Kotlin
implementation("androidx.media3:media3-transformer:1.4.0") implementation("androidx.media3:media3-effect:1.4.0") implementation("androidx.media3:media3-common:1.4.0")
Groovy
implementation "androidx.media3:media3-transformer:1.4.0" implementation "androidx.media3:media3-effect:1.4.0" implementation "androidx.media3:media3-common:1.4.0"
trong đó 1.4.0 là phiên bản ưa thích của bạn. Phiên bản mới nhất có thể là bằng cách tham khảo bản phát hành lưu ý.
Bạn có thể xem thêm thông tin về các mô-đun thư viện có sẵn trên Google Maven AndroidX Media3 .
Bật tính năng hỗ trợ Java 8
Nếu chưa bật, bạn cần bật tính năng hỗ trợ Java 8 trong tất cả build.gradle
các tệp phụ thuộc vào Transformer bằng cách thêm đoạn mã sau vào android
mục:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
Bắt đầu biến đổi
Sau đây là ví dụ về cách tạo EditedMediaItem
để loại bỏ âm thanh cho một nguồn đầu vào
sau đó tạo và định cấu hình phiên bản 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 đa phương tiện, hãy xem các mục đa phương tiện trong ExoPlayer . Dữ liệu đầu vào có thể là phương thức nhập luỹ tiến hoặc thích ứng nhưng đầu ra luôn là một luồng tăng dần. Đối với đầu vào thích ứng, kênh có độ phân giải cao nhất luôn được chọn để chuyển đổi. Thông tin đầu vào có thể thuộc 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 hoạt động xuất theo tuần tự trên cùng một trang
Thực thể Transformer
, nhưng các lượt xuất đồng thời với cùng một thực thể thì không
được hỗ trợ.
Lưu ý về việc tạo chuỗi
Các thực thể của bộ chuyển đổi phải được truy cậ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. Đối với hầu hết các trường hợp, luồng ứng dụng có thể chỉ là luồng chính của ứng dụng. Trong nội bộ, Transformer hoạt động ở chế độ nền và đăng các lệnh gọi lên 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ộ. Kết quả này sẽ trả về ngay lập tức và ứng dụng
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ả 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
biến đổi. Giá trị trả về cho biết trạng thái tiến trình. Nếu tiến trình
trạng thái là PROGRESS_STATE_AVAILABLE
, thì ProgressHolder
đã cho là
đã cập nhật theo tỷ lệ phần trăm tiến trình hiện tại. Ví dụ sau đây trình bày cách
truy vấn định kỳ tiến trình chuyển đổi, trong đó
Bạn 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 quay lại một quy trình xuất, hãy huỷ thao tác xuất
cùng với 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ị giới hạn,
đặc biệt là trên các thiết bị cấp thấp hơn, vì vậy, bạn cần phải thực hiện thao tác này để giải phóng
nếu không cần kết quả.