الوسائط 3
مستندات مرجعية بلغة Java لنظام التشغيل AndroidX
مستندات مرجعية بلغة Kotlin في AndroidX
التعديل الأخير | الإصدار المستقر | سحب المرشح | الإصدار التجريبي | إصدار أولي |
---|---|---|---|---|
10 يوليو 2024 | 1.3.1 | 1.4.0-rc01 | 1.4.0-beta01 | 1.4.0-alpha02 |
إعلان التبعيات
لإضافة تبعية إلى Media3، يجب إضافة مستودع Google Maven إلى مشروعك. يمكنك الاطّلاع على مستودع Maven من Google للحصول على مزيد من المعلومات.
أضِف العناصر الاعتمادية الخاصة بالعناصر التي تحتاج إليها في ملف build.gradle
لتطبيقك أو وحدتك:
Groovy
dependencies { def media3_version = "1.4.0" // For media playback using ExoPlayer implementation "androidx.media3:media3-exoplayer:$media3_version" // For DASH playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-dash:$media3_version" // For HLS playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-hls:$media3_version" // For SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For integrating with Cast implementation "androidx.media3:media3-cast:$media3_version" // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version" // For transforming media files implementation "androidx.media3:media3-transformer:$media3_version" // For applying effects on video frames implementation "androidx.media3:media3-effect:$media3_version" // For muxing media files implementation "androidx.media3:media3-muxer:$media3_version" // Utilities for testing media components (including ExoPlayer components) implementation "androidx.media3:media3-test-utils:$media3_version" // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation "androidx.media3:media3-test-utils-robolectric:$media3_version" // Common functionality for reading and writing media containers implementation "androidx.media3:media3-container:$media3_version" // Common functionality for media database components implementation "androidx.media3:media3-database:$media3_version" // Common functionality for media decoders implementation "androidx.media3:media3-decoder:$media3_version" // Common functionality for loading data implementation "androidx.media3:media3-datasource:$media3_version" // Common functionality used across multiple media libraries implementation "androidx.media3:media3-common:$media3_version" }
Kotlin
dependencies { val media3_version = "1.4.0" // For media playback using ExoPlayer implementation("androidx.media3:media3-exoplayer:$media3_version") // For DASH playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-dash:$media3_version") // For HLS playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-hls:$media3_version") // For SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For integrating with Cast implementation("androidx.media3:media3-cast:$media3_version") // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version") // For transforming media files implementation("androidx.media3:media3-transformer:$media3_version") // For applying effects on video frames implementation("androidx.media3:media3-effect:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") }
لمزيد من المعلومات عن العناصر التابعة، يُرجى الاطّلاع على إضافة تبعيات الإصدار.
ملاحظات
تساعدنا ملاحظاتك في تحسين Jetpack. يمكنك استخدام أداة تتبُّع مشاكل Media3 للعثور على إجابات عن الأسئلة والمشاكل المعروفة وطلبات الميزات وكذلك للإبلاغ عن مشاكل جديدة.
الإصدار 1.4.0
الإصدار 1.4.0-rc01
10 يوليو 2024
تم طرح androidx.media3:media3-*:1.4.0-rc01
.
يحتوي الإصدار 1.4.0-rc01 على عمليات التنفيذ هذه.
- المكتبة المشتركة:
- أضِف
Format.customData
إلى تخزين المعلومات المخصّصة التي يوفّرها التطبيق حولFormat
مثيل.
- أضِف
- ExoPlayer:
- إصلاح بعض حالات عدم اتساق التركيز الصوتي، مثل عدم الإبلاغ عن فقدان التركيز الكامل أو العابر عندما يكون المشغّل متوقفًا مؤقتًا (#1436).
- يمكنك إصلاح
IndexOutOfBoundsException
المحتمَلة الناتجة عن أدوات استخراج البيانات التي تسجّل مسارات إضافية بعد خطوة التحضير الأولية (#1476). - سيحصل
Effects
فيExoPlayer.setVideoEffect()
على الطوابع الزمنية مع إزالة إزاحة العارض (#1098). - إصلاح
IllegalArgumentException
المحتمل عند التعامل مع خطأ المشغّل الذي حدث أثناء القراءة في عنصر قائمة تشغيل آخر (#1483).
- النص:
- يجب حلّ المشكلة "
IllegalArgumentException
" منLegacySubtitleUtil
عندما لا يحتوي نموذج الترجمة في WebVTT على أي إشارات، مثلاً كجزء من بث DASH (#1516).
- يجب حلّ المشكلة "
- الجلسة:
- يسمح بتعيين نشاط الجلسة لكل وحدة تحكم لإلغاء نشاط الجلسة العامة. يمكن تحديد نشاط الجلسة لوحدة التحكم في وقت الاتصال من خلال إنشاء
ConnectionResult
باستخدامAcceptedResultBuilder.setSessionActivivty(PendingIntent)
. بعد الربط، يمكن تعديل نشاط الجلسة باستخدامMediaSession.setSessionActivity(ControllerInfo, PendingIntent)
. - تحسين تكرار أخطاء المكالمات إلى
MediaLibrarySession.Callback
. يمكن الآن ضبط النسخ المتماثل للخطأ باستخدامMediaLibrarySession.Builder.setLibraryErrorReplicationMode()
لاختيار نوع الخطأ أو لإيقاف النسخ المتماثل للخطأ الذي يكون مفعّلاً بشكل تلقائي.
- يسمح بتعيين نشاط الجلسة لكل وحدة تحكم لإلغاء نشاط الجلسة العامة. يمكن تحديد نشاط الجلسة لوحدة التحكم في وقت الاتصال من خلال إنشاء
- واجهة المستخدم:
- يجب معالجة خطأ في النظام الأساسي يؤدي إلى تمديد الفيديو أو اقتصاصه عند استخدام
SurfaceView
في ComposeAndroidView
على واجهة برمجة التطبيقات 34 (#1237).
- يجب معالجة خطأ في النظام الأساسي يؤدي إلى تمديد الفيديو أو اقتصاصه عند استخدام
- التطبيق التجريبي:
- استخدِم
HttpEngineDataSource
باعتبارهHttpDataSource
إذا كان الجهاز متوافقًا.
- استخدِم
الإصدار 1.4.0-beta01
26 يونيو 2024
تم طرح androidx.media3:media3-*:1.4.0-beta01
.
يحتوي الإصدار 1.4.0-beta01 على عمليات التنفيذ هذه.
- ExoPlayer:
- يمكنك إضافة
ExoPlayer.isReleased()
للتحقّق مما إذا تم استدعاءExoplayer.release()
. - أضف
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs
لضبط الحد الأقصى للموضع الذي تسعىseekToPrevious()
إليه إلى العنصر السابق (#1425).
- يمكنك إضافة
- المحوِّل:
- إزالة حقل
ExportResult.processedInputs
إذا كنت تستخدم هذا الحقل للحصول على تفاصيل برنامج الترميز، استخدِمDefaultDecoderFactory.listener
بدلاً من ذلك. وفي حال انطباق استثناء برنامج الترميز، ستتوفر تفاصيل برنامج الترميز فيExportException.codecInfo
.
- إزالة حقل
- أدوات استخلاص البيانات:
- إصلاح استخراج تنسيق صوت PCM في حاويات AVI.
- الصورة:
- تسمح هذه السياسة بتفعيل
null
كمَعلمة فيExoPlayer.setImageOutput
بمحو سمةImageOutput
تم إعدادها سابقًا.
- تسمح هذه السياسة بتفعيل
- التأثير:
- أزِل
OverlaySettings.useHdr
غير المستخدَم لأنّ النطاق الديناميكي للتراكب والإطار يجب أن يتطابق. - يمكنك إضافة إمكانية استخدام النطاق العالي الديناميكية (HDR) إلى قناة
TextOverlay
. يمكن تعديل إضاءة النص المركَّب باستخدامOverlaySettings.setHdrLuminanceMultiplier
.
- أزِل
- الجلسة:
- يمكنك إضافة
MediaSession.Callback.onPlayerInteractionFinished
لإعلامك بالجلسات عند انتهاء سلسلة من تفاعلات اللاعب من وحدة تحكّم محدّدة. - أضِف
SessionError
واستخدِمه فيSessionResult
وLibraryResult
بدلاً من رمز الخطأ لتوفير مزيد من المعلومات عن الخطأ وكيفية حلّه إن أمكن. - انشر الرمز الخاص بتطبيق اختبار وحدة التحكم Media3 الذي يمكن استخدامه لاختبار التفاعلات مع التطبيقات التي تنشر جلسة وسائط.
- يمكنك نشر الميزات الإضافية التي تم تمريرها إلى
MediaSession[Builder].setSessionExtras()
الخاص بـmedia3 إلىPlaybackStateCompat.getExtras()
الخاصة بوحدة التحكم في media1. - ربط الأخطاء الفادحة وغير الفادحة من جلسة المنصة وإليها. تم ربط
PlaybackException
بحالة خطأ فادحة فيPlaybackStateCompat
. تم ربطSessionError
التي تم إرسالها إلى وحدة التحكّم بإشعارات الوسائط باستخدامMediaSession.sendError(ControllerInfo, SessionError)
بخطأ غير فادح فيPlaybackStateCompat
، ما يعني أنّه تم ضبط رمز الخطأ والرسالة ولكن تظل حالة جلسة النظام الأساسي مختلفة علىSTATE_ERROR
.
- يمكنك إضافة
- واجهة المستخدم:
- إضافة HLS:
- إصلاح خطأ عدم تحديث قوائم التشغيل التي يتم تشغيلها بشكل أساسي أثناء التشغيل المباشر (#1240)
- أزِل الرموز التي تم إيقافها نهائيًا:
- إزالة الواجهة
Bundleable
ويشمل ذلك إزالة جميع الحقول الثابتةBundleable.Creator<Foo> CREATOR
. وعلى المتصلين أن يستخدموا الطريقتَينBundle toBundle()
وstatic Foo fromBundle(Bundle)
مع كل نوع بدلاً من ذلك.
- إزالة الواجهة
الإصدار 1.4.0-alpha02
7 يونيو 2024
تم طرح androidx.media3:media3-*:1.4.0-alpha02
.
يحتوي الإصدار 1.4.0-alpha02 على عمليات التنفيذ هذه.
- المكتبة المشتركة:
- تهدف عملية إعادة التوجيه التي يُفترض أن تكون بلا عمليات إلى استخدام طريقتَي
BasePlayer.seekTo
وSimpleBasePlayer.handleSeek
المحميتَين بدلاً من تجاهلها. في حال تنفيذ هذه الطرق في مشغّل مخصّص، قد تحتاج إلى التعامل مع هذه الطلبات الإضافية باستخدامmediaItemIndex == C.INDEX_UNSET
. - أزِل تبعية التجميع من إزالة لغة البرمجة Java 8 المحسّنة (#1312).
- تأكَّد من تجاهل المدة التي تم ضبطها على السمة
MediaItem.Builder.setImageDurationMs
بالنسبة إلى السمةMediaItem
التي لا تتضمّن صورة (كما هو موثَّق).
- تهدف عملية إعادة التوجيه التي يُفترض أن تكون بلا عمليات إلى استخدام طريقتَي
- ExoPlayer:
- أضِف
reset
إلىBasePreloadManager
لتحرير جميع مصادر الاحتفاظ بالبيانات مع الاحتفاظ بمثيل مدير التحميل المُسبق. - أضِف
ExoPlayer.setPriority
(وBuilder.setPriority
) لتحديد قيمة الأولوية المستخدَمة فيPriorityTaskManager
ولأهمية MediaCodec من واجهة برمجة التطبيقات 35. - يُرجى حلّ المشكلة المتعلّقة بتعديل آخر وقت للمخزن المؤقت، ما أدى إلى ظهور
مفتاح
bs
(تجويع المخزن المؤقت) غير صحيح في أداة CMCD (#1124). - أضِف
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
للإشارة إلى تحميل المصدر حتى النهاية. يتيح هذا الإجراء لعمليات تنفيذDefaultPreloadManager
وPreloadMediaSource.PreloadControl
المخصّصة تحميل المصدر التالي مسبقًا أو اتّخاذ إجراءات أخرى. - إصلاح الخطأ الذي قد يؤدي فيه تخطّي كتم الصوت عند نهاية العناصر إلى استثناء تشغيل الفيديو
- يمكنك إضافة
clear
إلىPreloadMediaSource
لتجاهل فترة التحميل المُسبق. - إضافة رمز خطأ جديد
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED
يتم استخدامه عند استرداد موارد برنامج الترميز لتنفيذ مهام ذات أولوية أعلى - السماح لـ
AdsMediaSource
بتحميل إعلانات ما قبل التشغيل قبل اكتمال التحضير الأولي لوسائط المحتوى (#1358). - يجب إصلاح الخطأ الذي تسبب في نقل التشغيل إلى
STATE_ENDED
عند إعادة إعداد بث مباشر DASH متعدد الفترات بعد إزالة الفترة الأصلية من ملف البيان. - إعادة تسمية "
onTimelineRefreshed
" إلى "onSourcePrepared
" و"onPrepared
" إلى "onTracksSelected
" فيPreloadMediaSource.PreloadControl
. عليك أيضًا إعادة تسمية IntDefs فيDefaultPreloadManager.Stage
وفقًا لذلك. - يمكنك إضافة دعم تجريبي للجدولة الديناميكية من أجل مواءمة العمل بشكل أفضل مع دورات تنشيط وحدة المعالجة المركزية (CPU) وتأخير الاستيقاظ حتى وقت تقدم العارضات.
يمكنك تفعيل هذا الخيار باستخدام
experimentalSetDynamicSchedulingEnabled
عند إعداد مثيل ExoPlayer. - إضافة
Renderer.getDurationToProgressMs
ويمكن لـRenderer
تنفيذ هذه الطريقة للعودة إلى ExoPlayer لمدة يجب أن ينتقل خلالها العرض إلى أن يتقدم العارض. إذا تم ضبط السمةExoPlayer
علىexperimentalSetDynamicSchedulingEnabled
، سيستدعيExoPlayer
هذه الطريقة عند احتساب الوقت لجدولة مهمة العمل. - يمكنك إضافة
MediaCodecAdapter#OnBufferAvailableListener
للتنبيه عندما تكون المخزن المؤقت للإدخالات والمخرجات متاحة للاستخدام بحلولMediaCodecRenderer
. سيشيرMediaCodecRenderer
إلىExoPlayer
عند تلقّي عمليات معاودة الاتصال هذه وإذا تم ضبطExoPlayer
علىexperimentalSetDynamicSchedulingEnabled
، سيجدولExoPlayer
حلقة العمل الخاصة به حيث يمكن للعارضين إحراز تقدم. - استخدِم فئة البيانات لطرق
LoadControl
بدلاً من المعلَمات الفردية.
- أضِف
- المحوِّل:
- تفادي حدوث خطأ في برنامج فك الترميز حيث تم تقييد عدد القنوات الصوتية بصوت الاستيريو عند التعامل مع إدخال PCM.
- عند اختيار مقاطع صوتية في
ExoPlayerAssetLoader
، تجاهل قيود عدد القنوات الصوتية لأنها تنطبق على التشغيل فقط. - استبدِل واجهة
androidx.media3.transformer.Muxer
بـandroidx.media3.muxer.Muxer
وأزِلandroidx.media3.transformer.Muxer
. - أصلح تحميل صورة HEIC من مخططات معرِّف الموارد المنتظم (URI) للمحتوى. (#1373)
- اضبط مدة المقطع الصوتي في
AudioGraphInput
لتحسين مزامنة الصوت والفيديو.
- أدوات استخلاص البيانات:
- MPEG-TS: تقديم التغيير لضمان عرض الإطار الأخير من خلال تمرير وحدة الوصول الأخيرة من البث إلى قائمة انتظار النماذج (#7909). دمج الإصلاحات لحلّ المشاكل التي ظهرت في مجموعات بث HLS(#1150) وH.262 HLS (#1126) من خلال إطار I-frame فقط
- تنسيق MP3: يمكنك تفضيل حجم البيانات من إطار
Info
على الحجم الذي قدّمه مصدر البيانات الأساسي (مثل حجم الملف أو عنوان HTTP يتضمّن السمةContent-Length
). ويساعد ذلك في استبعاد بيانات المقاطع الدعائية غير القابلة للتشغيل (مثل صورة الألبوم) من عمليات احتساب البحث عن معدل نقل البيانات المستمر، ما يجعل عملية البحث أكثر دقة (#1376). - MP3: استخدِم عدد اللقطات والبيانات الأخرى في إطار
Info
(إذا كان متوفرًا) لاحتساب متوسط معدل نقل البيانات للتقديم أو الترجيع بشكل ثابت لمعدّل نقل البيانات، بدلاً من الاستخراج من معدّل نقل بيانات الإطار بعد الإطارInfo
، الذي قد يكون صغيرًا بشكل زائف، مثل إطارPCUT
(#1376).
- الصوت:
- إصلاح سمات الترميز DTS:X Profile 2 للتشغيل أثناء التشغيل (#1299)
- بالنسبة إلى التشغيل الذي تم إلغاء تحميله، عليك إعادة ضبط حقل التتبّع لاكتمال البث
في
DefaultAudioSink
قبل طلبAudioTrack.stop()
، لكي يتعرّفAudioTrack.StreamEventCallback#onPresentationEnded
بشكل صحيح على وقت تشغيل جميع البيانات المعلّقة. - يجب إصلاح الخطأ في
SilenceSkippingAudioProcessor
حيث إنّ الانتقال بين تنسيقات الصوت المختلفة (مثلاً الاستيريو إلى الصوت الأحادي) قد يفرض استثناءً على معالج البيانات (#1352). - نفِّذ
MediaCodecAudioRenderer.getDurationToProgressUs
بحيث يجدول ExoPlayer بشكلٍ ديناميكي حلقة العمل الرئيسية الخاصة به إلى الوقت الذي يمكن فيه لبرنامج MediaCodecAudioRenderer إحراز تقدم.
- الفيديو:
- إصلاح المنطق الاحتياطي لبرنامج فك الترميز لكي تستخدم تقنية Dolby Vision برنامج فك ترميز AV1 متوافق إذا لزم الأمر (#1389).
- النص:
- يجب حلّ مشكلة تخطّي الترجمات التي تبدأ قبل موضع التقديم/الترجيع. تم طرح هذه المشكلة فقط في Media3 1.4.0-alpha01.
- غيِّر السلوك التلقائي لتحليل الترجمة بحيث يتم تنفيذه أثناء الاستخراج بدلاً من إجراؤه خلال العرض (راجِع الرسم البياني لبنية ExoPlayer لمعرفة الفرق بين استخراج البيانات وعرضها).
- ويمكن إلغاء هذا التغيير من خلال استدعاء كل من
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)
وTextRenderer.experimentalSetLegacyDecodingEnabled(true)
. اطّلِع على مستندات حول التخصيص لمعرفة كيفية دمج هذه المكوّنات في مثيلExoPlayer
. وستتم إزالة هذه الطرق (وكل الدعم الذي يتيحه فك ترميز العناوين الفرعية القديمة) في إصدار مستقبلي. - يجب تحديث التطبيقات التي تتضمن عمليات تنفيذ
SubtitleDecoder
مخصّصة لتنفيذSubtitleParser
بدلاً من ذلك (وSubtitleParser.Factory
بدلاً منSubtitleDecoderFactory
).
- ويمكن إلغاء هذا التغيير من خلال استدعاء كل من
- PGS: إصلاح فك ترميز مدة التشغيل لمعالجة
0
كفهرس ألوان بدلاً من قيمة لون حرفي (#1367). - CEA-708: تجاهُل قيمة
rowLock
. تنص مواصفات CEA-708-E S-2023 على أنّه يجب افتراض أنّ القيمةrowLock
وcolumnLock
صحيحة، بغض النظر عن القيم الواردة في البث (لم يتم تنفيذ دعمcolumnLock
، ولذلك يُفترض أن تكون خاطئة دائمًا).- تم تضمين هذا التغيير في الأصل في ملاحظات إصدار
1.3.0-alpha01
، ولكن تم إرجاع التغيير عن طريق الخطأ قبل إصدار1.3.0-rc01
. لقد تم إصلاح هذه المشكلة الآن، وبالتالي أصبح التغيير معروضًا من جديد.
- تم تضمين هذا التغيير في الأصل في ملاحظات إصدار
- CEA-708: تجنَّب إضافة أسطر جديدة مكرّرة من خلال طريقة تعامل ExoPlayer بطريقة سلِسة مع الأمر "set pen location" (ضبط موقع القلم) (#1315).
- البيانات الوصفية:
- إصلاح ربط علامات الترتيب بتنسيق MP4 إلى ID3. في السابق، كانت علامات MP4 الخاصة بـ "ترتيب الألبوم" (
soal
) و"ترتيب الفنانين" (soar
) و"ترتيب فنان الألبوم" (soaa
) تم بشكل غير صحيح ربط علاماتTSO2
وTSOA
وTSOP
بأرقام التعريف 3 (#1302). - يجب إصلاح قراءة علامات
gnre
الرقمية (النوع) وtmpo
(الإيقاع) بتنسيق MP4 عندما يتجاوز طول القيمة بايت واحد. - انشر إطار رقم التعريف3
TCON
علىMediaMetadata.genre
(#1305).
- إصلاح ربط علامات الترتيب بتنسيق MP4 إلى ID3. في السابق، كانت علامات MP4 الخاصة بـ "ترتيب الألبوم" (
- الصورة:
- أضِف السماح لشبكات الصور المصغّرة غير المربّعة على شكل DASH (#1300).
- إضافة إمكانية استخدام AVIF لواجهة برمجة التطبيقات 34+
- مصدر البيانات:
- السماح لـ
ByteArrayDataSource
بتحويل عنوان URI إلى مصفوفة بايت أثناءopen()
، بدلاً من أن يكون ثابتًا أثناء الإنشاء (#1405).
- السماح لـ
- إدارة الحقوق الرقمية:
- السماح بضبط
LoadErrorHandlingPolicy
علىDefaultDrmSessionManagerProvider
(#1271).
- السماح بضبط
- التأثير:
- إصلاح الخطأ الذي يحدث فيه تعطُّل
TimestampWrapper
عند استخدامه معExoPlayer#setVideoEffects
(#821) - تغيير مساحة العمل التلقائية المستخدَمة في تنسيق SDR من الألوان الخطية إلى الألوان الكهربائية BT 709 SDR قم أيضًا بتوفير الخيار الثالث للاحتفاظ بمساحة اللون الأصلية.
- السماح بتحديد ترتيب z غير محدد لـ EditedMediaItemSequences (#1055).
- الحفاظ على نطاق إضاءة ثابت في مختلف قطع محتوى النطاق العالي الديناميكية (باستخدام نطاق HLG)
- يمكنك إضافة إمكانية استخدام تركيبات بدقة HDR فائقة (صورة نقطية) على محتوى HDR.
- السماح باستخدام تأثيرات
SeparableConvolution
قبل واجهة برمجة التطبيقات 26
- إصلاح الخطأ الذي يحدث فيه تعطُّل
- إضافة إعلانات الوسائط التفاعلية:
- روِّج لواجهة برمجة التطبيقات المطلوبة لكي تعمل التطبيقات على تثبيت مصادر إعلانات "إدراج إعلان ديناميكي" ثابتة.
- أضِف
replaceAdTagParameters(Map <String, String>)
إلىImaServerSideAdInsertionMediaSource.AdLoader
بما يسمح باستبدال مَعلمات علامات الإعلانات في وقت التشغيل. - إصلاح الخطأ الذي لم يكن يتم فيه استدعاء
VideoAdPlayer.VideoAdPlayerCallback.onError
عند حدوث خطأ في المشغّل أثناء تشغيل الإعلان (#1334). - عليك ترقية إصدار حزمة تطوير البرامج لإعلانات الوسائط التفاعلية إلى 3.33.0 لإصلاح
NullPointerException
عند استخدام معرّفات الموارد المنتظمة (URI) لعلامة الإعلانdata://
(#700).
- الجلسة:
- يمكنك إخفاء شريط التمرير في إشعار الوسائط لأحداث البث المباشر من خلال عدم ضبط المدة على البيانات الوصفية لجلسة النظام الأساسي (#1256).
- يجب محاذاة تحويل
MediaMetadata
إلىMediaDescriptionCompat
لاستخدام نفس الترتيب والمنطق المفضّلين عند اختيار خصائص البيانات الوصفية كما في media1. - أضِف
MediaSession.sendError()
الذي يسمح بإرسال الأخطاء غير الفادحة إلى وحدة التحكّم في Media3. عند استخدام وحدة التحكّم في الإشعارات (راجِعMediaSession.getMediaNotificationControllerInfo()
)، يتم استخدام الخطأ المخصّص لتعديلPlaybackState
جلسة النظام الأساسي إلى حالة خطأ باستخدام معلومات الخطأ المحدّدة (#543).
- إضافة Cronet:
- إصلاح
SocketTimeoutException
فيCronetDataSource
في بعض إصدارات Cronet، لا يكون الطلب المقدم من معاودة الاتصال مماثلاً دائمًا. يؤدي ذلك إلى عدم اكتمال معاودة الاتصال وانتهاء مهلة الطلب (https://issuetracker.google.com/328442628).
- إصلاح
- إضافة HLS:
- إصلاح الخطأ الذي تم فيه تفويض نماذج EMSG المُعلَّقة التي كانت تنتظر انقطاع الخدمة في
HlsSampleStreamWrapper
مع إزاحة غير صحيحة تؤدي إلى حدوثIndexOutOfBoundsException
أوIllegalArgumentException
(#1002) - يجب إصلاح الخطأ الذي يكمن في إعادة تحميل قوائم التشغيل غير الأساسية لأحداث البث من خلال LL-HLS (#1240).
- إصلاح الخطأ الذي أدّى فيه تفعيل بروتوكول CMCD لبروتوكول HLS
مع مقاطع الإعداد إلى حدوث
Source Error
وIllegalArgumentException
.
- إصلاح الخطأ الذي تم فيه تفويض نماذج EMSG المُعلَّقة التي كانت تنتظر انقطاع الخدمة في
- إضافة DASH:
- إضافة Cast:
- إصلاح الخطأ الذي أدّى إلى تحويل عنوان ألبوم
MediaQueueItem
إلى اسم الفنان في عنصر الوسائط Media3 (#1255).
- إصلاح الخطأ الذي أدّى إلى تحويل عنوان ألبوم
- التطبيق التجريبي:
- ويمكنك السماح بإعداد وضع التكرار باستخدام
Intent
وسيطات من سطر الأوامر (#1266).
- ويمكنك السماح بإعداد وضع التكرار باستخدام
- أزِل الرموز التي تم إيقافها نهائيًا:
- إزالة طريقة
setContentTypePredicate(Predicate)
منDefaultHttpDataSource
وOkHttpDataSource
وCronetDataSource
استخدِم الطريقة المكافئة لكلXXXDataSource.Factory
بدلاً من ذلك. - إزالة طرق الإنشاء
OkHttpDataSource
وOkHttpDataSourceFactory
يمكنك استخدامOkHttpDataSource.Factory
كبديل. - إزالة
PlayerMessage.setHandler(Handler)
استخدِمsetLooper(Looper)
بدلاً من ذلك. - إزالة حقل
Timeline.Window.isLive
استخدِم طريقةisLive()
بدلاً من ذلك. - إزالة طرق الإنشاء
DefaultHttpDataSource
استخدِمDefaultHttpDataSource.Factory
بدلاً من ذلك. - إزالة
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS
استخدِمDashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
بدلاً من ذلك. - إزالة
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)
يمكنك استخدامMediaCodecInfo.canReuseCodec(Format, Format)
كبديل. - أزِل الطريقة
DrmSessionManager.DUMMY
وgetDummyDrmSessionManager()
. يمكنك استخدامDrmSessionManager.DRM_UNSUPPORTED
كبديل. - إزالة
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)
،AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)
،AudioRendererEventListener.onAudioInputFormatChanged(Format)
،VideoRendererEventListener.onVideoInputFormatChanged(Format)
. ويمكنك بدلاً من ذلك استخدام حِمل البيانات الزائد التي يتم احتسابها من خلالDecoderReuseEvaluation
. - إزالة
RendererSupport.FormatSupport
IntDef وFORMAT_HANDLED
وFORMAT_EXCEEDS_CAPABILITIES
وFORMAT_UNSUPPORTED_DRM
وFORMAT_UNSUPPORTED_SUBTYPE
وFORMAT_UNSUPPORTED_TYPE
ثوابت. استخدِم IntDef والثوابت المكافئة فيandroidx.media3.common.C
بدلاً من ذلك (مثلC.FORMAT_HANDLED
).
- إزالة طريقة
الإصدار 1.4.0-alpha01
17 أبريل 2024
تم طرح androidx.media3:media3-*:1.4.0-alpha01
.
يحتوي الإصدار 1.4.0-alpha01 على عمليات التنفيذ هذه.
- ExoPlayer:
- أضِف السمة
BasePreloadManager
التي تعمل على تنسيق التحميل المُسبق لمصادر متعددة استنادًا إلى الأولويات المحدّدة في السمةrankingData
. يمكن التخصيص من خلال تمديد هذه الفئة. أضِفDefaultPreloadManager
الذي يستخدمPreloadMediaSource
لتحميل عيّنات وسائط من المصادر مسبقًا إلى الذاكرة، كما يستخدم عددًا صحيحًاrankingData
يشير إلى فهرس أحد العناصر على واجهة المستخدم. - يمكنك إضافة
PlayerId
إلى معظم طُرقLoadControl
لتفعيل عمليات تنفيذLoadControl
لإتاحة إمكانية تشغيل عدّة مشغّلات. - إزالة
Buffer.isDecodeOnly()
وC.BUFFER_FLAG_DECODE_ONLY
وليست هناك حاجة إلى ضبط هذه العلامة إذ ستقرّر برامج العرض وفك الترميز تخطّي المخازن المؤقتة بناءً على الطابع الزمني. يجب أن تتحقّق عمليات تنفيذRenderer
المخصّصة ما إذا كانت مدة المخزن المؤقتBaseRenderer.getLastResetPositionUs()
على الأقل لتحديد ما إذا كان يجب عرض عيّنة يمكن لعمليات تنفيذSimpleDecoder
المخصّصة التحقّق منisAtLeastOutputStartTimeUs
إذا لزم الأمر أو وضع علامةDecoderOutputBuffer.shouldBeSkipped
على الموارد الاحتياطية الأخرى لتخطّيها. - ويمكنك السماح بعرض قيمة فارغة من خلال
"
TargetPreloadStatusControl.getTargetPreloadStatus(T)
" للإشارة إلى عدم تحميلMediaSource
مسبقًا باستخدامrankingData
المحدَّد. - إضافة
remove(MediaSource)
إلىBasePreloadManager
- أضِف السمة
- المحوِّل:
- أضِف
audioConversionProcess
وvideoConversionProcess
إلىExportResult
للإشارة إلى كيفية إنشاء المقطع الصوتي ذي الصلة في ملف المخرجات. - عمليات التحقّق من مستوى H.264 لتحسين عملية تقليل الصوت
- يمكنك إضافة إمكانية التبديل بين وسائط إدخال SDR وHDR بشكل تسلسلي.
- يمكنك إضافة دعم للتأثيرات الصوتية على مستوى المقطوعة الموسيقية.
- يمكنك إضافة إمكانية تحويل ترميز الصور التي تعمل بتقنية HDR الفائقة إلى فيديوهات HDR.
- أصلِح المشكلة التي لا تُخرج فيها
DefaultAudioMixer
الحجم الصحيح من وحدات البايت بعد إعادة ضبطها وإعادة استخدامها.
- أضِف
- الفيديو:
- يجب حلّ المشكلة المتعلّقة بوصول
Listener.onRenderedFirstFrame()
مبكرًا جدًا عند تبديل مساحات العرض أثناء التشغيل.
- يجب حلّ المشكلة المتعلّقة بوصول
- مصدر البيانات:
- تنفيذ إتاحة معرّفات الموارد المنتظمة (URI) للموارد الأولية
android.resource://package/id
في حال اختلافpackage
عن حزمة التطبيق الحالي لم يتم توثيق هذا سابقًا للعمل، ولكنه طريقة أكثر فاعلية للوصول إلى الموارد في حزمة أخرى من الاسم. - تحقق بعناية من أن
url
ليس قيمة خالية في دوال الإنشاءDataSpec
. تمت إضافة تعليق توضيحي على هذه المعلمة لتكون غير خالية.
- تنفيذ إتاحة معرّفات الموارد المنتظمة (URI) للموارد الأولية
- التأثير:
- يمكنك إتاحة عدة تغييرات للسرعة ضمن
EditedMediaItem
أوComposition
نفسها فيSpeedChangeEffect
. - دعم إخراج HLG وPQ من إدخال الصور النقطية بتقنية HDR الفائقة
- يمكنك إضافة دعم لـ EGL_GL_ColorSPACE_BT2020_HLG_EXT، ما يؤدي إلى تحسين ناتج سطح HLG في ExoPlayer.setVideoEffect وDebugView في Transformer.
- عدِّل تنفيذ مصفوفة التراكب لتتوافق مع المستندات من خلال قلب قيمتي x وy المطبقة في
setOverlayFrameAnchor()
. في حال استخدامOverlaySettings.Builder.setOverlayFrameAnchor()
، اقلب قيمتَي x وy بضربهما في-1
.
- يمكنك إتاحة عدة تغييرات للسرعة ضمن
- الجلسة:
- غيِّر القيمة التلقائية من
CommandButton.enabled
إلىtrue
وتأكَّد من أنّ القيمة يمكن أن تظل "خطأ" لوحدات التحكّم حتى في حال توفّر الأمر المرتبط. - أضِف ثوابت رموز لـ
CommandButton
التي يجب استخدامها بدلاً من موارد الرموز المخصّصة. - يمكنك إضافة
MediaSessionService.isPlaybackOngoing()
للسماح للتطبيقات بالاستعلام عمّا إذا كان يجب إيقاف الخدمة فيonTaskRemoved()
(#1219). - يمكنك إضافة
MediaSessionService.pauseAllPlayersAndStopSelf()
الذي يتيح بسهولة إيقاف تشغيل كل الجلسات مؤقتًا وطلبstopSelf
لإنهاء دورة حياةMediaSessionService
. - يمكنك إلغاء
MediaSessionService.onTaskRemoved(Intent)
لتوفير عملية تنفيذ تلقائية آمنة تُبقي الخدمة قيد التشغيل في المقدّمة إذا كان التشغيل مستمرًا أو يوقف الخدمة بطريقة أخرى.
- غيِّر القيمة التلقائية من
- عمليات التنزيل:
- يُرجى التأكُّد من عدم تسريب
DownloadHelper
لمثيلاتRenderer
التي لم يتم إصدارها، ما قد يؤدي في النهاية إلى تعطُّل التطبيق معIllegalStateException: Too many receivers, total of 1000, registered for pid
(#1224).
- يُرجى التأكُّد من عدم تسريب
- أدوات مساعدة للاختبار:
- تنفيذ
onInit()
وonRelease()
فيFakeRenderer
- غيِّر طريقة
TestPlayerRunHelper.runUntil/playUntil
إذا تعذّر تطبيقها على الأخطاء غير الفادحة (مثل الأخطاء التي تم الإبلاغ عنها إلىAnalyticsListener.onVideoCodecError
)، واستخدِم سلسلة الطريقةTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
الجديدة لإيقاف هذا السلوك.
- تنفيذ
- التطبيق التجريبي:
- يمكنك استخدام "
DefaultPreloadManager
" في التطبيق التجريبي للصيغة المختصرة.
- يمكنك استخدام "
- أزِل الرموز التي تم إيقافها نهائيًا:
- إزالة
CronetDataSourceFactory
استخدِمCronetDataSource.Factory
بدلاً من ذلك. - أزِل بعض منصات إنشاء
DataSpec
. يمكنك استخدامDataSpec.Builder
كبديل.
- إزالة
الإصدار 1.3.0
الإصدار 1.3.1
11 أبريل 2024
تم طرح androidx.media3:media3-*:1.3.1
.
يحتوي الإصدار 1.3.1 على عمليات الالتزام هذه.
- المكتبة المشتركة:
- أضِف
Format.labels
للسماح بالتصنيفات المترجَمة أو البديلة الأخرى.
- أضِف
- ExoPlayer:
- يجب حلّ المشكلة التي تمنع
PreloadMediaPeriod
من الاحتفاظ بالبثّ عند تحميله مسبقًا من جديد. - طبِّق السمة
TrackSelectionResult
المقابلة الصحيحة على فترة التشغيل في إعادة اختيار المسار. - يجب عدم بدء برامج العرض التي تم تفعيل الميزة فيها قبل إطلاقها إلا بعد تقدّم مدة التشغيل عند الانتقال بين ملفات الوسائط (#1017).
- أضِف نوع الإرجاع غير المتوفّر إلى قاعدة Proguard
-keepclasseswithmembers
للحسابDefaultVideoFrameProcessor.Factory.Builder.build()
(#1187).
- يجب حلّ المشكلة التي تمنع
- المحوِّل:
- إضافة حل بديل للاستثناء الذي تم طرحه بسبب عدم دعم
MediaMuxer
للطوابع الزمنية السلبية للعروض التقديمية قبل واجهة برمجة التطبيقات 30.
- إضافة حل بديل للاستثناء الذي تم طرحه بسبب عدم دعم
- اختيار المقطع الصوتي:
DefaultTrackSelector
: تفضيل مقاطع الفيديو التي يكون عدد اللقطات في الثانية فيها "معقول" (أكبر من أو تساوي 10 لقطات في الثانية) بدلاً من المقاطع الصوتية التي يكون عدد اللقطات في الثانية فيها أقل أو بدون ضبط. ويضمن ذلك أن يحدّد المشغّل المقطع الصوتي "الحقيقي" بتنسيق MP4 الذي يتم استخلاصه من صور الحركة التي يمكن أن يحتوي على مسارين بتنسيق HEVC حيث يكون أحدهما عالي الدقة ولكن يضم عددًا قليلاً جدًا من اللقطات (#1051).
- أدوات استخلاص البيانات:
- يجب حل مشكلة عدم تخطّي المساحة المتروكة عند قراءة أجزاء ذات حجم فردي من ملفات WAV (#1117).
- MP3: عليك تعبئة
Format.averageBitrate
من إطارات البيانات الوصفية، مثلXING
وVBRI
. - MPEG-TS: يجب العودة عن التغيير الذي يهدف إلى ضمان عرض الإطار الأخير من خلال تمرير وحدة الوصول الأخيرة من البث إلى قائمة انتظار النماذج (#7909). ويرجع ذلك إلى التغيير الذي يتسبّب في حدوث مشاكل جديدة في مجموعات بث HLS فقط ضمن إطار I-frame (#1150) والبث المباشر وفق بروتوكول H.262 (#1126).
- الصوت:
- يمكنك السماح باسترداد بيانات العارض من خلال إيقاف "إلغاء التحميل" في حال تعذّر إعداد المقطع الصوتي في وضع "إلغاء التحميل".
- الفيديو:
- إضافة حل بديل لمشكلة في الجهاز على أجهزة Galaxy Tab S7 FE و"Chromecast مع Google TV" وLenovo M10 FHD Plus ويتم وضع علامة "غير متوافقة" على أحداث البث بمعدل 60 لقطة في الثانية H265.
- أضِف حلاً بديلاً يضمن عرض الإطار الأول دائمًا أثناء إنشاء النفق حتى إذا لم ينفِّذ الجهاز ذلك تلقائيًا على النحو الذي تتطلّبه واجهة برمجة التطبيقات (#1169). (#966)
- يجب حلّ المشكلة التي تؤدي فيها معالجة معلومات ألوان HDR إلى سوء سلوك برنامج الترميز وتمنع تبديل التنسيق التكيُّفي لمقاطع الفيديو ذات التنسيق SDR (#1158).
- النص:
- WebVTT: منع الإشارات المتتالية بشكل مباشر من إنشاء مثيلات
CuesWithTiming
إضافية زائفة منWebvttParser.parse
(#1177).
- WebVTT: منع الإشارات المتتالية بشكل مباشر من إنشاء مثيلات
- إدارة الحقوق الرقمية:
- عليك حلّ
NoSuchMethodError
التي يمكن عرضها في إطار عملMediaDrm
بدلاً منResourceBusyException
أوNotProvisionedException
على بعض أجهزة Android 14 (#1145).
- عليك حلّ
- التأثير:
- تحسين ربط الألوان من PQ إلى SDR عن طريق تحويل مساحات الألوان
- الجلسة:
- واجهة المستخدم:
- الإجراء الاحتياطي لتضمين اسم لغة المقطع الصوتي في حال تعذّر على
Locale
تحديد الاسم المعروض (#988).
- الإجراء الاحتياطي لتضمين اسم لغة المقطع الصوتي في حال تعذّر على
- إضافة DASH:
- عليك تعبئة جميع عناصر
Label
من البيان فيFormat.labels
(#1054).
- عليك تعبئة جميع عناصر
- إضافة RTSP:
- تخطي قيم معلومات الجلسة الفارغة (علامات i-tag) في تحليل SDP (#1087).
- إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
- أوقِف إضافة MIDI كتبعية محلية تلقائيًا لأنّها تتطلب إعداد مستودع Maven إضافي. يمكن للمستخدمين الذين يحتاجون إلى هذه الوحدة من خلال تبعية محلية إعادة تفعيلها.
الإصدار 1.3.0
6 مارس 2024
تم طرح androidx.media3:media3-*:1.3.0
.
يحتوي الإصدار 1.3.0 على عمليات التنفيذ هذه.
- المكتبة المشتركة:
- تنفيذ إتاحة معرّفات الموارد المنتظمة (URI) الخاصة بـ
android.resource://package/[type/]name
في الحالات التي يختلف فيهاpackage
عن حزمة التطبيق الحالي. لقد تم توثيق هذا دائمًا للعمل، ولكن لم يتم تنفيذه بشكل صحيح حتى الآن. - يمكنك تسوية أنواع MIME التي تم ضبطها من خلال رمز التطبيق أو قراءتها من الوسائط لتكون بأحرف صغيرة تمامًا.
- تحديد الإعلانات باستخدام
MediaItem
كاملة بدلاً منUri
واحد فيAdPlaybackState
. - رفع
minSdk
إلى 19 (Android KitKat) ويتوافق هذا مع جميع مكتبات AndroidX الأخرى، ويتطلب منا الترقية إلى أحدث الإصدارات من ملحقات AndroidX. - يمكنك تعبئة كل من
artworkUri
وartworkData
فيMediaMetadata.Builder.populate(MediaMetadata)
عندما يكون أحدهما على الأقل غير فارغ (#964).
- تنفيذ إتاحة معرّفات الموارد المنتظمة (URI) الخاصة بـ
- ExoPlayer:
- أضِف السمتَين
PreloadMediaSource
وPreloadMediaPeriod
اللذين يسمحان للتطبيقات بتحميل مصدر وسائط المحتوى مسبقًا في موضع بدء محدّد قبل التشغيل. يتولىPreloadMediaSource
مهمة إعداد مصدر وسائط المحتوى للحصول علىTimeline
، وإعداد الفترة وتخزينها مؤقتًا عند نقطة البداية المحددة، واختيار المقاطع الصوتية وتحميل بيانات الوسائط لهذه الفترة. تتحكم التطبيقات في تقدم التحميل المسبق من خلال تنفيذPreloadMediaSource.PreloadControl
وتعيين المصدر المحمَّل مسبقًا على المشغّل للتشغيل. - أضِف
ExoPlayer.setImageOutput
الذي يسمح للتطبيقات بضبطImageRenderer.ImageOutput
. - تقدّم حزمة
DefaultRenderersFactory
الآنImageRenderer
للمشغّل بشكل تلقائي مع تضمينImageOutput
وImageDecoder.Factory.DEFAULT
فارغَين. - إطلاق حدث
Player.Listener.onPositionDiscontinuity
عند تخطّي كتم الصوت (#765) - إضافة دعم تجريبي لتحليل الترجمات أثناء الاستخراج. يمكنك تفعيل هذه الميزة باستخدام
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
. - إتاحة مصادر الوسائط التكيّفية باستخدام
PreloadMediaSource
- نفِّذ
HttpEngineDataSource
، وهوHttpDataSource
باستخدام واجهة برمجة التطبيقات HttpEngine. - منع التصنيف الفرعي
CompositeSequenceableLoader
. كان هذا المكوّن قابلاً للتوسع في السابق، ولكن لم يتم تصنيفه ضمن فئة فرعية في المكتبة. يمكن إجراء عمليات التخصيص من خلال إحاطة مثيل باستخدام نمط أداة التصميم وتنفيذ علامةCompositeSequenceableLoaderFactory
مخصّصة. - أصلِح المشكلة التي يؤدي فيها التكرار في الوقت نفسه إلى محو البيانات الوصفية من هذا العنصر (#1007).
- إعادة تسمية طُرق
experimentalSetSubtitleParserFactory
علىBundledChunkExtractor.Factory
وDefaultHlsExtractorFactory
إلىsetSubtitleParserFactory
وعدم السماح باجتيازnull
. استخدم طرقexperimentalParseSubtitlesDuringExtraction(boolean)
الجديدة للتحكم في سلوك التحليل. - يمكنك إضافة إمكانية تخصيص
SubtitleParser.Factory
المستخدَم أثناء الاستخراج. ويمكن تحقيق ذلك باستخدامMediaSource.Factory.setSubtitleParserFactory()
. - أضِف بادئة المصدر إلى جميع حقول
Format.id
التي تم إنشاؤها منMergingMediaSource
. ويساعد ذلك في تحديد المصدر الذي أنتجFormat
(#883). - يمكنك إصلاح التعبير العادي المستخدَم في التحقّق من صحة أسماء مفاتيح بيانات عميل الوسائط الشائعة (CMCD) المخصّصة عن طريق تعديله للتحقّق من الواصلة فقط (#1028).
- أوقِف الترميز المزدوج لمَعلمات طلب البحث CMCD (#1075).
- أضِف السمتَين
- المحوِّل:
- يمكنك إضافة إمكانية لتسوية فيديوهات التصوير البطيء H.265/HEVC SEF.
- عليك زيادة سرعة تحويل المُهملات، خاصةً لتعديلات "إزالة الفيديو".
- يمكنك إضافة واجهة برمجة تطبيقات لضمان بدء ملف الإخراج على إطار فيديو. وقد يساعد ذلك في جعل نتائج عمليات القطع أكثر توافقًا مع عمليات تنفيذ المشغّل التي لا تعرض إطار الفيديو الأول حتى الطابع الزمني للعرض التقديمي (#829).
- يمكنك إضافة دعم لتحسين عمليات قطع ملفات MP4 لمواد العرض الفردية.
- يمكنك إضافة دعم لضمان توفُّر الطابع الزمني الأول لإطار الفيديو في ملف الناتج. يعمل على إصلاح ملفات الإخراج التي تبدأ بإطار أسود في المشغّلات المستندة إلى iOS (#829).
- اختيار المقطع الصوتي:
- أضِف
DefaultTrackSelector.selectImageTrack
لتفعيل اختيار مسار الصورة. - أضِف
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled
لتحديد ما إذا كنت تريد اختيار مسار صورة ما إذا كان كلاً من مسار صورة ومقطع فيديو متاحين. والقيمة التلقائية هيfalse
، ما يعني منح الأولوية لاختيار مقطع فيديو.
- أضِف
- أدوات استخلاص البيانات:
- أضِف تحليل AV1C الإضافي إلى أداة استخراج MP4 لاسترداد
قيم
ColorInfo.colorSpace
وColorInfo.colorTransfer
وColorInfo.colorRange
(#692). - تنسيق MP3: استخدام معدل نقل بيانات ثابت (CBR) للبحث عن الملفات ذات العنوان
Info
(أي CBR المكافئ للعنوانXing
) في السابق، استخدمنا جدول التقديم/الترجيع من عنوانInfo
، ولكن هذه النتائج كانت في البحث بدقة أقل مقارنةً بتجاهله مع افتراض أنّ الملف CBR. - MPEG2-TS: إضافة دعم DTS وDTS-LBR وDTS:X Profile2 (#275)
- يمكنك استخراج أنواع الصوت من أدوات وصف TS وربطها بعلامات الأدوار، ما يتيح للمستخدمين تحديد المقاطع الصوتية بشكل مستنير (#973).
- أضِف تحليل AV1C الإضافي إلى أداة استخراج MP4 لاسترداد
قيم
- الصوت:
- الفيديو:
- غيِّر الدالة الإنشائية
MediaCodecVideoRenderer
التي تستخدم وسيطةVideoFrameProcessor.Factory
واستبدلها بدالة إنشائية تستخدم الوسيطةVideoSinkProvider
. إنّ التطبيقات التي تريد إدخالVideoFrameProcessor.Factory
مخصّصة يمكنها إنشاء مثيلCompositingVideoSinkProvider
يستخدم السمةVideoFrameProcessor.Factory
المخصّصة وتمرير موفّر حوض الفيديو إلىMediaCodecVideoRenderer
.
- غيِّر الدالة الإنشائية
- النص:
- يجب إصلاح تسلسل إشارات الصور النقطية لحلّ الخطأ
Tried to marshall a Parcel that contained Binder objects
عند استخدامDefaultExtractorsFactory.setTextTrackTranscodingEnabled
(#836). - CEA-708: تجاهُل قيمة
rowLock
. تنص مواصفات CEA-708-E S-2023 على أنّه يجب افتراض أنّ القيمةrowLock
وcolumnLock
صحيحة، بغض النظر عن القيم الواردة في البث (لم يتم تنفيذ دعمcolumnLock
، ولذلك يُفترض أن تكون خاطئة دائمًا).
- يجب إصلاح تسلسل إشارات الصور النقطية لحلّ الخطأ
- الصورة:
- يمكنك إضافة إمكانية استخدام الصور المصغّرة بتنسيق DASH. يتم اقتصاص الصور على شكل مربّعات ويتم توفير صور مصغّرة فردية في "
ImageOutput
" بالقرب من أوقات العرض.
- يمكنك إضافة إمكانية استخدام الصور المصغّرة بتنسيق DASH. يتم اقتصاص الصور على شكل مربّعات ويتم توفير صور مصغّرة فردية في "
- إدارة الحقوق الرقمية:
- يجب تشغيل نماذج "محو العميل المحتمل" غير المشفَّرة في محتوى DRM على الفور
تلقائيًا، حتى إذا لم تكن المفاتيح للنماذج المُشفَّرة اللاحقة
جاهزة بعد. وقد يؤدي ذلك إلى عرض أخطاء أثناء التشغيل إذا كانت المفاتيح لا تزال غير جاهزة
عندما يصل موضع التشغيل إلى النماذج المشفَّرة (ولكنّ التشغيل السابق لم يكن ليبدأ على الإطلاق عند هذه النقطة). يمكن إيقاف هذا السلوك باستخدام
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
أوDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
.
- يجب تشغيل نماذج "محو العميل المحتمل" غير المشفَّرة في محتوى DRM على الفور
تلقائيًا، حتى إذا لم تكن المفاتيح للنماذج المُشفَّرة اللاحقة
جاهزة بعد. وقد يؤدي ذلك إلى عرض أخطاء أثناء التشغيل إذا كانت المفاتيح لا تزال غير جاهزة
عندما يصل موضع التشغيل إلى النماذج المشفَّرة (ولكنّ التشغيل السابق لم يكن ليبدأ على الإطلاق عند هذه النقطة). يمكن إيقاف هذا السلوك باستخدام
- إضافة إعلانات الوسائط التفاعلية:
- أصلِح المشكلة التي تمنع تشغيل إعلانات DASH وHLS بدون امتداد الملف المناسب.
- الجلسة:
- إيقاف رصد النقر مرّتين لتطبيقات التلفزيون (#962)
- يُرجى حل مشكلة عدم نقل
MediaItem.RequestMetadata
الذي يتضمن إضافات غير فارغة بين وحدات التحكّم في الوسائط والجلسات. - أضِف دالة إنشاء إلى
MediaLibrarySession.Builder
تستخدمContext
بدلاً منMediaLibraryService
.
- إضافة HLS:
- تقليل
HlsMediaPeriod
إلى إذن الوصول الخاص بالحزمة. لا ينبغي الاعتماد على هذا النوع بشكل مباشر من خارج حزمة HLS. - يسعى الحلّ إلى بدء القسم بكفاءة أكبر (#1031).
- تقليل
- إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
- برنامج فك ترميز MIDI: تجاهل رسائل أحداث SysEx (#710).
- أدوات مساعدة للاختبار:
- عدم إيقاف التشغيل مؤقتًا بعد
TestPlayerRunHelper.playUntilPosition
ويبقي الاختبار التشغيل في حالة تشغيل، ولكنه يعلّق التقدم إلى أن يتمكن الاختبار من إضافة تأكيدات وإجراءات أخرى.
- عدم إيقاف التشغيل مؤقتًا بعد
- التطبيق التجريبي:
- أضِف وحدة عرض توضيحي مختصر لعرض استخدام
PreloadMediaSource
مع حالة استخدام المحتوى القصير.
- أضِف وحدة عرض توضيحي مختصر لعرض استخدام
الإصدار 1.3.0-rc01
22 فبراير 2024
استخدِم الإصدار 1.3.0 الثابت.
الإصدار 1.3.0-beta01
7 فبراير 2024
استخدِم الإصدار 1.3.0 الثابت.
الإصدار 1.3.0-alpha01
15 يناير 2024
استخدِم الإصدار 1.3.0 الثابت.
الإصدار 1.2.0
الإصدار 1.2.1
9 يناير 2024
- ExoPlayer:
- يجب حلّ المشكلة التي تؤدي فيها عمليات البحث اليدوي خارج نطاق
LiveConfiguration.min/maxOffset
إلى الاستمرار في تعديل الإزاحة مرة أخرى إلىmin/maxOffset
. - يجب حلّ المشكلة التي تشير إلى أنّ تنسيقات قنوات OPUS وVORBIS خاطئة لـ 3 و5 و6 و7 و8 قنوات (#8396).
- يجب حلّ المشكلة التي تؤدي إلى صفر في خيارات المقطع الصوتي بعد البث المباشر والسماح ببدء البث من موضعه التلقائي (#9347).
- أصلِح المشكلة المتمثلة في تلقّي مثيلات جديدة من
CmcdData.Factory
قيمًا سلبية لـbufferedDurationUs
من مصادر المقاطع، ما أدى إلى حدوثIllegalArgumentException
(#888).
- يجب حلّ المشكلة التي تؤدي فيها عمليات البحث اليدوي خارج نطاق
- المحوِّل:
- حاول حل مشكلة يتسبب فيها برنامج الترميز في وقت الإعداد بسبب ضبط معدل تشغيل مرتفع.
- أدوات استخلاص البيانات:
- ضَع علامة على مسارات HEVC الثانوية (غير القابلة للتشغيل) في الصور الحيّة بتنسيق JPEG على أنّها
ROLE_FLAG_ALTERNATE
لمنع اختيارها تلقائيًا للتشغيل بسبب ارتفاع درجة دقتها. - إصلاح الأخطاء في رصد الإطارات الرئيسية غير الصحيحة لأحداث بث TS H264 (#864)
- إصلاح المدة المقدَّرة لأحداث البث المباشر التي تزيد مدتها عن 47721 ثانية (#855)
- ضَع علامة على مسارات HEVC الثانوية (غير القابلة للتشغيل) في الصور الحيّة بتنسيق JPEG على أنّها
- الصوت:
- يمكنك إصلاح التعامل مع EOS لـ
SilenceSkippingAudioProcessor
عند استدعائها عدة مرات (#712).
- يمكنك إصلاح التعامل مع EOS لـ
- الفيديو:
- إضافة حل لمشكلة أحد الأجهزة على Galaxy Tab S7 FE و"Chromecast مع Google TV" وLenovo M10 FHD Plus، ما يؤدي إلى وضع علامة "غير متوافقة" على بث الفيديو بمعدل 60 لقطة في الثانية (#693).
- البيانات الوصفية:
- إصلاح الخطأ الذي أدّى إلى تعبئة
MediaMetadata
فقط من تعليقات Vorbis التي تستخدم مفاتيح الأحرف الكبيرة (#876) - يمكنك تسجيل
OutOfMemoryError
عند تحليل إطارات ID3 كبيرة جدًا، ما يعني أنّه يمكن مواصلة التشغيل بدون معلومات العلامة بدلاً من تعذُّر التشغيل بشكل كامل.
- إصلاح الخطأ الذي أدّى إلى تعبئة
- إدارة الحقوق الرقمية:
- يمكنك تمديد الحل البديل لترخيص ClearKey
https://default.url
الزائف إلى عنوان URL لواجهة برمجة التطبيقات 33 أو الإصدارات الأحدث (كان الحل البديل ينطبق سابقًا على واجهة برمجة التطبيقات 33 فقط بالضبط) (#837). - يجب إصلاح الخطأ
ERROR_DRM_SESSION_NOT_OPENED
عند التبديل من المحتوى المشفّر إلى محو المحتوى بدون سطح مرتبط بالمشغّل. يرجع الخطأ إلى استخدام برنامج فك ترميز آمن بشكل غير صحيح لتشغيل المحتوى الواضح.
- يمكنك تمديد الحل البديل لترخيص ClearKey
- الجلسة:
- يمكنك وضع المفاتيح والقيم المخصّصة في
MediaMetadataCompat
علىMediaMetadata.extras
وMediaMetadata.extras
علىMediaMetadataCompat
(#756, #802). - إصلاح بث
notifyChildrenChanged
لوحدات التحكّم القديمة (#644). - إصلاح خطأ يؤدي فيه ضبط وقت سلبي للإيقاف المؤقت للإشعار
setWhen
إلى تعطُّل بعض الأجهزة (#903). - يمكنك إصلاح الخطأ
IllegalStateException
عندما لا تكتمل عملية ربط وحدة التحكّم في إشعارات الوسائط عند طلب التحديث الأول للإشعارات (#917).
- يمكنك وضع المفاتيح والقيم المخصّصة في
- واجهة المستخدم:
- إضافة DASH:
- يُرجى تحليل "f800" كعدد القنوات الذي يبلغ 5 قنوات Dolby في بيان DASH (#688).
- إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
- إضافة Cast:
- يجب تصحيح عملية إنشاء "
Timeline
" لكي لا يتم إيقاف التطبيق عند تحميل وسائط على جهاز البث (#708).
- يجب تصحيح عملية إنشاء "
الإصدار 1.2.0
15 تشرين الثاني (نوفمبر) 2023
- المكتبة المشتركة:
- أضِف معلَمة
@Nullable Throwable
إلى الطرق في واجهةLog.Logger
. لم تعد المعلَمةmessage
بهذه الطرق تحتوي على أي معلومات عنThrowable
التي تم ضبطها على طرقLog.{d,i,w,e}()
، لذا يجب أن تُلحق عمليات التنفيذ هذه المعلومات يدويًا إذا لزم الأمر (ربما باستخدامLogger.appendThrowableString(String, Throwable)
). - يجب حل مشكلة توافق Kotlin التي لا يتم فيها اكتشاف معلمات النوع العامة القابلة للقيم الفارغة وأنواع العناصر الصفيفة القابلة للقيم الفارغة. ومن الأمثلة على ذلك
معلمتا الطريقة
TrackSelectorResult
وSimpleDecoder
(#6792). - يمكنك تغيير واجهة المستخدم التلقائية وسلوك الإشعارات في
Util.shouldShowPlayButton
لعرض الزر "تشغيل" عندما يكون التشغيل مكتومًا مؤقتًا (مثلاً بسبب فقدان التركيز مؤقتًا على الصوت). ويمكن الحفاظ على السلوك القديم باستخدامPlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)
أوMediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)
(#11213). - يُرجى ترقية "
androidx.annotation:annotation-experimental
" إلى "1.3.1
" لحلّ المشكلة https://issuetracker.google.com/251172715. - نقل
ExoPlayer.setAudioAttributes
إلى واجهةPlayer
- أضِف معلَمة
- ExoPlayer:
- إصلاح مشاكل البحث عن المحتوى في أحداث بث AC4 الناتجة عن عدم تحديد نماذج فك الترميز فقط بشكل صحيح (#11000).
- إضافة ميزة إيقاف التشغيل على أجهزة إخراج الصوت غير المناسبة (مثل
مكبّر الصوت المدمج على أجهزة Wear OS) عند تفعيل هذه الميزة عبر
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput
سيتم تعديل سبب إيقاف التشغيل باسمPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
إذا تمت محاولة التشغيل عند عدم توفّر مخرجات صوت مناسبة أو إذا انقطعت كل مصادر المخرجات الملائمة أثناء التشغيل. ستتم إزالة سبب الإيقاف عند توصيل ناتج مناسب. - يمكنك إضافة "
MediaSource.canUpdateMediaItem
" و"MediaSource.updateMediaItem
" لقبول تعديلات "MediaItem
" بعد الإنشاء من خلال "Player.replaceMediaItem(s)
". - السماح بتحديث
MediaItem
لجميع صفوفMediaSource
التي توفّرها المكتبة من خلالPlayer.replaceMediaItem(s)
(#33، #9978) - إعادة تسمية "
MimeTypes.TEXT_EXOPLAYER_CUES
" إلىMimeTypes.APPLICATION_MEDIA3_CUES
- يمكنك إضافة
PngExtractor
الذي يرسل ويقرأ ملف PNG بالكامل إلىTrackOutput
كنموذج واحد. - يمكنك تحسين طريقة
SequenceableLoader.continueLoading(long)
في واجهةSequenceableLoader
لتصبحSequenceableLoader.continueLoading(LoadingInfo loadingInfo)
. يحتويLoadingInfo
على معلَمات إضافية، من بينهاplaybackSpeed
وlastRebufferRealtimeMs
بالإضافة إلىplaybackPositionUs
الحالي. - يمكنك تحسين طريقة
ChunkSource.getNextChunk(long, long, List, ChunkHolder)
في واجهةChunkSource
لتصبحChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
. - أضِف حقولاً إضافية إلى تسجيل بيانات عميل الوسائط الشائعة (CMCD): المخزن المؤقت
المجاعة (
bs
) والموعد النهائي (dl
) ومعدل التشغيل (pr
) وبدء التشغيل (su
) (#8699). - أضِف عمق بت luma والكروما إلى
ColorInfo
(#491). - أضِف حقولاً إضافية إلى تسجيل بيانات عميل الوسائط الشائعة (CMCD): طلب الكائن التالي (
nor
) وطلب النطاق التالي (nrr
) (#8699). - إضافة وظائف لنقل بيانات عميل الوسائط الشائعة (CMCD) باستخدام معلمات طلب البحث (#553).
- إصلاح
ConcurrentModificationException
فيExperimentalBandwidthMeter
(#612). - إضافة مَعلمة
MediaPeriodId
إلىCompositeMediaSource.getMediaTimeForChildMediaTime
- يمكنك إتاحة
ClippingMediaSource
(والمصادر الأخرى التي تتضمّن إزاحات زمنية في الفترة أو الفترة) فيConcatenatingMediaSource2
(#11226). - يمكنك تغيير
BaseRenderer.onStreamChanged()
لتلقّي وسيطةMediaPeriodId
أيضًا.
- المحوِّل:
- تحليل بيانات تدوير EXIF لإدخالات الصور
- أزِل نوع التعليق التوضيحي
TransformationRequest.HdrMode
والثوابت المرتبطة به. استخدِمComposition.HdrMode
والثوابت المرتبطة بها بدلاً من ذلك. - يمكنك تبسيط
OverlaySettings
لحلّ مشاكل عرض الإعلانات بالتناوب. - تم تغيير المعلمتين
frameRate
وdurationUs
منSampleConsumer.queueInputBitmap
إلىTimestampIterator
.
- اختيار المقطع الصوتي:
- يمكنك إضافة
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness
للسماح صراحةً بالتكيّف غير السلس أو عدم السماح به. وتظل القيمة التلقائية على سلوكها الحالي، وهوtrue
.
- يمكنك إضافة
- أدوات استخلاص البيانات:
- MPEG-TS: تأكد من عرض الإطار الأخير من خلال تمرير آخر وحدة وصول لبث إلى قائمة انتظار النماذج (#7909).
- إصلاح الأخطاء الإملائية عند تحديد
rotationDegrees
. تم تغييرprojectionPosePitch
إلىprojectionPoseRoll
(#461). - أزِل الافتراض بأنّه يمكن فحص مثيلات
Extractor
مباشرةً باستخدامinstanceof
. إذا أردت الوصول إلى بيئة التشغيل إلى تفاصيل تنفيذExtractor
، عليك أولاً استدعاءExtractor.getUnderlyingInstance
. - إضافة
BmpExtractor
- إضافة
WebpExtractor
- إضافة
HeifExtractor
- أضِف دعم
QuickTime الكلاسيكي
إلى
Mp4Extractor
.
- الصوت:
- يمكنك إضافة دعم لـ PCM كبيرة الحجم 24/32 بت في MP4 وMatroska، وتحليل ترميز
PCM لـ
lpcm
في MP4. - يمكنك إضافة دعم لاستخراج صوت Vorbis بتنسيق MP4.
- أضِف
AudioSink.getFormatOffloadSupport(Format)
الذي يسترجع مستوى توافق التفريغ الذي يمكن أن يوفره الحوض للتنسيق من خلالDefaultAudioOffloadSupportProvider
. وتعرض قيمةAudioOffloadSupport
الجديدة التي تحتوي علىisFormatSupported
وisGaplessSupported
وisSpeedChangeSupported
. - أضِف
AudioSink.setOffloadMode()
الذي يتم من خلاله ضبط إعدادات التفريغ في حوض الصوت. القيمة التلقائية هيAudioSink.OFFLOAD_MODE_DISABLED
. - يمكن تفعيل نقل البيانات من خلال
setAudioOffloadPreference
فيTrackSelectionParameters
. في حال تفعيل الإعدادات المفضَّلة التي تم ضبطها، يتيح الجهاز نقل بيانات التنسيق مع ضبط المقطع الصوتي على مقطع صوتي واحد، سيتم تفعيل نقل الصوت. - في حال ضبط السمة
audioOffloadModePreference
علىAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
، لن يختارDefaultTrackSelector
مقطعًا صوتيًا إلا إذا كان تنسيق هذا المقطع الصوتي متوافقًا مع نقل البيانات. إذا لم يتم دعم أي مقطع صوتي عند إلغاء التحميل، لن يتم اختيار أي مقطع صوتي. - إيقاف إمكانية توفير البيانات بدون أي ثغرات عند الانتقال إلى مستوى ما قبل واجهة برمجة التطبيقات 33 بسبب مشكلة في موضع التشغيل بعد نقل المسار
- إزالة المعلمة
enableOffload
من توقيع طريقةDefaultRenderersFactory.buildAudioSink
. - إزالة الطريقة
DefaultAudioSink.Builder.setOffloadMode
- إزالة قيمة intdef
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
- يمكنك إتاحة البيانات الوصفية بدون ثغرة في Opus أثناء تشغيل المحتوى الذي تمت إزالته.
- يمكنك السماح باسترداد بيانات العارض من خلال إيقاف نقل البيانات في حال تعذُّر الكتابة في البداية (#627).
- يمكنك تفعيل "جدولة إلغاء التحميل" تلقائيًا لتشغيل المحتوى الصوتي فقط بلا إنترنت.
- يمكنك حذف
ExoPlayer.experimentalSetOffloadSchedulingEnabled
وAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
. - تمت إعادة تسمية "
onExperimentalSleepingForOffloadChanged
" باسم "onSleepingForOffloadChanged
" و"onExperimentalOffloadedPlayback
" ليصبحonOffloadedPlayback
. - نقل واجهات
TrackSelectionParameters
وتعريفاتها المتعلقة بوضع إلغاء تحميل الصوت إلى فئةAudioOffloadPreferences
داخلية - إضافة طلبات معاودة الاتصال
onAudioTrackInitialized
وonAudioTrackReleased
إلىAnalyticsListener
وAudioRendererEventListener
وAudioSink.Listener
. - يجب إصلاح مشكلة تدفق المخزن المؤقت للصوت لدى DTS Express (#650).
- إصلاح خطأ يؤدي فيه التحقُّق من الإمكانيات عن E-AC3-JOC إلى عرض
IllegalArgumentException
(#677).
- يمكنك إضافة دعم لـ PCM كبيرة الحجم 24/32 بت في MP4 وMatroska، وتحليل ترميز
PCM لـ
- الفيديو:
- يجب السماح لـ "
MediaCodecVideoRenderer
" باستخدام علامةVideoFrameProcessor.Factory
مخصّصة. - يجب إصلاح الخطأ الذي أدّى إلى تعذّر عرض الإطار الأوّل إذا كان البث الصوتي يبدأ بطوابع زمنية سلبية (#291).
- يجب السماح لـ "
- النص:
- إزالة
ExoplayerCuesDecoder
يعالجTextRenderer
الآن المقاطع الصوتية النصية التي تتضمّنsampleMimeType = application/x-media3-cues
مباشرةً بدون الحاجة إلى مثيلSubtitleDecoder
.
- إزالة
- البيانات الوصفية:
- لن يتم طلب
MetadataDecoder.decode
بعد الآن للنماذج "فك الترميز فقط" لأن عملية التنفيذ يجب أن تعرض قيمة فارغة على أي حال.
- لن يتم طلب
- التأثير:
- إضافة
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
لإدخال الصورة النقطية في "قائمة المحتوى التالي" حسب الطابع الزمني - غيِّر "
VideoFrameProcessor.registerInputStream()
" بحيث لا يؤدي إلى حظر الفيديو. يجب أن تنفّذ التطبيقاتVideoFrameProcessor.Listener#onInputStreamRegistered()
. - تم تغيير المعلمتين
frameRate
وdurationUs
منVideoFrameProcessor.queueInputBitmap
إلىTimestampIterator
.
- إضافة
- إضافة إعلانات الوسائط التفاعلية:
- إصلاح الخطأ الذي يؤدي فيه البث المباشر عبر DASH متعدد الفترات إلى استثناء هذَين العنصرَين (#571) في قائمة تشغيل
- عليك رفع إصبعك عن StreamManager قبل الاتصال بـ
AdsLoader.destroy()
. - ترقية إصدار حزمة تطوير البرامج لإعلانات الوسائط التفاعلية إلى الإصدار 3.31.0
- الجلسة:
- ضبط سلوك خدمة الإشعارات التي تعمل في المقدّمة على
FOREGROUND_SERVICE_IMMEDIATE
فيDefaultMediaNotificationProvider
(#167) - يُرجى استخدام
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()
واجهة برمجة التطبيقات 31 أعلاه فقط لتجنُّب المشاكل المتعلّقة بإيقاف واجهة برمجة التطبيقات نهائيًا على أجهزة Samsung (#167). - استخدِم وحدة التحكّم بإشعارات الوسائط كخادم وكيل لضبط الأوامر المتاحة والتنسيق المخصّص المستخدَم لتعبئة الإشعارات وجلسة النظام الأساسي.
- يمكنك تحويل أحداث أزرار الوسائط التي يتم تلقّيها من خلال "
MediaSessionService.onStartCommand()
" ضمن Media3 بدلاً من توجيهها إلى جلسة النظام الأساسي والعودة إلى Media3. من خلال ذلك، تكون "أداة التحكّم في المكالمات" هي دائمًا وحدة التحكّم في إشعارات الوسائط، ويمكن للتطبيقات التعرّف بسهولة على المكالمات الواردة من الإشعار بالطريقة نفسها على جميع مستويات واجهة برمجة التطبيقات المتوافقة. - إصلاح الخطأ الذي لا يتقدّم في إصدارات
MediaController.getCurrentPosition()
عند ربطه بجهازMediaSessionCompat
قديم. - يمكنك إضافة
MediaLibrarySession.getSubscribedControllers(mediaId)
لتسهيل الأمر. - يمكنك إلغاء
MediaLibrarySession.Callback.onSubscribe()
لتأكيد مدى توفّر المعرّف الرئيسي الذي تشترك فيه وحدة التحكّم. وفي حال نجاح الإجراء، سيتم قبول الاشتراك وسيتم استدعاء "notifyChildrenChanged()
" على الفور لإعلام المتصفّح بذلك (#561). - أضِف وحدة العرض التوضيحي للجلسة لنظام التشغيل Automotive وفعِّل العرض التوضيحي للجلسة لنظام التشغيل Android Auto.
- يُرجى عدم ضبط قائمة الانتظار لجلسة إطار العمل في حال عدم توفّر "
COMMAND_GET_TIMELINE
" لوحدة التحكّم في إشعارات الوسائط. عند استخدام ميزة Android Auto باعتبارها وحدة تحكم العميل التي تقرأ من جلسة إطار العمل، يؤدي ذلك إلى عدم عرض الزر "queue
" في واجهة المستخدم الخاصة بتطبيق Android Auto (#339). - يمكنك استخدام
DataSourceBitmapLoader
تلقائيًا بدلاً منSimpleBitmapLoader
(#271، #327). - يمكنك إضافة
MediaSession.Callback.onMediaButtonEvent(Intent)
الذي يسمح للتطبيقات بإلغاء المعالجة التلقائية لأحداث زر الوسائط.
- ضبط سلوك خدمة الإشعارات التي تعمل في المقدّمة على
- واجهة المستخدم:
- يمكنك إضافة طريقة تنفيذ
Player.Listener
لأجهزة Wear OS التي تعالج إيقاف التشغيل بسببPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
، وذلك من خلال إطلاق مربّع حوار النظام للسماح للمستخدم بتوصيل جهاز الإخراج الصوتي المناسب (مثلاً، سمّاعات رأس بلوتوث). سيستأنف المستمع التشغيل تلقائيًا إذا تم توصيل جهاز مناسب خلال مهلة قابلة للتهيئة (تبلغ القيمة التلقائية 5 دقائق).
- يمكنك إضافة طريقة تنفيذ
- عمليات التنزيل:
- تعريف نوع الخدمة التي تعمل في المقدّمة "مزامنة البيانات" لنظام
DownloadService
للتوافق مع الإصدار 14 من نظام التشغيل Android. عند استخدام هذه الخدمة، يحتاج التطبيق أيضًا إلى إضافةdataSync
كـforegroundServiceType
في البيان وإضافة إذنFOREGROUND_SERVICE_DATA_SYNC
(#11239).
- تعريف نوع الخدمة التي تعمل في المقدّمة "مزامنة البيانات" لنظام
- إضافة HLS:
- أعِد تحميل قائمة التشغيل المباشر وفق بروتوكول HLS باستخدام فاصل زمني يتم احتسابه من وقت بدء التحميل الأخير بدلاً من وقت آخر عملية تحميل مكتملة (#663).
- إضافة DASH:
- السماح بمضاعفات معرّف DASH نفسه في عنوان URL لنموذج الشريحة.
- إضافة دعم تجريبي لتحليل الترجمات أثناء الاستخراج. يتيح ذلك دمج الترجمات المتداخلة بشكل أفضل، بما في ذلك حلّ الوميض عند الانتقال بين مقاطع الترجمة. يمكنك
تفعيل هذا الخيار باستخدام
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
(#288).
- إضافة RTSP:
- يمكنك إصلاح حالة سباق قد تؤدي إلى
IndexOutOfBoundsException
عند الرجوع إلى بروتوكول التحكم بالنقل، أو تعليق التشغيل في بعض المواقف. - تحقَّق من الحالة في إعداد RTSP عند عرض حالة تحميل
RtspMediaPeriod
(#577). - تجاهُل طرق طلب Rtsp المخصّصة في العنوان العام لاستجابة الخيارات (#613).
- ويمكنك استخدام قيمة مهلة استجابة إعداد RTSP في الفاصل الزمني لإرسال طلبات خيارات RTSP المستمرة (#662).
- يمكنك إصلاح حالة سباق قد تؤدي إلى
- إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
- إطلاق وحدة فك ترميز MIDI التي تتيح تشغيل ملفات MIDI العادية باستخدام مكتبة Jyn لتوليف الصوت
- أضِف
DecoderOutputBuffer.shouldBeSkipped
لوضع علامة مباشرةً على الموارد الاحتياطية للمخرجات التي لا تحتاج إلى تقديمها. ويُفضَّل تحديد هذه القيمة علىC.BUFFER_FLAG_DECODE_ONLY
التي سيتم إيقافها نهائيًا. - أضِف
Decoder.setOutputStartTimeUs
وSimpleDecoder.isAtLeastOutputStartTimeUs
للسماح لبرامج فك الترميز بإرسال نماذج لفك الترميز فقط قبل وقت البدء. من المفترض أن يتم اختيار "Buffer.isDecodeOnly
" التي سيتم إيقافها نهائيًا. - إصلاح الخطأ في عنصر فك ترميز MIDI الذي تم نشره في مستودع Maven. تمت إعادة تسمية
العناصر إلى
media3-exoplayer-midi
(#734).
- إضافة Leanback:
- أصلِح الخطأ الذي يؤدي فيه إيقاف سطح إلى حدوث
ArithmeticException
في رمز Leanback (#617).
- أصلِح الخطأ الذي يؤدي فيه إيقاف سطح إلى حدوث
- أدوات مساعدة للاختبار:
- اجعل
TestExoPlayerBuilder
وFakeClock
متوافقَين مع اختبارات واجهة مستخدم Espresso واختبارات واجهة مستخدم Compose. يؤدي ذلك إلى إصلاح خطأ يتقدم التشغيل بشكل غير حاسم أثناء تفاعلات عرض Espresso أو Compose.
- اجعل
- أزِل الرموز التي تم إيقافها نهائيًا:
- إزالة
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
وTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
. استخدِم السمةComposition.Builder.setHdrMode(int)
ومرِّرComposition
إلىTransformer.start(Composition, String)
بدلاً من ذلك. - أزِل طريقة
DownloadNotificationHelper.buildProgressNotification
المتوقّفة نهائيًا، واستخدِم طريقة غير متوقفة تستخدم مَعلمةnotMetRequirements
بدلاً منها.
- إزالة
الإصدار 1.2.0-rc01
1 تشرين الثاني (نوفمبر) 2023
استخدام الإصدار الثابت 1.2.0
الإصدار 1.2.0-beta01
19 تشرين الأول (أكتوبر) 2023
استخدام الإصدار الثابت 1.2.0
الإصدار 1.2.0-alpha02
29 أيلول (سبتمبر) 2023
استخدام الإصدار الثابت 1.2.0
الإصدار 1.2.0-alpha01
17 آب (أغسطس) 2023
استخدام الإصدار الثابت 1.2.0
الإصدار 1.1.0
الإصدار 1.1.1
16 آب (أغسطس) 2023
- المكتبة المشتركة:
- أزِل تبعية
multidex
التي تمت إضافتها عن طريق الخطأ من جميع الوحدات (#499).
- أزِل تبعية
- ExoPlayer:
- يجب حل المشكلة في
PlaybackStatsListener
التي يتم فيها إنشاءPlaybackStats
الزائف بعد محو قائمة التشغيل. - أضِف حقولاً إضافية إلى تسجيل بيانات عميل الوسائط الشائعة (CMCD): تنسيق البث (sf) ونوع البث (st) والإصدار (v) ومعدل نقل البيانات الأعلى (tb) ومدة العنصر (d) ومعدل نقل البيانات الذي يتم قياسه (mtp) ونوع العنصر (ot) (#8699).
- يجب حل المشكلة في
- الصوت:
- إصلاح خطأ عدم انتقال
Player.getState()
إلىSTATE_ENDED
عند تشغيل ملفات قصيرة جدًا (#538).
- إصلاح خطأ عدم انتقال
- نقل الصوت:
- أضِف عنوان معرّف Ogg وصفحات رؤوس التعليق إلى البث المباشر لتشغيل المحتوى غير المتوفِّر وفقًا لمعيار RFC 7845.
- الفيديو:
- H.265/HEVC: إصلاح تحليل SPS لمعلومات الصورة المرجعية القصيرة والطويلة الأمد.
- النص:
- CEA-608: تغيير منطق اقتطاع الإشارة لمراعاة النص المرئي فقط كان يتم تضمين المسافة البادئة والإزاحة لعلامة التبويب في السابق عند تقييد طول الإشارة إلى 32 حرفًا (وهذا كان صحيحًا من الناحية الفنية من خلال المواصفات) (#11019).
- إضافة إعلانات الوسائط التفاعلية:
- ترقية إصدار حزمة تطوير البرامج لإعلانات الوسائط التفاعلية إلى الإصدار 3.30.3
- الجلسة:
- أضف تخطيطًا مخصصًا إلى حالة وحدة التحكم ووفر واجهة
للوصول إليها. عند تغيير التنسيق المخصّص،
يتم استدعاء
MediaController.Listener.onCustomLayoutChanged
. يمكن للتطبيقات التي تريد إرسال تنسيقات مخصّصة مختلفة إلى وحدة تحكّم مختلفة في Media3 إجراء ذلك فيMediaSession.Callback.onConnect
باستخدامAcceptedResultBuilder
للتأكّد من توفُّر التنسيق المخصّص لوحدة التحكّم عند اكتمال الاتصال. - إصلاح الحالات التي أرسل فيها
MediaLibraryServiceLegacyStub
خطأً إلىResult
لا يدعم ذلك، ما أدى إلى ظهورUnsupportedOperationException
(#78). - عليك إصلاح طريقة إنشاء
PlayerWrapper
للسمةVolumeProviderCompat
من خلال تحديدvolumeControlType
من خلال كل من الأمرَين القديمَين (COMMAND_ADJUST_DEVICE_VOLUME
وCOMMAND_SET_DEVICE_VOLUME
) والأوامر الجديدة (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
وCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
) (#554).
- أضف تخطيطًا مخصصًا إلى حالة وحدة التحكم ووفر واجهة
للوصول إليها. عند تغيير التنسيق المخصّص،
يتم استدعاء
الإصدار 1.1.0
5 تموز (يوليو) 2023
- المكتبة المشتركة:
- أضِف سببًا لإيقاف مسار الصوت غير الملائم، وشغِّل المحتوى عندما تكون جاهزًا، وغيّر سبب الإيقاف لفترة طويلة جدًا. (#15)
- أضِف أوامر إلى "المشغّل":
COMMAND_GET_METADATA
COMMAND_SET_PLAYLIST_METADATA
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- يمكنك إضافة طرق لزيادة التحميل إلى المشغّل تسمح للمستخدمين بتحديد علامات
معدل ارتفاع الصوت:
void setDeviceVolume(int, int)
void increaseDeviceVolume(int)
void decreaseDeviceVolume(int)
void setDeviceMuted(boolean, int)
- إضافة
Builder
إلىDeviceInfo
وإيقاف الدالة الإنشائية الحالية نهائيًا - يمكنك إضافة
DeviceInfo.routingControllerId
لتحديد معرّف وحدة التحكم في التوجيه لعمليات التشغيل عن بُعد. - أضِف
Player.replaceMediaItem(s)
كاختصار لإضافة العناصر وإزالتها في الموضع نفسه (#8046).
- ExoPlayer:
- يجب السماح لـ ExoPlayer بالتحكم في طرق مستوى صوت الجهاز فقط في حال الموافقة بشكل صريح. استخدِم
ExoPlayer.Builder.setDeviceVolumeControlEnabled
للوصول إلى:getDeviceVolume()
isDeviceMuted()
setDeviceVolume(int)
وsetDeviceVolume(int, int)
increaseDeviceVolume(int)
وincreaseDeviceVolume(int, int)
decreaseDeviceVolume(int)
وdecreaseDeviceVolume(int, int)
- أضِف
FilteringMediaSource
الذي يسمح بفلترة أنواع الأغاني المتوفّرة منMediaSource
. - توفير إمكانية تضمين بيانات عميل الوسائط الشائعة (CMCD) في الطلبات الصادرة لتنسيقات البث التكيُّفي DASH وHLS وSmoothStreaming تم دمج الحقول التالية،
br
وbl
وcid
وrtp
وsid
، (#8699). بنية واجهة برمجة التطبيقات وطرقها:- يكون تسجيل CMCD غير مفعَّل تلقائيًا، لذا استخدِم
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)
لتفعيله. - تكون جميع المفاتيح مفعّلة تلقائيًا، ويمكنك إلغاء
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)
لفلترة المفاتيح التي يتم تسجيلها. - يمكنك إلغاء
CmcdConfiguration.RequestConfig.getCustomData()
لتفعيل تسجيل المفتاح المخصّص.
- يكون تسجيل CMCD غير مفعَّل تلقائيًا، لذا استخدِم
- أضِف إجراءً إضافيًا إلى بيان العرض التوضيحي الرئيسي لتسهيل بدء
تطبيق العرض التوضيحي باستخدام ملف
*.exolist.json
مخصّص (#439). - أضِف
ExoPlayer.setVideoEffects()
عند استخدامEffect
أثناء تشغيل الفيديو. - يجب تعديل
SampleQueue
لتخزينsourceId
على أنّهlong
بدلاً منint
. يؤدي هذا الإجراء إلى تغيير توقيعات الطريقتَين العامتَينSampleQueue.sourceId
وSampleQueue.peekSourceId
. - أضِف معلَمات إلى طريقتَي
LoadControl
shouldStartPlayback
وonTracksSelected
التي تسمح بربط هذه الطرق بـMediaPeriod
ذي الصلة. - يمكنك تغيير توقيع
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)
من خلال إضافة مَعلمة مخطط زمني تحتوي على الفترات التي تتضمّن المُعرّفات الفريدة (UID) المستخدَمة كمفاتيح في الخريطة. وهذا الإجراء مطلوب لتجنُّب مشاكل التزامن مع أحداث البث المباشر المتعددة الفترات. - يمكنك إيقاف
EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)
وBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)
نهائيًا. ويمكن استدعاء الصيغ المختلفة للطرق بدونmediaTimeOffsetUs
بدلاً من ذلك. يُرجى العلم أنّه حتى بالنسبة إلى خيارات المنتج المتوقّفة نهائيًا، لن تتم إضافة الإزاحة بعد الآن إلىstartTimeUs
وendTimeUs
في كائناتMediaLoadData
التي أرسلتها المُرسِل. - إعادة تسمية "
ExoTrackSelection.blacklist
" إلى "excludeTrack
" و"isBlacklisted
" إلى "isTrackExcluded
" - يجب إصلاح السلوك غير المتسق بين
ExoPlayer.setMediaItem(s)
وaddMediaItem(s)
عند استدعاء قائمة تشغيل فارغة.
- يجب السماح لـ ExoPlayer بالتحكم في طرق مستوى صوت الجهاز فقط في حال الموافقة بشكل صريح. استخدِم
- المحوِّل:
- إزالة
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)
استخدِمExoPlayerAssetLoader.Factory(MediaSource.Factory)
وTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
بدلاً من ذلك. - إزالة
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
- إصلاح الخطأ الذي قد يتوقّف فيه عملية التحويل (مما يؤدي إلى حدوث مهلة أكثر تشويقًا) إذا تمت الإشارة إلى انتهاء الفيديو المضمّن أثناء معالجة إطار الإدخال الذي كان في انتظار المعالجة
- طلب البحث عن برامج الترميز من خلال
MediaCodecList
بدلاً من استخدام أدوات مساعدةfindDecoder/EncoderForFormat
لتوسيع نطاق الدعم - أزِل إعدادات الإطار B في
DefaultEncoderFactory
لأنّها لا تعمل على بعض الأجهزة.
- إزالة
- اختيار المقطع الصوتي:
- إضافة
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
تكون غير مفعّلة تلقائيًا عند تفعيل هذه السياسة، سيؤدي اختيارDefaultTrackSelector
إلى اختيار قناة إصدار جديدة عند تغيُّر إمكانات العارض.
- إضافة
- أدوات استخلاص البيانات:
- الصوت:
- إصلاح الخطأ الذي يحدث فيه تعذُّر بعض عمليات التشغيل عندما تكون تقنية الاتصال النفقي مفعّلة
وتفعيل ميزة
AudioProcessors
، مثلًا للقطع بدون انقطاع (#10847). - تغليف إطارات Opus في حزم Ogg في عمليات التشغيل المباشرة (التفريغ).
- استقراء الوضع الحالي أثناء النوم باستخدام جدولة التفريغ.
- أضِف
Renderer.release()
وAudioSink.release()
لتوفير الموارد في نهاية دورة حياة اللاعب. - يمكنك الاستماع إلى التغييرات في الإمكانات الصوتية باللغة
DefaultAudioSink
. أضِف مَعلمةcontext
المطلوبة في الدالة الإنشائيةDefaultAudioSink
، حيث سيتم تسجيلDefaultAudioSink
كأداة استماع إلىAudioCapabilitiesReceiver
و تعديل السمةaudioCapabilities
الخاصة بها عند ظهور تغيير في الإمكانيات. - يمكنك نشر التغييرات في إمكانات الصوت من خلال حدث جديد
onAudioCapabilitiesChanged
في واجهةAudioSink.Listener
وواجهة جديدةRendererCapabilities.Listener
تؤدي إلى تشغيلonRendererCapabilitiesChanged
أحداث. - أضِف
ChannelMixingAudioProcessor
لتطبيق تغيير الحجم/المزج على القنوات الصوتية. - أضِف قيمة Int جديدة
DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
إلىDecoderDiscardReasons
لتجاهل برنامج فك ترميز الصوت عندما يكون وضع التجاوز ممكنًا بعد تغيير إمكانات الصوت. - ويمكنك توفير إمكانية التشغيل المباشر لتقنية DTS Express وDTS:X (#335).
- إصلاح الخطأ الذي يحدث فيه تعذُّر بعض عمليات التشغيل عندما تكون تقنية الاتصال النفقي مفعّلة
وتفعيل ميزة
- الفيديو:
- يمكنك ضبط ميزة "
MediaCodecVideoRenderer
" على الإبلاغ عنVideoSize
بعرض وارتفاع 0 عند إيقاف العارض. يتم استدعاءPlayer.Listener.onVideoSizeChanged
وفقًا لذلك عند تغييرPlayer.getVideoSize()
. مع هذا التغيير، يصبح حجم فيديو ExoPlayer معMediaCodecVideoRenderer
بعرض وارتفاع 0 في حال عدم توافقPlayer.getCurrentTracks
مع الفيديو أو لم يتم بعد تحديد حجم الملف المدعوم.
- يمكنك ضبط ميزة "
- إدارة الحقوق الرقمية:
- تقليل ظهور العديد من الطرق الداخلية فقط على
DefaultDrmSession
والتي لا يُتوقع طلبها من خارج حزمة DRM:void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- تقليل ظهور العديد من الطرق الداخلية فقط على
- صانع المحتوى:
- أضِف مكتبة muxer جديدة يمكن استخدامها لإنشاء ملف حاوية MP4.
- إضافة إعلانات الوسائط التفاعلية:
- تفعيل أحداث البث المباشر المستندة إلى DASH متعددة الفترات باستخدام DAI يُرجى العِلم أنّ طريقة التنفيذ الحالية لا تتيح بعد التقديم في أحداث البث المباشر (#10912).
- إصلاح خطأ يتمّ فيه إدراج مجموعة إعلانية جديدة في أحداث البث المباشر بسبب تفاوت موضع المحتوى المحسوب في المخططات الزمنية المتتالية بشكل طفيف.
- الجلسة:
- أضِف طريقة المساعدة
MediaSession.getControllerForCurrentRequest
للحصول على معلومات حول وحدة التحكّم التي تطلب حاليًا طريقةPlayer
. - يمكنك إضافة
androidx.media3.session.MediaButtonReceiver
للسماح للتطبيقات باستئناف التشغيل مع أحداث أزرار الوسائط التي تم إرسالها من خلال سماعة رأس بلوتوث مثلاً (#167). - أضِف عملية التنفيذ التلقائية إلى
MediaSession.Callback.onAddMediaItems
للسماح بتمريرMediaItems
المطلوب إلىPlayer
إذا كانت تتضمّنLocalConfiguration
(مثل معرّف الموارد المنتظم (URI)) (#282). - أضِف زرَّي الأمر "الانتقال إلى السابق" و "الانتقال إلى التالي" في عرض إشعارات الوسائط المكثّف تلقائيًا في نظام التشغيل Android 12 والإصدارات الأقدم (#410).
- أضِف عملية التنفيذ التلقائية إلى
MediaSession.Callback.onAddMediaItems
للسماح بتمريرMediaItems
المطلوب إلىPlayer
إذا كانت تتضمّنLocalConfiguration
(مثل معرّف الموارد المنتظم (URI)) (#282). - أضِف زرَّي الأمر "الانتقال إلى السابق" و "الانتقال إلى التالي" في عرض إشعارات الوسائط المكثّف تلقائيًا في نظام التشغيل Android 12 والإصدارات الأقدم (#410).
- أضِف طريقة المساعدة
- واجهة المستخدم:
- أضف طريقتي الاستخدام
shouldShowPlayButton
وhandlePlayPauseButtonAction
لكتابة عناصر واجهة المستخدم المخصصة باستخدام زر التشغيل/الإيقاف المؤقت.
- أضف طريقتي الاستخدام
- إضافة RTSP:
- إضافة DASH:
- يمكنك إزالة معادلة الوقت للوسائط من
MediaLoadData.startTimeMs
وMediaLoadData.endTimeMs
لأحداث البث من خلال DASH متعدّدة الفترات. - إصلاح الخطأ الذي أدى إلى إنشاء
IndexOutOfBoundsException
(#10838) من خلال إعادة إعداد مصدر وسائط مباشر قائم على فترات متعددة
- يمكنك إزالة معادلة الوقت للوسائط من
- إضافة HLS:
- يمكنك إضافة
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
لضبط مهلة لسلسلة محادثات التحميل من أجل الانتظار حتى يتم إعداد علامةTimestampAdjuster
. إذا لم تكتمل عملية الإعداد قبل انتهاء المهلة، يتم عرضPlaybackException
لتجنُّب توقُّف التشغيل اللا نهائي. ويتم ضبط المهلة على صفر تلقائيًا (#323).
- يمكنك إضافة
- أدوات مساعدة للاختبار:
- تحقَّق من حساسية حالة مخطط معرِّف الموارد المنتظم (URI) في
DataSourceContractTest
.
- تحقَّق من حساسية حالة مخطط معرِّف الموارد المنتظم (URI) في
- أزِل الرموز التي تم إيقافها نهائيًا:
- إزالة التركيبات البرمجية لـ
DefaultAudioSink
، واستخدامDefaultAudioSink.Builder
بدلاً من ذلك. - يمكنك إزالة "
HlsMasterPlaylist
"، واستخدام "HlsMultivariantPlaylist
" بدلاً منها. - إزالة
Player.stop(boolean)
استخدِمPlayer.stop()
وPlayer.clearMediaItems()
(إذا كانت قيمةreset
هيtrue
) بدلاً من ذلك. - يُرجى إزالة مادتَي إنشاء
SimpleCache
متوقّفة نهائيًا، واستخدام دالة إنشاء غير متوقّفة نهائيًا تستخدمDatabaseProvider
بدلاً منها للحصول على أداء أفضل. - أزِل الدالة الإنشائية
DefaultBandwidthMeter
، واستخدِمDefaultBandwidthMeter.Builder
بدلاً منها. - عليك إزالة طرق الإنشاء
DefaultDrmSessionManager
، واستخدامDefaultDrmSessionManager.Builder
بدلاً منها. - أزِل ماكينات إنشاء
HttpDataSource.InvalidResponseCodeException
متوقّفة نهائيًا، واستخدِم دالة إنشاء غير متوقّفة نهائيًا وتقبل حقولاً إضافية(cause
،responseBody
) لتحسين تسجيل الأخطاء. - يمكنك إزالة
DownloadHelper.forProgressive
وDownloadHelper.forHls
وDownloadHelper.forDash
وDownloadHelper.forSmoothStreaming
، واستخدامDownloadHelper.forMediaItem
بدلاً منها. - أزِل الدالة الإنشائية
DownloadService
المتوقّفة نهائيًا، واستخدِم دالة إنشاء غير متوقّفة نهائيًا تتضمّن خيارًا لتوفير مَعلمةchannelDescriptionResourceId
. - عليك إزالة ثوابت السلسلة التي تم إيقافها نهائيًا للأحرف (
ASCII_NAME
وUTF8_NAME
وISO88591_NAME
وUTF16_NAME
وUTF16LE_NAME
)، واستخدام مجموعات أحرف Kotlin من حزمةkotlin.text
، أوjava.nio.charset.StandardCharsets
أوcom.google.common.base.Charsets
بدلاً من ذلك. - أزِل دالة الإنشاء
WorkManagerScheduler
المتوقّفة نهائيًا، واستخدِم دالة إنشاء غير متوقّفة نهائيًا تتضمن خيارًا لتوفير مَعلمةContext
بدلاً من ذلك. - يجب إزالة الطرق التي تم إيقافها نهائيًا، مثل
createVideoSampleFormat
وcreateAudioSampleFormat
وcreateContainerFormat
وcreateSampleFormat
، والتي تم استخدامها لإنشاء مثيل للفئةFormat
. بدلاً من ذلك، استخدِمFormat.Builder
لإنشاء مثيلات منFormat
. - يمكنك إزالة الطرق المتوقّفة نهائيًا
copyWithMaxInputSize
وcopyWithSubsampleOffsetUs
وcopyWithLabel
وcopyWithManifestFormatInfo
وcopyWithGaplessInfo
وcopyWithFrameRate
وcopyWithDrmInitData
وcopyWithMetadata
وcopyWithBitrate
وcopyWithVideoSize
، واستخدامFormat.buildUpon()
وطرق الإعداد بدلاً من ذلك. - أزِل واجهة
ExoPlayer.retry()
المتوقّفة نهائيًا، واستخدِمprepare()
بدلاً منها. - إزالة الدالة الإنشائية لنظام
DefaultTrackSelector
التي تم إيقافها نهائيًا بدون وسيطة، واستخدامDefaultTrackSelector(Context)
بدلاً منها - إزالة الدالة الإنشائية
OfflineLicenseHelper
المتوقّفة نهائيًا، واستخدامOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
بدلاً منها - أزِل الدالة الإنشائية
DownloadManager
المتوقّفة نهائيًا، واستخدِم الدالة الإنشائية التي تستخدِم السمةExecutor
بدلاً منها. - إزالة منصات إنشاء
Cue
المتوقّفة نهائيًا، واستخدامCue.Builder
بدلاً منها - إزالة الدالة الإنشائية
OfflineLicenseHelper
المتوقّفة نهائيًا، واستخدامOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
بدلاً منها - أزِل أربع طُرق
AnalyticsListener
متوقّفة نهائيًا:onDecoderEnabled
، يمكنك استخدامonAudioEnabled
و/أوonVideoEnabled
بدلاً من ذلك.onDecoderInitialized
، يمكنك استخدامonAudioDecoderInitialized
و/أوonVideoDecoderInitialized
بدلاً من ذلك.onDecoderInputFormatChanged
، يمكنك استخدامonAudioInputFormatChanged
و/أوonVideoInputFormatChanged
بدلاً من ذلك.onDecoderDisabled
، يمكنك استخدامonAudioDisabled
و/أوonVideoDisabled
بدلاً من ذلك.
- أزِل السمتَين
Player.Listener.onSeekProcessed
وAnalyticsListener.onSeekProcessed
المتوقّفتَين نهائيًا، واستخدِمonPositionDiscontinuity
معDISCONTINUITY_REASON_SEEK
بدلاً من ذلك. - يمكنك إزالة "
ExoPlayer.setHandleWakeLock(boolean)
" واستخدام "setWakeMode(int)
" بدلاً من ذلك. - إزالة
DefaultLoadControl.Builder.createDefaultLoadControl()
المتوقّفة، واستخدامbuild()
بدلاً من ذلك - أزِل واجهة
MediaItem.PlaybackProperties
المتوقّفة نهائيًا، واستخدِمMediaItem.LocalConfiguration
بدلاً منها. تم إيقاف الحقلMediaItem.playbackProperties
وأصبح الآن من النوعMediaItem.LocalConfiguration
.
- إزالة التركيبات البرمجية لـ
الإصدار 1.1.0-rc01
21 حزيران (يونيو) 2023
استخدام الإصدار الثابت 1.1.0
الإصدار 1.1.0-beta01
7 حزيران (يونيو) 2023
استخدام الإصدار الثابت 1.1.0
الإصدار 1.1.0-alpha01
10 أيار (مايو) 2023
استخدام الإصدار الثابت 1.1.0
الإصدار 1.0.0
الإصدار 1.0.2
18 أيار (مايو) 2023
تم طرح androidx.media3:media3-*:1.0.2
.
يحتوي الإصدار 1.0.2 على عمليات الالتزام هذه.
يتوافق هذا الإصدار مع إصدار ExoPlayer 2.18.7.
يتضمّن هذا الإصدار التغييرات التالية منذ الإصدار 1.0.1:
- المكتبة الأساسية:
- أضِف السمة
Buffer.isLastSample()
التي تشير إلى ما إذا كانت السمةBuffer
تتضمّن علامةC.BUFFER_FLAG_LAST_SAMPLE
. - يجب حلّ المشكلة التي قد تؤدي إلى عدم عرض آخر إطار إذا تم إلغاء ضبط آخر عيّنة تحتوي على إطارات في قائمة المحتوى التالي بدون قراءة عيّنة "نهاية البث". (#11079).
- أضِف السمة
- أدوات استخلاص البيانات:
- إصلاح تحليل H.265 SPS في ملفات MPEG-TS عن طريق إعادة استخدام منطق التحليل الذي تستخدمه بالفعل أدوات استخراج ملفات RTSP وMP4 (#303).
- النص:
- SSA: إتاحة استخدام ملفات UTF-16 إذا كانت تبدأ بعلامة ترتيب بايت (#319).
- الجلسة:
- يجب حلّ المشكلة المتعلّقة بعدم تعديل "
MediaController
" للأوامر المتاحة عند ربطه بنظامMediaSessionCompat
قديم يعدِّل الإجراءات. - يجب إصلاح خطأ منع
MediaLibraryService
من عرض قيمة خالية لاستدعاء من واجهة مستخدم النظام إلىCallback.onGetLibraryRoot
باستخدامparams.isRecent == true
على واجهة برمجة التطبيقات 30 (#355). - إصلاح تسرّب الذاكرة في
MediaSessionService
أوMediaLibraryService
(#346) - إصلاح خطأ قد يؤدي فيه تعديل مجمّع للسمة
Timeline
والموضع فيMediaSession
إلى طرحMediaController
IllegalStateException
.
- يجب حلّ المشكلة المتعلّقة بعدم تعديل "
الإصدار 1.0.1
18 نيسان (أبريل) 2023
تم طرح androidx.media3:media3-*:1.0.1
.
يحتوي الإصدار 1.0.1 على عمليات الالتزام هذه.
ويتوافق هذا الإصدار مع إصدار ExoPlayer 2.18.6.
- المكتبة الأساسية:
- إعادة ضبط تجاهل البث المباشر المستهدَف عند التقديم على الوضع التلقائي (#11051)
- إصلاح الخطأ الذي قد يؤدي فيه إلى توقُّف تشغيل النماذج الفارغة في الوسائط
- الجلسة:
- إصلاح الخطأ الذي يؤدي فيه العديد من العناصر المتطابقة في قائمة الانتظار والتي تم نشرها بواسطة عنصر
MediaSessionCompat
قديم إلى استثناء فيMediaController
(#290). - أضِف ميزة إعادة التوجيه
MediaSession.broadcastCustomCommand
المفقودة إلىMediaControllerCompat.Callback.onSessionEvent
القديمة (#293). - إصلاح الخطأ الذي لا يؤدي فيه طلب "
MediaSession.setPlayer
" إلى تعديل الطلبات المتاحة - يجب حلّ مشكلة تجاهل مثيلات
TrackSelectionOverride
المُرسَلة من "MediaController
" في حال الإشارة إلى مجموعة تحتوي علىFormat.metadata
(#296). - يجب حلّ المشكلة التي تتطلّب إتاحة
Player.COMMAND_GET_CURRENT_MEDIA_ITEM
للوصول إلى البيانات الوصفية من خلال الإصدار القديم منMediaSessionCompat
. - يجب حلّ المشكلة التي تؤدي فيها مثيلات
MediaSession
في سلسلة محادثات في الخلفية إلى حدوث أعطال عند استخدامها فيMediaSessionService
(#318). - إصلاح المشكلة التي أفصحت فيها المكتبة عن مستقبل زر الوسائط بدون أن يقصد التطبيق ذلك (#314)
- إصلاح الخطأ الذي يؤدي فيه العديد من العناصر المتطابقة في قائمة الانتظار والتي تم نشرها بواسطة عنصر
- DASH:
- إصلاح معالجة المخططات الزمنية للشرائح الفارغة (#11014).
- بروتوكول RTSP:
- أعِد المحاولة باستخدام بروتوكول TCP في حال تعذُّر إعداد RTSP باستخدام بروتوكول UDP مع ظهور خطأ RTSP 461 supportedTransport (#11069).
الإصدار 1.0.0
22 آذار (مارس) 2023
تم طرح androidx.media3:media3-*:1.0.0
.
يحتوي الإصدار 1.0.0 على عمليات الالتزام هذه.
ويتوافق هذا الإصدار مع إصدار ExoPlayer 2.18.5.
لا توجد تغييرات منذ 1.0.0-rc02.
الإصدار 1.0.0-rc02
2 آذار (مارس) 2023
تم طرح androidx.media3:media3-*:1.0.0-rc02
.
يحتوي الإصدار 1.0.0-rc02 على هذه عمليات التنفيذ.
ويتوافق هذا الإصدار مع إصدار ExoPlayer 2.18.4.
- المكتبة الأساسية:
- عمليات التنزيل:
- عليك إحداث فرق أقصى في وقت البدء الخاص بالجزأين اللذين سيتم
دمجهما والقابلَين للضبط في
SegmentDownloader
والفئات الفرعية (#248).
- عليك إحداث فرق أقصى في وقت البدء الخاص بالجزأين اللذين سيتم
دمجهما والقابلَين للضبط في
- الصوت:
- الفيديو:
- اربط تنسيق HEVC HDR10 بـ
HEVCProfileMain10HDR10
بدلاً منHEVCProfileMain10
. - يمكنك إضافة حل بديل لمشكلة في الجهاز على "Chromecast مع Google TV" وLenovo M10 FHD Plus، وتتسبب في وضع علامة "غير متوافق" على أحداث البث بتنسيق AVC بمعدّل 60 لقطة في الثانية (#10898).
- أصلِح مشاكل أداء إصدار الإطارات عند تشغيل الوسائط بمعدّل إطارات أعلى بكثير من معدّل تحديث الشاشة.
- اربط تنسيق HEVC HDR10 بـ
- طاقم العمل:
- إصلاح
STATE_IDLE
المؤقت عند الانتقال بين عناصر الوسائط (#245).
- إصلاح
- بروتوكول RTSP:
- رصد الخطأ LEGALArgumentException الذي تم عرضه أثناء تحليل بروتوكول RTSP غير صالح وصف رسائل الاستجابة (#10971).
- الجلسة:
- إصلاح خطأ عدم تحديث زر تشغيل/إيقاف الإشعارات حسب حالة المشغّل (#192)
- إضافة إعلانات الوسائط التفاعلية:
- أصلِح خطأ منع بدء بث DAI بدون أي إعلانات،
لأنّه لم يتم استلام حدث
LOADED
الأول (وفي حال عدم عرض إعلانات فقط).
- أصلِح خطأ منع بدء بث DAI بدون أي إعلانات،
لأنّه لم يتم استلام حدث
الإصدار 1.0.0-rc01
16 شباط (فبراير) 2023
تم طرح androidx.media3:media3-*:1.0.0-rc01
.
يحتوي الإصدار 1.0.0-rc01 على هذه عمليات التنفيذ.
ويتوافق هذا الإصدار مع إصدار ExoPlayer 2.18.3.
- المكتبة الأساسية:
- تعديل منطق الترتيب في برنامج فك ترميز العارض للتوافق مع إعدادات "
MediaCodecSelector
" المفضّلة، حتى إذا أبلغ برنامج فك الترميز بأنه قد لا يتمكن من تشغيل الوسائط بشكل جيد فعلى سبيل المثال، باستخدام المحدِّد التلقائي، سيتم تفضيل برنامج فك ترميز الأجهزة الذي يوفّر دعمًا وظيفيًا فقط على برنامج فك ترميز البرامج الذي يتوافق بالكامل مع التنسيق (#10604). - أضِف
ExoPlayer.Builder.setPlaybackLooper
التي تضبط سلسلة محادثات حالية لمثيل ExoPlayer الجديد. - السماح بمحو أدوات مساعدة إدارة التنزيل (#10776).
- أضِف مَعلمة إلى
BasePlayer.seekTo
للإشارة أيضًا إلى الأمر المستخدَم في التقديم/الترجيع. - يمكنك استخدام المظهر عند تحميل عناصر للرسم على الإصدار 21 من واجهة برمجة التطبيقات أو الإصدارات الأحدث (#220).
- أضِف
ConcatenatingMediaSource2
الذي يسمح بدمج عدة عناصر وسائط في نافذة واحدة (#247).
- تعديل منطق الترتيب في برنامج فك ترميز العارض للتوافق مع إعدادات "
- أدوات استخلاص البيانات:
- يمكنك عرض
ParserException
بدلاً منNullPointerException
إذا كان جدول العينة (stbl) يفتقد إلى وصف مطلوب للعيّنة (stsd) عند تحليل ذرات البيانات. - يمكنك تخطّي العيّنات بشكل صحيح عند التقديم مباشرةً إلى إطار مزامنة في fMP4 (#10941).
- يمكنك عرض
- الصوت:
- استخدِم معدل نقل البيانات لتنسيق الصوت المضغوط لاحتساب الحد الأدنى لحجم المخزن المؤقت
لـ
AudioTrack
في عمليات التشغيل المباشرة (المرور).
- استخدِم معدل نقل البيانات لتنسيق الصوت المضغوط لاحتساب الحد الأدنى لحجم المخزن المؤقت
لـ
- النص:
- يجب حل مشكلة تمرير
TextRenderer
فهرسًا (سلبيًا) غير صالح إلىSubtitle.getEventTime
إذا كان ملف الترجمة والشرح لا يحتوي على أي إشارات. - SubRip: يمكنك إتاحة استخدام ملفات UTF-16 إذا كانت تبدأ بعلامة ترتيب بايت.
- يجب حل مشكلة تمرير
- البيانات الوصفية:
- تحليل القيم المتعدّدة المفصولة فارغًا من إطارات ID3، على النحو المسموح به في الإصدار 2.4 من ID3.
- أضِف
MediaMetadata.mediaType
للإشارة إلى نوع المحتوى أو نوع المجلد الموصوف في البيانات الوصفية. - إضافة
MediaMetadata.isBrowsable
كبديل لـMediaMetadata.folderType
وسيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
- DASH:
- يمكنك إضافة تحليل كامل لمجموعات تعديل الصور، بما في ذلك أعداد المربّعات (#3752).
- واجهة المستخدم:
- يجب حلّ المشاكل المتعلّقة بالإيقاف النهائي
PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener)
لضمان نقل التغييرات في إذن الوصول إلى المستمع المسجَّل (#229). - يجب إصلاح ترتيب عناصر التحكم في المشغّل الأوسط في
PlayerView
عند استخدام تنسيق من اليمين إلى اليسار (RTL) (#227).
- يجب حلّ المشاكل المتعلّقة بالإيقاف النهائي
- الجلسة:
- أضِف ملخّص
SimpleBasePlayer
للمساعدة في تنفيذ واجهةPlayer
للمشغّلات المخصّصة. - يمكنك إضافة طريقة مساعدة لتحويل الرمز المميّز لجلسة النظام الأساسي إلى Media3
SessionToken
(#171). - استخدِم
onMediaMetadataChanged
لتشغيل تحديثات جلسة وسائط النظام الأساسي (#219). - أضِف جلسة الوسائط كوسيطة في
getMediaButtons()
للسمةDefaultMediaNotificationProvider
واستخدِم القوائم غير القابلة للتغيير للإيضاح (#216). - يمكنك إضافة أداة معالجة معاودة الاتصال عبر
onSetMediaItems
لتوفير وسائل تعديل وضبط قائمةMediaItem
، وبدء الفهرس وموضعه حسب الجلسة قبل ضبط المشغّل (#156). - تجنَّب اكتشاف النقر مرّتين لأحداث أزرار الوسائط التي لا تستخدم بلوتوث (#233).
- اجعل
QueueTimeline
أكثر قوة في حال حالة جلسة قديمة مظللة (#241).
- أضِف ملخّص
- البيانات الوصفية:
- تحليل القيم المتعدّدة المفصولة فارغًا من إطارات ID3، على النحو المسموح به في الإصدار 2.4 من ID3.
- أضِف
MediaMetadata.mediaType
للإشارة إلى نوع المحتوى أو نوع المجلد الموصوف في البيانات الوصفية. - إضافة
MediaMetadata.isBrowsable
كبديل لـMediaMetadata.folderType
وسيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
- إضافة البثّ:
- نقل إصدار حزمة تطوير البرامج (SDK) لجهاز Google Cast إلى الإصدار 21.2.0
- إضافة إعلانات الوسائط التفاعلية:
- يمكنك إزالة مستمع المشغّل إلى
ImaServerSideAdInsertionMediaSource
في سلسلة محادثات التطبيق لتجنُّب مشاكل سلاسل المحادثات. - يمكنك إضافة السمة
focusSkipButtonWhenAvailable
إلىImaServerSideAdInsertionMediaSource.AdsLoader.Builder
لطلب التركيز على زر التخطّي على أجهزة التلفزيون وضبطه على "صحيح" تلقائيًا. - أضِف طريقة
focusSkipButton()
إلىImaServerSideAdInsertionMediaSource.AdsLoader
لطلب التركيز على زر التخطّي آليًا. - ترقية إصدار حزمة تطوير البرامج لإعلانات الوسائط التفاعلية إلى الإصدار 3.29.0
- يمكنك إزالة مستمع المشغّل إلى
- التطبيق التجريبي:
- طلب إذن إرسال الإشعارات لإشعارات التنزيل في وقت التشغيل (#10884)
الإصدار 1.0.0-beta03
22 تشرين الثاني (نوفمبر) 2022
تم طرح androidx.media3:media3-*:1.0.0-beta03
.
يحتوي الإصدار 1.0.0-beta03 على عمليات التنفيذ هذه.
ويتوافق هذا الإصدار مع إصدار ExoPlayer 2.18.2.
- المكتبة الأساسية:
- يمكنك إضافة
ExoPlayer.isTunnelingEnabled
للتحقق مما إذا كان الاتصال النفقي مفعّلاً للمسارات المحدَّدة حاليًا (#2518). - إضافة
WrappingMediaSource
لتبسيط التفافMediaSource
واحدة (#7279). - تجاهل المخزن المؤقت قبل توقف التشغيل بسبب نقص الذاكرة المتاحة.
- إغلاق كتلة التتبع "doSomeWork" عند تفعيل التحميل.
- يمكنك إصلاح مشكلة تتبُّع الجلسات باستخدام ميزة التقديم السريع في
PlaybackStatsListener
(#180). - إرسال رسالة معاودة الاتصال من
onMediaItemTransition
عند طلبseekToNext
أوseekToPrevious
في قائمة تشغيل تتضمن عنصرًا واحدًا (#10667). - أضِف
Player.getSurfaceSize
التي تعرض حجم السطح الذي يتم عرض الفيديو عليه. - إصلاح الخطأ الذي قد تؤدي فيه إزالة المستمعين أثناء إصدار المُشغِّل إلى
IllegalStateException
(#10758).
- يمكنك إضافة
- الإصدار:
- يمكنك فرض قيمة الحد الأدنى
compileSdkVersion
لتجنُّب أخطاء التجميع (#10684). - تجنَّب كتلة النشر عند تضمينها في إصدار Gradle آخر.
- يمكنك فرض قيمة الحد الأدنى
- اختيار المقطع الصوتي:
- تفضيل المسارات الأخرى لاستخدام Dolby Vision إذا كان العرض لا يتيح ذلك. (#8944)
- عمليات التنزيل:
- الفيديو:
- جرِّب استخدام برنامج فك ترميز بديل لتطبيق Dolby Vision إذا كان جهازك لا يتوافق مع هذا البرنامج. (#9794).
- الصوت:
- استخدِم
SingleThreadExecutor
لإصدار مثيلات الـAudioTrack
لتجنُّب ظهور أخطاء OutOfMemory عند طرح عدة مشغّلات في الوقت نفسه (#10057). - تضيف السمة
AudioOffloadListener.onExperimentalOffloadedPlayback
الخاصة بحالة نقل بيانات AudioTrack. (#134) - جعل
AudioTrackBufferSizeProvider
واجهة عامة. - أضِف
ExoPlayer.setPreferredAudioDevice
لضبط جهاز إخراج الصوت المفضّل (#135). - إعادة تسمية "
androidx.media3.exoplayer.audio.AudioProcessor
" إلىandroidx.media3.common.audio.AudioProcessor
- اربط صوت 8 قنوات و12 قناة بأقنعة القناة 7.1 و7.1.4 على التوالي في جميع إصدارات Android (#10701).
- استخدِم
- البيانات الوصفية:
- يمكن الآن إعداد
MetadataRenderer
لعرض البيانات الوصفية فور توفّرها. يمكنك إنشاء مثيل باستخدامMetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)
لتحديد ما إذا كان العارض سيخرج البيانات الوصفية في وقت مبكر أو بالتزامن مع موضع المشغّل.
- يمكن الآن إعداد
- إدارة الحقوق الرقمية:
- يجب معالجة خطأ في تنفيذ KeyKey في نظام التشغيل Android 13 الذي يعرض عنوان URL للترخيص غير فارغ ولكنه غير صالح.
- إصلاح الخطأ
setMediaDrmSession failed: session not opened
عند التبديل بين أنظمة إدارة الحقوق الرقمية (DRM) في قائمة تشغيل (على سبيل المثال، من Widevine إلىClearKey)
- النص:
- CEA-608: تأكَّد من التعامل مع أوامر تبديل الخدمة في الحقل 2 بشكل صحيح (#10666).
- DASH:
- تحليل
EventStream.presentationTimeOffset
من البيانات (#10460).
- تحليل
- واجهة المستخدم:
- يمكنك استخدام إجراءات الإلغاء الحالية للمشغّل كما تم إعدادها مسبقًا في
TrackSelectionDialogBuilder
(#10429).
- يمكنك استخدام إجراءات الإلغاء الحالية للمشغّل كما تم إعدادها مسبقًا في
- الجلسة:
- تأكَّد من تنفيذ الأوامر دائمًا بالترتيب الصحيح حتى إذا كان بعضها يتطلب دقة غير متزامنة (#85).
- أضِف
DefaultMediaNotificationProvider.Builder
لإنشاءDefaultMediaNotificationProvider
مثيل. يمكن لأداة الإنشاء ضبط معرّف الإشعار ومعرّف قناة الإشعارات واسم قناة الإشعارات التي يستخدمها الموفِّر. يمكنك أيضًا إضافة طريقةDefaultMediaNotificationProvider.setSmallIcon(int)
لضبط رمز صغير للإشعارات. (#104) - تأكَّد من عدم تجاهل الأوامر المُرسَلة قبل
MediaController.release()
(#99). - بإمكان
SimpleBitmapLoader
تحميل صورة نقطية من معرّفات الموارد المنتظمة (URI) لـfile://
(#108). - إصلاح التأكيد الذي يمنع
MediaController
من تقديم طلب خلال فترة زمنية (#122). - عند انتهاء التشغيل، يتم إيقاف
MediaSessionService
من المقدّمة ويتم عرض إشعار لإعادة تشغيل آخر عنصر وسائط تم تشغيله (#112). - عدم بدء خدمة تعمل في المقدّمة وتتضمن طلبًا في انتظار المراجعة للإيقاف المؤقت (#167).
- إخفاء "الشارة" المرتبطة بالإشعار الذي تم إنشاؤه من قِبل "
DefaultNotificationProvider
" يدويًا على واجهة برمجة التطبيقات 26 وواجهة برمجة التطبيقات 27 (يتم إخفاء الشارة تلقائيًا على الإصدار 28 من واجهة برمجة التطبيقات والإصدارات الأحدث) (#131). - إصلاح الخطأ الذي يتسبب فيه اتصال المثبت الثاني من MediaSession القديمة إلى Media3 MediaController ويتسبب في UnknownStateExceptions (#49).
- بروتوكول RTSP:
- إعلانات الوسائط التفاعلية:
- أضِف مهلة لتحميل معلومات الإعلان لمعالجة الحالات التي تتعطّل فيها حزمة تطوير البرامج لإعلانات الوسائط التفاعلية (#10510).
- عدم تخطّي الإعلانات أثناء التشغيل عند التقديم/الترجيع إلى نهاية المحتوى (#10685)
- احتسب المدة الزمنية بشكل صحيح لأحداث البث المباشر التي تتضمّن إعلانات مدرَجة من جهة الخادم، مثل إدراج إعلان ديناميكي لإعلانات الوسائط التفاعلية (#10764).
- إضافة FFmpeg:
- أضِف العلامات المطلوبة حديثًا لربط مكتبات FFmpeg بالإصدار 23.1.7779620 والإصدارات الأحدث (#9933).
- إضافة AV1:
- يجب تحديث إصدار CMake لتجنُّب حالات عدم التوافق مع أحدث إصدارات "استوديو Android" (#9933).
- إضافة البثّ:
- نفِّذ
getDeviceInfo()
لتتمكَّن من تحديدCastPlayer
عند التحكّم في التشغيل باستخدامMediaController
(#142).
- نفِّذ
- المحوِّل:
- يمكنك إضافة موقّت مراقب النظام الشامل لاكتشاف ما إذا كان إنشاء عينة إخراج بطيء جدًا.
- أزِل الرموز التي تم إيقافها نهائيًا:
- إزالة
Transformer.Builder.setOutputMimeType(String)
تمت إزالة هذه الميزة. وسيكون نوع MIME دائمًا بتنسيق MP4 عند استخدام المُخرِج التلقائي.
- إزالة
الإصدار 1.0.0-beta02
21 تموز (يوليو) 2022
تم طرح androidx.media3:media3-*:1.0.0-beta02
.
يحتوي الإصدار 1.0.0-beta02 على عمليات التنفيذ هذه.
ويتوافق هذا الإصدار مع إصدار ExoPlayer 2.18.1.
- المكتبة الأساسية:
- احرص على أن يؤدي تغيير
ShuffleOrder
باستخدامExoPlayer.setShuffleOrder
إلى طلب الرقمPlayer.Listener#onTimelineChanged
باستخدامreason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
(#9889). - بالنسبة إلى الوسائط التقدّمية، يمكنك تضمين المقاطع الصوتية المحدَّدة فقط في موضع التخزين المؤقت (#10361).
- السماح ببرنامج المسجّل المخصص لجميع مخرجات سجل ExoPlayer (#9752).
- إصلاح تنفيذ
setDataSourceFactory
فيDefaultMediaSourceFactory
، والذي كان لا يعمل في بعض الحالات (#116).
- احرص على أن يؤدي تغيير
- أدوات استخلاص البيانات:
- DASH:
- تحليل عنوان URL لترخيص FreeKey من البيانات (#10246)
- واجهة المستخدم:
- تأكَّد من أنّ ميزة TalkBack تتضمّن خيار السرعة النشط حاليًا في قائمة عناصر التحكّم في التشغيل (#10298).
- بروتوكول RTSP:
- أضِف معالجة حزم VP8 المجزأة (#110).
- إضافة Leanback:
- يمكنك الاطّلاع على التغييرات في
playWhenReady
فيLeanbackAdapter
(10420).
- يمكنك الاطّلاع على التغييرات في
- طاقم العمل:
الإصدار 1.0.0-beta01
16 حزيران (يونيو) 2022
تم طرح androidx.media3:media3-*:1.0.0-beta01
.
يحتوي الإصدار 1.0.0-beta01 على عمليات التنفيذ هذه.
ويتوافق هذا مع إصدار ExoPlayer 2.18.0.
- المكتبة الأساسية:
- يمكنك تفعيل إمكانية استخدام بيانات تشخيص نظام Android الأساسي من خلال
MediaMetricsManager
. سيعيد ExoPlayer توجيه أحداث التشغيل وبيانات الأداء إلى النظام الأساسي، ما يساعد في توفير معلومات عن أداء النظام وتصحيح الأخطاء على الجهاز. ويمكن أن تجمع Google هذه البيانات أيضًا إذا تم تفعيل مشاركة بيانات الاستخدام والتشخيص من قِبل مستخدم الجهاز. يمكن للتطبيقات إيقاف المساهمة في بيانات تشخيص النظام الأساسي لـ ExoPlayer من خلالExoPlayer.Builder.setUsePlatformDiagnostics(false)
. - إصلاح الخطأ الذي يؤدي إلى إعادة ضبط المقاطع الصوتية بمعدّل مرتفع عند استخدام
MergingMediaSource
، على سبيل المثال، عند تثبيت مقاطع الترجمة من مصدر غير معروف وتغيير الترجمة المحدّدة في منتصف التشغيل (#10248). - التوقّف عن رصد نوع شبكة 5G-NSA على كل من واجهة برمجة التطبيقات 29 وواجهة برمجة التطبيقات 30 وستفترض عمليات التشغيل هذه توفر شبكة الجيل الرابع.
- عدم السماح بتمرير
null
إلىMediaSource.Factory.setDrmSessionManagerProvider
وMediaSource.Factory.setLoadErrorHandlingPolicy
. ويمكن تمرير أمثلةDefaultDrmSessionManagerProvider
وDefaultLoadErrorHandlingPolicy
بشكل صريح إذا لزم الأمر. - يمكنك إضافة
MediaItem.RequestMetadata
لتمثيل البيانات الوصفية اللازمة لتشغيل الوسائط عندما لا يكونLocalConfiguration
الدقيق معروفًا. يُرجى إزالة "MediaMetadata.mediaUrl
" أيضًا لأنّ هذه الميزة مضمّنة الآن في "RequestMetadata
". - يمكنك إضافة السمة
Player.Command.COMMAND_SET_MEDIA_ITEM
للسماح للّاعبين بضبط عنصر واحد.
- يمكنك تفعيل إمكانية استخدام بيانات تشخيص نظام Android الأساسي من خلال
- اختيار المقطع الصوتي:
- تنظيم الصف
TrackSelectionOverrides
إلىTrackSelectionParameters
، وترقيةTrackSelectionOverride
إلى فئة من المستوى الأعلى. - إعادة تسمية "
TracksInfo
" إلى "Tracks
" و"TracksInfo.TrackGroupInfo
" إلىTracks.Group
تمت أيضًا إعادة تسمية "Player.getCurrentTracksInfo
" و"Player.Listener.onTracksInfoChanged
" إلى "Player.getCurrentTracks
" و"Player.Listener.onTracksChanged
". يشمل ذلك "إلغاء الإيقاف النهائي" لاسم طريقةPlayer.Listener.onTracksChanged
، ولكن مع أنواع مختلفة من المَعلمات. - يمكنك تغيير
DefaultTrackSelector.buildUponParameters
وDefaultTrackSelector.Parameters.buildUpon
للعودة إلىDefaultTrackSelector.Parameters.Builder
بدلاً منDefaultTrackSelector.ParametersBuilder
المتوقّفة. - أضِف علامة التبويب
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities
التي تكون مفعَّلة تلقائيًا. عند تفعيل هذه السياسة، سيفضِّلDefaultTrackSelector
المقاطع الصوتية التي لا يتجاوز عدد قنواتها إمكانيات إخراج الأجهزة. بالنسبة إلى الأجهزة المحمولة، سيتم تفضيلDefaultTrackSelector
على تنسيقات الصوت الاستيريو/الأحادية على تنسيقات الصوت المتعددة القنوات، إلا إذا كان من الممكن تحديد موضعها (الإصدار 12L والإصدارات الأحدث من Android) أو إذا كان تنسيق الصوت المحيطي Dolby. بالإضافة إلى ذلك، على الأجهزة التي تتيح تحديد مكاني الصوت، سيرصدDefaultTrackSelector
التغيُّرات في خصائص المحدِّد المكاني وسيتم اختيار مقطع صوتي جديد بناءً عليها. يتم استبعاد الأجهزة التي تتضمّنtelevision
وضع واجهة المستخدم من هذه القيود، ويُفضّل استخدام التنسيق الذي يتضمّن أكبر عدد من القنوات. لتفعيل هذه الميزة، يجب إنشاء المثيلDefaultTrackSelector
باستخدامContext
.
- تنظيم الصف
- الفيديو:
- إعادة تسمية "
DummySurface
" إلى "PlaceholderSurface
" - يمكنك إضافة دعم AV1 إلى
MediaCodecVideoRenderer.getCodecMaxInputSize
.
- إعادة تسمية "
- الصوت:
- استخدام برنامج فك ترميز الصوت LG AC3 الذي يروّج لنوع MIME غير عادي
- تغيير نوع إرجاع
AudioAttributes.getAudioAttributesV21()
منandroid.media.AudioAttributes
إلى فئة برامج تضمينAudioAttributesV21
جديدة لتجنّب بطء التحقق من خلال ART على واجهة برمجة التطبيقات < 21 - يمكنك إرسال طلب بحث إلى النظام الأساسي (واجهة برمجة التطبيقات 29+ ) أو افتراض عدد قنوات ترميز الصوت لانتقال الصوت عند عدم ضبط عدد القنوات الصوتية بالتنسيق، وهو ما يحدث عند إجراء الإعداد المقسّم باستخدام بروتوكول HLS (10204).
- ضبط
AudioTrack
مع قناع القناةAudioFormat.CHANNEL_OUT_7POINT1POINT4
إذا أخرجت أداة فك الترميز صوت PCM بقيمة 12 قناة (#10322
- إدارة الحقوق الرقمية
- التأكّد دائمًا من تعديل جلسة إدارة الحقوق الرقمية بشكل صحيح عند التقديم/الترجيع مباشرةً بعد تغيير التنسيق (10274)
- النص:
- يمكنك تغيير
Player.getCurrentCues()
لعرضCueGroup
بدلاً منList<Cue>
. - SSA: إتاحة إعداد النمط
OutlineColour
عند ضبطBorderStyle == 3
(أي ضبطOutlineColour
على خلفية الإشارة) (#8435). - CEA-708: تحليل البيانات إلى مجموعات خدمات متعددة وتجاهل المجموعات غير المرتبطة برقم الخدمة المحدد حاليًا.
- إزالة
RawCcExtractor
الذي تم استخدامه فقط للتعامل مع تنسيق الترجمة داخليًا من Google.
- يمكنك تغيير
- أدوات استخلاص البيانات:
- واجهة المستخدم:
- أصلِح تسليم الأحداث إلى
OnClickListener
التي تم ضبطها فيPlayerView
في الحالة التالية:useController=false
(#9605). أصلِح أيضًا تسليم الأحداث إلىOnLongClickListener
لجميع إعدادات الملفات الشخصية. - إصلاح التعامل غير الصحيح مع تسلسل أحداث اللمس التي تخرج من حدود
PlayerView
قبلACTION_UP
كنقرة (#9861). - يجب حل مشكلة إمكانية الوصول إلى
PlayerView
حيث قد يؤدي النقر على زر التشغيل إلى إيقاف التشغيل بدلاً من إخفاء عناصر التحكم (#8627). - أعِد كتابة
TrackSelectionView
وTrackSelectionDialogBuilder
للعمل مع واجهةPlayer
بدلاً منExoPlayer
. ويتيح ذلك استخدام طرق العرض مع عمليات تنفيذPlayer
الأخرى، وإزالة التبعية من وحدة واجهة المستخدم إلى وحدة ExoPlayer. هذا تغيير كبير. - عدم إظهار المقاطع الصوتية التي يتم فرض عرضها في أداة اختيار مسار
PlayerView
، والاحتفاظ بمسار نص مفروض مناسب ومختارًا في حال اختيار "بدون" (#9432).
- أصلِح تسليم الأحداث إلى
- DASH:
- تحليل عدد القنوات من عناصر DTS
AudioChannelConfiguration
ويؤدي ذلك إلى إعادة تفعيل مرور الصوت في مجموعات البث عبر DTS (#10159). - عدم السماح بتمرير
null
إلىDashMediaSource.Factory.setCompositeSequenceableLoaderFactory
. ويمكن تمرير مثيلاتDefaultCompositeSequenceableLoaderFactory
صراحةً إذا لزم الأمر.
- تحليل عدد القنوات من عناصر DTS
- بروتوكول HLS:
- يمكنك الرجوع إلى طريقة التحضير المقسّمة إذا لم تكن سمة قائمة التشغيل CODECS تحتوي على برنامج ترميز الصوت (#10065).
- عدم السماح بتمرير
null
إلىHlsMediaSource.Factory.setCompositeSequenceableLoaderFactory
وHlsMediaSource.Factory.setPlaylistParserFactory
وHlsMediaSource.Factory.setPlaylistTrackerFactory
. يمكن نقل مثيلاتDefaultCompositeSequenceableLoaderFactory
أوDefaultHlsPlaylistParserFactory
أو مرجع إلىDefaultHlsPlaylistTracker.FACTORY
بشكل صريح إذا لزم الأمر.
- البث السلس:
- عدم السماح بتمرير
null
إلىSsMediaSource.Factory.setCompositeSequenceableLoaderFactory
. ويمكن تمرير مثيلاتDefaultCompositeSequenceableLoaderFactory
صراحةً إذا لزم الأمر.
- عدم السماح بتمرير
- بروتوكول RTSP:
- أضِف قارئ RTP لـ H263 (#63).
- أضِف قارئ RTP لـ MPEG4 (#35).
- أضِف قارئ RTP لـ HEVC (#36).
- إضافة قارئ RTP لـ AMR في الوقت الحالي، لا تتوفّر سوى أحداث البث بتقنية AMR الأحادية القناة وغير التبادلية. حمولة AMR RTP المركّبة غير متوافقة. (#46)
- أضِف قارئ RTP لـ VP8 (#47).
- أضِف قارئ RTP لـ WAV (#56).
- إصلاح عنوان التفويض الأساسي لـ RTSP. (#9544)
- توقف عن التحقق من حقول SDP الإلزامية نظرًا لأن ExoPlayer لا يحتاجها (#10049).
- عرض الاستثناء المحدد عند تحليل توقيت RTSP (#10165).
- يمكنك إضافة قارئ بروتوكول النقل في الوقت الفعلي (RTP) لـ VP9 (#47).
- أضِف قارئ RTP لتطبيق OPUS (#53).
- مصادر البيانات:
- إعادة تسمية "
DummyDataSource
" إلى "PlaceholderDataSource
" - يمكنك حل المشكلة من خلال معالجة مقاطعة OkHttp.
- إعادة تسمية "
- الجلسة:
- استبدِل
MediaSession.MediaItemFiller
بـMediaSession.Callback.onAddMediaItems
للسماح بالحل غير المتزامن للطلبات. - يمكنك استخدام طرق
setMediaItems(s)
عند اتصالMediaController
بجلسة وسائط قديمة. - إزالة
MediaController.setMediaUri
وMediaSession.Callback.onSetMediaUri
يمكن تنفيذ الوظيفة نفسها باستخدامMediaController.setMediaItem
وMediaSession.Callback.onAddMediaItems
. - يمكنك إعادة توجيه مكالمات
MediaController
القديمة لتشغيل الوسائط إلى "MediaSession.Callback.onAddMediaItems
" بدلاً من "onSetMediaUri
". - يمكنك إضافة
MediaNotification.Provider
وDefaultMediaNotificationProvider
لتخصيص الإشعار. - أضِف
BitmapLoader
وSimpleBitmapLoader
لتنزيل صور الأعمال الفنية. - أضِف
MediaSession.setCustomLayout()
للتوافق مع الأنظمة القديمة مع الجلسة القديمة. - أضِف
MediaSession.setSessionExtras()
لتحقيق التكافؤ بين الميزات في الجلسة القديمة. - إعادة تسمية "
MediaSession.MediaSessionCallback
" إلى "MediaSession.Callback
" و"MediaLibrarySession.MediaLibrarySessionCallback
" إلى "MediaLibrarySession.Callback
" و"MediaSession.Builder.setSessionCallback
" إلى "setCallback
". - إصلاح NPE في
MediaControllerImplLegacy
(#59). - عدِّل معلومات موضع الجلسة عند تغيير المخطط الزمني(#51).
- إصلاح NPE في
MediaControllerImplBase
بعد إطلاق وحدة التحكّم (#74).
- استبدِل
- تشغيل الإعلان / إعلانات الوسائط التفاعلية:
- عليك تقليل معدّل استطلاع الإعلانات من كل 100 ملي ثانية إلى كل 200 ملي ثانية، للتوافق مع اقتراحات مجلس تقييم الوسائط (MRC).
- إضافة FFmpeg:
- يجب تحديث إصدار CMake إلى
3.21.0+
لتجنُّب حدوث خطأ CMake يتسبَّب في تعذُّر مزامنة Gradle في Android Studio (#9933).
- يجب تحديث إصدار CMake إلى
- أزِل الرموز التي تم إيقافها نهائيًا:
- إزالة
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
استخدِمPlayer.Listener.onTracksChanged(Tracks)
بدلاً من ذلك. - إزالة
Player.getCurrentTrackGroups
وPlayer.getCurrentTrackSelections
استخدِمPlayer.getCurrentTracks
بدلاً من ذلك. يمكنك أيضًا مواصلة استخدامExoPlayer.getCurrentTrackGroups
وExoPlayer.getCurrentTrackSelections
، مع العلم أنّ هاتَين الطريقتَين ستظلا متوقفتَين. - إزالة
DownloadHelper
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
وDEFAULT_TRACK_SELECTOR_PARAMETERS
ثابتَين استخدِم السمةgetDefaultTrackSelectorParameters(Context)
بدلاً منها إن أمكن وDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT
بدلاً من ذلك. - إزالة الدالة الإنشائية
DefaultTrackSelector(ExoTrackSelection.Factory)
يمكنك استخدامDefaultTrackSelector(Context, ExoTrackSelection.Factory)
كبديل. - إزالة
Transformer.Builder.setContext
ويجب تمريرContext
إلى الدالة الإنشائيةTransformer.Builder
بدلاً من ذلك.
- إزالة
الإصدار 1.0.0-alpha03
14 آذار (مارس) 2022
تم طرح androidx.media3:media3-*:1.0.0-alpha03
.
يحتوي الإصدار 1.0.0-alpha03 على هذه عمليات التنفيذ.
ويتوافق هذا مع إصدار ExoPlayer 2.17.1.
- الصوت:
- إصلاح خطأ أثناء التحقّق من إمكانات الصوت في Dolby Atmos (E-AC3-JOC) في HLS
- أدوات استخلاص البيانات:
- FMP4: حل مشكلة إمكانية إخراج البيانات الوصفية لعيّنة الرسالة الإلكترونية بترتيب غير صحيح لأحداث البث التي تحتوي على ذرات الرسالة الإلكترونية v0 وv1 (#9996).
- النص:
- يجب إصلاح التفاعل بين
SingleSampleMediaSource.Factory.setTrackId
وMediaItem.SubtitleConfiguration.Builder.setId
لمنح الأولوية للحقلSubtitleConfiguration
والرجوع إلى القيمةFactory
إذا لم يتم ضبطها (#10016).
- يجب إصلاح التفاعل بين
- تشغيل الإعلان:
- حلّ مشكلة انخفاض عدد المقاطع الصوتية بين فترات الإعلان في أحداث البث المباشر المستندة إلى HLS SSAI
الإصدار 1.0.0-alpha02
2 آذار (مارس) 2022
تم طرح androidx.media3:media3-*:1.0.0-alpha02
.
يحتوي الإصدار 1.0.0-alpha02 على عمليات التنفيذ هذه.
ويتوافق هذا مع إصدار ExoPlayer 2.17.0.
- المكتبة الأساسية:
- أضِف طريقة محمية
DefaultRenderersFactory.getCodecAdapterFactory()
حتى تتمكّن الفئات الفرعية منDefaultRenderersFactory
التي تلغيbuildVideoRenderers()
أوbuildAudioRenderers()
من الوصول إلى مصنع محوّل الترميز وتمريرها إلىMediaCodecRenderer
مثيلات التي تم إنشاؤها. - انشر حقلي العنوان ICY
name
وgenre
فيMediaMetadata.station
وMediaMetadata.genre
على التوالي حتى يتمكنوا من الوصول إلى التطبيق من خلالPlayer.Listener.onMediaMetadataChanged()
(#9677). - يمكنك إزالة المفاتيح الفارغة من
DefaultHttpDataSource#getResponseHeaders
. - السكون وإعادة المحاولة عند تعذُّر إنشاء مثيل
MediaCodec
. ويعمل ذلك على حل مشكلة تحدث على بعض الأجهزة عند تبديل سطح من برنامج ترميز آمن إلى برنامج ترميز آخر (#8696). - أضِف
MediaCodecAdapter.getMetrics()
للسماح للمستخدمين بالحصول على بيانات المقاييس منMediaCodec
. (#9766). - إصلاح دقة تبعية Maven (#8353).
- أوقِف التعديل التلقائي للسرعة في أحداث البث المباشر التي لا تتضمّن ميزات وقت الاستجابة المنخفض أو لا يطلب المستخدم ضبط السرعة (#9329).
- إعادة تسمية "
DecoderCounters#inputBufferCount
" إلى "queuedInputBufferCount
" - جعل
SimpleExoPlayer.renderers
خاصًا. يمكن الوصول إلى العارضين من خلالExoPlayer.getRenderer
. - تم تعديل بعض قيم
AnalyticsListener.EventFlags
الثابتة لمطابقة القيم فيPlayer.EventFlags
. - قسِّم
AnalyticsCollector
إلى واجهة وتنفيذ تلقائي للسماح بإزالتها بواسطة R8 إذا كان التطبيق لا يحتاج إليها.
- أضِف طريقة محمية
- اختيار المقطع الصوتي:
- إتاحة علامات تحديد الأدوار المفضّلة للفيديو عند اختيار المقطع الصوتي (#9402)
- عدِّل منطق اختيار المقطع الصوتي للفيديو لمراعاة أنواع MIME المفضّلة وعلامات الأدوار عند اختيار عدة مقاطع فيديو لتعديلها (#9519).
- عدِّل منطق اختيار الفيديو والمقطع الصوتي ليتم فقط اختيار التنسيقات للخيارات التكيفية التي لها المستوى نفسه من برنامج فك الترميز ودعم الأجهزة (#9565).
- عدِّل منطق اختيار مسار الفيديو لتفضيل برامج ترميز أكثر كفاءة إذا كانت برامج الترميز المتعددة متوافقة مع برامج فك الترميز الأساسية التي يتم تسريعها باستخدام الأجهزة (#4835).
- تفضيل المحتوى الصوتي (مثل المقطع الصوتي "التلقائي" أو المقطع الصوتي الذي يتطابق مع اللغة المحلية للنظام) على قيود اختيار المقطع الصوتي الفني (على سبيل المثال، نوع MIME المفضل أو الحد الأقصى لعدد القنوات)
- يجب إصلاح مشكلة اختيار قناة الإصدار التي لم يؤدّي فيها إلغاء مجموعة قنوات إصدار إلى إيقاف مجموعات قنوات الإصدار الأخرى من النوع نفسه (#9675).
- يُرجى حل مشكلة اختيار المقطع الصوتي حيث لا يتم تطبيق مجموعة من تجاوزات المسارات الفارغة والفارغة بشكل صحيح (#9649).
- حظر علامات
TrackGroup
المكرّرة فيTrackGroupArray
ويمكن دائمًا تمييزTrackGroup
عن طريق وضعid
في الدالة الإنشائيةTrackGroup
. يؤدي ذلك إلى إصلاح أي عطل عند استئناف التشغيل بعد تشغيل التطبيق في الخلفية مع إلغاء مسار نشط (#9718). - عليك تعديل المنطق في
AdaptiveTrackSelection
للسماح بزيادة الجودة ضمن معدل نقل البيانات الكافي للشبكة حتى إذا كان التشغيل قريبًا جدًا من حافة البث المباشر (#9784).
- الفيديو:
- إصلاح المنطق الاحتياطي لبرنامج فك الترميز لكي تستخدم تقنية Dolby Vision برنامج فك ترميز H264/H265 متوافق إذا لزم الأمر.
- الصوت:
- إصلاح المنطق الاحتياطي لبرنامج فك الترميز في Dolby Atmos (E-AC3-JOC) لاستخدام برنامج فك ترميز E-AC3 متوافق إذا لزم الأمر
- غيِّر واجهات برمجة تطبيقات
AudioCapabilities
بحيث تتطلب ضبط النصAudioCapabilities.DEFAULT_AUDIO_CAPABILITIES
بشكل صريح بدلاً منnull
. - اسمح بتخصيص حساب حجم المخزن المؤقت
AudioTrack
من خلال إدخالAudioTrackBufferSizeProvider
فيDefaultAudioSink
. (#8891). - يُرجى إعادة محاولة إنشاء
AudioTrack
إذا كان حجم المخزن المؤقت المطلوب أكبر من 1 ميغابايت. (#9712).
- أدوات استخلاص البيانات:
- النص:
- إدارة الحقوق الرقمية:
- إزالة
playbackLooper
منDrmSessionManager.(pre)acquireSession
عند استخدامDrmSessionManager
من خلال تطبيق فيMediaSource
مخصّص، يجب تمريرplaybackLooper
إلىDrmSessionManager.setPlayer
بدلاً من ذلك.
- إزالة
- تشغيل الإعلان / إعلانات الوسائط التفاعلية:
- يمكنك توفير إمكانية استخدام ميزة "إدراج إعلان ديناميكي" (DAI) لإعلانات الوسائط التفاعلية (#8213).
- أضِف طريقة إلى
AdPlaybackState
للسماح بإعادة ضبط مجموعة إعلانية لكي يمكن تشغيلها مرة أخرى (#9615). - يمكنك فرض سرعة تشغيل 1.0 أثناء تشغيل الإعلان (#9018).
- يجب إصلاح المشكلة التي أدّت إلى إعادة ضبط التشغيل الفوري لمجموعة إعلانية تعذّر تحميلها (#9929).
- واجهة المستخدم:
- DASH:
- أضِف السمات الأساسية والتكميلية التي تم تحليلها إلى
Representation
(#9579). - دعم دور قناة الإصدار
forced-subtitle
(#9727). - إيقاف تفسير دور قناة الإصدار
main
على أنّهC.SELECTION_FLAG_DEFAULT
. - يجب إصلاح منطق استبعاد عناوين URL الأساسية في البيانات التي لا تتضمّن مساحة اسم DVB (#9856).
- إتاحة عناوين URL النسبية
MPD.Location
(#9939).
- أضِف السمات الأساسية والتكميلية التي تم تحليلها إلى
- بروتوكول HLS:
- يجب تعبئة
Format.label
بشكل صحيح لأحداث البث المباشر وفق بروتوكول HTTP (HLS) الصوتية فقط (#9608). - يمكنك إعداد المنتجات بشكل غير محدود تلقائيًا لتحسين وقت بدء التشغيل. إذا كانت فيديوهاتك تتضمّن مقاطع ترجمة وشرح مختلطة ولم يتم تضمينها في قائمة التشغيل الرئيسية، عليك إضافتها إلى قائمة التشغيل الرئيسية من أجل تشغيل مقاطع الترجمة والشرح فيها، أو إيقاف إعداد مقاطع الترجمة والشرح باستخدام
HlsMediaSource.Factory.setAllowChunklessPreparation(false)
. - يمكنك إتاحة التقديم الدقيق للإطارات الرئيسية باستخدام بروتوكول HLS (#2882).
- يجب تعبئة
- بروتوكول RTSP:
- المحوِّل:
- زيادة الحد الأدنى المطلوب إصدار واجهة برمجة التطبيقات إلى 21.
- يُستخدَم
TransformationException
الآن لوصف الأخطاء التي تحدث أثناء التحويل. - أضِف
TransformationRequest
لتحديد خيارات التحويل. - السماح بتسجيل عدّة مستمعين
- إصلاح توقُّف المحوِّل عند قراءة ناتج برنامج الترميز جزئيًا.
- أصلِح NPE المحتملة في
Transformer.getProgress
عند إطلاق رميات الهجوم. - أضِف تطبيقًا تجريبيًا لتطبيق عمليات التحويل.
- إضافة MediaSession:
- وفقًا للإعدادات التلقائية، يتم الآن محو قائمة التشغيل عند الإيقاف من قِبل "
MediaSessionConnector
". يمكن للتطبيقات التي تريد الاحتفاظ بقائمة التشغيل الاتصال بـsetClearMediaItemsOnStop(false)
على الموصِّل.
- وفقًا للإعدادات التلقائية، يتم الآن محو قائمة التشغيل عند الإيقاف من قِبل "
- إضافة البثّ:
- إضافة FFmpeg:
- اجعل
build_ffmpeg.sh
تعتمد على أدوات bin LLVM بدلاً من GNU (#9933).
- اجعل
- التوافق مع نظام التشغيل Android 12:
- عليك ترقية إضافة Cast للاعتماد على
com.google.android.gms:play-services-cast-framework:20.1.0
. ولا تتوافق الإصدارات السابقة منplay-services-cast-framework
مع التطبيقات التي تستهدف الإصدار 12 من نظام التشغيل Android، وسيتعطّل معIllegalArgumentException
عند إنشاءPendingIntent
s (#9528).
- عليك ترقية إضافة Cast للاعتماد على
- أزِل الرموز التي تم إيقافها نهائيًا:
- إزالة
Player.EventListener
يمكنك استخدامPlayer.Listener
كبديل. - إزالة
MediaSourceFactory#setDrmSessionManager
وMediaSourceFactory#setDrmHttpDataSourceFactory
وMediaSourceFactory#setDrmUserAgent
استخدِمMediaSourceFactory#setDrmSessionManagerProvider
بدلاً من ذلك. - إزالة
MediaSourceFactory#setStreamKeys
استخدِمMediaItem.Builder#setStreamKeys
بدلاً من ذلك. - إزالة
MediaSourceFactory#createMediaSource(Uri)
استخدِمMediaSourceFactory#createMediaSource(MediaItem)
بدلاً من ذلك. - إزالة "
setTag
" منDashMediaSource
وHlsMediaSource
وSsMediaSource
يمكنك استخدامMediaItem.Builder#setTag
كبديل. - إزالة
DashMediaSource#setLivePresentationDelayMs(long, boolean)
يمكنك استخدامMediaItem.Builder#setLiveConfiguration
وMediaItem.LiveConfiguration.Builder#setTargetOffsetMs
لإلغاء ملف البيان، أو استخدامDashMediaSource#setFallbackTargetLiveOffsetMs
لتوفير قيمة احتياطية. - إزالة
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread
لم يعُد من الممكن إيقاف فرض سلسلة المحادثات. - إزالة
ActionFile
وActionFileUpgradeUtil
يُرجى استخدام ExoPlayer 2.16.1 أو قبل لاستخدامActionFileUpgradeUtil
لدمج ملفات الإجراءات القديمة فيDefaultDownloadIndex
. - إزالة
ProgressiveMediaSource#setExtractorsFactory
يمكنك استخدام دالة إنشاءProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)
بدلاً من ذلك. - إزالة
ProgressiveMediaSource.Factory#setTag
وProgressiveMediaSource.Factory#setCustomCacheKey
. استخدمMediaItem.Builder#setTag
وMediaItem.Builder#setCustomCacheKey
بدلاً من ذلك. - إزالة
DefaultRenderersFactory(Context, @ExtensionRendererMode int)
وDefaultRenderersFactory(Context, @ExtensionRendererMode int, long)
الإنشاءات. يمكنك استخدام الدالة الإنشائيةDefaultRenderersFactory(Context)
وDefaultRenderersFactory#setExtensionRendererMode
وDefaultRenderersFactory#setAllowedVideoJoiningTimeMs
بدلاً منها. - إزالة جميع تصاميم
CronetDataSource
العامة استخدِمCronetDataSource.Factory
بدلاً من ذلك.
- إزالة
- يمكنك تغيير خيار "
IntDefs
" التالي إلى "@Target(TYPE_USE)
" فقط. وقد يؤدي ذلك إلى إيقاف تجميع الاستخدامات في Kotlin، والتي يمكن إصلاحها من خلال نقل التعليق التوضيحي لإضافة تعليقات توضيحية إلى النوع (Int
).@AacAudioObjectType
@Ac3Util.SyncFrameInfo.StreamType
@AdLoadException.Type
@AdtsExtractor.Flags
@AmrExtractor.Flags
@AspectRatioFrameLayout.ResizeMode
@AudioFocusManager.PlayerCommand
@AudioSink.SinkFormatSupport
@BinarySearchSeeker.TimestampSearchResult.Type
@BufferReplacementMode
@C.BufferFlags
@C.ColorRange
@C.ColorSpace
@C.ColorTransfer
@C.CryptoMode
@C.Encoding
@C.PcmEncoding
@C.Projection
@C.SelectionReason
@C.StereoMode
@C.VideoOutputMode
@CacheDataSource.Flags
@CaptionStyleCompat.EdgeType
@DataSpec.Flags
@DataSpec.HttpMethods
@DecoderDiscardReasons
@DecoderReuseResult
@DefaultAudioSink.OutputMode
@DefaultDrmSessionManager.Mode
@DefaultTrackSelector.SelectionEligibility
@DefaultTsPayloadReaderFactory.Flags
@EGLSurfaceTexture.SecureMode
@EbmlProcessor.ElementType
@ExoMediaDrm.KeyRequest.RequestType
@ExtensionRendererMode
@Extractor.ReadResult
@FileTypes.Type
@FlacExtractor.Flags
(في حزمةcom.google.android.exoplayer2.ext.flac
)@FlacExtractor.Flags
(في حزمة واحدة (com.google.android.exoplayer2.extractor.flac
))@FragmentedMp4Extractor.Flags
@HlsMediaPlaylist.PlaylistType
@HttpDataSourceException.Type
@IllegalClippingException.Reason
@IllegalMergeException.Reason
@LoadErrorHandlingPolicy.FallbackType
@MatroskaExtractor.Flags
@Mp3Extractor.Flags
@Mp4Extractor.Flags
@NotificationUtil.Importance
@PlaybackException.FieldNumber
@PlayerNotificationManager.Priority
@PlayerNotificationManager.Visibility
@PlayerView.ShowBuffering
@Renderer.State
@RendererCapabilities.AdaptiveSupport
@RendererCapabilities.Capabilities
@RendererCapabilities.DecoderSupport
@RendererCapabilities.FormatSupport
@RendererCapabilities.HardwareAccelerationSupport
@RendererCapabilities.TunnelingSupport
@SampleStream.ReadDataResult
@SampleStream.ReadFlags
@StyledPlayerView.ShowBuffering
@SubtitleView.ViewType
@TextAnnotation.Position
@TextEmphasisSpan.MarkFill
@TextEmphasisSpan.MarkShape
@Track.Transformation
@TrackOutput.SampleDataPart
@Transformer.ProgressState
@TsExtractor.Mode
@TsPayloadReader.Flags
@WebvttCssStyle.FontSizeUnit
الإصدار 1.0.0-alpha01
27 تشرين الأول (أكتوبر) 2021
تم طرح androidx.media3:media3-*:1.0.0-alpha01
.
يحتوي الإصدار 1.0.0-alpha01 على عمليات التنفيذ هذه.
الميزات الجديدة
Media3 هي الوجهة الجديدة لمكتبات دعم الوسائط، بما في ذلك ExoPlayer. تحتوي النسخة الأولية الأولى على عمليات تنفيذ وظيفية مبكرة للمكتبات لتنفيذ حالات استخدام الوسائط، بما في ذلك:
- ExoPlayer هو مشغّل وسائط على مستوى التطبيق لنظام التشغيل Android يسهل تخصيصه وتوسيع نطاقه.
- وظائف جلسة الوسائط لعرض عمليات التشغيل والتحكم فيها تستخدم وحدة الجلسة الجديدة هذه واجهة
Player
نفسها التي تستخدمها ExoPlayer. - مكونات واجهة المستخدم لإنشاء واجهات مستخدم لتشغيل الوسائط.
- وظائف التفاف الوحدات في المكتبات الأخرى للاستخدام مع ExoPlayer، على سبيل المثال، إدراج الإعلانات من خلال حزمة تطوير البرامج لإعلانات الوسائط التفاعلية.
لمزيد من المعلومات، يُرجى الاطّلاع على مشروع Media3 GitHub.
وقد تمت استضافة ExoPlayer في السابق من خلال مشروع ExoPlayer GitHub منفصل. في Media3،
اسم الحزمة هو androidx.media3.exoplayer
. ونخطط لمواصلة صيانة مشروع ExoPlayer GitHub وإصداره لفترة من الوقت لمنح التطبيقات الوقت اللازم لنقل البيانات إلى
Media3. تم استبدال جميع وحدات Media3 بجميع وحدات ExoPlayer، باستثناء الإضافات القديمة Media2 وmediasessions والتي تم استبدالها بوحدة media3-session
الجديدة. يوفر ذلك تكاملاً مباشرًا بين المشغلات وجلسات الوسائط
دون الحاجة إلى استخدام فئة المحول/الموصل.