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

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

يمكنك تحديد تنسيقات الإخراج الصوتية والفيديو التي تريد إنتاجها عند إنشاء 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();

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

تتضمن 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 قائمة بتأثيرات الصوت والفيديو لتطبيقها. داخليًا، يحوّل إطار تأثيرات Transformer قائمة تأثيرات الفيديو إلى سلسلة من برامج تظليل GL التي يتم تطبيقها بالترتيب. في بعض الحالات، يكون إطار التأثيرات قادرًا على تطبيق تأثيرات متعددة باستخدام برنامج تظليل واحد. على سبيل المثال، يمكن لبرنامج تظليل واحد تطبيق عمليات تحويل متعددة متتالية في المصفوفة، مما يؤدي إلى تحسين الكفاءة والجودة.

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

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

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

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