تحولات

کلیپ‌ها، اعمال جلوه‌های ویدیویی و بهینه‌سازی خروجی‌ها. keywords_public: Media3، Transformer، transcode، ویرایش ویدیو، برش، پردازش صدا، رسانه اندروید

تبدیل کد بین فرمت‌ها

شما می‌توانید هنگام ساخت 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();

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

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

کاتلین

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 پشتیبانی می‌کند و امکان ویرایش‌های «فقط برش» کارآمدتر را بدون نیاز به کدگذاری مجدد کامل ویدیو فراهم می‌کند. این روش از نمونه‌های کدگذاری شده موجود و یک «پیش‌پخش» در لیست ویرایش استفاده می‌کند که به پخش‌کننده دستور می‌دهد پخش را از یک نقطه خاص شروع کند و عملاً از بخش اولیه نامطلوب صرف‌نظر کند.

برای اینکه ویرایش‌های فقط-تریم (trim-only) را به‌طور قابل‌توجهی سریع‌تر کنید، تابع 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();

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

این بهینه‌سازی فقط با ورودی MP4 تک‌فایلی و بدون هیچ جلوه‌ای به جز جلوه‌های ویدیویی op و چرخش‌های قابل تقسیم بر ۹۰ درجه کار می‌کند. اگر بهینه‌سازی با شکست مواجه شود، 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 پشتیبانی می‌شوند. برای مثالی از نحوه استفاده از این API، برنامه نسخه آزمایشی effect را بررسی کنید.

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

ورودی تصویر

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

  • با استفاده از 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();

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

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

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