تحويل الترميز بين التنسيقات
يمكنك تحديد تنسيقات الصوت والفيديو التي تريد إنتاجها عند إنشاء 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();
قوائم تعديل MP4
لتسريع عملية القص، تتوافق أداة Transformer مع قوائم تعديل MP4، ما يتيح إجراء تعديلات "قص فقط" أكثر فعالية بدون إعادة ترميز الفيديو بالكامل. تستخدم هذه الطريقة عيّنات مشفّرة حالية و "إعلانًا تمهيديًا" ضمن قائمة التعديل، ما يوجّه المشغّل إلى بدء التشغيل عند نقطة معيّنة، وبالتالي تخطّي المقطع الأوّلي غير المرغوب فيه.
لإجراء تعديلات على مستوى القص فقط بشكل أسرع بكثير، استخدِم الدالة
experimentalSetMp4EditListTrimEnabled(true)
.
Kotlin
Transformer.Builder(context) .experimentalSetMp4EditListTrimEnabled(true) .build()
Java
new Transformer.Builder(context) .experimentalSetMp4EditListTrimEnabled(true) .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
، ما يسمح بمعاينة تعديلات الصوت.