Bắt đầu

Quy trình bắt đầu sử dụng Transformer bao gồm các bước sau:

  1. Thêm Media3 Transformer làm phần phụ thuộc trong dự án.
  2. 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 đó.
  3. 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.
  4. 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.
  5. Khi quá trình xuất kết thúc, hãy xử lý kết quả 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 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. 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ả các tệp build.gradle phụ thuộc vào Trình chuyển đổi 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 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 đa phương tiện, hãy xem trang 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 đầu vào thích ứng, kênh có độ phân giải cao nhất luôn được chọn để chuyển đổi. Dữ liệu đầu vào có thể ở định dạng vùng chứa bất kỳ mà ExoPlayer hỗ trợ, nhưng dữ liệu đầu ra luôn là tệp MP4.

Bạn có thể thực thi nhiều hoạt động xuất 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. Trong hầu hết 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 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ả 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 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 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ị 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ả.