تبدیل‌ها

Jetpack Media3 Transformer امکان ویرایش، تبدیل، و صادر کردن دارایی‌های رسانه‌ای در Android را فراهم می‌کند. این صفحه توضیح می‌دهد که چگونه تبدیل‌های اصلی را پیکربندی کنید:

  • تراتبدیل و تراتبدیل مجدد: تبدیل قالب‌های صوتی و ویدیویی، یا دور زدن کدبندی مجدد ازطریق کپی کردن نمونه‌های ظرف (تراتبدیل مجدد).
  • حذف قطعه: حذف قطعه‌های صوتی یا ویدیویی از رسانه.
  • برش و بهینه‌سازی: برش رسانه براساس مُهر زمان، با گزینه‌هایی برای صادر کردن سریع‌تر بااستفاده از فهرست‌های ویرایش MP4 و بهینه‌سازی برش.
  • جلوه‌های ویدیو: مقیاس‌بندی، چرخش، یا اعمال جلوه‌های سایه‌زن OpenGL سفارشی، همچنین قابل پیش‌نمایش در ExoPlayer.
  • ورودی تصویر: تصاویر ثابت را با مدت زمان و نرخ فریم سفارشی به کلیپ‌های ویدیویی تبدیل کنید.
  • پردازش صدا: برای اصلاح صدای خام، AudioProcessor نمونه را به‌هم زنجیر کنید.

تراتبدیل بین قالب‌ها

می‌توانید قالب‌های صوتی و تصویری خروجی موردنظرتان را هنگام ساختن «تبدیل‌کننده» مشخص کنید. برای مثال، کد زیر نحوه پیکربندی «تبدیل‌کننده» برای خروجی ویدیو H.264/AVC و صدای AAC را نشان می‌دهد:

کاتلین

Transformer.Builder(context)
  .setVideoMimeType(MimeTypes.VIDEO_H264)
  .setAudioMimeType(MimeTypes.AUDIO_AAC)
  .build()

جاوا

new Transformer.Builder(context)
    .setVideoMimeType(MimeTypes.VIDEO_H264)
    .setAudioMimeType(MimeTypes.AUDIO_AAC)
    .build();

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

برداشتن صدا یا ویدیو

حذف صدا یا ویدیو بااستفاده از EditedMediaItem.Builder، برای مثال:

کاتلین

EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()

جاوا

new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();

کوتاه کردن کلیپ

با تنظیم پیکربندی برش روی عنصر رسانه ورودی، می‌توانید هر رسانه‌ای را که خارج از مُهر زمان شروع و پایان مشخص‌شده است بردارید. برای مثال، برای تولید یک کلیپ که فقط شامل رسانه بین ۱۰ تا ۲۰ ثانیه است:

کاتلین

val inputMediaItem =
  MediaItem.Builder()
    .setUri(uri)
    .setClippingConfiguration(
      MediaItem.ClippingConfiguration.Builder()
        .setStartPositionMs(10_000)
        .setEndPositionMs(20_000)
        .build()
    )
    .build()

جاوا

MediaItem inputMediaItem =
    new MediaItem.Builder()
        .setUri(uri)
        .setClippingConfiguration(
            new MediaItem.ClippingConfiguration.Builder()
                .setStartPositionMs(10_000)
                .setEndPositionMs(20_000)
                .build())
        .build();

ویرایش فهرست‌های MP4

برای برش سریع‌تر، Transformer از فهرست‌های ویرایش MP4 پشتیبانی می‌کند و امکان ویرایش‌های «فقط برش» کارآمدتر را بدون تراتبدیل کامل ویدیو فراهم می‌کند. این روش از نمونه‌های کدبندی‌شده موجود و یک «پیش‌نمایش» در فهرست ویرایش استفاده می‌کند که به پخش‌کننده دستور می‌دهد پخش را از یک نقطه خاص شروع کند و به‌طور مؤثر بخش اولیه ناخواسته را رد کند.

برای اینکه ویرایش‌های فقط برش را به‌طور قابل‌توجهی سریع‌تر کنید، با experimentalSetMp4EditListTrimEnabled(true) تماس بگیرید.

کاتلین

Transformer.Builder(context).experimentalSetMp4EditListTrimEnabled(true).build()

جاوا

new Transformer.Builder(context).experimentalSetMp4EditListTrimEnabled(true).build();
توجه به این نکته مهم است که همه پخش‌کننده‌های رسانه از موقعیت «پیش‌نمایش» پشتیبانی نمی‌کنند. این یعنی وقتی از چنین پخش‌کننده‌ای استفاده شود، فایل از ابتدای نمونه کدبندی‌شده پخش خواهد شد، صرف‌نظر از هرگونه اطلاعات فهرست ویرایشی که ممکن است نقطه شروع متفاوتی را مشخص کند.

درحال بهینه‌سازی کردن برش‌ها

برای کاهش تأخیر در برش ابتدای ویدیو، بهینه‌سازی برش را فعال کنید.

کاتلین

Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build()

جاوا

new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();

این کار با رمزگشایی و رمزگذاری مجدد بخش کوچکی از ویدیو تا حد امکان، و سپس چسباندن داده‌های رمزگذاری‌شده مجدد با بقیه ویدیو اصلی، سرعت برون‌برد را افزایش می‌دهد. بهینه‌سازی به این بستگی دارد که بتوان بخشی از فایل ورودی را با برونداد کدبندی‌شده جدید به‌هم چسباند، که یعنی قالب برونداد کدبند و قالب ورودی باید سازگار باشند. بنابراین، برای مثال، اگر فایل دراصل در دستگاهی با پیاده‌سازی کدبند متفاوت تولید شده باشد، احتمالاً نمی‌توان بهینه‌سازی را اعمال کرد. برای اینکه بهینه‌سازی موفقیت‌آمیز باشد، کدبند ارائه‌شده به «ترانسفورمر» ازطریق EncoderFactory باید سطح و نمایه‌ای سازگار با قالب ورودی داشته باشد.

این بهینه‌سازی فقط با ورودی تک‌دارایی MP4 بدون جلوه، به‌جز جلوه‌های ویدیویی بدون عملیات و چرخش‌های قابل‌تقسیم بر ۹۰ درجه کار می‌کند. اگر بهینه‌سازی ناموفق باشد، Transformer به‌طور خودکار به برون‌برد عادی برمی‌گردد و نتیجه بهینه‌سازی را در ExportResult.OptimizationResult گزارش می‌کند.

درحال اعتبارسنجی این عملکرد هستیم و انتظار داریم در نسخه بعدی از حالت آزمایشی خارج شود.

ویرایش‌های ویدیو

EditedMediaItems فهرست‌هایی از پردازنده‌های صوتی و جلوه‌های ویدیویی برای اعمال کردن به‌ترتیب دارد. این کتابخانه شامل پیاده‌سازی‌های جلوه ویدیو برای موارد استفاده رایج است، یا می‌توانید جلوه‌های سفارشی بنویسید و هنگام ساختن عناصر رسانه‌ای ویرایش‌شده آن‌ها را اضافه کنید.

می‌توانید رسانه‌ها را تغییر مقیاس دهید، که می‌تواند برای صرفه‌جویی در منابع پردازش یا پهنای باند هنگام کار با ورودی‌های با وضوح بسیار بالا، مانند ویدیوهای 4k یا 8k مفید باشد. برای مثال، برای تغییر اندازه متناسب به ۴۸۰ پیکسل ارتفاع:

کاتلین

EditedMediaItem.Builder(MediaItem.fromUri(uri))
  .setEffects(
    Effects(
      /* audioProcessors= */ listOf(),
      /* videoEffects= */ listOf(Presentation.createForHeight(480)),
    )
  )
  .build()

جاوا

new EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(
        new Effects(
            /* audioProcessors= */ ImmutableList.of(),
            /* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480))))
    .build();

یا می‌توانید با یک عامل معین مقیاس‌بندی کنید، برای مثال، برای نصف کردن اندازه:

کاتلین

val editedMediaItem =
  EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(
      Effects(
        /* audioProcessors= */ listOf(),
        /* videoEffects= */ listOf(
          ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()
        ),
      )
    )
    .build()

جاوا

new EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(
        new Effects(
            /* audioProcessors= */ ImmutableList.of(),
            /* videoEffects= */ ImmutableList.of(
                new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build())))
    .build();

می‌توانید چرخش را به همین روش پیکربندی کنید:

کاتلین

EditedMediaItem.Builder(MediaItem.fromUri(uri))
  .setEffects(
    Effects(
      /* audioProcessors= */ listOf(),
      /* videoEffects= */ listOf(
        ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build()
      ),
    )
  )
  .build()

جاوا

new EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(
        new Effects(
            /* audioProcessors= */ ImmutableList.of(),
            /* videoEffects= */ ImmutableList.of(
                new ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build())))
    .build();

جلوه‌های ویدیویی سفارشی

سازنده Effects فهرستی از جلوه‌های صوتی و ویدیویی را برای اعمال کردن می‌پذیرد. درون‌برنامه‌ای، چارچوب جلوه‌های Transformer فهرست جلوه‌های ویدیو را به توالی برنامه‌های سایه‌زن GL تبدیل می‌کند که به‌ترتیب اعمال می‌شوند. در برخی موارد، چارچوب جلوه‌ها می‌تواند چندین جلوه را با یک برنامه سایه‌زن اعمال کند. برای مثال، یک برنامه سایه‌زن می‌تواند چندین تبدیل ماتریس متوالی را اعمال کند که باعث بهبود کارایی و کیفیت می‌شود.

جلوه‌های ویدیو نیز بااستفاده از ExoPlayer.setVideoEffects برای پیش‌نمایش در ExoPlayer پشتیبانی می‌شوند. برای نمونه‌ای از نحوه استفاده از این API، برنامه نمایشی جلوه را بررسی کنید.

برنامه نمایشی شامل نمونه‌هایی از جلوه‌های ویدیویی سفارشی است.

ورودی تصویر

‫Transformer از ورودی‌های تصویر با تبدیل آن‌ها به کلیپ‌های ویدیویی ثابت پشتیبانی می‌کند. برای پیکربندی کردن تصویر به‌عنوان منبع ورودی، این مراحل را دنبال کنید:

  • بااستفاده از MediaItem.Builder، یک MediaItem بسازید. با فراخوانی setImageDurationMs، مدت زمان نمایش تصویر در ویدیو خروجی را مشخص کنید.

  • ‫EditedMediaItem را بسازید و MediaItem را در آن بپیچید. نرخ فریم هدف را برای جاری‌سازی ویدیو تولیدشده بااستفاده از EditedMediaItem.Builder#setFrameRate مشخص کنید.

مثال زیر نحوه پیکربندی ورودی تصویر برای تولید ویدیو ۵ ثانیه‌ای با نرخ ۳۰ فریم در ثانیه را نشان می‌دهد:

کاتلین

val imageMediaItem =
  MediaItem.Builder()
    .setUri(imageUri)
    .setImageDurationMs(5000) // 5 seconds
    .build()

val editedImageItem =
  EditedMediaItem.Builder(imageMediaItem)
    .setFrameRate(30) // 30 frames per second
    .build()

جاوا

MediaItem imageMediaItem =
    new MediaItem.Builder()
        .setUri(imageUri)
        .setImageDurationMs(5000) // 5 seconds
        .build();
new EditedMediaItem.Builder(imageMediaItem)
    .setFrameRate(30) // 30 frames per second
    .build();

ویرایش‌های صدا

جلوه‌های صوتی با اعمال یک توالی از AudioProcessor نمونه به صدای خام (PCM) پیاده‌سازی می‌شوند. ‫ExoPlayer از انتقال پردازشگرهای صوتی به DefaultAudioSink.Builder پشتیبانی می‌کند که امکان پیش‌دید کردن ویرایش‌های صوتی را فراهم می‌کند.