أضفنا أيضًا تحسينات على التخزين المؤقت وإدارة الذاكرة مدير التحميل المسبق، وقدمت العديد من الجديد ExoPlayer, محول و MediaSession التبسيط.
يمنحك هذا الإصدار أيضًا أول وصول تجريبي إلى مشغل التكوين لمعاينة تعديلات الوسائط.
تابع القراءة لمعرفة المزيد، وكما هو الحال دائمًا، يرجى الاطلاع على النص الكامل ملاحظات الإصدار للحصول على نظرة شاملة للتغييرات في هذا الإصدار.
استخراج البيانات الوصفية والإطارات خارج التشغيل
هناك العديد من الحالات التي تريد فيها فحص الوسائط دون بدء التشغيل. على سبيل المثال، قد ترغب في اكتشاف التنسيقات التي يحتوي عليها أو ما هي مدتها، أو استرداد الصور المصغرة.
الجديد media3-inspector تجمع الوحدة جميع الأدوات المساعدة لفحص الوسائط دون تشغيلها في مكان واحد:
-
مسترد البيانات الوصفية لقراءة المدة والتنسيق والبيانات الوصفية الثابتة من ملف MediaItem.
-
مستخرج الإطار للحصول على إطارات أو صور مصغرة من أحد العناصر.
-
MediaExtractorCompat كبديل مباشر لمنصة أندرويد مستخرج الوسائط class، للحصول على معلومات مفصلة حول العينات الموجودة في الملف.
suspend fun extractThumbnail(mediaItem: MediaItem) { FrameExtractor.Builder(context, mediaItem).build().use { val thumbnail = frameExtractor.getThumbnail().await() } }
قم ببناء واجهة مستخدم أساسية لـ Material3 Compose Media في بضع خطوات فقط
في الإصدارات السابقة، بدأنا في توفير رمز الرابط بين عناصر Compose UI ومثيل Player الخاص بك. مع Media3 1.9.0، أضفنا وحدة جديدة media3-ui-compose-material3 مع أزرار Material3 وعناصر المحتوى المصممة بالكامل. فهي تتيح لك إنشاء واجهة مستخدم للوسائط في بضع خطوات فقط، مع توفير كل المرونة لتخصيص النمط. إذا كنت تفضل إنشاء نمط واجهة المستخدم الخاص بك، فيمكنك استخدام الكتل البرمجية الإنشائية التي تعتني بكل منطق التحديث والاتصال، لذلك تحتاج فقط إلى التركيز على تصميم عنصر واجهة المستخدم. يرجى مراجعة لدينا صفحات الدليل الموسعة لوحدات إنشاء واجهة المستخدم.
نحن أيضًا لا نزال نعمل على المزيد من مكونات Compose، مثل شريط البحث الذي تم إنشاؤه مسبقًا، وهو بديل كامل جاهز لـ Compose عرض المشغل، بالإضافة إلى الترجمة وتكامل الإعلانات.
@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) } } }
إنشاء واجهة مستخدم بسيطة للمشغل مع عناصر جاهزة
التعامل تلقائيًا مع التحولات بين عمليات الإرسال وعمليات التشغيل المحلية
برنامج 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, player) // MediaRouteButton in UI @Composable fun UIWithMediaRouteButton() { MediaRouteButton() }
تكامل CastPlayer الجديد في التطبيق التجريبي لجلسة Media3
تشغيل AV1 متسق مع الامتداد المعاد كتابته استنادًا إلى dav1d
يحتوي الإصدار 1.9.0 على وحدة امتداد AV1 مُعاد كتابتها بالكامل استنادًا إلى وحدة امتداد AV1 الشائعة dav1d مكتبة.
كما هو الحال مع جميع وحدات فك ترميز الامتداد، يرجى ملاحظة أن ذلك يتطلب البناء من المصدر لتجميع الكود الأصلي ذي الصلة بشكل صحيح. يوفر تجميع وحدة فك الترميز دعمًا للتنسيق والاتساق عبر جميع الأجهزة، ولكن نظرًا لأنه يقوم بتشغيل فك التشفير في العملية الخاصة بك، فهو مناسب بشكل أفضل للمحتوى الذي يمكنك الوثوق به.
دمج التخزين المؤقت وإدارة الذاكرة في PreloadManager
لقد صنعنا لدينا مدير التحميل المسبق أفضل أيضًا. لقد مكّنك بالفعل من تحميل الوسائط مسبقًا في الذاكرة خارج التشغيل ثم تسليمها بسهولة إلى المشغل عند الحاجة. على الرغم من الأداء الرائع، إلا أنه لا يزال يتعين عليك توخي الحذر حتى لا تتجاوز حدود الذاكرة عن طريق التحميل المسبق عن طريق الخطأ أكثر من اللازم. لذلك، مع Media3 1.9.0، أضفنا ميزتين تجعلان هذا الأمر أسهل بكثير وأكثر استقرارًا:
-
دعم التخزين المؤقت – عند تحديد مدى التحميل المسبق، يمكنك الآن الاختيار PreloadStatus.specifiedRangeCached(0, 5000) كحالة مستهدفة للعناصر المحملة مسبقًا. سيؤدي هذا إلى إضافة النطاق المحدد إلى ذاكرة التخزين المؤقت الموجودة على القرص بدلاً من تحميل البيانات إلى الذاكرة. باستخدام هذا، يمكنك توفير نطاق أكبر بكثير من العناصر للتحميل المسبق حيث أن العناصر البعيدة عن العنصر الحالي لم تعد بحاجة إلى شغل الذاكرة. لاحظ أن هذا يتطلب إعداد مخبأ في DefaultPreloadManager.Builder.
-
إدارة الذاكرة التلقائية – لقد قمنا أيضًا بتحديث موقعنا التحكم في التحميل واجهة للتعامل بشكل أفضل مع حالة التحميل المسبق حتى تتمكن الآن من تعيين حد واضح للذاكرة العليا لجميع العناصر المحملة مسبقًا في الذاكرة. يبلغ حجمه 144 ميجابايت افتراضيًا، ويمكنك ضبط الحد فيه DefaultLoadControl.Builder. ال DefaultPreloadManager سيتوقف التحميل المسبق تلقائيًا بمجرد الوصول إلى الحد الأقصى، ويحرر تلقائيًا ذاكرة العناصر ذات الأولوية الأقل إذا لزم الأمر.
اعتمد على السلوكيات الافتراضية المبسطة الجديدة في ExoPlayer
كما هو الحال دائمًا، أضفنا الكثير من التحسينات الإضافية إلى ExoPlayer أيضًا. على سبيل المثال لا الحصر:
-
كتم الصوت وإلغاء كتم الصوت – لقد كان لدينا بالفعل setVolume الطريقة، ولكن تمت إضافة الراحة الآن صامت و إلغاء كتم الصوت طرق لاستعادة المجلد السابق بسهولة دون تتبعه بنفسك.
-
اكتشاف اللاعب العالق – في بعض الحالات النادرة، قد يعلق اللاعب في حالة التخزين المؤقت أو التشغيل دون إحراز أي تقدم، على سبيل المثال، بسبب مشكلات في برنامج الترميز أو التكوينات الخاطئة. سوف ينزعج المستخدمون، لكنك لن ترى هذه المشكلات أبدًا في تحليلاتك! ولجعل هذا الأمر أكثر وضوحًا، يقوم اللاعب الآن بالإبلاغ عن أ StuckPlayerException عندما يكتشف حالة عالقة.
-
Wakelock بشكل افتراضي – تم تمكين إدارة قفل التنشيط سابقًا، مما أدى إلى صعوبة العثور على حالات الحافة حيث يمكن أن يتأخر تقدم التشغيل كثيرًا عند التشغيل في الخلفية. تم الآن إلغاء الاشتراك في هذه الميزة، لذلك لا داعي للقلق بشأنها ويمكنك أيضًا إزالة جميع عمليات قفل التنشيط اليدوي أثناء التشغيل.
-
إعداد مبسط لمنطق زر CC – تغيير معلمات تحديد المسار كان من الصعب جدًا أن نقول “تشغيل/إيقاف الترجمة” بشكل صحيح، لذلك أضفنا قيمة منطقية بسيطة حددTextByDefault خيار لحالة الاستخدام هذه.
قم بتبسيط تفضيلات زر الوسائط الخاصة بك في MediaSession
حتى الآن، كان تحديد تفضيلاتك بشأن الأزرار التي يجب أن تظهر في درج إشعارات الوسائط على Android Auto أو WearOS يتطلب تحديد أوامر وأزرار مخصصة، حتى لو كنت تريد ببساطة تشغيل طريقة تشغيل قياسية.
يتمتع Media3 1.9.0 بوظائف جديدة لتسهيل الأمر كثيرًا – يمكنك ذلك الآن تحديد تفضيلات زر الوسائط الخاصة بك مع أمر لاعب قياسي، لا يتطلب أي معالجة مخصصة للأوامر على الإطلاق.
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 شرح. يشير التعليق التوضيحي إلى أنه متاح للتجربة، ولكنه لا يزال قيد التطوير.
مشغل التكوين هو مكون جديد في واجهات برمجة تطبيقات تحرير Media3 المصممة للمعاينة في الوقت الفعلي لتحريرات الوسائط. مبني على Media3 المألوف لاعب واجهة, مشغل التكوين يسمح للمستخدمين برؤية تغييراتهم أثناء التنفيذ قبل الالتزام بعملية التصدير. يستخدم نفس الشيء تعبير الكائن الذي سوف تنتقل إليه محول للتصدير وتبسيط سير عمل التحرير من خلال توحيد نموذج البيانات للمعاينة والتصدير.
نحن نشجعك على البدء في استخدام مشغل التكوين ومشاركة ملاحظاتك، وترقب المنشورات والتحديثات القادمة للوثائق لمزيد من التفاصيل.
InAppMuxer باعتباره muxer الافتراضي في Transformer
واجهات برمجة التطبيقات الجديدة لتعديل السرعة
يعمل الإصدار 1.9.0 على تبسيط واجهات برمجة التطبيقات الخاصة بتعديلات السرعة لتحرير الوسائط. لقد أدخلنا أساليب جديدة مباشرة على EditMediaItem.Builder للتحكم في السرعة، مما يجعل واجهة برمجة التطبيقات (API) أكثر سهولة. يمكنك الآن تغيير سرعة المقطع عن طريق الاتصال setSpeed(موفر SpeedProvider) على EditMediaItem.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()
يحل هذا النهج الجديد محل الطريقة السابقة للاستخدام التأثيرات# createExperimentalSpeedChangingEffects()، والتي قمنا بإهمالها وسنقوم بإزالتها في إصدار مستقبلي.
تقديم أنواع المسارات لـ EditedMediaItemSequence
ويتم ذلك عن طريق الجديد EditedMediaItemSequence.Builder المُنشئ الذي يقبل مجموعة من أنواع المسارات (على سبيل المثال، ج.TRACK_TYPE_AUDIO, ج.TRACK_TYPE_VIDEO).
لتبسيط عملية الإنشاء، أضفنا أساليب راحة ثابتة جديدة:
-
EditedMediaItemSequence.withAudioFrom(List
) -
EditedMediaItemSequence.withVideoFrom(قائمة
) -
EditedMediaItemSequence.withAudioAndVideoFrom(قائمة
)
نحن نشجعك على الانتقال إلى المنشئ الجديد أو الأساليب الملائمة للحصول على تعريفات تسلسل أكثر وضوحًا وموثوقية.
مثال لإنشاء تسلسل فيديو فقط:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()
—
يرجى التواصل عبر Media3 قضية المقتفي إذا واجهت أي أخطاء، أو إذا كانت لديك أسئلة أو طلبات ميزات. ونحن نتطلع الى الاستماع منك!

