طرق التنفيذ

‫Media3 1.11 - ما الجديد؟

يستغرق الاطِّلاع على المقال 3 دقائق
عرض الملف الشخصي لـ "توني هايدنرايش"
Toni Heidenreich مهندس برمجيات، Android

تم إصدار Media3 1.11. يوفّر هذا الإصدار ميزات جديدة وإصلاحات للأخطاء وتحسينات في التشغيل والتعديل ومكوّنات واجهة المستخدم، وهو يتيح تشغيل معظم تطبيقات الوسائط الرائجة على Android. نعمل على توسيع نطاق وحدات واجهة المستخدم في Jetpack Compose لتشمل Player مساحات إعلانية قابلة للتخصيص وإعدادات تلقائية سهلة الاستخدام وإيماءات تفاعلية ومراقبة الحالة والتحميل المُسبَق للفيديوهات القصيرة باستخدام PlayerPool. عدّلنا أيضًا عملية دمج Media3 Cast مع إتاحة "مبدّل الإخراج" في SystemUI، وقدّمنا إضافة شبكة جديدة لبرنامج Ktor HTTP، وأضفنا أدوات جديدة لدمج ملفات Ogg وWAV.

يمكنك الاطّلاع على أهم النقاط أدناه، كما يمكنك مراجعة ملاحظات الإصدار الكاملة للاطّلاع على قائمة شاملة بالتغييرات.

واجهة مستخدم التشغيل وCompose

مع إعطاء الأولوية لاستخدام Compose في Android، نواصل توسيع نطاق وحدتَي media3-ui-compose وmedia3-ui-compose-material3. يتيح لك هذا التحديث التحكّم بشكلٍ أدق في تخطيط المشغّل، كما يوفّر أنماط تفاعل أكثر ثراءً وتكاملاً أعمق مع Material3.

تنسيق مشغّل قابل للتخصيص

يتوافق العنصر القابل للإنشاء "مشغّل Material 3" الآن مع خانات المحتوى المخصّصة topControls وcenterControls وbottomControls وerrorOverlay. يمكنك إضافة عناصر Composables الخاصة بك أو استخدام الإعدادات التلقائية الجاهزة المنشورة في PlayerDefaults:

Player(
  player = player,
  topControls = { PlayerDefaults.TopControls(player) },
  centerControls = { PlayerDefaults.CenterControls(player) },
  bottomControls = { PlayerDefaults.BottomControls(player) },
)

تتضمّن Player Composable أيضًا FocusRequester، ما يتيح التنقّل بسلاسة باستخدام لوحة التحكّم ولوحة المفاتيح على أجهزة Android TV والأجهزة القابلة للطي وبيئات سطح المكتب. 

player_video.png
مثال على مشغّل Composable Player مع عناصر تحكّم مخصّصة

الإيماءات والتحكّم في سرعة التشغيل

توفّر PlaybackSpeedState الآن واجهة برمجة تطبيقات للتقديم السريع/التصوير البطيء. تعرض demo-compose app ذلك من خلال الإيماءة بالضغط مع الاستمرار لتقديم التشغيل سريعًا والبحث من خلال النقر مرّتين. بالإضافة إلى ProgressSlider الذي تم تقديمه في الإصدار 1.10، توفّر واجهة مستخدم مشغّل Compose الآن تفاعلات غنية باللمس والإيماءات بدون الحاجة إلى أي إعدادات إضافية.

التحميل المُسبَق للفيديوهات القصيرة باستخدام PlayerPool

بالنسبة إلى التطبيقات التي تتضمّن خلاصات وسائط بنظام النافذة المنزلقة (مثل الفيديوهات القصيرة في الوضع العمودي)، تشكّل إدارة عدة مثيلات من ExoPlayer بكفاءة تحديًا شائعًا. تتضمّن Media3 1.11 PlayerPool (في common-ktx) وrememberPooledPlayer (في ui-compose) للتعامل مع إعادة استخدام المشغّل والتحميل المُسبَق تلقائيًا.

تعرض ShortFormPlayerScreen الجديدة في demo-compose هذا الإجراء، وهي خلاصة تتضمّن صفحات عمودية يتم فيها تجميع المشغّلات وتحميلها مسبقًا وإعادة استخدامها بسلاسة أثناء تنقّل المستخدم.

MiniController

يتوفّر عنصر MiniController Composable جديد في media3-ui-compose-material3 يقدّم شريط تشغيل مضغوطًا يعرض عنوان العنصر الحالي والفنان وصورة الألبوم ومستوى التقدّم إلى جانب عناصر التحكّم في التشغيل/الإيقاف المؤقت. كما هو الحال مع جميع عناصر Composables التلقائية في media3-ui-compose-material3، يتيح MiniController إمكانية دمج ميزة "الألوان الديناميكية" في Material3، ما يسمح بتكييفها تلقائيًا مع خلفية شاشة المستخدم.ويُعدّ ذلك مثاليًا لتوفير عناصر دائمة في أسفل الشاشة أو عناصر مشغّل صغير، مثلاً أثناء تصفّح المستخدم للمحتوى أو خلال جلسات Cast النشطة.

mini_player.png
عرض "وحدة التحكّم المصغّرة" في Media3 لغلاف الألبوم والبيانات الوصفية للوسائط وعناصر التحكّم الأساسية

حقول حالة موسّعة للبيانات الوصفية والأخطاء

أضفنا العديد من عناصر التحكّم الجديدة في الحالة التفاعلية إلى media3-ui-compose:

  • rememberCurrentMediaItemState: مراقبة البيانات الوصفية للعنصر الذي يتم تشغيله حاليًا
  • rememberPlaylistState: مراقبة قائمة التشغيل الكاملة والفهارس النشطة
  • rememberErrorState: لتتبُّع أخطاء التشغيل، مع عنصر ErrorText Composable مطابق وErrorOverlay تلقائي في Material3

سنواصل العمل على إضافة ميزات جديدة والمزيد من خيارات التخصيص في الإصدارات القادمة. يُرجى مشاركة رأيك حول أداة تتبُّع مشاكل المشاريع.

تحديث عملية الدمج مع Cast

يضيف الإصدار 1.11 من Media3 إلى إضافة Cast خيارات إعداد آلي وإمكانية توجيه المحتوى على مستوى نظام التشغيل.

‫CastParams وأداة التبديل بين أجهزة التشغيل في SystemUI

يمكنك الآن ضبط إضافة Cast باستخدام CastParams:

val castParams = CastParams.Builder()
  .setShowSystemOutputSwitcherOnCastButtonClick(true)
  .build()


Cast.getSingletonInstance(context).initialize(castParams)

يؤدي ضبط setShowSystemOutputSwitcherOnCastIconClick(true) إلى إعداد MediaRouteButton لفتح أداة اختيار الإخراج SystemUI الأصلية في Android على إصدارات النظام الأساسي المتوافقة، ما يوفّر تجربة موحّدة لاختيار الإخراج.

حالة Reactive MediaRouteButton في Compose

يمكن للتطبيقات التي تستخدم Jetpack Compose الآن إضافة زر "توجيه الوسائط" (المعروف أيضًا باسم زر "البث") بسهولة، والذي يتتبّع تلقائيًا حالة مربّع الحوار ويعدِّلها وفقًا لذلك. لا حاجة إلى منطق إضافي عند استخدامها مع CastPlayer في Media3.

@Composable
fun TopAppBarWithCast() {
  Row {
    Text(text = "App Title")
    MediaRouteButton()
  }
}
cast_button_2.png
زر مسار الوسائط Media3 في تطبيق يفتح مربّع الحوار التلقائي لأداة التبديل بين أجهزة التشغيل

تحسينات على التشغيل الأساسي والجلسات

Eclipsa Video - HAGC dynamic HDR metadata (API 37+)

تعدك Eclipsa Video بتجربة HDR أكثر اتساقًا على جميع الأجهزة، مع توفير مستوى أساسي ثابت من اللون الأبيض في HDR، ومساحة رأسية قابلة للتكيّف حسب الشاشة والمحيط، ما يضمن الحفاظ على الهدف الإبداعي على جميع الأجهزة.

يتيح ExoPlayer الآن تشغيل البيانات الوصفية الموقّتة اللازمة لمعيار HAGC (ST 2094-50) للوسائط التقدّمية (MP4 وMatroska). يدمج المشغّل تلقائيًا مسارات البيانات الوصفية لـ HAGC مع مسار الفيديو المرتبط بها، وينقل البيانات الوصفية خارج النطاق إلى برنامج الترميز على الأجهزة التي تعمل بالإصدار 37 من واجهة برمجة التطبيقات أو الإصدارات الأحدث. على الأجهزة القديمة، يعود ExoPlayer تلقائيًا إلى توفير تجربة تشغيل عادية باستخدام النطاق العالي الديناميكية بدون إجراء التعديلات.  

eclipsa.png
صورة توضيحية تعرض مزايا تقنية HDR في فيديوهات Eclipsa، مثل تباين الألوان الأكثر اتساقًا

إضافة جديدة لبرنامج Ktor HTTP

يوفر وحدة إضافة media3-datasource-ktor جديدة KtorDataSource، وهي تستند إلى حزمة Ktor لبروتوكول HTTP. يوفّر هذا الخيار بديلاً متوافقًا مع لغة Kotlin وroutines لوحدتَي المصدر الحاليَّتَين لبيانات Cronet وOkHttp.

عمليات الربط غير المتزامنة في MediaSession

يتضمّن الإصدار MediaSession.Callback الآن onConnectAsync()، ما يتيح لك معالجة محاولات ربط وحدة التحكّم بشكل غير متزامن، وذلك مثلاً للتحقّق من إذن الوصول قبل قبول عملية الربط. يمكنك عرض Future مع Futures.immediateFuture(ConnectionResult) للحصول على السلوك نفسه الذي يوفّره onConnect الحالي. 

override fun onConnectAsync(
  session: MediaSession,
  controller: MediaSession.ControllerInfo
): ListenableFuture<MediaSession.ConnectionResult> {
  return authenticateControllerAsync(controller)
}

إعدادات تلقائية أكثر أمانًا في MediaSession

بالنسبة إلى التطبيقات التي لا تتجاهل onConnect أو onConnectAsync في MediaSession.Callback، يتم الآن ضبط المكتبة تلقائيًا على إعدادات أكثر أمانًا. على وجه التحديد، لم يعُد يتم تلقائيًا مشاركة بيانات الجلسة مع وحدات التحكّم غير الموثوق بها، ما يعني أنّه يتم حظر التطبيقات التابعة لجهات خارجية أو التطبيقات غير التابعة للنظام التي لا يمكنها الوصول إلى الإشعارات من الوصول إلى بيانات الجلسة ما لم تنفِّذ بشكل صريح طرق معاودة الاتصال هذه لتفويض عملية الربط.

عمليات تنفيذ جديدة لبرنامج Muxer وتحليل الحاويات

OggMuxer وWavMuxer

أضفنا برنامجَي دمج جديدَين مخصّصَين: OggMuxer لدمج OPUS وVORBIS في ملفات ‎ .ogg عادية، وWavMuxer لإنشاء ملفات صوتية .wav PCM غير مضغوطة وذات فاصلة عائمة.

تحليل الحاويات وتتبُّع المراجع

  • مراجع المقاطع الصوتية بتنسيق MP4 (tref): يتيح Mp4Muxer.addTrackReference ربط البيانات الوصفية التابعة أو المقاطع الصوتية المساعدة بتيارات الفيديو الأساسية.
  • استخراج الفصول: يتم الآن استخراج فصول QuickTime وNero من ملفات MP4 (.m4a، .m4b) وفصول Matroska كإدخالات بيانات وصفية Chapter لتسهيل التنقّل في الكتب المسموعة وبرامج البودكاست.

يُرجى استخدام أداة تتبُّع المشاكل للإبلاغ عن أي أخطاء، أو إذا كانت لديك أسئلة أو طلبات ميزات. نتطلّع إلى تلقّي ردّ منك.

متابعة القراءة