الإصدار 1.9.0 من Media3 متاح الآن بالإضافة إلى إصلاحات الأخطاء وتحسينات الأداء المعتادة، يحتوي الإصدار الأخير أيضًا على أربع وحدات جديدة أو معاد كتابتها إلى حد كبير:
-
media3-inspector- استخراج البيانات الوصفية والإطارات خارج نطاق التشغيل -
media3-ui-compose-material3- إنشاء واجهة مستخدم أساسية لتطبيق وسائط متوافق مع Material3 Compose في بضع خطوات فقط -
media3-cast- التعامل تلقائيًا مع عمليات الانتقال بين البث والتشغيل على الجهاز -
media3-decoder-av1: تشغيل فيديوهات AV1 بشكل متسق باستخدام برنامج فك الترميز المعاد كتابته والمستند إلى مكتبة dav1d
أضفنا أيضًا تحسينات على التخزين المؤقت وإدارة الذاكرة في PreloadManager، وقدّمنا العديد من التبسيطات الجديدة في ExoPlayer وTransformer وMediaSession.
يتيح لك هذا الإصدار أيضًا تجربة CompositionPlayer للمرة الأولى لمعاينة تعديلات الوسائط.
يمكنك مواصلة القراءة لمعرفة المزيد، ويُرجى الاطّلاع دائمًا على ملاحظات الإصدار الكاملة للحصول على نظرة عامة شاملة حول التغييرات في هذا الإصدار.
استخراج البيانات الوصفية والإطارات خارج نطاق التشغيل
هناك العديد من الحالات التي تريد فيها فحص الوسائط بدون بدء التشغيل. على سبيل المثال، قد تريد معرفة التنسيقات التي يتضمّنها أو مدته أو استرداد الصور المصغّرة.
يجمع قسم media3-inspector الجديد كل الأدوات المساعدة لفحص الوسائط بدون تشغيلها في مكان واحد:
-
MetadataRetrieverلقراءة المدة والتنسيق والبيانات الوصفية الثابتة منMediaItem -
FrameExtractorللحصول على لقطات أو صور مصغّرة من ملف -
MediaExtractorCompatكبديل مباشر لفئة MediaExtractor في نظام Android الأساسي للحصول على معلومات مفصّلة عن العيّنات في الملف
تتّبع الرموز MetadataRetriever وFrameExtractor نمطًا بسيطًا AutoCloseable. يمكنك الاطّلاع على صفحات الأدلة الجديدة لمزيد من التفاصيل.
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}
إنشاء واجهة مستخدم أساسية لتطبيق وسائط متوافق مع Material3 Compose Media ببضع خطوات فقط
في الإصدارات السابقة، بدأنا في توفير رمز ربط بين عناصر واجهة مستخدم Compose ونسخة Player. في الإصدار 1.9.0 من Media3، أضفنا وحدة جديدة media3-ui-compose-material3 تتضمّن أزرارًا وعناصر محتوى بتصميم Material3 كامل. تتيح لك إنشاء واجهة مستخدم للوسائط في بضع خطوات فقط، مع توفير كل المرونة اللازمة لتخصيص النمط. إذا كنت تفضّل إنشاء نمط واجهة المستخدم الخاص بك، يمكنك استخدام اللبنات الأساسية التي تتولّى جميع عمليات التحديث ومنطق الربط، وبالتالي لن تحتاج إلا إلى التركيز على تصميم عنصر في واجهة المستخدم. يُرجى الاطّلاع على صفحات الدليل الموسّع الخاصة بوحدات Compose UI.
نعمل أيضًا على توفير المزيد من مكوّنات Compose، مثل شريط البحث المسبق الإنشاء، وبديل كامل وجاهز للاستخدام PlayerView، بالإضافة إلى دمج الترجمة والإعلانات.
@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
Column(modifier) {
ContentFrame(player) // Video surface and shutter logic
Row (Modifier.align(Alignment.CenterHorizontally)) {
SeekBackButton(player) // Simple controls
PlayPauseButton(player)
SeekForwardButton(player)
}
}
}
واجهة مستخدم بسيطة لـ Compose Player تتضمّن عناصر جاهزة للاستخدام
التعامل تلقائيًا مع عمليات الانتقال بين البث والتشغيل المحلي
تمت إعادة كتابة CastPlayer في الوحدة media3-cast للتعامل تلقائيًا مع عمليات الانتقال بين التشغيل المحلي (على سبيل المثال باستخدام ExoPlayer) والتشغيل عن بُعد باستخدام Cast.
عند إعداد MediaSession، ما عليك سوى إنشاء CastPlayer حول ExoPlayer وإضافة MediaRouteButton إلى واجهة المستخدم، وبذلك تكون قد انتهيت.
// MediaSession setup with CastPlayer
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, castPlayer).build()
// MediaRouteButton in UI
@Composable fun UIWithMediaRouteButton() {
MediaRouteButton()
}
دمج CastPlayer الجديد في تطبيق العرض التوضيحي لجلسة Media3
تشغيل فيديوهات AV1 بشكل متّسق باستخدام الإضافة المعاد كتابتها استنادًا إلى dav1d
يحتوي الإصدار 1.9.0 على وحدة إضافة AV1 مُعاد كتابتها بالكامل استنادًا إلى مكتبة dav1d الشائعة.
كما هو الحال مع جميع وحدات فك ترميز الإضافات، يُرجى العِلم أنّها تتطلّب إنشاءها من المصدر لتجميع الرمز البرمجي الأصلي ذي الصلة بشكلٍ صحيح. يوفّر تجميع أداة فك الترميز الاتساق وإمكانية استخدام التنسيق على جميع الأجهزة، ولكن بما أنّها تنفّذ فك الترميز في عمليتك، فإنّها الأنسب للمحتوى الذي تثق به.
دمج التخزين المؤقت وإدارة الذاكرة في PreloadManager
لقد حسّنّا PreloadManager أيضًا. وقد أتاحت لك هذه الميزة سابقًا تحميل الوسائط مسبقًا في الذاكرة خارج نطاق التشغيل ثم تسليمها بسلاسة إلى مشغّل عند الحاجة. على الرغم من أنّها كانت فعّالة إلى حدّ كبير، كان عليك توخّي الحذر لعدم تجاوز حدود الذاكرة عن طريق التحميل المُسبَق لكمية كبيرة جدًا من البيانات عن طريق الخطأ. لذلك، أضفنا في الإصدار 1.9.0 من Media3 ميزتَين تسهّلان هذه العملية وتجعلانها أكثر استقرارًا:
-
إتاحة التخزين المؤقت – عند تحديد مدى التحميل المُسبَق، يمكنك الآن اختيار
PreloadStatus.specifiedRangeCached(0, 5000)كحالة مستهدَفة للعناصر التي تم تحميلها مُسبَقًا. سيؤدي ذلك إلى إضافة النطاق المحدّد إلى ذاكرة التخزين المؤقت على القرص بدلاً من تحميل البيانات إلى الذاكرة. باستخدام هذه الطريقة، يمكنك توفير مجموعة أكبر بكثير من العناصر للتحميل المُسبَق، لأنّ العناصر الأبعد عن العنصر الحالي لم تعُد بحاجة إلى شغل الذاكرة. يُرجى العِلم أنّ هذا الإجراء يتطلّب ضبطCacheفيDefaultPreloadManager.Builder. -
إدارة الذاكرة التلقائية – عدّلنا أيضًا واجهة
LoadControlللتعامل بشكل أفضل مع حالة التحميل المُسبَق، وبات بإمكانك الآن ضبط حد أقصى صريح للذاكرة لجميع العناصر التي تم تحميلها مُسبَقًا في الذاكرة. يبلغ حجمها 144 ميغابايت تلقائيًا، ويمكنك ضبط الحدّ الأقصى فيDefaultLoadControl.Builder. سيتوقّفDefaultPreloadManagerتلقائيًا عن التحميل المُسبَق عند بلوغ الحدّ الأقصى، وسيحرّر تلقائيًا ذاكرة العناصر ذات الأولوية المنخفضة إذا لزم الأمر.
الاستفادة من السلوكيات التلقائية الجديدة والمبسَّطة في ExoPlayer
وكالعادة، أضفنا أيضًا العديد من التحسينات التدريجية إلى ExoPlayer. إليك بعض الأمثلة:
-
كتم الصوت وإلغاء كتمه: كانت لدينا طريقة
setVolume، ولكن أضفنا الآن الطريقتَينmuteوunmuteلتسهيل استعادة مستوى الصوت السابق بدون الحاجة إلى تتبُّعه بنفسك. -
رصد تعذُّر تشغيل المحتوى: في بعض الحالات النادرة، قد يتعذّر على المشغّل تشغيل المحتوى أو تخزينه مؤقتًا بدون إحراز أي تقدّم، على سبيل المثال، بسبب مشاكل في الترميز أو إعدادات غير صحيحة. سيشعر المستخدمون بالانزعاج، ولكن لن تظهر لك هذه المشاكل في إحصاءاتك. لجعل ذلك أكثر وضوحًا، يعرض المشغّل الآن
StuckPlayerExceptionعند رصد حالة تعذُّر التحميل. - تفعيل قفل التنشيط تلقائيًا: كانت إدارة قفل التنشيط تتطلّب الموافقة سابقًا، ما أدّى إلى صعوبة العثور على حالات استخدام نادرة يمكن فيها تأخير مستوى تقدّم التشغيل بشكل كبير عند تشغيل التطبيق في الخلفية. أصبحت هذه الميزة اختيارية، لذا لا داعي للقلق بشأنها ويمكنك أيضًا إزالة كل عمليات معالجة قفل التنشيط اليدوي أثناء التشغيل.
-
إعداد مبسط لمنطق زر الترجمة والشرح – كان من الصعب جدًا تغيير
TrackSelectionParametersليصبح "تفعيل الترجمة والشرح أو إيقافهما"، لذا أضفنا خيارًا بسيطًا من النوع المنطقيselectTextByDefaultلحالة الاستخدام هذه.
تبسيط إعدادات أزرار الوسائط المفضّلة في MediaSession
حتى الآن، كان تحديد إعداداتك المفضّلة بشأن الأزرار التي يجب أن تظهر في لوحة الإشعارات الخاصة بالوسائط على Android Auto أو WearOS يتطلّب تحديد الأوامر والأزرار المخصّصة، حتى إذا كنت تريد ببساطة تشغيل طريقة عرض مشغّل عادية.
يتضمّن الإصدار 1.9.0 من Media3 وظيفة جديدة لتسهيل ذلك كثيرًا، إذ يمكنك الآن تحديد إعداداتك المفضّلة لأزرار الوسائط باستخدام أمر مشغّل عادي، بدون الحاجة إلى معالجة الأوامر المخصّصة على الإطلاق.
session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action
.build()
))
خيارات زر الوسائط مع زر التقديم السريع
CompositionPlayer للمعاينة في الوقت الفعلي
يتضمّن الإصدار 1.9.0 فئة CompositionPlayer ضمن التعليق التوضيحي الجديد @ExperimentalApi. يشير التصنيف إلى أنّ الميزة متاحة للتجربة، ولكنّها لا تزال قيد التطوير.
CompositionPlayer هو مكوّن جديد في واجهات برمجة التطبيقات الخاصة بتعديل الوسائط في Media3، وهو مصمّم لمعاينة تعديلات الوسائط في الوقت الفعلي. استنادًا إلى واجهة Media3 Player المألوفة، تتيح CompositionPlayer للمستخدمين الاطّلاع على التغييرات أثناء تنفيذها قبل بدء عملية التصدير. يستخدم هذا الإجراء كائن Composition نفسه الذي ستمرّره إلى Transformer للتصدير، ما يؤدي إلى تبسيط سير عمل التعديل من خلال توحيد نموذج البيانات لكلّ من المعاينة والتصدير.
ننصحك بالبدء في استخدام CompositionPlayer ومشاركة ملاحظاتك، ومتابعة المشاركات والتحديثات القادمة على المستندات للحصول على مزيد من التفاصيل.
InAppMuxer كمجمّع تلقائي في Transformer
يستخدم Transformer الآن InAppMp4Muxer كأداة دمج تلقائية لكتابة ملفات حاوية الوسائط. داخليًا، تعتمد InAppMp4Muxer على وحدة Muxer في Media3، ما يوفّر سلوكًا متسقًا في جميع إصدارات واجهة برمجة التطبيقات.
يُرجى العِلم أنّه على الرغم من أنّ Transformer لم يعُد يستخدم MediaMuxer التابع لمنصة Android تلقائيًا، سيظل بإمكانك توفير FrameworkMuxer.Factory من خلال setMuxerFactory إذا كانت حالة الاستخدام تتطلّب ذلك.
واجهات برمجة التطبيقات الجديدة لتعديل السرعة
يسهّل الإصدار 1.9.0 استخدام واجهات برمجة التطبيقات الخاصة بتعديل السرعة عند تعديل الوسائط. لقد أتحنا طرقًا جديدة مباشرةً على EditedMediaItem.Builder للتحكّم في السرعة، ما يجعل واجهة برمجة التطبيقات أكثر سهولة في الاستخدام. يمكنك الآن تغيير سرعة مقطع من خلال استدعاء setSpeed(SpeedProvider provider) على EditedMediaItem.Builder:
val speedProvider = object : SpeedProvider {
override fun getSpeed(presentationTimeUs: Long): Float {
return speed
}
override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
return C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()
يحلّ هذا الأسلوب الجديد محلّ الطريقة السابقة التي كانت تستخدم Effects#createExperimentalSpeedChangingEffects()، والتي أوقفنا العمل بها وستتم إزالتها في إصدار مستقبلي.
تقديم أنواع المسارات لـ EditedMediaItemSequence
في الإصدار 1.9.0، يتطلّب EditedMediaItemSequence تحديد أنواع المقاطع الصوتية المطلوبة أثناء إنشاء التسلسل. يضمن هذا التغيير أن تكون معالجة المقاطع الصوتية أكثر وضوحًا وقوة في جميع "المقطوعة الموسيقية".
يتم ذلك من خلال دالة إنشاء EditedMediaItemSequence.Builder جديدة تقبل مجموعة من أنواع المسارات (مثل C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO).
لتبسيط عملية الإنشاء، أضفنا طرقًا ثابتة جديدة لتسهيل الاستخدام:
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
ننصحك بنقل البيانات إلى أداة الإنشاء الجديدة أو طرق الملاءمة للحصول على تعريفات تسلسل أكثر وضوحًا وموثوقية.
مثال على إنشاء تسلسل إعلانات فيديو فقط:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()
يُرجى التواصل معنا من خلال أداة تتبُّع المشاكل في Media3 إذا واجهت أي أخطاء أو إذا كانت لديك أسئلة أو طلبات ميزات. نتطلّع إلى تلقّي ردّك.
متابعة القراءة
-
أخبار المنتجات
أصبح الإصدار 4 من استوديو Android Panda ثابتًا وجاهزًا للاستخدام في الإنتاج. يتضمّن هذا الإصدار "وضع التخطيط" و"توقّع التعديل التالي" والمزيد، ما يسهّل إنشاء تطبيقات Android عالية الجودة أكثر من أي وقت مضى.
Matt Dyor • مدة القراءة: 5 دقائق
-
أخبار المنتجات
إذا كنت من مطوّري تطبيقات Android وتتطلّع إلى دمج ميزات مبتكرة تستند إلى الذكاء الاصطناعي في تطبيقك، أطلقنا مؤخرًا تحديثات جديدة وفعّالة.
Thomas Ezan • قراءة لمدة 3 دقائق
-
أخبار المنتجات
وصل الإصدار التجريبي 4 من نظام التشغيل Android 17، وهو آخر إصدار تجريبي مُجدوَل من دورة الإصدار هذه، ويمثّل إنجازًا مهمًا لتحقيق توافق التطبيقات وثبات النظام الأساسي.
Daniel Galpin • مدة القراءة: 4 دقائق
البقاء على اطّلاع على آخر التحديثات
يمكنك تلقّي أحدث الإحصاءات حول تطوير تطبيقات Android في بريدك الوارد أسبوعيًا.