عمليات التحويل

تحويل الترميز بين التنسيقات

يمكنك تحديد تنسيقات الإخراج الصوتي والفيديو التي تريد إنتاجها عند إنشاء Transformer. على سبيل المثال، يوضح الرمز التالي كيف لإعداد المحوّل لإخراج فيديو H.264/AVC وصوت AAC:

Kotlin

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

Java

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

إذا كان تنسيق وسائط الإدخال مطابقًا لإعدادات الصوت أو فيديو، يتحول المحوّل تلقائيًا إلى التحويل، وهو نسخ العينات المضغوطة من حاوية الإدخال إلى حاوية الإخراج بدون التعديل. وهذا يتجنب التكلفة الحاسوبية وفقدان الجودة المحتمل فك الترميز وإعادة تشفيره بالتنسيق ذاته.

إزالة الصوت أو الفيديو

إزالة الصوت أو الفيديو باستخدام EditedMediaItem.Builder، على سبيل المثال:

Kotlin

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

Java

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

قطع مقطع

يمكنك إزالة أي وسائط خارج الطوابع الزمنية المحدّدة للبدء والانتهاء من خلال ضبط إعدادات الاقتصاص على عنصر وسائط الإدخال. على سبيل المثال، لإنتاج مقطع يحتوي فقط على وسائط تتراوح مدتها بين 10 ثوانٍ و20 ثانية:

Kotlin

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

Java

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

تحسين عمليات القطع

لتقليل وقت الاستجابة لقطع بداية الفيديو، فعِّل ميزة القطع. التحسين.

Kotlin

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

Java

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

يؤدي ذلك إلى تسريع عملية التصدير من خلال فك ترميز المحتوى وإعادة تشفيره بقدر ضئيل من محتوى الفيديو بعد ذلك، ندمج البيانات المُعاد ترميزها مع باقي البيانات الأصلية الفيديو القادم. يعتمد التحسين على القدرة على دمج جزء من ملف الإدخال. بمخرجات مشفرة حديثًا، أي أن تنسيق الإخراج لبرنامج التشفير أن يكون تنسيق الإدخال متوافقًا على سبيل المثال، إذا تم حفظ الملف على جهاز يستخدم برنامج ترميز مختلف، فمن المرجح أن أنه لن يكون من الممكن تطبيق التحسين. لضمان نجاح عملية التحسين، تم توفير برنامج الترميز إلى Transformer عبر يجب أن يحتوي EncoderFactory على مستوى وملف شخصي متوافقَين مع تنسيق الإدخال.

لا يعمل هذا التحسين إلا مع إدخالات MP4 بمادة عرض واحدة بدون أي تأثيرات، باستثناء لا تتوفر تأثيرات فيديو وعمليات تدوير قابلة للقسمة على 90 درجة. إذا كان التحسين فإن Transformer يعود تلقائيًا إلى التصدير العادي، ويقدم تقريرًا نتيجة التحسين في ExportResult.OptimizationResult.

نحن نتحقّق من صحة هذه الوظيفة ونتوقّع أن تصبح غير تجريبية. في إصدار لاحق.

تعديلات الفيديوهات

لدى "EditedMediaItems" قوائم بمعالجات الصوت وتأثيرات الفيديو المطلوب تطبيقها فيها. طلبك. تتضمن المكتبة تنفيذ تأثيرات الفيديو لحالات الاستخدام الشائعة، أو كتابة تأثيرات مخصّصة وتمريرها عند إنشاء وسائط معدّلة عناصر.

يمكنك إعادة ضبط حجم الوسائط، وهو ما قد يكون مفيدًا لتوفير موارد المعالجة أو النطاق الترددي عند التعامل مع مدخلات عالية الدقة، مثل فيديو 4k أو 8k. على سبيل المثال، لضبط الحجم بالتناسب إلى ارتفاع 480 بكسل:

Kotlin

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

Java

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

وبدلاً من ذلك، يمكنك القياس حسب عامل معيّن، على سبيل المثال، لخفض الحجم إلى النصف:

Kotlin

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

Java

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

يمكنك ضبط التدوير بالطريقة نفسها:

Kotlin

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

Java

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

تأثيرات الفيديو المخصّصة

تقبل الدالة الإنشائية Effects قائمة بتأثيرات الصوت والفيديو لتطبيقها. داخليًا، يحوّل إطار عمل تأثيرات الفيديو قائمة تأثيرات الفيديو إلى سلسلة من برامج تظليل GL التي يتم تطبيقها بالترتيب. في بعض الحالات، يستطيع إطار التأثيرات تطبيق تأثيرات متعددة باستخدام برنامج تظليل واحد. على سبيل المثال، يمكن لبرنامج تظليل واحد تطبيق مصفوفة متتالية متعددة التحولات، مما يحسن الكفاءة والجودة.

يمكن أيضًا استخدام تأثيرات الفيديو للمعاينة في ExoPlayer باستخدام ExoPlayer.setVideoEffects

يتضمّن تطبيق العرض التوضيحي أمثلة على تأثيرات الفيديو المخصّصة.

تعديلات الصوت

يتم تنفيذ التأثيرات الصوتية من خلال تطبيق تسلسل من AudioProcessor. الحالة إلى الصوت الأولي (PCM). يدعم ExoPlayer تمرير معالجات الصوت إلى DefaultAudioSink.Builder، ما يسمح بمعاينة التعديلات الصوتية.