تحولات

رمزگذاری بین فرمت ها

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

صدا یا تصویر را حذف کنید

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

کاتلین

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

جاوا

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

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

می‌توانید با تنظیم پیکربندی برش بر روی آیتم رسانه ورودی، هر رسانه‌ای را خارج از مهر زمانی مشخص شده شروع و پایان حذف کنید. به عنوان مثال، برای تولید یک کلیپ که فقط حاوی رسانه بین 10 تا 20 ثانیه است:

کاتلین

val inputMediaItem = MediaItem.Builder()
    .setUri(uri)
    .setClippingConfiguration(
        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();

بهینه سازی تریم ها

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

کاتلین

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

جاوا

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

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

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

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

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

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

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

کاتلین

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 با استفاده از ExoPlayer.setVideoEffects پشتیبانی می شود.

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

ویرایش های صوتی

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