يتكون بدء استخدام "Transformer
" من الخطوات التالية:
- أضف Media3 Transformer كتبعية في مشروعك.
- إنشاء
EditedMediaItem
تمثّل الوسائط التي تريد معالجتها والتعديلات عليها تنطبق عليه. - إنشاء
Transformer
، مع وصف الناتج المطلوب واختيار المستمع لأحداث الإكمال والخطأ. - ابدأ عملية التصدير، مع تمرير
EditedMediaItem
للتعديل مسار الإخراج. أثناء التصدير، يمكنك الاستعلام عن مستوى التقدّم الحالي أو إلغاء العملية. - عند انتهاء عملية التصدير، تعامل مع الإخراج حسب الحاجة. على سبيل المثال، يمكنك مشاركة المخرجات مع تطبيق آخر أو تحميلها على خادم.
يُرجى مواصلة القراءة للاطّلاع على مزيد من التفاصيل عن هذه الخطوات، كما يمكنك الاطّلاع على "TransformerActivity
" في
عرض توضيحي للمحوّل
التطبيق
مثال كامل.
إضافة المحوِّل Media3 كتبعية
أسهل طريقة لبدء استخدام Transformer هي إضافة تبعيات Gradle
في المكتبة ضمن ملف build.gradle
الخاص بوحدة تطبيقك:
Kotlin
implementation("androidx.media3:media3-transformer:1.4.1") implementation("androidx.media3:media3-effect:1.4.1") implementation("androidx.media3:media3-common:1.4.1")
Groovy
implementation "androidx.media3:media3-transformer:1.4.1" implementation "androidx.media3:media3-effect:1.4.1" implementation "androidx.media3:media3-common:1.4.1"
حيث يكون 1.4.1 هو الإصدار المفضل لديك. يمكن أن يكون أحدث إصدار تم العثور عليها من خلال الرجوع إلى إصدار الملاحظات.
يمكنك العثور على مزيد من المعلومات حول وحدات المكتبة المتاحة في Google Maven AndroidX Media3 .
تفعيل دعم Java 8
إذا لم يتم تفعيلها من قبل، يجب تفعيل دعم Java 8 على جميع build.gradle
التي تعتمد على المحوّل من خلال إضافة ما يلي إلى android
:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
بدء تحويل
في ما يلي مثال على إنشاء EditedMediaItem
لإزالة صوت أحد الإدخالات
ثم إنشاء مثيل Transformer
وإعداده لتصديره
فيديو H.265/HEVC، يتم إخراج النتيجة إلى outputPath
.
Kotlin
val inputMediaItem = MediaItem.fromUri("path_to_input_file") val editedMediaItem = EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build() val transformer = Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H265) .addListener(transformerListener) .build() transformer.start(editedMediaItem, outputPath)
Java
MediaItem inputMediaItem = MediaItem.fromUri("path_to_input_file"); EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build(); Transformer transformer = new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H265) .addListener(transformerListener) .build(); transformer.start(editedMediaItem, outputPath);
للحصول على مزيد من المعلومات حول عناصر الوسائط، يمكنك الاطلاع على عناصر وسائط ExoPlayer. . يمكن أن يكون الإدخال متدرّجًا أو تكيّفيًا ولكن البث يكون دائمًا بثًا تدريجيًا. بالنسبة للإدخالات التكيّفية، يتم دائمًا تحديد المسارات ذات الدقة الأعلى لعملية التحويل. الإدخال يمكن أن يكون بأي تنسيق حاوية متوافق مع ExoPlayer، ولكن يكون الإخراج دائمًا ملف MP4.
يمكنك تنفيذ عمليات تصدير متعددة بالتتابع على التطبيق نفسه
Transformer
مثال، ولكن لا يتم اعتبار عمليات التصدير المتزامنة التي لها المثيل نفسه.
ملاحظة حول سلاسل المحادثات
يجب الوصول إلى مثيلات المحوّل من سلسلة محادثات واحدة للتطبيق، طرق المستمعين في نفس سلسلة المحادثات. بالنسبة لمعظم الحالات، يمكن أن تكون سلسلة محادثات التطبيق مجرد سلسلة الرسائل الرئيسية للتطبيق. داخليًا، تعمل خدمة Transformer على العمل في الخلفية وتنشر مكالماتها إلى المستمع. في مؤشر ترابط التطبيق.
الاستماع إلى الأحداث
طريقة start
غير متزامنة. يعود على الفور ويصبح التطبيق
يتم إشعارها بالأحداث من خلال أداة معالجة البيانات التي يتم تمريرها إلى أداة إنشاء Transformer
.
Kotlin
val transformerListener: Transformer.Listener = object : Transformer.Listener { override fun onCompleted(composition: Composition, result: ExportResult) { playOutput() } override fun onError(composition: Composition, result: ExportResult, exception: ExportException) { displayError(exception) } }
Java
Transformer.Listener transformerListener = new Transformer.Listener() { @Override public void onCompleted(Composition composition, ExportResult result) { playOutput(); } @Override public void onError(Composition composition, ExportResult result, ExportException exception) { displayError(exception); } };
يتضمن ExportResult
معلومات عن ملف الإخراج، بما في ذلك الملف.
الحجم ومتوسط معدلات البت للصوت والفيديو، حسب الاقتضاء.
تلقّي إشعارات حول مستوى التقدّم
طلب Transformer.getProgress
للاستعلام عن مستوى التقدّم الحالي
التحويل. تشير القيمة المعروضة إلى حالة التقدم. في حال التقدّم
الحالة هي PROGRESS_STATE_AVAILABLE
، فإن قيمة ProgressHolder
المقدمة هي
مع النسبة المئوية للتقدم الحالي. يوضح المثال التالي كيفية
تقدم الاستعلام بشكل دوري عن تقدم التحويل، حيث
يمكن تنفيذ طريقة updateProgressInUi
لتعديل شريط التقدّم.
Kotlin
transformer.start(inputMediaItem, outputPath) val progressHolder = ProgressHolder() mainHandler.post( object : Runnable { override fun run() { val progressState: @ProgressState Int = transformer.getProgress(progressHolder) updateProgressInUi(progressState, progressHolder) if (progressState != Transformer.PROGRESS_STATE_NOT_STARTED) { mainHandler.postDelayed(/* r= */this, /* delayMillis= */500) } } } )
Java
transformer.start(inputMediaItem, outputPath); ProgressHolder progressHolder = new ProgressHolder(); mainHandler.post( new Runnable() { @Override public void run() { @Transformer.ProgressState int progressState = transformer.getProgress(progressHolder); updateProgressInUi(progressState, progressHolder); if (progressState != PROGRESS_STATE_NOT_STARTED) { mainHandler.postDelayed(/* r= */ this, /* delayMillis= */ 500); } } });
إلغاء تحويل
إذا اختار المستخدم التراجع عن عملية التصدير، عليك إلغاء عملية التصدير.
مع Transformer.cancel
. تكون الموارد مثل برامج ترميز الفيديو
محدودة،
خاصة على الأجهزة المنخفضة المواصفات، لذلك من المهم القيام بذلك لتحرير
والموارد إذا لم تكن بحاجة إلى الناتج.