شروع به کار

شروع به کار با Transformer شامل مراحل زیر است:

  1. Media3 Transformer را به‌عنوان وابستگی در پروژه خود اضافه کنید.
  2. EditedMediaItem بسازید که نشان‌دهنده رسانه برای پردازش و ویرایش‌های اعمال‌شده بر آن باشد.
  3. یک Transformer بسازید و خروجی موردنیاز و یک شنونده برای رویدادهای تکمیل و خطا را توصیف کنید.
  4. عملیات صادر کردن را شروع کنید، EditedMediaItem را برای ویرایش و مسیر خروجی ارسال کنید. درطول صادر کردن، می‌توانید پیشرفت فعلی را پرس‌وجو کنید یا عملیات را لغو کنید.
  5. وقتی صادر کردن تمام شد، خروجی را به‌دلخواه مدیریت کنید. برای مثال، می‌توانید خروجی را با برنامه دیگری هم‌رسانی کنید یا آن را در سروری بارگذاری کنید.

برای جزئیات بیشتر درباره این مراحل، ادامه مطلب را بخوانید و برای نمونه کامل، TransformerActivity را در برنامه نمایشی Transformer ببینید.

افزودن Media3 Transformer به‌عنوان وابستگی

ساده‌ترین راه برای شروع استفاده از Transformer، افزودن وابستگی‌های gradle به کتابخانه در فایل build.gradle ماژول برنامه‌تان است:

کاتلین

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

شیک

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

که 1.11.1 نسخه ترجیحی شما است. جدیدترین نسخه را می‌توانید با مراجعه به یادداشت‌های انتشار پیدا کنید.

اطلاعات بیشتر درباره ماژول‌های کتابخانه دردسترس را می‌توانید در صفحه Google Maven AndroidX Media3 پیدا کنید.

روشن کردن پشتیبانی از Java 8

اگر قبلاً فعال نشده است، باید پشتیبانی از Java 8 را در همه فایل‌های build.gradle که به Transformer وابسته هستند با افزودن موارد زیر به بخش android فعال کنید:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

شروع تبدیل

در اینجا مثالی از ایجاد EditedMediaItem برای حذف صدا از فایل ورودی، سپس ایجاد و پیکربندی نمونه Transformer برای صادر کردن ویدیو H.265/HEVC، و خروجی گرفتن از نتیجه در outputPath آورده شده است.

کاتلین

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)

جاوا

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);

برای کسب اطلاعات بیشتر درباره موارد رسانه‌ای، به صفحه موارد رسانه‌ای ExoPlayer مراجعه کنید. ورودی می‌تواند جاری‌سازی تطبیقی یا پیش‌رونده باشد، اما خروجی همیشه جاری‌سازی پیش‌رونده است. برای ورودی‌های تطبیقی، همیشه قطعه‌های با بالاترین وضوح برای تبدیل انتخاب می‌شوند. ورودی می‌تواند هر قالب محفظه‌ای باشد که ExoPlayer پشتیبانی می‌کند، اما خروجی همیشه فایل MP4 است.

می‌توانید چندین عملیات برون‌برد را به‌طور متوالی در یک نمونه Transformer اجرا کنید، اما برون‌بردهای هم‌زمان با یک نمونه پشتیبانی نمی‌شود.

برای کسب اطلاعات درباره تولید رسانه با ترکیب کردن چند ورودی، به ویرایش چنددارایی مراجعه کنید.

یادداشتی درباره رشته‌سازی

نمونه‌های Transformer باید از یک رشته برنامه قابل‌دسترسی باشند و روش‌های شنونده در همان رشته فراخوانی می‌شوند. در اکثر موارد، رشته برنامه می‌تواند همان رشته اصلی برنامه باشد. Internally, Transformer does its work in the background and posts its calls to listener methods on the application thread.

گوش دادن به رویدادها

روش start ناهمگام است. این روش فوراً برمی‌گردد و برنامه ازطریق شنونده‌ای که به سازنده Transformer ارسال شده است، از رویدادها مطلع می‌شود.

کاتلین

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)
    }
  }

جاوا

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 شامل اطلاعاتی درباره فایل خروجی است، ازجمله اندازه فایل و نرخ بیت متوسط برای صدا و ویدیو، درصورت وجود.

دریافت به‌روزرسانی‌های پیشرفت

برای پرس‌وجو درباره پیشرفت فعلی تبدیل، Transformer.getProgress را فراخوانی کنید. مقدار برگردانده‌شده نشان‌دهنده وضعیت پیشرفت است. اگر وضعیت پیشرفت PROGRESS_STATE_AVAILABLE باشد، ProgressHolder ارائه‌شده با درصد پیشرفت فعلی به‌روز می‌شود. مثال زیر نشان می‌دهد که چگونه می‌توان به‌طور دوره‌ای پیشرفت تبدیل را پرس‌وجو کرد، جایی که متد updateProgressInUi می‌تواند برای به‌روزرسانی نوار پیشرفت پیاده‌سازی شود.

کاتلین

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)
      }
    }
  }
)

جاوا

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);
        }
      }
    });

لغو تبدیل

اگر کاربر تصمیم گرفت از جریان برون‌برد خارج شود، عملیات برون‌برد را با Transformer.cancel لغو کنید. منابعی مانند کدک‌های ویدیویی سخت‌افزاری محدود هستند، به‌ویژه در دستگاه‌های رده‌پایین، بنابراین مهم است که این کار را انجام دهید تا منابع را آزاد کنید اگر خروجی موردنیاز نیست.