شروع به کار

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

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

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

اضافه کردن Media3 Transformer به عنوان یک وابستگی

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

کاتلین

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

گرووی

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

که در آن نسخه ۱.۸.۰ نسخه مورد نظر شماست. آخرین نسخه را می‌توانید با مراجعه به یادداشت‌های انتشار پیدا کنید.

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

فعال کردن پشتیبانی از جاوا ۸

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

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