أصبح الإصدار 1.9.0 من Media3 متاحًا. بالإضافة إلى إصلاحات الأخطاء المعتادة والتحسينات في الأداء، يحتوي أحدث إصدار أيضًا على أربع وحدات جديدة أو معاد كتابتها إلى حد كبير:
media3-inspector- استخراج البيانات الوصفية والإطارات خارج التشغيلmedia3-ui-compose-material3- إنشاء واجهة مستخدم أساسية للوسائط في Compose مستندة إلى Material3 في بضع خطوات فقطmedia3-cast- التعامل تلقائيًا مع عمليات الانتقال بين عمليات التشغيل على 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()
}
}إنشاء واجهة مستخدم أساسية للوسائط في Compose مستندة إلى Material3 في بضع خطوات فقط
في الإصدارات السابقة، بدأنا في توفير رمز موصِّل بين عناصر واجهة مستخدم Compose ومثيل المشغّل. في الإصدار 1.9.0 من Media3، أضفنا وحدة جديدة هي media3-ui-compose-material3 تتضمّن أزرارًا وعناصر محتوى منسّقة بالكامل مستندة إلى Material3. تتيح لك هذه الوحدة إنشاء واجهة مستخدم للوسائط في بضع خطوات فقط، مع توفير كل المرونة لتخصيص النمط. إذا كنت تفضّل إنشاء نمط واجهة المستخدم الخاص بك، يمكنك استخدام اللبنات الأساسية التي تتولى جميع منطق التحديث والربط، لذا ما عليك سوى التركيز على تصميم عنصر في واجهة المستخدم. يُرجى الاطّلاع على صفحات الدليل الموسّعة الموسّعة لوحدات واجهة مستخدم Compose.
ما زلنا نعمل أيضًا على المزيد من مكوّنات 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 تتضمّن عناصر جاهزة للاستخدام
التعامل تلقائيًا مع عمليات الانتقال بين عمليات التشغيل على Cast وعمليات التشغيل المحلية
تمت إعادة كتابة 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لاستعادة مستوى الصوت السابق بسهولة بدون تتبُّعه بنفسك. - رصد المشغّل المتوقف : في بعض الحالات النادرة، يمكن أن يتوقف المشغّل في حالة التخزين المؤقت أو التشغيل بدون إحراز أي تقدّم، على سبيل المثال، بسبب مشاكل في برامج الترميز أو الإعدادات غير الصحيحة. سيشعر المستخدمون بالانزعاج، ولكن لن تظهر لك هذه المشاكل في "إحصاءات Google". لتوضيح ذلك بشكل أكبر، يعرض المشغّل الآن
StuckPlayerExceptionعند رصد حالة توقف. - قفل التنشيط تلقائيًا : كان عليك سابقًا تفعيل ميزة "قفل التنشيط"، ما يؤدي إلى صعوبة العثور على الحالات القصوى التي يمكن أن يتأخر فيها تقدّم التشغيل كثيرًا عند التشغيل في الخلفية. أصبحت هذه الميزة الآن غير مفعّلة تلقائيًا، لذا لن تقلق بشأنها ويمكنك أيضًا إزالة جميع عمليات معالجة ميزة "قفل التنشيط" اليدوية حول التشغيل.
- إعداد مبسّط لمنطق زر الترجمة والشرح : كان من الصعب بشكل مفاجئ ضبط
TrackSelectionParametersعلى "تفعيل الترجمة والشرح أو إيقافهما"، لذا أضفنا خيارًا بسيطًا من نوع boolean هو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 تحديد أنواع مسارات الإخراج المطلوبة أثناء إنشاء التسلسل. يضمن هذا التغيير أن تكون معالجة المسارات أكثر وضوحًا وقوة في جميع أنحاء Composition.
يتم ذلك من خلال أداة إنشاء 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 إذا واجهت أي أخطاء أو إذا كانت لديك أسئلة أو طلبات ميزات. يسرّنا سماع رأيك.
-
16/07/202616/07/2026
أخبار المنتجاتأصبح الإصدار 2 من "استوديو Android Quail" مستقرًا الآن وجاهزًا للاستخدام في الإنتاج، ما يؤدي إلى تغيير في بيئة التطوير المتكاملة (IDE) من خلال سير العمل المستند إلى الوكيل المتزامن، وإمكانية إنشاء ملفات تعريف تسرّب الذاكرة المدمجة بشكل أساسي، وإصلاح الأعطال المستند إلى السياق.
Amman Asfaw • مدّة القراءة: 3 دقائق -
أخبار المنتجاتفي شهر مارس، قدّمنا Android Bench، وهو لوحة صدارة النماذج اللغوية الكبيرة (LLM) لمهام تطوير تطبيقات Android في العالم الحقيقي. ومنذ ذلك الحين، حسّنّا المقياس استنادًا إلى ملاحظاتك، بما في ذلك تقييم النماذج المفتوحة المصدر وإضافة بُعدَي التكلفة والكفاءة إلى لوحة الصدارة.
Zoe Lopez-Latorre • مدّة القراءة: 3 دقائق -
أخبار المنتجاتنحن ملتزمون في Google Play بتقديم أفضل تجربة ممكنة للمستخدمين، مع ضمان توفّر الأدوات والإمكانات اللازمة لنجاح شركائنا.
Paul Feng • مدّة القراءة: 3 دقائق
يمكنك تلقّي أحدث المعلومات عن تطوير تطبيقات Android أسبوعيًا في بريدك الوارد.