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

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

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

تتوفّر أيضًا تأثيرات الفيديو للمعاينة في ExoPlayer باستخدام ExoPlayer.setVideoEffects. للاطّلاع على مثال حول كيفية استخدام واجهة برمجة التطبيقات هذه، يمكنك مراجعة تطبيق العرض التوضيحي للمؤثرات.

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

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

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