شروع به کار

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

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

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

‫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 باید از یک رشته برنامه واحد دسترسی داشت و روش‌های شنونده در همان رشته فراخوانی می‌شوند. در اکثر موارد، رشته برنامه می‌تواند همان رشته اصلی برنامه باشد. دروناً، «تبدیل‌کننده» کارش را در پس‌زمینه انجام می‌دهد و فراخوانی‌هایش را در رشته برنامه به روش‌های شنونده پست می‌کند.

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

روش 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 لغو کنید. منابعی مانند کدک‌های ویدیویی سخت‌افزاری محدود هستند، به‌ویژه در دستگاه‌های پایین‌رده، بنابراین مهم است که این کار را انجام دهید تا منابع را درصورت عدم نیاز به برونداد آزاد کنید.