Bắt đầu

Để bắt đầu sử dụng Transformer, bạn cần thực hiện các bước sau:

  1. Thêm Media3 Transformer làm phần phụ thuộc trong dự án của bạn.
  2. Tạo một EditedMediaItem đại diện cho nội dung nghe nhìn cần xử lý, cũng như các bản chỉnh sửa cần áp dụng cho nội dung đó.
  3. Tạo một Transformer, mô tả đầu ra bắt buộc và một trình nghe cho các sự kiện hoàn thành và lỗi.
  4. Bắt đầu thao tác xuất, truyền vào EditedMediaItem cần chỉnh sửa và một đường dẫn đầu ra. Trong khi xuất, bạn có thể kiểm tra tiến trình hiện tại hoặc huỷ thao tác đó.
  5. Khi xuất xong, hãy xử lý đầ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 đầu ra lên một máy chủ.

Hãy đọc tiếp để hiểu rõ hơn về các bước này, và tham khảo TransformerActivity trong ứng dụng minh hoạ Transformer để xem 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 của thư viện vào tệp build.gradle trong mô-đun ứng dụng của bạn:

Kotlin

implementation("androidx.media3:media3-transformer:1.7.1")
implementation("androidx.media3:media3-effect:1.7.1")
implementation("androidx.media3:media3-common:1.7.1")

Groovy

implementation "androidx.media3:media3-transformer:1.7.1"
implementation "androidx.media3:media3-effect:1.7.1"
implementation "androidx.media3:media3-common:1.7.1"

trong đó 1.7.1 là phiên bản bạn muốn dùng. Bạn có thể tham khảo ghi chú phát hành để biết phiên bản mới nhất.

Bạn có thể xem 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, 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 nội dung sau vào phần android:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

Bắt đầu 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 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 nội dung nghe nhìn, hãy xem trang về các mục nội dung nghe nhìn của ExoPlayer. Đầu vào có thể là một luồng liên tục hoặc một luồng thích ứng, nhưng đầu ra luôn là một luồng liên tục. Đối với các đầu vào thích ứng, các bản nhạc có độ phân giải cao nhất luôn được chọn để biến đổi. Đầu vào có thể ở bất kỳ định dạng vùng chứa nào mà ExoPlayer hỗ trợ, nhưng đầu ra luôn là tệp MP4.

Bạn có thể thực hiện nhiều thao tác xuất theo trình tự trên cùng một phiên bản Transformer, nhưng các thao tác xuất đồng thời bằng cùng một phiên bản không được hỗ trợ.

Lưu ý về tính năng tạo luồng

Bạn phải truy cập vào các phiên bản Transformer từ một luồng ứng dụng duy nhất và các phương thức của trình nghe được gọi trên cùng một luồng. Trong phần lớn các trường hợp, luồng ứng dụng chỉ có thể là luồng chính của ứng dụng. Về nội bộ, Transformer hoạt động ở chế độ nền và đăng các lệnh gọi đến các phương thức của trình nghe trên luồng ứng dụng.

Lắng nghe các sự kiện

Phương thức start là 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 để kiểm tra tiến trình hiện tại của quá trình biến đổi. Giá trị 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 đã 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 kiểm tra định kỳ tiến trình của một quá trình biến đổi, trong đó phương thức updateProgressInUi có thể được triển khai để cập nhật mộ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ỷ biến đổi

Nếu người dùng chọn thoát khỏi quy trình 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ã video phần cứng có hạn, đặc biệt là trên các thiết bị cấp thấp, 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.