Media3
آخر تعديل | الإصدار الثابت | إصدار محتمل | الإصدار التجريبي | الإصدار التجريبي الأول |
---|---|---|---|---|
13 تشرين الثاني (نوفمبر) 2024 | 1.4.1 | 1.5.0-rc01 | - | - |
الإعلان عن التبعيات
لإضافة تبعية على Media3، عليك إضافة مستودع Google Maven إلى مشروعك. اطّلِع على مستودع Maven من Google لمزيد من المعلومات.
أضِف التبعيات للعناصر التي تحتاج إليها في ملف build.gradle
ل
تطبيقك أو وحدتك:
Groovy
dependencies { def media3_version = "1.4.1" // 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" // Common Kotlin-specific functionality implementation "androidx.media3:media3-common-ktx:$media3_version" }
Kotlin
dependencies { val media3_version = "1.4.1" // 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") // Common Kotlin-specific functionality implementation("androidx.media3:media3-common-ktx:$media3_version") }
لمزيد من المعلومات عن العناصر الاعتمادية، اطّلِع على مقالة إضافة عناصر الاعتماد الخاصة بالإصدار.
ملاحظات
تساعدنا ملاحظاتك في تحسين Jetpack. يمكنك استخدام أداة تتبُّع المشاكل في Media3 للعثور على إجابات عن الأسئلة والمشاكل المعروفة وطلبات الميزات، ولتسجيل مشاكل جديدة.
الإصدار 1.5
1.5.0-rc02 (19-11-2024)
تم إصدار androidx.media3:media3-*:1.5.0-rc02
.
يتضمّن الإصدار 1.5.0-rc02 عمليات الربط هذه.
يتضمّن هذا الإصدار التغييرات التالية منذ الإصدار 1.5.0-rc01:
- برامج الاستخراج:
- إتاحة تنسيق ملف الوسائط الأساسي AC-4 Level-4 وفقًا لمعيار ISO (#1265)
- النص:
- إصلاح مقاطع الترجمة والشرح بتنسيق CEA-608 المشوشة في المحتوى الذي يتضمّن أكثر من رسالة SEI واحدة في كل عيّنة
- إصلاح مشكلة تعليق التشغيل في أحداث البث المتعدّدة الفترات باستخدام DASH عند تفعيل ملفّات ترجمة CEA-608 (#1863)
- إصلاح مقاطع الترجمة والشرح غير المفهومة بتنسيق CEA-608 في ملفات MP4 التي تضع بشكل غير صحيح علامة "عيّنة للمزامنة" على كل عيّنة (#1863)
- التطبيق التجريبي
- حلّ مشاكل تسرُّب الذاكرة في التطبيق التجريبي المخصّص لفيديوهات Shorts القصيرة (#1839)
1.5.0-rc01 (2024-11-13)
تم إصدار androidx.media3:media3-*:1.5.0-rc01
.
يتضمّن الإصدار 1.5.0-rc01 عمليات الربط هذه.
يتضمّن هذا الإصدار التغييرات التالية منذ الإصدار 1.5.0-beta01:
- ExoPlayer:
- تم إصلاح خطأ كان يؤدي إلى تجميد اللقطات في نهاية العنصر في قوائم التشغيل أو الفترات في أحداث البث باستخدام DASH المتعدّدة الفترات التي لا تتطابق مدّتها مع المحتوى الفعلي (#1698).
- أضِف طريقة ضبط إلى
SntpClient
لضبط الحد الأقصى للوقت المنقضي منذ آخر تعديل، وبعد ذلك تتم إعادة تهيئة العميل مجددًا (#1794).
- برامج الاستخراج:
- DataSource:
DataSourceContractTest
: تأكَّد من أنّDataSource.getUri()
يعرض عنوان URI الذي تمّ حلّه (كما هو موضّح في المستندات). إذا كان هذا العنوان مختلفًا عن عنوان ملف التمهيد الذي تمّ طلبه، يمكن أن تشير الاختبارات إلى ذلك باستخدام الطريقة الجديدةDataSourceContractTest.TestResource.Builder.setResolvedUri()
.DataSourceContractTest
: تأكَّد من أنّDataSource.getUri()
وgetResponseHeaders()
يعرضان القيمة "مفتوح" بعد تعذُّر الاتصال بمحاولةopen()
(بسبب عدم توفّر المورد) وقبل إجراء محاولة متعاقبة لتحميلclose()
.- يتيح إلغاء القيمة
DataSourceContractTest.getNotFoundResources()
لفئات فرعية اختبارية تقديم موارد متعددة "لم يتم العثور عليها"، و تقديم أي رؤوس متوقّعة أيضًا. يتيح ذلك التمييز بين رمز الخطأ HTTP 404 (مع الرؤوس) و "تعذّر العثور على الخادم" (بدون رؤوس).
- يتيح إلغاء القيمة
- النص:
- إصلاح عدم عرض مقاطع الترجمة والشرح بتنسيق CEA-608 في أحداث البث بتنسيق H.264 MPEG-TS (تعذّر عرض هذه المقاطع في الإصدار
1.5.0-alpha01
من خلال الرابط https://github.com/androidx/media/commit/03a205f220ecf7681f85f8a752227e3986e257ff). - إتاحة مقاطع الترجمة والشرح بتنسيق CEA-608 في محتوى Dolby Vision (#1820)
- إصلاح عدم عرض مقاطع الترجمة والشرح بتنسيق CEA-608 في أحداث البث بتنسيق H.264 MPEG-TS (تعذّر عرض هذه المقاطع في الإصدار
- إضافة RTSP:
- إصلاح الأعطال عند تحليل حزم RTP التي تحتوي على إضافات رؤوس (#1225)
الإصدار 1.5.0-beta01
30 تشرين الأول (أكتوبر) 2024
تم إصدار androidx.media3:media3-*:1.5.0-beta01
.
يتضمّن الإصدار 1.5.0-beta01 عمليات الربط هذه.
- المكتبة المشتركة:
- أزِل التعليقات التوضيحية
@DoNotInline
من العلامات الترميزية الداخلية التي تم وضعها يدويًا خارج الصفوف والمصمّمة لتجنُّب أخطاء التحقّق من فئة وقت التشغيل. في الإصدارات الحديثة من R8، تتم الآن تلقائيًا إزالة المكالمات غير المضمّنة مثل هذه لتجنُّب أخطاء وقت التشغيل (لذلك لم يعُد من الضروري إزالة الخطوط يدويًا). يجب أن يكون جميع مستخدمي Gradle للمكتبة يستخدمون حاليًا إصدارًا من المكوّن الإضافي لنظام Gradle المتوافق مع Android يستخدم إصدارًا من R8 ينفّذ ذلك، بسببcompileSdk = 35
. على مستخدمي المكتبة الذين يستخدمون أنظمة إنشاء غير Gradle التأكّد من أنّ خطوة التصغير/التشويه المعادل لـ R8 تُجري عملية مماثلة تلقائية لإزالة الربط من أجل تجنُّب حالات تعذُّر التحقّق من فئة وقت التشغيل. سبق أن تم تنفيذ هذا التغيير في مكتبات AndroidX الأخرى.
- أزِل التعليقات التوضيحية
- ExoPlayer:
- إصلاح مشكلة ظهور
MediaCodec.CryptoException
أحيانًا على أنّه "خطأ غير متوقّع في بيئة التشغيل" عند تشغيلMediaCodec
في وضع غير متزامن (السلوك التلقائي في الإصدار 31 من واجهة برمجة التطبيقات والإصدارات الأحدث) - نقْل
bufferedDurationUs
بدلاً منbufferedPositionUs
باستخدامPreloadMediaSource.PreloadControl.onContinueLoadingRequested()
. يتم أيضًا تغييرDefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS
إلىDefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS
، ويجب على التطبيقات عندئذٍ إرسال قيمة تمثّل مدة محددة من التلقائي موضع البدء الذي يجب فيه preloadedتحميل مصدر الوسائط المقابل باستخدام IntDef هذا، بدلاً من موضع. - أضِف عملية تنفيذ
ForwardingRenderer
تعيد توجيه جميع طلبات الطريقة إلى أداة عرض أخرى (1703). - إضافة ميزة "التحميل المُسبَق لقائمة التشغيل" للعنصر التالي في قائمة التشغيل يمكن للتطبيقات
تفعيل التحميل المُسبَق من خلال استدعاء
ExoPlayer.setPreloadConfiguration(PreloadConfiguration)
وفقًا لذلك. يكون التحميل المُسبَق غير مفعَّل تلقائيًا. عند تفعيل ميزةDefaultLoadControl
وعدم التدخل في عملية التشغيل، لا يبدأ التحميل المُسبَق ولا يستمر إلا عندما لا يكون المشغّل قيد التحميل. يمكن للتطبيقات تغيير هذا السلوك من خلال تنفيذLoadControl.shouldContinuePreloading()
وفقًا لذلك (مثل تجاوز هذه الطريقة فيDefaultLoadControl
). يؤدي التنفيذ التلقائي لـLoadControl
إلى إيقاف التحميل المُسبَق في حال استخدام التطبيق لطريقة تنفيذ مخصّصة لـLoadControl
. - أضِف الطريقة
MediaSourceEventListener.EventDispatcher.dispatchEvent()
لسماحٍ باستدعاء أحداث أدوات معالجة الأحداث الفرعية (1736). - أضِف
DefaultPreloadManager.Builder
الذي ينشئ مثيلَيDefaultPreloadManager
وExoPlayer
باستخدام إعدادات مشترَكة باستمرار. - أزِل المَعلمة
Renderer[]
منLoadControl.onTracksSelected()
لأنّ تنفيذDefaultLoadControl
يمكنه استرداد أنواع البث منExoTrackSelection[]
. - تم إيقاف
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])
نهائيًا وتم وضع علامة على الطريقة باعتبارها نهائية لمنع عمليات الاستبدال. يجب استخدام الرمز الجديدDefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])
بدلاً من ذلك. - الإبلاغ عن أحداث
MediaSourceEventListener
من مصادر ثانوية فيMergingMediaSource
سيؤدي ذلك إلى تسجيل أحداث التحميل بدء/خطأ/تم إلغاؤه/اكتماله للملفّات الترجمة والشرح التي تم تحميلها من مصدر خارجي (تلك التي تمت إضافتها باستخدامMediaItem.LocalConfiguration.subtitleConfigurations
)، والتي قد تظهر كأحداث تحميل مكرّرة يتم إصدارها منAnalyticsListener
. - منع أخطاء الترجمة والشرح والبيانات الوصفية من إيقاف التشغيل تمامًا
بدلاً من ذلك، يتم إيقاف المقطع الصوتي الذي يتضمّن المشكلة ويستمر تشغيل المقطوعات المتبقية
(#1722).
- في عملية معالجة الترجمة والشرح الجديدة (أثناء الاستخراج)، يتمّ بث أخطاء التحليل (مثل
بيانات الترجمة والشرح غير الصالحة) وتحميلها (مثل HTTP 404)
من خلال
onLoadError
عمليات الاستدعاء. - في معالجة الترجمة والشرح القديمة (أثناء العرض)، يتم فقط عرض أخطاء التحميل
المرتبطة من خلال
onLoadError
عمليات الاستدعاء بينما يتم تجاهل أخطاء التحليل بدون إشعار (هذا السلوك متوفّر مسبقًا).
- في عملية معالجة الترجمة والشرح الجديدة (أثناء الاستخراج)، يتمّ بث أخطاء التحليل (مثل
بيانات الترجمة والشرح غير الصالحة) وتحميلها (مثل HTTP 404)
من خلال
- إصلاح مشكلة ظهور
- المحوِّل:
- يجب جعل ضبط مدة الصورة باستخدام
MediaItem.Builder.setImageDurationMs
إلزاميًا لتصدير الصور. - إضافة إمكانية التصدير للفواصل في تسلسلات عناصر EditedMediaItem الصوتية
- يجب جعل ضبط مدة الصورة باستخدام
- اختيار المقطع الصوتي:
DefaultTrackSelector
: نفضّل استخدام المحتوى الصوتي المستند إلى العناصر بدلاً من المحتوى الصوتي المستنِد إلى القناة عند تساوي العوامل الأخرى.
- برامج الاستخراج:
- إصلاح مشكلة في معالجة عيّنات "العرض الإعلاني ما قبل التشغيل" لمواضع بدء الوسائط غير المرتبطة بإطار رئيسي عند معالجة قوائم التعديل في ملفات MP4 (#1659)
- تحسين عملية احتساب معدّل عرض اللقطات باستخدام مدة الوسائط من مربّع
mdhd
فيMp4Extractor
وFragmentedMp4Extractor
(#1531) - حلّ مشكلة التوسيع غير الصحيح
media_time
في قوائم تعديل MP4 على الرغم من أنّه سبق أن تمّت زيادة حجم ملفsegment_duration
بشكلٍ صحيح باستخدام مقياس زمنه، تمّ الآن زيادة حجم ملفmedia_time
بشكلٍ صحيح باستخدام مقياس زمنه، كما هو محدّد في معيار تنسيق MP4 (#1792). - التعامل مع اللقطات غير المرتبطة بترتيب معيّن في عملية احتساب
endIndices
لملفات MP4 باستخدام قائمة تعديل (#1797)
- الصوت:
- حلّ مشكلة الأصوات المنبعثة أثناء الانتقال إلى أجزاء مختلفة من الفيديو
- إصلاح تراكم أخطاء القطع في خوارزمية التمديد الزمني/تغيير الدرجة الصوتية في Sonic
- إصلاح خطأ في
SpeedChangingAudioProcessor
يؤدي إلى حذف لقطات الإخراج
- الفيديو:
- إضافة حلّ بديل لمشكلة في جهاز Galaxy Tab S7 FE تؤدي إلى وضع علامة "غير متوافقة" على عمليات بث H264 المشفَّرة التي تبلغ سرعتها 60 لقطة في الثانية (#1619).
- إضافة حلّ بديل لبرامج الترميز التي تتعذّر إكمالها بعد العيّنة الأخيرة بدون عرض إشارة نهاية البث
- النص:
- تأكَّد من عرض WebVTT في HLS مع الطوابع الزمنية للترجمة والشرح الكبيرة جدًا (التي تتجاوز
long
64 بت عند تمثيلها بالميكرو ثانية ومضاعفة90,000
قاعدة وقت MPEG) (#1763).
- تأكَّد من عرض WebVTT في HLS مع الطوابع الزمنية للترجمة والشرح الكبيرة جدًا (التي تتجاوز
- البيانات الوصفية:
- يمكنك تحديد النوع
C.TRACK_TYPE_METADATA
للمقاطع الصوتية التي تحتوي على محتوى icy أو vnd.dvb.ait.
- يمكنك تحديد النوع
- إدارة الحقوق الرقمية:
- إصلاح
IllegalStateException
منDefaultDrmSession.requiresSecureDecoder
بعد تعذُّر فتح جلسة إدارة الحقوق الرقمية ظهرت هذه المشكلة في1.5.0-alpha01
.
- إصلاح
- برامج ربط الوسائط:
- إضافة IMA:
- إصلاح خطأ كان يؤدي إلى ظهور
ArrayIndexOutOfBoundsException
عند تشغيل المحتوى بعد انتهاء آخر إعلان أثناء عرض (الخطأ رقم 1741) في أحداث DAI المُدرَجة من جهة الخادم بدون إعلان ما قبل التشغيل
- إصلاح خطأ كان يؤدي إلى ظهور
- الجلسة:
- تم إصلاح الخلل الذي كان يتسبب في توجيه الطلبات المخصّصة المُرسَلة من
MediaBrowser
إلىMediaSessionCompat.Callback
بدلاً من استخدامMediaBrowserServiceCompat
من الطريقة عند الاتصال بأحد الخدمات القديمة. وقد منع ذلكMediaBrowser
من تلقّي قيمة الردّ الفعلية التي أرسلتها الخدمة القديمة (#1474). - تم طرح الخطأ
IllegalArgumentException
من أجهزة مصنعين معيّنين عند ضبط جهاز استقبال البث لطلبات زر الوسائط (#1730). - أضِف أزرار أوامر لعناصر الوسائط. يؤدي ذلك إلى إضافة Media3 API لما كان يُعرف باسم
Custom browse actions
مع المكتبة القديمة التي تتضمّنMediaBrowserCompat
. يُرجى العِلم أنّه باستخدام Media3، تتوفّر أزرار الأوامر الخاصة بعناصر الوسائط لكلٍّ منMediaBrowser
وMediaController
. راجِع إجراءات التصفّح المخصّصة لنظام التشغيل AAOS. - تم إصلاح الخلل الذي كان يمنع أحيانًا وحدة تحكّم Media3 من السماح لتطبيق جلسة
ببدء خدمة تعمل في المقدّمة بعد طلب
play()
. - حصر
CommandButton.Builder.setIconUri
لقبول عناوين URL للمحتوى فقط - تمرير إشارات الاتصال لمتصفّح Media3 إلى
MediaBrowserCompat
الأوّلي عند الاتصال بMediaBrowserCompat
قديم يمكن للخدمة تلقّي إشارات الاتصال التي يتم تمريرها كإشارات جذر مع أول طلب إلىonGetRoot()
. - إصلاح خطأ كان يؤدي إلى عدم تلقّي
MediaBrowser
خطأ أرسلته الخدمة بعد أن اشترك المتصفّح فيparentid
، وذلك عندما يكونMediaBrowser
متصلاً بخدمة متصفّح قديمة - تحسين سلوك التشغيل التفاعلي، بحيث لا يطلب متصفّح Media3 المتصل
بحساب
MediaBrowserService
قديم بيانات أطفال حسابparentId
مرتين عند الاشتراك في حساب أحد الوالدَين
- تم إصلاح الخلل الذي كان يتسبب في توجيه الطلبات المخصّصة المُرسَلة من
- واجهة المستخدم:
- يمكنك تفعيل الحلول البديلة لفيديوهات "
PlayerView
في أثناء إنشاء المحتوى"AndroidView
التي تم تمديدها أو اقتصاصها، وذلك بسبب المشاكل المتعلّقة بعمليات الانتقال المشتركة المستندة إلى تنسيق XML. يجب أن تتصل التطبيقات التي تستخدمPlayerView
داخلAndroidView
بخطPlayerView.setEnableComposeSurfaceSyncWorkaround
للموافقة على الميزة (#1237، #1594). - أضِف
setFullscreenButtonState
إلىPlayerView
للسماح بتعديلات رمز زرّ ملء الشاشة عند الطلب، أي خارج النطاق وليس بشكل تفاعلي عند النقر عليه (#1590، #184). - إصلاح خطأ يتعذّر فيه استخدام الخيار "بدون" في اختيار النص إذا كانت هناك إعدادات مفضّلة لاختيار مقاطع الترجمة والشرح محدّدة من التطبيق
- يمكنك تفعيل الحلول البديلة لفيديوهات "
- إضافة "البث السلس":
- إصلاح خطأ
Bad magic number for Bundle
عند تشغيل أحداث البث باستخدام تقنية SmoothStreaming التي تتضمّن مقاطع نصية (#1779)
- إصلاح خطأ
- إضافة RTSP:
- حلّ مشكلة إزالة معلومات المستخدمين لعناوين URL التي تحتوي على أحرف @ مُشفَّرة (#1138)
- إضافات برامج الترميز (FFmpeg وVP9 وAV1 وما إلى ذلك):
- إضافة دعم لصفحات بحجم 16 كيلوبايت لإضافات برامج الترميز على Android 15 (#1685)
- إضافة البث:
- إيقاف تنظيف المخطط الزمني بعد انقطاع الاتصال بجلسة البث، ما يتيح لتطبيق المُرسِل استئناف التشغيل على الجهاز بعد انقطاع الاتصال
- تعبئة
DeviceInfo
في CastPlayer عند توفيرContext
يتيح ذلك ربطMediaSession
بـRoutingSession
، وهو ضروري لدمج "محوِّل الإخراج" (#1056).
- إزالة الرموز المتوقّفة نهائيًا:
- أزِل وظائف إنشاء
DefaultEncoderFactory
المتوقّفة نهائيًا. استخدِمDefaultEncoderFactory.Builder
بدلاً من ذلك.
- أزِل وظائف إنشاء
الإصدار 1.5.0-alpha01
10 أيلول (سبتمبر) 2024
يتضمّن هذا الإصدار التغييرات التالية منذ الإصدار 1.4.1:
- المكتبة المشتركة:
- أضِف
ForwardingSimpleBasePlayer
التي تتيح إعادة توجيه المحتوى إلى مشغّل آخر مع إجراء تعديلات طفيفة مع ضمان الاتساق الكامل ومعالجة المستمعين (#1183). - استبدِل
SimpleBasePlayer.State.playlist
بطريقةgetPlaylist()
. - أضِف إلغاءً لـ
SimpleBasePlayer.State.Builder.setPlaylist()
لتحديدTimeline
وTracks
وMetadata
حاليًا مباشرةً بدلاً من إنشاء بنية قائمة تشغيل. - زيادة
minSdk
إلى 21 (Android Lollipop) ويتوافق ذلك مع جميع مكتبات AndroidX الأخرى. - إضافة عنصر
androidx.media3:media3-common-ktx
يقدّم وظائف خاصة بلغة Kotlin تم إنشاؤها على أساس المكتبة الشائعة - أضِف
Player.listen
دالة إضافة تعليق مؤقت لتشغيل دالة معالجة متزامنة لمحاولة الاستماع إلىPlayer.Events
في مكتبةmedia3-common-ktx
.
- أضِف
- ExoPlayer:
- يمكن الآن استدعاء
MediaCodecRenderer.onProcessedStreamChange()
لكل عنصر وسائط. لم يتم استدعاؤه في السابق للمرة الأولى. استخدِمMediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()
لتفعيل هذه الميزة. - أضِف
PreloadMediaSource.PreloadControl.onPreloadError
للسماح لعمليات تنفيذPreloadMediaSource.PreloadControl
باتخاذ إجراءات عند حدوث خطأ. - أضِف
BasePreloadManager.Listener
لنشر أحداث التحميل المُسبَق إلى التطبيقات. - السماح بتغيير مهلة عميل بروتوكول SNTP وإعادة محاولة استخدام العناوين البديلة عند انتهاء المهلة (#1540)
- أزِل
MediaCodecAdapter.Configuration.flags
لأنّ الحقل كان دائمًا صفرًا. - يجب السماح للمستخدم باختيار مكبّر الصوت المدمج لتشغيل المحتوى على Wear OS API 35 والإصدارات الأحدث (حيث يعلن الجهاز عن توفّر هذه الميزة).
- تأجيل طلب الحظر المُرسَل إلى
Context.getSystemService(Context.AUDIO_SERVICE)
إلى أن يتم تفعيل معالجة ميزة "تركيز الصوت" يضمن ذلك عدم إجراء المكالمة الحظرية في حال عدم تفعيل معالجة التركيز الصوتي (#1616). - السماح بالتشغيل بغض النظر عن مدة التخزين المؤقت عند تعذُّر التحميل (#1571)
- أضِف
AnalyticsListener.onRendererReadyChanged()
للإشارة إلى الحالات التي تسمح فيها أدوات التحويل الفردية ببدء التشغيل.
- يمكن الآن استدعاء
- المحوِّل:
- أضِف
SurfaceAssetLoader
، الذي يتيح إضافة بيانات الفيديو إلى "Surface
" في "Surface
". - يُبلغ
ImageAssetLoader
عن الإدخال غير المتوافق من خلالAssetLoader.onError
بدلاً من طرحIllegalStateException
.
- أضِف
- برامج الاستخراج:
- اسمح لـ
Mp4Extractor
وFragmentedMp4Extractor
بتحديد عيّنات H264 التي لا يتم استخدامها كمرجع من قِبل عيّنات لاحقة. - إضافة خيار لتفعيل التقديم أو الإيقاف المستند إلى الفهرس في
AmrExtractor
- التعامل مع ملفات MP3 التي يزيد حجمها عن 128 كيلوبايت بين الإطارات الصالحة على أنّها مقطوعة
(بدلاً من غير صالحة) وهذا يعني أنّ الملفات التي تحتوي على بيانات غير MP3 في نهايتها،
وبدون بيانات وصفية أخرى للإشارة إلى طول وحدات بت MP3، ستتوقف الآن عن
التشغيل عند نهاية بيانات MP3 بدلاً من تعذُّر تشغيلها مع رمز الخطأ
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}
(الخطأ 1563).
- اسمح لـ
- DataSource:
- تعديل
HttpEngineDataSource
للسماح باستخدام الإصدار S الإضافة 7 بدلاً من المستوى 34 لواجهة برمجة التطبيقات (#1262)
- تعديل
- الصوت:
- ضبط البيانات الوصفية لمستوى الصوت CTA-2075 تلقائيًا في برنامج الترميز إذا كانت متوفّرة في الوسائط
- تأكَّد من خفض مستوى الصوت بسلاسة عند التقديم أو الإيقاف.
- الفيديو:
MediaCodecVideoRenderer
يتجنّب فك ترميز العيّنات التي لا يتم عرضها أو استخدامها كمرجع من قِبل عيّنات أخرى.- في الإصدار 35 من واجهة برمجة التطبيقات والإصدارات الأحدث، يمكن أن يتلقّى
MediaCodecAdapter
الآنnull
Surface
فيconfigure
ويطلب إجراءً جديدًاdetachOutputSurface
لإزالةSurface
تم ضبطه سابقًا إذا كان برنامج الترميز يتيح ذلك (MediaCodecInfo.detachedSurfaceSupported
). - استخدِم قيم نسبة عرض البكسل إلى ارتفاعه المقدَّمة في
MediaCodecAdapter
إذا تم تقديمها عند معالجةonOutputFormatChanged
(#1371).
- النص:
- أضِف
VoiceSpan
مخصّصًا واملأه لتحديد مقطع الترجمة والشرح الصوتي في WebVTT (#1632).
- أضِف
- الصورة:
- أضِف
ExternallyLoadedImageDecoder
لدمج مبسّط مع مكتبات تحميل الصور الخارجية، مثل Glide أو Coil.
- أضِف
- DataSource:
- أضِف
FileDescriptorDataSource
، وهوDataSource
جديد يمكن استخدامه للقيام بقراءة بيانات منFileDescriptor
(#3757).
- أضِف
- التأثير:
- أضِف
DefaultVideoFrameProcessor
حلاً بديلاً لتحسينSurfaceTexture
الأداء بشكل بسيط. قد يتضمّنSurfaceTexture
تصغيرًا صغيرًا يقطع حدود 1 بكسل حول حافة مساحة تخزين تم اقتصاصها. تمّت معالجة ذلك الآن كي يكون الناتج أقرب إلى المتوقّع. - زيادة السرعة
DefaultVideoFrameProcessor.queueInputBitmap()
ونتيجةً لذلك، تتم عملية تصدير الصور إلى الفيديوهات باستخدامTransformer
بشكل أسرع.
- أضِف
- إضافة IMA:
- تم إصلاح الخلل الذي كان يؤدي إلى ظهور رمز
ArrayIndexOutOfBoundsException
فيImaServerSideAdInsertionMediaSource
عند محو قائمة التشغيل.
- تم إصلاح الخلل الذي كان يؤدي إلى ظهور رمز
- الجلسة:
- أضِف
MediaButtonReceiver.shouldStartForegroundService(Intent)
للسماح للتطبيقات بالحد من تلقّي أمر تشغيل لاستئناف التشغيل من خلال تجاوز هذه الطريقة. يتم تشغيل الخدمة تلقائيًا في كل الأوقات، ولا يمكن إيقاف التشغيل بدون أن يؤدي النظام إلى تعطيل الخدمة باستخدامForegroundServiceDidNotStartInTimeException
(#1528).
- أضِف
- إضافة DASH:
- إتاحة الفترات التي تبدأ في منتصف شريحة (#1440)
- إضافات برامج الترميز (FFmpeg وVP9 وAV1 وما إلى ذلك):
- أضِف وحدة ترميز IAMF التي تتيح تشغيل ملفات MP4
التي تحتوي على مقاطع صوتية بتنسيق IAMF باستخدام مكتبة libiamf الأصلية ل synthesizing audio.
- يمكن تشغيل الفيديوهات بتنسيق الاستيريو وتنسيق 5.1 مع الصوت المكاني، بالإضافة إلى تفعيل ميزة تتبُّع حركة الرأس الاختيارية، ولكن لا تتوفّر إمكانية تشغيل الفيديوهات بتنسيق الاستيريو الثنائي حاليًا.
- أضِف وحدة ترميز IAMF التي تتيح تشغيل ملفات MP4
التي تحتوي على مقاطع صوتية بتنسيق IAMF باستخدام مكتبة libiamf الأصلية ل synthesizing audio.
- إضافة البث:
- إيقاف محو المخطط الزمني بعد إلغاء ربط CastSession، ما يؤدي إلى تفعيل تطبيق المُرسِل لاستئناف التشغيل على الجهاز بعد إلغاء الربط
- تعبئة
DeviceInfo
في CastPlayer عند توفيرContext
يتيح ذلك ربطMediaSession
بـRoutingSession
، وهو ضروري لدمج "محوِّل الإخراج" (#1056).
- أدوات الاختبار:
- يتضمّن
DataSourceContractTest
الآن اختبارات لإثبات ما يلي:- تم تعديل مصدر البيانات
read position
. - تم تطبيق وحدة تخزين مؤقت للإخراج
offset
بشكل صحيح.
- تم تعديل مصدر البيانات
- يتضمّن
- إزالة الرموز المتوقّفة نهائيًا:
- أزِل العمودَين
Player.hasPrevious
وPlayer.hasPreviousWindow()
اللذَين تم إيقافهما نهائيًا. استخدِمPlayer.hasPreviousMediaItem()
بدلاً من ذلك. - أزِل الطريقة
Player.previous()
التي تم إيقاف استخدامها. استخدِمPlayer.seekToPreviousMediaItem()
بدلاً من ذلك. - أزِل الطريقة
DrmSessionEventListener.onDrmSessionAcquired
التي تم إيقاف استخدامها.
- أزِل العمودَين
الإصدار 1.4.0
الإصدار 1.4.1
27 آب (أغسطس) 2024
تم إصدار androidx.media3:media3-*:1.4.1
.
يحتوي الإصدار 1.4.1 على عمليات الربط هذه.
- ExoPlayer:
- برامج الاستخراج:
- MP3: يجب إصلاح الخطأ
Searched too many bytes
من خلال تجاهل data غير MP3 في نهاية الملف بشكلٍ صحيح استنادًا إلى حقل الطول في إطارInfo
(#1480).
- MP3: يجب إصلاح الخطأ
- النص:
- ملف TTML: إصلاح معالجة قيم النسبة المئوية
tts:fontSize
لضمان اكتسابها بشكل صحيح من العقد الرئيسية التي تحتوي على قيم النسبة المئويةtts:fontSize
- إصلاح
IndexOutOfBoundsException
فيLegacySubtitleUtil
بسبب التعامل بشكل غير صحيح مع حالة وقت بدء الإخراج المطلوب أكبر من أو يساوي وقت الحدث النهائي فيSubtitle
(#1516).
- ملف TTML: إصلاح معالجة قيم النسبة المئوية
- إدارة الحقوق الرقمية:
- إصلاح خطأ
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE
على الأجهزة التي تعمل بالإصدار 31 من واجهة برمجة التطبيقات أو الإصدارات الأحدث عند تشغيل محتوى L1 Widevine يرجع سبب حدوث هذا الخطأ إلى عدم اكتمال تنفيذ أسلوب الإطار العملMediaDrm.requiresSecureDecoder
(#1603).
- إصلاح خطأ
- التأثير:
- أضِف طريقة
release()
إلىGlObjectsProvider
.
- أضِف طريقة
- الجلسة:
- إضافة RTSP:
- تخطّي أوصاف الوسائط غير الصالحة في تحليل SDP (#1087)
الإصدار 1.4.0
25 تموز (يوليو) 2024
تم إصدار androidx.media3:media3-*:1.4.0
.
يحتوي الإصدار 1.4.0 على عمليات الربط هذه.
- المكتبة المشتركة:
- يجب إعادة توجيه طلبات البحث التي يُفترض أنّها لا تؤدي إلى أي إجراء إلى الطريقتَين المحميتَين
BasePlayer.seekTo()
وSimpleBasePlayer.handleSeek()
بدلاً من تجاهلها. إذا كنت تطبّق هذه الطرق في مشغّل مخصّص، قد تحتاج إلى معالجة هذه الطلبات الإضافية باستخدامmediaItemIndex == C.INDEX_UNSET
. - إزالة الاعتماد على ميزة إزالة الرمز البرمجي غير القابل للتنفيذ في Java 8 المحسَّنة أثناء عملية الترجمة (#1312)
- تأكَّد من أنّ المدة التي تم تمريرها إلى
MediaItem.Builder.setImageDurationMs()
يتم تجاهلها إذا كانMediaItem
غير صورة (كما هو موضّح في المستندات). - أضِف
Format.customData
لتخزين المعلومات المخصّصة التي يوفّرها التطبيق حول مثيلاتFormat
.
- يجب إعادة توجيه طلبات البحث التي يُفترض أنّها لا تؤدي إلى أي إجراء إلى الطريقتَين المحميتَين
- ExoPlayer:
- أضِف
BasePreloadManager
الذي ينظّم عملية التحميل المُسبَق لمصادر متعدّدة استنادًا إلى الأولويات التي تحدّدهاrankingData
. يمكن إجراء التخصيص من خلال توسيع نطاق هذه الفئة. أضِفDefaultPreloadManager
الذي يستخدمPreloadMediaSource
لتحميل عيّنات من الوسائط مسبَقًا من المصادر إلى الذاكرة، ويستخدم عددًا صحيحًاrankingData
يشير إلى فهرس عنصر في واجهة المستخدم. - أضِف
PlayerId
إلى معظم طرقLoadControl
لتفعيل عمليات تنفيذLoadControl
لتتوافق مع لاعبين متعدّدين. - أزِل
Buffer.isDecodeOnly()
وC.BUFFER_FLAG_DECODE_ONLY
. ليس هناك حاجة إلى ضبط هذه العلامة لأنّ برامج عرض الفيديو وبرامج ترميز الفيديو ستقرر تخطّي المخازن المؤقتة استنادًا إلى الطابع الزمني. يجب أن تتحقّق عمليات تنفيذRenderer
المخصّصة مما إذا كان وقت التخزين المؤقت لا يقل عنBaseRenderer.getLastResetPositionUs()
لتحديد ما إذا كان يجب عرضRenderer
. يمكن لعمليات تنفيذSimpleDecoder
المخصّصة التحقّق منisAtLeastOutputStartTimeUs()
إذا لزم الأمر أو وضع علامة على ذاكرات التخزين المؤقت الأخرى باستخدامDecoderOutputBuffer.shouldBeSkipped
لتخطّيها. - اسمح بعرض قيمة فارغة من خلال
TargetPreloadStatusControl.getTargetPreloadStatus(T)
للإشارة إلى عدم تحميلMediaSource
مسبقًا باستخدامrankingData
المحدّد. - أضِف
remove(MediaSource)
إلىBasePreloadManager
. - أضِف
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
وفقًا لذلك. - إضافة ميزة تجريبية للتخطيط الديناميكي لمواءمة العمل بشكل أفضل مع دورات تنشيط وحدة المعالجة المركزية وتأخير التنشيط إلى حين أن يتمكّن مُنشئ العرض من التقدّم
يمكنك تفعيل هذا الخيار باستخدام
experimentalSetDynamicSchedulingEnabled()
عند إعداد مثيل ExoPlayer. - أضِف
Renderer.getDurationToProgressUs()
. يمكن لـRenderer
تنفيذ هذه الطريقة لإعادة إلى ExoPlayer المدة التي يجب أن يتقدم فيها التشغيل لكي يتقدّم مُنشئ العرض. إذا تم ضبطExoPlayer
باستخدامexperimentalSetDynamicSchedulingEnabled()
، سيستدعيExoPlayer
هذه الطريقة عند احتساب الوقت لجدولة مهمة العمل. - أضِف
MediaCodecAdapter#OnBufferAvailableListener
لتنبيه عندما تكون ملفّات تخزين مؤقتة للإدخال والإخراج متاحة لاستخدامها من قِبلMediaCodecRenderer
. سيُرسِلMediaCodecRenderer
إشارة إلىExoPlayer
عند تلقّي هذه callbacks، وإذا تم ضبطExoPlayer
باستخدامexperimentalSetDynamicSchedulingEnabled()
، سيُحدِّدExoPlayer
جدولاً زمنيًا لحلقة العمل لأنّه يمكن لأدوات التقديم والعرض تحقيق تقدّم. - استخدِم فئة البيانات لطرق
LoadControl
بدلاً من المَعلمات الفردية. - أضِف
ExoPlayer.isReleased()
للتحقّق مما إذا تمّت دعوةExoplayer.release()
. - أضِف
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
لضبط الحد الأقصى للمكان الذي يبحث فيهseekToPrevious()
عن العنصر السابق (#1425). - إصلاح بعض التناقضات في تركيز الصوت، مثل عدم الإبلاغ عن فقدان التركيز الكامل أو المؤقت أثناء إيقاف المشغّل مؤقتًا (#1436)
- حلّ مشكلة
IndexOutOfBoundsException
المحتمَلة التي تحدث بسبب أدوات الاستخراج التي تُبلغ عن أغانٍ إضافية بعد خطوة الإعداد الأولية (#1476) - سيتلقّى
Effects
فيExoPlayer.setVideoEffect()
الطوابع الزمنية بعد إزالة إزاحة أداة التحويل (#1098). - إصلاح مشكلة
IllegalArgumentException
محتملة عند معالجة خطأ في المشغّل حدث أثناء قراءة المحتوى إلى الأمام في عنصر آخر من قائمة التشغيل (#1483)
- أضِف
- المحوِّل:
- أضِف
audioConversionProcess
وvideoConversionProcess
إلىExportResult
للإشارة إلى كيفية إنشاء المقطع الصوتي المعني في ملف الإخراج. - تخفيف عمليات التحقّق من مستوى تحسين القطع باستخدام برنامج الترميز H.264
- إضافة إمكانية التبديل بين وسائط الإدخال بتنسيق SDR وHDR بشكل تسلسلي
- إتاحة استخدام المؤثرات الصوتية على مستوى التركيب
- إتاحة إعادة ترميز صور Ultra HDR إلى فيديوهات HDR
- تم إصلاح مشكلة عدم عرض
DefaultAudioMixer
للقيمة الصحيحة للبايت بعد إعادة ضبطه وإعادة استخدامه. - حلّ مشكلة خطأ في وحدة الترميز حيث كان عدد القنوات الصوتية محدودًا بالصوت الاستيريو عند معالجة إدخال PCM
- عند اختيار المقاطع الصوتية في
ExoPlayerAssetLoader
، تجاهل القيود المفروضة على عدد قنوات الصوت، لأنّها لا تنطبق إلا على التشغيل. - استبدِل واجهة
androidx.media3.transformer.Muxer
بandroidx.media3.muxer.Muxer
وأزِلandroidx.media3.transformer.Muxer
. - حلّ مشكلة تحميل صور HEIC من مخططات معرّفات الموارد المنتظمة للمحتوى (#1373).
- اضبط مدة المقطع الصوتي في
AudioGraphInput
لتحسين مزامنة الصوت والصورة. - أزِل حقل
ExportResult.processedInputs
. إذا كنت تستخدم هذا الحقل لتحديد تفاصيل الترميز، استخدِمDefaultDecoderFactory.listener
بدلاً من ذلك. فيحال حدوث استثناء في ترميز الفيديو، ستتوفّر تفاصيل ترميز الفيديو فيExportException.codecInfo
.
- أضِف
- برامج الاستخراج:
- MPEG-TS: يمكنك الرجوع إلى التغيير مع التأكّد من عرض الإطار الأخير من خلال تمرير وحدة الوصول الأخيرة من البث إلى قائمة انتظار العيّنات (#7909). دمج إصلاحات لحلّ المشاكل التي ظهرت في بثّات HLS التي تتضمّن إطارات I فقط(#1150) وبثّات HLS التي تتضمّن ترميز H.262 (#1126)
- MP3: يُفضّل استخدام حجم البيانات من إطار
Info
بدلاً من الحجم الذي يُبلِغ عنه البث الأساسي (مثل حجم الملف أو عنوان HTTPContent-Length
). يساعد ذلك في استبعاد بيانات المقاطع الدعائية غير القابلة للتشغيل (مثل أعمال فنية للألبومات) من عمليات احتساب التقديم/الترجيع بمعدّل نقل بيانات ثابت، ما يجعل عمليات التقديم/الترجيع أكثر دقةً (#1376). - MP3: استخدِم عدد اللقطات والبيانات الأخرى في لقطة
Info
(في حال توفّرها) لحساب متوسط معدل نقل البيانات من أجل البحث عن معدل ثابت لنقل البيانات، بدلاً من التوغّل في معدل نقل البيانات للّقطة التي تلي لقطةInfo
، التي قد تكون صغيرة بشكل مصطنع، مثل لقطةPCUT
(#1376). - إصلاح استخراج تنسيق الصوت PCM في حاويات AVI
- الصوت:
- إصلاح سمات ترميز DTS:X Profile 2 لتشغيل "التشغيل المباشر" (#1299)
- بالنسبة إلى التشغيل بلا إنترنت، يجب إعادة ضبط حقل التتبّع لإكمال البث
في
DefaultAudioSink
قبل استدعاءAudioTrack.stop()
لكي تتمكّنAudioTrack.StreamEventCallback#onPresentationEnded
من التعرّف بشكلٍ صحيح على وقت تشغيل جميع البيانات في انتظار المعالجة. - إصلاح خطأ في
SilenceSkippingAudioProcessor
حيث يمكن أن تؤدي عمليات النقل بين تنسيقات الصوت المختلفة (على سبيل المثال، الاستيريو إلى الصوت الأحادي) إلى طرح المعالج استثناءً (#1352) - نفِّذ
MediaCodecAudioRenderer.getDurationToProgressUs()
لكي يحدِّد ExoPlayer جدولاً زمنيًا ديناميكيًا لحلقة العمل الرئيسية عندما يمكن لمحاولة MediaCodecAudioRenderer تحسين الأداء.
- الفيديو:
- إصلاح مشكلة ظهور
Listener.onRenderedFirstFrame()
مبكرًا جدًا عند تبديل مساحات العرض أثناء التشغيل - إصلاح منطق التراجع عن فك ترميز 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).
- يجب حلّ مشكلة
IllegalArgumentException
منLegacySubtitleUtil
عندما لا يحتوي ملفIllegalArgumentException
على مقتطفات من ملفLegacySubtitleUtil
، مثلاً كجزء من بث DASH (#1516).
- البيانات الوصفية:
- حلّ مشكلة ربط علامات MP4 بعلامات الترتيب ID3 في السابق، كانت علامات "ترتيب الألبوم"
(
soal
) و"ترتيب الفنان" (soar
) و"ترتيب فنان الألبوم" (soaa
) في MP4 مرتبطة بشكل خاطئ بعلامات ID3TSO2
وTSOA
وTSOP
(#1302). - إصلاح قراءة علامتَي MP4 (/iTunes) الرقميتَين
gnre
(النوع) وtmpo
(السرعة) عندما تكون القيمة أطول من بايت واحد - انشر إطار
TCON
بتنسيق ID3 إلىMediaMetadata.genre
(#1305).
- حلّ مشكلة ربط علامات MP4 بعلامات الترتيب ID3 في السابق، كانت علامات "ترتيب الألبوم"
(
- الصورة:
- إتاحة استخدام شبكات الصور المصغّرة غير المربّعة في DASH (#1300)
- إتاحة استخدام تنسيق AVIF مع الإصدار 34 من واجهة برمجة التطبيقات والإصدارات الأحدث
- السماح باستخدام
null
كمَعلمة لـExoPlayer.setImageOutput()
لمحوImageOutput
تم ضبطه سابقًا
- DataSource:
- يجب توفير إمكانية استخدام عناوين URL لمواد العرض الأوّلية
android.resource://package/id
حيث يختلفpackage
عن حزمة التطبيق الحالي. لم يكن هذا الإجراء موثَّقًا في السابق، ولكنه يمثّل طريقة أكثر فعالية للوصول إلى الموارد في حزمة أخرى مقارنةً بالوصول إليها بالاسم. - تأكَّد من أنّ
url
غير فارغ في وظائف الإنشاءDataSpec
. سبق أن تم وضع تعليق توضيحي على هذه القيمة لتكون غير فارغة. - اسمح لـ
ByteArrayDataSource
بتحويل عنوان URL إلى صفيف بايت أثناءopen()
، بدلاً من برمجته بشكل ثابت عند الإنشاء (#1405).
- يجب توفير إمكانية استخدام عناوين URL لمواد العرض الأوّلية
- إدارة الحقوق الرقمية:
- السماح بضبط
LoadErrorHandlingPolicy
علىDefaultDrmSessionManagerProvider
(#1271)
- السماح بضبط
- التأثير:
- أن تتيح تغييرات متعددة في السرعة ضمن
EditedMediaItem
أوComposition
نفسه فيSpeedChangeEffect
- إتاحة إخراج HLG وPQ من إدخال ملفات بترميز bitmap بدقة فائقة للغاية
- إضافة إمكانية استخدام EGL_GL_COLORSPACE_BT2020_HLG_EXT، ما يؤدي إلى تحسين إخراج سطح HLG في ExoPlayer.setVideoEffect وDebug SurfaceView في Transformer
- عدِّل عملية تنفيذ مصفوفة التراكب لتكون متسقة مع مستندات المساعدة من خلال قلب قيم x وy المطبَّقة في
setOverlayFrameAnchor()
. في حال استخدامOverlaySettings.Builder.setOverlayFrameAnchor()
، يمكنك قلب قيم x وy بضربهما في-1
. - إصلاح خطأ يؤدي إلى تعطُّل
TimestampWrapper
عند استخدامه معExoPlayer#setVideoEffects
(#821) - تغيير مساحة العمل التلقائية للألوان بنطاق ديناميكية عادي (SDR) من الألوان الخطية إلى الكهربائية فيديو بنطاق ديناميكية عادي (SDR) بتنسيق BT 709 قدِّم أيضًا خيارًا ثالثًا للاحتفاظ بالملف الشخصي للألوان الأصلي.
- السماح بتحديد ترتيب z غير المحدّد لـ EditedMediaItemSequences (#1055)
- الحفاظ على نطاق سطوع متسق في أجزاء مختلفة من محتوى HDR (يستخدم نطاق HLG)
- إتاحة استخدام ميزة "الدقّة الفائقة للصور ذات النطاق الديناميكي العالي (الصور النقطية)" على المحتوى بدقة HDR
- السماح باستخدام تأثيرات
SeparableConvolution
قبل الإصدار 26 من واجهة برمجة التطبيقات - أزِل
OverlaySettings.useHdr
غير المستخدَمة لأنّ النطاق الديناميكي للعنصر المتراكب والإطار يجب أن يتطابقا. - إضافة ميزة النطاق العالي الديناميكية (HDR) إلى
TextOverlay
يمكن تعديل سطوع النص المتراكب باستخدامOverlaySettings.Builder.setHdrLuminanceMultiplier()
.
- أن تتيح تغييرات متعددة في السرعة ضمن
- إضافة IMA:
- ترقية واجهة برمجة التطبيقات المطلوبة للتطبيقات لتشغيل عمليات عرض الإعلانات الديناميكية أثناء التشغيل إلى الإصدار الثابت
- أضِف
replaceAdTagParameters(Map <String, String>)
إلىImaServerSideAdInsertionMediaSource.AdLoader
التي تسمح باستبدال مَعلمات علامة الإعلان أثناء التشغيل. - إصلاح خطأ عدم
استدعاء
VideoAdPlayer.VideoAdPlayerCallback.onError()
عند حدوث خطأ في المشغّل أثناء تشغيل الإعلان (#1334) - عليك ترقية إصدار حزمة IMA SDK إلى 3.33.0 لحلّ مشكلة
NullPointerException
عند استخدام معرّفات الموارد المنتظمة (URI) لعلامة الإعلانdata://
(#700).
- الجلسة:
- غيِّر القيمة التلقائية من
CommandButton.enabled
إلىtrue
وتأكَّد من أنّه يمكن أن تظل القيمة خطأ لعناصر التحكّم حتى إذا كان الأمر المرتبط بها متاحًا. - أضِف ثوابت الرموز لـ
CommandButton
التي يجب استخدامها بدلاً من مصادر الرموز المخصّصة. - أضِف
MediaSessionService.isPlaybackOngoing()
للسماح للتطبيقات بالاستعلام عمّا إذا كان يجب إيقاف الخدمة فيonTaskRemoved()
(#1219). - أضِف
MediaSessionService.pauseAllPlayersAndStopSelf()
الذي يتيح بشكل ملائم إيقاف تشغيل كل الجلسات مؤقتًا واستدعاءstopSelf()
ل إنهاء دورة حياةMediaSessionService
. - يمكنك إلغاء القيمة
MediaSessionService.onTaskRemoved(Intent)
لتوفير تنفيذ افتراضي آمن يحافظ على تشغيل الخدمة في المقدّمة إذا كان التشغيل مستمرًا أو يوقف الخدمة في حال أخرى. - إخفاء شريط التمرير في إشعار الوسائط الخاص بالبث المباشر من خلال عدم ضبط المدّة في البيانات الوصفية لجلسة المنصة (#1256)
- يجب مواءمة تحويل
MediaMetadata
إلىMediaDescriptionCompat
لاستخدام الترتيب والمنطق المفضّلَين نفسهما عند اختيار سمات البيانات الوصفية كما هو الحال في media1. - أضِف
MediaSession.sendError()
الذي يسمح بإرسال الأخطاء غير الخطيرة إلى وحدة تحكّم Media3. عند استخدام وحدة التحكّم في الإشعارات (راجِعMediaSession.getMediaNotificationControllerInfo()
)، يتم استخدام خطأ مخصّص لتحديثPlaybackState
لجلسة النظام الأساسي إلى حالة خطأ تتضمّن معلومات الخطأ المحدّدة (#543). - أضِف
MediaSession.Callback.onPlayerInteractionFinished()
لإعلام الجلسات عند انتهاء سلسلة من تفاعلات اللاعب من وحدة تحكّم معيّنة. - أضِف
SessionError
واستخدِمه فيSessionResult
وLibraryResult
بدلاً من رمز الخطأ لتقديم مزيد من المعلومات عن الخطأ وكيفية حلّه إن أمكن. - انشر رمز تطبيق اختبار وحدة التحكّم في Media3 الذي يمكن استخدامه لاختبار التفاعلات مع التطبيقات التي تنشر جلسة وسائط.
- انشر الإضافات التي تم تمريرها إلى
MediaSession[Builder].setSessionExtras()
في media3 إلىPlaybackStateCompat.getExtras()
في وحدة التحكّم في media1. - يمكنك ربط الأخطاء الفادحة وغير الفادحة بجلسة المنصة ومنها. يتمّ ربط
PlaybackException
بحالة خطأ فادح فيPlaybackStateCompat
. يتمّ ربطSessionError
المُرسَل إلى وحدة التحكّم في إعلامات الوسائط باستخدامMediaSession.sendError(ControllerInfo, SessionError)
بخطأ غير مميت فيPlaybackStateCompat
، ما يعني أنّه يتمّ ضبط رمز الخطأ والرسالة ولكنّ حالة جلسة المنصة تظلّ مختلفة عنSTATE_ERROR
. - السماح بضبط نشاط الجلسة لكل وحدة تحكّم لإلغاء
نشاط الجلسة العام يمكن تحديد نشاط الجلسة لجهاز التحكّم في وقت الاتصال من خلال إنشاء
ConnectionResult
باستخدامAcceptedResultBuilder.setSessionActivivty(PendingIntent)
. بعد الاتصال، يمكن تعديل نشاط الجلسة باستخدامMediaSession.setSessionActivity(ControllerInfo, PendingIntent)
. - تحسين تكرار الأخطاء في المكالمات إلى
MediaLibrarySession.Callback
يمكن الآن ضبط تكرار الأخطاء باستخدامMediaLibrarySession.Builder.setLibraryErrorReplicationMode()
لتحديد نوع الخطأ أو إيقاف تكرار الأخطاء الذي يكون مفعّلاً تلقائيًا.
- غيِّر القيمة التلقائية من
- واجهة المستخدم:
- إضافة ميزة عرض الصور إلى
PlayerView
عند ربطه بجهازExoPlayer
(#1144) - أضِف تخصيصًا للرموز المختلفة في
PlayerControlView
من خلال سمات xml للسماح بأشكال مختلفة للرسم لكل مثيل منPlayerView
، بدلاً من عمليات الاستبدال الشاملة (#1200). - حلّ مشكلة خطأ في النظام الأساسي يؤدي إلى تمديد الفيديو أو اقتصاصه عند استخدام
SurfaceView
داخل رمز إنشاءAndroidView
في واجهة برمجة التطبيقات 34 (#1237)
- إضافة ميزة عرض الصور إلى
- عمليات التنزيل:
- تأكَّد من أنّ
DownloadHelper
لا يُسرِّب مثيلاتRenderer
غير المنشورة، ما قد يؤدي في النهاية إلى تعطُّل التطبيق معIllegalStateException: Too many receivers, total of 1000, registered for pid
(#1224).
- تأكَّد من أنّ
- إضافة Cronet:
- حلّ المشكلة
SocketTimeoutException
فيCronetDataSource
في بعض إصدارات Cronet، لا يكون الطلب المقدَّم من خلال دالة الاستدعاء هو نفسه في كلّ مرة. يؤدي ذلك إلى عدم اكتمال عملية طلب إعادة الاتصال وانتهاء مهلة الطلب (https://issuetracker.google.com/328442628).
- حلّ المشكلة
- إضافة HLS:
- تم إصلاح الخلل الذي كان يتسبب في تعيين عيّنات EMSG في انتظار حدوث انقطاع في
HlsSampleStreamWrapper
باستخدام إزاحة غير صحيحة، ما يؤدي إلى حدوثIndexOutOfBoundsException
أوIllegalArgumentException
(#1002). - إصلاح الخلل الذي كان يؤدي إلى إعادة تحميل قوائم التشغيل غير الأساسية باستمرار لأحداث البث المباشر باستخدام بروتوكول HLS المنخفض التكلفة (#1240)
- تم إصلاح خطأ كان يؤدي إلى ظهور
Source Error
وIllegalArgumentException
عند تفعيل ميزة "إدارة المحتوى من جهة العميل" لبروتوكول HLS مع مقاطع الإعداد. - إصلاح الخلل الذي كان يؤدي إلى عدم إعادة تحميل قوائم التشغيل غير الأساسية أثناء التشغيل المباشر (#1240)
- إصلاح خطأ يؤدي إلى حدوث مشكلة عند تفعيل ميزة "إدارة المحتوى من خلال علامة مائية" لأحداث البث المباشر وفق بروتوكول HTTP (HLS)
ArrayIndexOutOfBoundsException
(#1395)
- تم إصلاح الخلل الذي كان يتسبب في تعيين عيّنات EMSG في انتظار حدوث انقطاع في
- إضافة DASH:
- إضافة البث:
- تم إصلاح الخطأ الذي كان يحوّل عنوان الألبوم في
MediaQueueItem
إلى الفنان في ملف الوسائط Media3 (#1255).
- تم إصلاح الخطأ الذي كان يحوّل عنوان الألبوم في
- أدوات الاختبار:
- نفِّذ
onInit()
وonRelease()
فيFakeRenderer
. - غيِّر طرق
TestPlayerRunHelper.runUntil()/playUntil()
لتتعطّل عند حدوث أخطاء غير خطيرة (مثل الأخطاء التي تم الإبلاغ عنها إلىAnalyticsListener.onVideoCodecError()
). استخدِم سلسلة الأسلوبTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
الجديدة لإيقاف هذا السلوك.
- نفِّذ
- التطبيق التجريبي:
- استخدِم
DefaultPreloadManager
في تطبيق المعاينة المخصّص للفيديوهات القصيرة. - السماح بضبط وضع التكرار باستخدام وسيطات
Intent
من سطر الأوامر (#1266) - استخدِم
HttpEngineDataSource
كHttpDataSource
عندما يكون ذلك متوافقًا مع الجهاز.
- استخدِم
- إزالة الرموز المتوقّفة نهائيًا:
- أزِل
CronetDataSourceFactory
. استخدِمCronetDataSource.Factory
بدلاً من ذلك. - أزِل بعض وظائف الإنشاء
DataSpec
. استخدِمDataSpec.Builder
بدلاً من ذلك. - أزِل طريقة الدفع
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
). - أزِل واجهة
Bundleable
. ويشمل ذلك إزالة جميع الحقول الثابتةBundleable.Creator<Foo> CREATOR
. على المُتصلين استخدام الأسلوبينBundle toBundle()
وstatic Foo fromBundle(Bundle)
مع كل نوع بدلاً من ذلك.
- أزِل
الإصدار 1.4.0-rc01
10 تموز (يوليو) 2024
استخدِم الإصدار الثابت 1.4.0.
الإصدار 1.4.0-beta01
26 حزيران (يونيو) 2024
استخدِم الإصدار الثابت 1.4.0.
الإصدار 1.4.0-alpha02
7 يونيو 2024
استخدِم الإصدار الثابت 1.4.0.
الإصدار 1.4.0-alpha01
17 نيسان (أبريل) 2024
استخدِم الإصدار الثابت 1.4.0.
الإصدار 1.3.0
الإصدار 1.3.1
11 نيسان (أبريل) 2024
تم إصدار androidx.media3:media3-*:1.3.1
.
يتضمّن الإصدار 1.3.1 عمليات الربط هذه.
- المكتبة المشتركة:
- أضِف
Format.labels
للسماح بتصنيفات بديلة مترجَمة أو غير ذلك.
- أضِف
- ExoPlayer:
- إصلاح مشكلة تعذُّر الاحتفاظ بالبثّات على
PreloadMediaPeriod
عند تحميلها مسبقًا مرة أخرى - طبِّق
TrackSelectionResult
المناسب على مدّة المحتوى المشغّل عند إعادة اختيار المقطع الصوتي. - لا تبدأ أدوات التحويل التي تم تفعيلها مبكرًا إلا بعد تقدُّم فترة التشغيل عند الانتقال بين عناصر الوسائط (#1017).
- أضِف نوع الإرجاع غير المتوفّر إلى قاعدة
-keepclasseswithmembers
في Proguard لملف APKDefaultVideoFrameProcessor.Factory.Builder.build()
(#1187).
- إصلاح مشكلة تعذُّر الاحتفاظ بالبثّات على
- المحوِّل:
- إضافة حلّ بديل للخطأ الذي يتم طرحه بسبب عدم توافق
MediaMuxer
مع الطوابع الزمنية السلبية للعرض قبل الإصدار 30 من واجهة برمجة التطبيقات
- إضافة حلّ بديل للخطأ الذي يتم طرحه بسبب عدم توافق
- اختيار المقطع الصوتي:
DefaultTrackSelector
: يُفضَّل استخدام مسارات الفيديو التي تتضمّن معدّل مقبولاً لعدد اللقطات في الثانية (>=10 لقطات في الثانية) بدلاً من تلك التي تتضمّن معدّلًا أقل أو لم يتم ضبطه. يضمن ذلك أن يختار المشغّل مسار الفيديو "الحقيقي" في ملفات MP4 المستخرَجة من صور متحركة يمكن أن تحتوي على مسارَين بترميز HEVC يكون أحدهما بدرجة دقة أعلى ولكن مع عدد قليل جدًا من اللقطات (#1051).
- برامج الاستخراج:
- تم إصلاح مشكلة عدم تخطّي الحشو عند قراءة أجزاء ذات أحجام فردية من ملفات WAV (#1117).
- MP3: يمكنك تعبئة
Format.averageBitrate
من إطارات البيانات الوصفية، مثلXING
وVBRI
. - MPEG-TS: التراجع عن تغيير كان يهدف إلى ضمان عرض اللقطة الأخيرة من خلال تمرير وحدة الوصول الأخيرة من البث إلى قائمة انتظار العيّنات (#7909) ويعود سبب ذلك إلى أنّ التغيير يتسبب في مشاكل جديدة في أحداث البث المباشر وفق بروتوكول HTTP التي تتضمّن إطارات I فقط (#1150) وأحداث البث المباشر وفق بروتوكول HTTP التي تتضمّن ترميز H.262 (#1126).
- الصوت:
- السماح باسترداد وحدة التحويل من خلال إيقاف وضع "إلغاء التحميل" إذا تعذّر بدء تشغيل المقطع الصوتي في وضع "إلغاء التحميل"
- الفيديو:
- إضافة حلّ بديل لمشكلة في جهاز Galaxy Tab S7 FE وChromecast مع Google TV وLenovo M10 FHD Plus تؤدي إلى وضع علامة "غير متوافقة" على عمليات بث H265 بمعدّل 60 لقطة في الثانية
- إضافة حلّ بديل يضمن عرض اللقطة الأولى دائمًا أثناء إنشاء نفق حتى إذا لم ينفّذ الجهاز ذلك تلقائيًا على النحو المطلوب من واجهة برمجة التطبيقات (#1169) (#966)
- حلّ مشكلة تؤدي إلى حدوث خلل في برنامج الترميز عند معالجة معلومات ألوان HDR وgátمنع تبديل التنسيقات التكيُّفية لملفات الفيديو بتنسيق 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) في تحليل SDP (#1087)
- إضافات برامج الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
- أوقِف إضافة MIDI كتبعية محلية تلقائيًا لأنّه يتطلب إعداد مستودع Maven إضافي. يمكن للمستخدمين الذين يحتاجون إلى هذه الوحدة من تبعية محلية إعادة تفعيلها.
الإصدار 1.3.0
6 مارس 2024
تم إصدار androidx.media3:media3-*:1.3.0
.
يحتوي الإصدار 1.3.0 على عمليات الربط هذه.
- المكتبة المشتركة:
- إتاحة
android.resource://package/[type/]name
عناوين URI لمواد الخام حيث يختلفpackage
عن حزمة التطبيق الحالي لقد تبيّن دائمًا أنّ هذا الإجراء يعمل، ولكن لم يتم تنفيذه بشكل صحيح حتى الآن. - يجب توحيد أنواع MIME التي يضبطها رمز التطبيق أو يقرأها من الوسائط لتكون بالكامل بالأحرف الصغيرة.
- حدِّد الإعلانات باستخدام
MediaItem
كامل بدلاً منUri
واحد فيAdPlaybackState
. - زيادة
minSdk
إلى 19 (Android KitKat) ويتم ذلك بهدف مواءمة جميع مكتبات AndroidX الأخرى، ويُشترط علينا الترقية إلى أحدث إصدارات مكتبات AndroidX المُستخدَمة في التطبيق. - املأ كلّ من
artworkUri
وartworkData
فيMediaMetadata.Builder.populate(MediaMetadata)
عندما يكون أحدهما على الأقل غير فارغ (#964).
- إتاحة
- 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
(المكافئ لمعدل نقل البيانات الثابت لرأس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 يتم اقتصاص صور الشبكة وعرض Thumbnails فردية
ImageOutput
بقرب وقت عرضها.
- إضافة ميزة عرض الصور المصغّرة بتنسيق DASH يتم اقتصاص صور الشبكة وعرض Thumbnails فردية
- إدارة الحقوق الرقمية:
- يتم تشغيل عيّنات "المحتوى الرئيسي" غير المشفَّرة في المحتوى الخاضع لإدارة الحقوق الرقمية على الفور
تلقائيًا، حتى إذا لم تكن مفاتيح العيّنات المشفَّرة اللاحقة جاهزة
بعد. وقد يؤدي ذلك إلى توقُّف التشغيل أثناء التشغيل إذا لم تكن المفاتيح جاهزة
عند وصول موضع التشغيل إلى العيّنات المشفَّرة (ولكن في السابق،
لم يكن من الممكن بدء التشغيل على الإطلاق في هذه المرحلة). يمكن
إيقاف هذا السلوك باستخدام
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
أوDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
.
- يتم تشغيل عيّنات "المحتوى الرئيسي" غير المشفَّرة في المحتوى الخاضع لإدارة الحقوق الرقمية على الفور
تلقائيًا، حتى إذا لم تكن مفاتيح العيّنات المشفَّرة اللاحقة جاهزة
بعد. وقد يؤدي ذلك إلى توقُّف التشغيل أثناء التشغيل إذا لم تكن المفاتيح جاهزة
عند وصول موضع التشغيل إلى العيّنات المشفَّرة (ولكن في السابق،
لم يكن من الممكن بدء التشغيل على الإطلاق في هذه المرحلة). يمكن
إيقاف هذا السلوك باستخدام
- إضافة IMA:
- إصلاح مشكلة تعذُّر تشغيل إعلانات DASH وHLS بدون إضافة الملف المناسبة
- الجلسة:
- أوقِف ميزة رصد النقر مرّتين في تطبيقات التلفزيون (#962).
- تم حلّ المشكلة المتعلّقة بعدم نقل
MediaItem.RequestMetadata
مع الإضافات غير الصفرية فقط بين وحدات التحكّم في الوسائط والجلسات. - أضِف عنصر إنشاء إلى
MediaLibrarySession.Builder
لا يقبل سوىContext
بدلاً منMediaLibraryService
.
- إضافة HLS:
- خفض مستوى رؤية
HlsMediaPeriod
إلى "مستوى رؤية حزمة" يجب عدم الاعتماد على هذا النوع مباشرةً من خارج حزمة HLS. - يبحث Resolve عن بداية المقطع بكفاءة أكبر (#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:
- إصلاح مشكلة استمرار تعديل الفاصل الزمني للرجوع إلى
min/maxOffset
عند إجراء عمليات بحث يدوي خارج نطاقLiveConfiguration.min/maxOffset
- حلّ مشكلة تنسيقات قنوات OPUS وVORBIS غير الصحيحة للقنوات 3 و5 و6 و7 و8 (#8396)
- تم إصلاح مشكلة عدم بدء البث المباشر من موضع البداية التلقائي عند اختيار الأغاني والرجوع إلى النقطة صفر في البث المباشر (#9347).
- حلّ المشكلة التي كانت تؤدي إلى تلقّي النُسخ الجديدة من
CmcdData.Factory
قيمًا سالبة لسمةbufferedDurationUs
من مصادر المقاطع، ما يؤدي بدوره إلى ظهورIllegalArgumentException
(#888).
- إصلاح مشكلة استمرار تعديل الفاصل الزمني للرجوع إلى
- المحوِّل:
- حلّ مشكلة تؤدي إلى ظهور خطأ في برنامج الترميز أثناء عملية الضبط بسبب ضبط معدّل تشغيل مرتفع
- برامج الاستخراج:
- ضَع علامة "
ROLE_FLAG_ALTERNATE
" على مسارات HEVC الثانوية (غير القابلة للتشغيل) في صور JPEG المتحركة لمنع اختيارها تلقائيًا لبدء التشغيل بسبب دقتها العالية. - إصلاح مشكلة رصد الإطارات الرئيسية غير الصحيحة لأحداث البث بتنسيق TS H264 (#864)
- إصلاح تقدير المدة لأحداث البث بتنسيق TS التي تزيد مدتها عن 47721 ثانية (#855)
- ضَع علامة "
- الصوت:
- حلّ مشكلة معالجة نهاية الجلسة في
SilenceSkippingAudioProcessor
عند الاتصال بها متعدد المرات (#712)
- حلّ مشكلة معالجة نهاية الجلسة في
- الفيديو:
- إضافة حلّ بديل لمشكلة في جهاز Galaxy Tab S7 FE وChromecast مع Google TV وLenovo M10 FHD Plus تؤدي إلى وضع علامة "غير متوافقة" على عمليات بث AVC بمعدّل 60 لقطة في الثانية (#693).
- البيانات الوصفية:
- إصلاح خطأ كان يؤدي إلى تعبئة
MediaMetadata
من تعليقات Vorbis فقط باستخدام مفاتيح بأحرف كبيرة (#876) - يمكنك معالجة
OutOfMemoryError
عند تحليل إطارات ID3 كبيرة جدًا، ما يعني أنّه يمكن مواصلة التشغيل بدون معلومات العلامة بدلاً من إيقاف التشغيل تمامًا.
- إصلاح خطأ كان يؤدي إلى تعبئة
- إدارة الحقوق الرقمية:
- توسيع نطاق الحلّ البديل لعنوان URL غير الصالح لترخيص ClearKey
https://default.url
لتشمل المستوى 33 من واجهة برمجة التطبيقات والإصدارات الأحدث (في السابق، كان الحلّ البديل ينطبق على المستوى 33 من واجهة برمجة التطبيقات بالضبط فقط) (#837) - حلّ مشكلة
ERROR_DRM_SESSION_NOT_OPENED
عند التبديل من محتوى مشفّر إلى محتوى واضح بدون سطح مرتبط بالوسيط حدث الخطأ بسبب استخدام وحدة فك ترميز آمنة بشكل غير صحيح لتشغيل المحتوى الواضح.
- توسيع نطاق الحلّ البديل لعنوان URL غير الصالح لترخيص 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 وما إلى ذلك):
- إضافة البث:
- يجب فحص عملية إنشاء
Timeline
لتجنّب تعطُّل التطبيق عند تعذُّر تحميل الوسائط على جهاز البث (#708).
- يجب فحص عملية إنشاء
الإصدار 1.2.0
15 تشرين الثاني (نوفمبر) 2023
- المكتبة المشتركة:
- أضِف مَعلمة
@Nullable Throwable
إلى الطرق في واجهةLog.Logger
. لم تعُد المَعلمةmessage
لهذه الطُرق تحتوي على أي معلومات عنThrowable
التي تم تمريرها إلى طُرقLog.{d,i,w,e}()
، لذا يجب أن تُلحق عمليات التنفيذ هذه المعلومات يدويًا إذا أرادت ذلك (ربما باستخدامLogger.appendThrowableString(String, Throwable)
). - إصلاح مشكلة التوافق مع Kotlin التي تؤدي إلى عدم رصد مَعلمات النوع العام nullable
وأنواع عناصر المصفوفة nullable على أنّها nullable ومن الأمثلة على ذلك
مَعلمات الطريقة
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). - أضِف عمق البتّ لكل من luminance وchroma إلى
ColorInfo
(#491). - أضِف حقولًا إضافية إلى تسجيل بيانات العميل المشترَكة للوسائط (CMCD): طلب العنصر التالي (
nor
) وطلب النطاق التالي (nrr
) (#8699). - إضافة وظيفة لنقل بيانات Common Media Client Data (CMCD) باستخدام مَعلمات طلب البحث (#553)
- حلّ المشكلة
ConcurrentModificationException
فيExperimentalBandwidthMeter
(#612) - أضِف المَعلمة
MediaPeriodId
إلىCompositeMediaSource.getMediaTimeForChildMediaTime
. - إتاحة
ClippingMediaSource
(والمصادر الأخرى التي تتضمّن Offsets لوقت الفترة/الإطار الزمني) في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 classic
في
Mp4Extractor
- الصوت:
- إتاحة استخدام تنسيق PCM بترميز big-endian بسعة 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)
- إصلاح خطأ يؤدي إلى ظهور رمز الخطأ
IllegalArgumentException
(#677) عند التحقّق من الإمكانات المتاحة لتنسيق E-AC3-JOC
- إتاحة استخدام تنسيق PCM بترميز big-endian بسعة 24/32 بت في MP4 وMatroska وتحليل ترميز
PCM لملف
- الفيديو:
- اسمح لتطبيق
MediaCodecVideoRenderer
باستخدامVideoFrameProcessor.Factory
مخصّص. - إصلاح الخلل الذي كان يؤدي إلى تعذُّر عرض اللقطة الأولى إذا كان بث الصوت يبدأ بطوابع زمنية سلبية (#291)
- اسمح لتطبيق
- النص:
- أزِل
ExoplayerCuesDecoder
. يتم الآن التعامل مع مسارات النص التي تحتوي علىsampleMimeType = application/x-media3-cues
مباشرةً من خلالTextRenderer
بدون الحاجة إلى مثيلSubtitleDecoder
.
- أزِل
- البيانات الوصفية:
- لن يتمّ استدعاء
MetadataDecoder.decode
بعد الآن لتحليل عيّنات "فك التشفير فقط" لأنّ التنفيذ يجب أن يعرض قيمة فارغة على أيّ حال.
- لن يتمّ استدعاء
- التأثير:
- أضِف
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
وضع إدخال الصورة النقطية في "قائمة الانتظار" حسب الطابع الزمني. - غيِّر
VideoFrameProcessor.registerInputStream()
إلى غير حظر. يجب أن تنفِّذ التطبيقاتVideoFrameProcessor.Listener#onInputStreamRegistered()
. - تم تغيير مَعلمتَي
frameRate
وdurationUs
فيVideoFrameProcessor.queueInputBitmap
إلىTimestampIterator
.
- أضِف
- إضافة IMA:
- إصلاح خطأ كان يؤدي إلى ظهور استثناء عند بث مباشر متعدد الفترات باستخدام 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
من أجل التوافق مع Android 14. عند استخدام هذه الخدمة، يجب أيضًا أن يُدرج التطبيقdataSync
كـforegroundServiceType
في البيان وأن يضيف الإذنFOREGROUND_SERVICE_DATA_SYNC
(#11239).
- يجب تقديم بيان عن نوع الخدمة التي تعمل في المقدّمة "مزامنة البيانات" لتطبيق
- إضافة HLS:
- أعِد تحميل قائمة التشغيل المباشرة بتنسيق HLS باستخدام فاصل زمني يتم احتسابه من وقت بدء عملية التحميل الأخيرة بدلاً من وقت اكتمال عملية التحميل الأخيرة (#663).
- إضافة DASH:
- السماح بعدة أرقام تعريف DASH نفسها في عنوان URL لنموذج الشريحة
- إضافة ميزة تجريبية لتحليل الترجمة أثناء الاستخراج يقدّم هذا الإصدار
دعمًا أفضل لدمج الترجمة والشرح المتداخلَين، بما في ذلك
حلّ مشكلة وميض الترجمة والشرح عند الانتقال بين مقاطع الترجمة والشرح. يمكنك
تفعيل هذه الميزة باستخدام
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
(#288).
- إضافة RTSP:
- تم إصلاح مشكلة تعارض في المعالجة يمكن أن تؤدي إلى
IndexOutOfBoundsException
عند الرجوع إلى بروتوكول TCP أو تعليق التشغيل في بعض الحالات. - تحقّق من الحالة في إعداد RTSP عند عرض حالة التحميل لملف
RtspMediaPeriod
(#577). - تجاهل طرق طلب Rtsp المخصّصة في الرأس العام للردّ على الخيارات (#613).
- استخدِم قيمة مهلة استجابة إعداد RTSP في الفاصل الزمني لإرسال طلبات خيارات RTSP للحفاظ على الاتّصال (#662).
- تم إصلاح مشكلة تعارض في المعالجة يمكن أن تؤدي إلى
- إضافات برامج الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
- يمكنك إصدار وحدة فك ترميز MIDI التي تتيح تشغيل ملفات MIDI العادية باستخدام مكتبة Jsyn لإنشاء الصوت.
- أضِف
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).
- تم إصلاح خطأ كان يمنع الانتقال من
- نقل بيانات الصوت:
- يجب إضافة صفحتَي Header ID وComment Header إلى بث البتات لتشغيل Opus الذي تم نقله خارج الجهاز وفقًا لمعيار RFC 7845.
- الفيديو:
- H.265/HEVC: إصلاح أخطاء تحليل معلومات الصورة المرجعية على المدى القصير والطويل في SPS
- النص:
- CEA-608: تغيير منطق اقتطاع المقاطع الصوتية لعرض النص المرئي فقط في السابق، كان يتم تضمين المسافة البادئة وعلامة التبويب عند الحد من طول العبارة المرجعية إلى 32 حرفًا (وهو ما كان صحيحًا من الناحية الفنية وفقًا للمواصفات) (#11019).
- إضافة IMA:
- عليك ترقية إصدار حزمة تطوير البرامج (SDK) لإعلانات الوسائط التفاعلية إلى 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
- أضِف طرقًا مُحمَّلة إلى Player تسمح للمستخدمين بتحديد علامات
مستوى الصوت:
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>)
عن طريق إضافة مَعلمة مخطط زمني تحتوي على الفترات الزمنية مع أرقام التعريف الفريد المستخدَمة كمفاتيح في الخريطة. هذا الإجراء مطلوب لتجنُّب مشاكل التزامن في أحداث البث المباشر التي تتضمن عدة فترات. - أوقِف
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)
. - تم إصلاح خطأ كان يؤدي إلى توقُّف عملية التحويل (ما يؤدي إلى انتهاء مهلة أداة muxer) في حال تم إرسال إشارة بنهاية بث الفيديو في اللحظة التي كان فيها إطار الإدخال في انتظار المعالجة.
- يمكنك طلب ترميزات الصوت والفيديو من خلال
MediaCodecList
بدلاً من استخدام أدواتfindDecoder/EncoderForFormat
لتوسيع نطاق التوافق. - أزِل إعدادات اللقطات البينية في
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
صفرًا عندما لا يتوافقPlayer.getCurrentTracks
مع الفيديو أو لم يتم تحديد حجم المسار الصوتي المتوافق مع الفيديو بعد.
- اجعل
- إدارة الحقوق الرقمية:
- يمكنك تقليل مستوى رؤية العديد من الطرق الداخلية فقط في
DefaultDrmSession
التي لا يُتوقّع استدعاؤها من خارج حزمة إدارة الحقوق الرقمية:void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- يمكنك تقليل مستوى رؤية العديد من الطرق الداخلية فقط في
- أداة الدمج:
- أضِف مكتبة جديدة لبرنامج ربط الوسائط يمكن استخدامها لإنشاء ملف حاوية MP4.
- إضافة IMA:
- تفعيل أحداث بث DASH مباشر متعددة الفترات لميزة "الإعلانات أثناء التشغيل" يُرجى العِلم أنّه لا يمكن حاليًا استخدام ميزة التقديم/الترجيع في أحداث البث المباشر (#10912).
- إصلاح خطأ يؤدي إلى إدراج مجموعة إعلانية جديدة في أحداث البث المباشر لأنّه يختلف موضع المحتوى المحسوب في المخططات الزمنية المتتالية قليلاً
- الجلسة:
- أضِف طريقة مساعدة
MediaSession.getControllerForCurrentRequest
للحصول على معلومات عن وحدة التحكّم التي تستدعي حاليًا طريقةPlayer
. - أضِف
androidx.media3.session.MediaButtonReceiver
لتفعيل التطبيقات على تنفيذ استئناف التشغيل من خلال أحداث أزرار الوسائط التي ترسلها، مثلاً، سماعات رأس بلوتوث (#167). - أضِف التنفيذ التلقائي إلى
MediaSession.Callback.onAddMediaItems
لسماح بتمريرMediaItems
المطلوبة إلىPlayer
إذا كان لديهاLocalConfiguration
(مثل عنوان URL) (#282). - إضافة زرَّي التحكم "التقديم إلى المحتوى السابق" و "التقديم إلى المحتوى التالي" في عرض إشعارات الوسائط المكثّف تلقائيًا على الإصدار 12 من نظام التشغيل Android والإصدارات الأقدم (#410)
- أضِف التنفيذ التلقائي إلى
MediaSession.Callback.onAddMediaItems
لسماح بتمريرMediaItems
المطلوبة إلىPlayer
إذا كان لديهاLocalConfiguration
(مثل عنوان URL) (#282). - إضافة زرَّي التحكم "التقديم إلى المحتوى السابق" و "التقديم إلى المحتوى التالي" في عرض إشعارات الوسائط المكثّف تلقائيًا على الإصدار 12 من نظام التشغيل Android والإصدارات الأقدم (#410)
- أضِف طريقة مساعدة
- واجهة المستخدم:
- أضِف طريقتَي Util
shouldShowPlayButton
وhandlePlayPauseButtonAction
لكتابة عناصر واجهة مستخدِم مخصّصة تتضمّن زرَّي تشغيل/إيقاف مؤقت.
- أضِف طريقتَي Util
- إضافة RTSP:
- إضافة DASH:
- أزِل مدة بدء عرض الوسائط من
MediaLoadData.startTimeMs
وMediaLoadData.endTimeMs
لأحداث البث باستخدام بروتوكول DASH ذات الفترات المتعددة. - تم إصلاح خطأ كان يؤدي إلى ظهور
IndexOutOfBoundsException
(#10838) عند إعادة إعداد مصدر وسائط Dash المباشر المتعدّد الفترات.
- أزِل مدة بدء عرض الوسائط من
- إضافة 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
. - أزِل ثوابت String المتوقّفة نهائيًا لمجموعات الأحرف (
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()
و methods setter بدلاً منها. - أزِل العنصر
ExoPlayer.retry()
الذي تم إيقافه نهائيًا واستخدِمprepare()
بدلاً منه. - أزِل باني
DefaultTrackSelector
الذي يستخدم مَعلمة واحدة تم إيقافه نهائيًا، واستخدِمDefaultTrackSelector(Context)
بدلاً منه. - أزِل باني
OfflineLicenseHelper
الذي تم إيقافه نهائيًا واستخدِمOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
بدلاً منه. - أزِل باني
DownloadManager
الذي تم إيقافه نهائيًا، واستخدِم بانيExecutor
الذي يقبل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)
- أضِف
- برامج الاستخراج:
- إصلاح تحليل SPS في H.265 في ملفات 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)
- تم إصلاح خطأ كان يؤدي إلى توقُّف تشغيل المحتوى عند بث عيّنات فارغة في الوسائط.
- الجلسة:
- تم إصلاح خطأ كان يؤدي إلى ظهور استثناء في
MediaController
(#290) عند نشر عناصر متعددة متطابقة في "قائمة المحتوى التالي" من خلالMediaSessionCompat
قديم. - إضافة إعادة التوجيه المفقودة من
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) بسبب الخطأ 461 UnsupportedTransport (#11069) في بروتوكول RTSP.
الإصدار 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:
- عليك رصد IllegalArgumentException الذي يتم طرحه عند تحليل طلب RTSP غير الصالح، ووصف رسائل الاستجابة (#10971).
- الجلسة:
- إصلاح خلل يؤدي إلى عدم تعديل زر التشغيل/الإيقاف في الإشعارات تبعًا لحالة المشغّل (#192)
- إضافة IMA:
- إصلاح خطأ كان يمنع بدء أحداث 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) عند تحليل وحدات trak. - تخطّي العيّنات بشكلٍ صحيح عند التقديم/الترجيع مباشرةً إلى إطار مزامنة في fMP4 (#10941)
- يجب عرض
- الصوت:
- استخدِم معدل نقل البيانات لتنسيق الصوت المضغوط لاحتساب الحد الأدنى لحجم المخزن المؤقت
لملف
AudioTrack
في عمليات التشغيل المباشر (التشغيل المباشر).
- استخدِم معدل نقل البيانات لتنسيق الصوت المضغوط لاحتساب الحد الأدنى لحجم المخزن المؤقت
لملف
- النص:
- يجب إصلاح
TextRenderer
تمرير فهرس غير صالح (سلبي) إلىSubtitle.getEventTime
إذا كان ملف الترجمة والشرح لا يحتوي على إشارات. - SubRip: إتاحة استخدام ملفات UTF-16 إذا كانت تبدأ بعلامة ترتيب وحدات البايت
- يجب إصلاح
- البيانات الوصفية:
- تحليل قيم متعددة مفصولة بقيم فارغة من إطارات ID3، على النحو المسموح به في ملف ID3 v2.4
- أضِف
MediaMetadata.mediaType
للإشارة إلى نوع المحتوى أو نوع المجلد الذي تصف البيانات الوصفية. - أضِف
MediaMetadata.isBrowsable
كبديل لMediaMetadata.folderType
. سيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
- DASH:
- إضافة تحليل كامل لمجموعات تعديل الصور، بما في ذلك أعداد المربّعات (#3752)
- واجهة المستخدم:
- الجلسة:
- أضِف
SimpleBasePlayer
مجردة للمساعدة في تنفيذ واجهةPlayer
للاعبين المخصّصين. - إضافة طريقة مساعدة لتحويل الرمز المميّز لجلسة المنصة إلى Media3
SessionToken
(#171) - استخدِم
onMediaMetadataChanged
لتشغيل تعديلات جلسة وسائط المنصة (#219). - أضِف جلسة الوسائط كوسيطة
getMediaButtons()
فيDefaultMediaNotificationProvider
واستخدِم القوائم الثابتة للوضوح (#216). - أضِف مستمعًا لطلبات إعادة الاتصال
onSetMediaItems
لتوفير وسائل لتعديل/ضبط قائمةMediaItem
والفهرس الأولي والموقع حسب الجلسة قبل ضبط على "مشغّل الوسائط" (#156). - تجنَّب رصد النقر مرّتين لأحداث أزرار الوسائط غير المزوّدة بتقنية البلوتوث (#233).
- جعل
QueueTimeline
أكثر أمانًا في حال حدوث حالة جلسة قديمة مشكوك فيها (#241).
- أضِف
- البيانات الوصفية:
- تحليل قيم متعددة مفصولة بقيم فارغة من إطارات ID3، على النحو المسموح به في ملف ID3 v2.4
- أضِف
MediaMetadata.mediaType
للإشارة إلى نوع المحتوى أو نوع المجلد الذي تصف البيانات الوصفية. - أضِف
MediaMetadata.isBrowsable
كبديل لMediaMetadata.folderType
. سيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
- إضافة البث:
- عليك تحديث إصدار حزمة تطوير البرامج (SDK) لتطبيق Cast إلى 21.2.0.
- إضافة IMA:
- أزِل مستمع اللاعب لـ
ImaServerSideAdInsertionMediaSource
في سلسلت محادثات التطبيق لتجنُّب مشاكل تتعلق بسلسلة المحادثات. - أضِف سمة
focusSkipButtonWhenAvailable
إلىImaServerSideAdInsertionMediaSource.AdsLoader.Builder
لطلب تركيز زر التخطّي على أجهزة التلفزيون وضبطه على true تلقائيًا. - أضِف طريقة
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
لتجنُّب أخطاء الترجمة compiling errors (#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)
لتحديد ما إذا كان مشغّل الوسائط سيعرض البيانات الوصفية مبكرًا أو بالتزامن مع موضع المشغّل.
- يمكن الآن ضبط
- إدارة الحقوق الرقمية:
- حلّ مشكلة خطأ في عملية تنفيذ ClearKey على نظام التشغيل Android 13 الذي يعرض عنوان URL غير فارغ ولكنّه غير صالح
- إصلاح الخطأ
setMediaDrmSession failed: session not opened
عند التبديل بين مخططات إدارة الحقوق الرقمية في قائمة تشغيل (مثل Widevine إلى ClearKey)
- النص:
- CEA-608: تأكَّد من معالجة أوامر تبديل الخدمة في الحقل 2 بشكل صحيح (#10666).
- DASH:
- تحليل
EventStream.presentationTimeOffset
من ملفات البيانات (#10460)
- تحليل
- واجهة المستخدم:
- استخدِم الإعدادات الحالية التي تم إلغاؤها في المشغّل كإعداد مُعدّ مسبقًا في
TrackSelectionDialogBuilder
(#10429).
- استخدِم الإعدادات الحالية التي تم إلغاؤها في المشغّل كإعداد مُعدّ مسبقًا في
- الجلسة:
- تأكَّد من تنفيذ الأوامر دائمًا بالترتيب الصحيح حتى إذا كانت بعض الأوامر تتطلّب حلًا غير متزامن (#85).
- أضِف
DefaultMediaNotificationProvider.Builder
لإنشاء مواردDefaultMediaNotificationProvider
. يمكن لصانع المحتوى ضبط معرّف الإشعار ومعرّف قناة الإشعار واسم قناة الإشعار التي يستخدمها مقدّم الخدمة. أضِف أيضًا الطريقةDefaultMediaNotificationProvider.setSmallIcon(int)
لضبط رمز الإشعارات الصغير. (#104) - تأكَّد من عدم إسقاط الأوامر المُرسَلة قبل
MediaController.release()
(#99). - يمكن أن تحمِّل
SimpleBitmapLoader
ملفًا بتنسيق bitmap من معرّفات الموارد المنتظمةfile://
(#108). - يجب إصلاح العبارة التي تمنع
MediaController
من التقديم أو الإيقاف أثناء عرض إعلان في فترة معيّنة (#122). - عند انتهاء التشغيل، يتم إيقاف
MediaSessionService
من المستوى الأول ويظهر إشعار لإعادة تشغيل آخر عنصر وسائط تم تشغيله (#112). - لا تبدأ خدمة تعمل في المقدّمة باستخدام نية معلّقة للتوقف مؤقتًا (#167).
- إخفاء "الشارة" يدويًا المرتبطة بالإشعار الذي أنشأه
DefaultNotificationProvider
على واجهتَي برمجة التطبيقات 26 و27 (يتم إخفاء الشارة تلقائيًا على واجهة برمجة التطبيقات 28 والإصدارات الأحدث) (#131) - تم إصلاح الخلل الذي كان يؤدي إلى ظهور IllegalStateExceptions (#49) عند إجراء اتصال ثانٍ بين رابط من MediaSession قديم و MediaController في Media3.
- RTSP:
- IMA:
- أضِف مهلة لتحميل معلومات الإعلان من أجل معالجة الحالات التي تتعذّر فيها على حزمة تطوير البرامج لإعلانات الوسائط التفاعلية loading an ad (#10510).
- منع تخطّي الإعلانات أثناء التشغيل عند الانتقال إلى نهاية المحتوى (#10685)
- احتساب مدة النافذة بشكل صحيح للبث المباشر باستخدام الإعلانات المُدرَجة من جهة الخادم، على سبيل المثال، ميزة "إدراج الإعلانات من جهة الخادم" في إعلانات الوسائط التفاعلية (#10764)
- إضافة FFmpeg:
- أضِف علامات مطلوبة حديثًا لربط مكتبات FFmpeg بمجموعة تطوير البرامج (NDK) 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 لترخيص ClearKey من ملفات البيان (#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 توجيه أحداث التشغيل و data الأداء إلى المنصة، ما يساعد في توفير معلومات عن أداء النظام وتصحيح الأخطاء على الجهاز. وقد تجمع 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
استخدام الصوت الاستيريو/المونو بدلاً من تنسيقات الصوت المتعدّد القنوات، ما لم يكن بإمكانه استخدام ميزة الصوت المكاني (Android 12L والإصدارات الأحدث) مع تنسيق الصوت المتعدّد القنوات أو استخدام تنسيق صوت محيطي بتقنية Dolby. بالإضافة إلى ذلك، على الأجهزة التي تتيح ميزة "الصوت المكاني"،DefaultTrackSelector
سترصد التغييرات في خصائص أداة "الصوت المكاني" وتبدأ في اختيار أغنية جديدة استنادًا إلى هذه التغييرات. يتم استبعاد الأجهزة التي تعمل فيtelevision
وضع واجهة المستخدم من هذه القيود، وسيتم تفضيل التنسيق الذي يتضمّن أكبر عدد من القنوات. لتفعيل هذه الميزة، يجب إنشاء مثيلDefaultTrackSelector
باستخدامContext
.
- دمج فئة
- الفيديو:
- أعِد تسمية
DummySurface
إلىPlaceholderSurface
. - أضِف ميزة استخدام تنسيق AV1 إلى
MediaCodecVideoRenderer.getCodecMaxInputSize
.
- أعِد تسمية
- الصوت:
- استخدام برنامج ترميز الصوت AC3 من LG للإعلان عن نوع 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 المتعدّدة القنوات غير المتداخلة. لا تتوفّر حمولة RTP المركبة لبروتوكول AMR. (#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
. - حلّ مشكلة "الخطأ في وقت التشغيل" في
MediaControllerImplLegacy
(#59) - تعديل معلومات موضع الجلسة على المخطط الزمني change(#51).
- إصلاح خطأ NPE في
MediaControllerImplBase
بعد إعادة تشغيل وحدة التحكّم (#74)
- استبدِل
- تشغيل الإعلانات / IMA:
- يمكنك خفض معدّل الاستطلاع الإعلاني من كل 100 ملي ثانية إلى كل 200 ملي ثانية، بما يتوافق مع اقتراحات "مجلس تقييم الوسائط" (MRC).
- إضافة FFmpeg:
- عليك تحديث إصدار CMake إلى
3.21.0+
لتجنُّب خطأ في CMake يؤدي إلى تعطُّل gradle sync في AndroidStudio (#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: إصلاح مشكلة تؤدي إلى عرض البيانات الوصفية لنموذج emsg بترتيب غير صحيح في أحداث البث التي تحتوي على ذرات emsg من الإصدار 0 والإصدار 1 (#9996)
- النص:
- يجب إصلاح التفاعل بين
SingleSampleMediaSource.Factory.setTrackId
وMediaItem.SubtitleConfiguration.Builder.setId
لمنح الأولوية لمحاولة استخدام حقلSubtitleConfiguration
والرجوع إلى القيمةFactory
في حال عدم تحديده (#10016).
- يجب إصلاح التفاعل بين
- تشغيل الإعلان:
- حلّ مشكلة عدم توفّر مساحة كافية لتخزين الصوت بين فترات عرض الإعلانات في أحداث البث المباشر باستخدام تقنية SSAI في بروتوكول HLS
الإصدار 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
يمكن دائمًا تمييزTrackGroup
s من خلال ضبطid
في constructorTrackGroup
. يعالج هذا التحديث مشكلة الأعطال عند استئناف التشغيل بعد وضع التطبيق في الخلفية مع إلغاء مسار نشط (#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
بدلاً من ذلك.
- عليك إزالة
- تشغيل الإعلانات / IMA:
- إتاحة استخدام ميزة إدراج الإعلانات الديناميكية في IMA (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
بشكل صحيح لأحداث البث المباشر وفق بروتوكول HLS التي تتضمّن صوتًا فقط (#9608). - استخدِم ميزة "الإعداد بدون أجزاء" تلقائيًا لتحسين وقت بدء التشغيل. إذا كانت
الإصدارات تتضمّن مقاطع صوتية مضمّنة لترجمة وشرح لم يتم إدراجها
في قائمة التشغيل الرئيسية، عليك إضافتها إلى قائمة التشغيل الرئيسية لتصبح
متوفّرة للتشغيل، أو إيقاف ميزة "الإعداد بدون أجزاء" باستخدام
HlsMediaSource.Factory.setAllowChunklessPreparation(false)
. - إتاحة إمكانية التقديم أو الإيقاف السريع بدقة في اللقطة الرئيسية في HLS (#2882)
- يجب تعبئة الحقل
- RTSP:
- المحوِّل:
- يجب زيادة الحد الأدنى المطلوب لإصدار واجهة برمجة التطبيقات إلى 21.
- يُستخدَم الرمز
TransformationException
الآن لوصف الأخطاء التي تحدث أثناء عملية التحويل. - أضِف
TransformationRequest
لتحديد خيارات التحويل. - السماح بتسجيل مستمعين متعدّدين
- إصلاح مشكلة توقف Transformer عند قراءة ناتج ترميز الصوت والفيديو جزئيًا
- حلّ مشكلة "الخطأ في وقت التشغيل" المحتمَلة في
Transformer.getProgress
عند رمي muxer throws - أضِف تطبيقًا تجريبيًا لتطبيق عمليات التحويل.
- إضافة MediaSession:
- يُمحو الزر
MediaSessionConnector
تلقائيًا قائمة التشغيل عند إيقاف التشغيل. يمكن للتطبيقات التي تريد الاحتفاظ بقائمة التشغيل الاتصال بواجهة برمجة التطبيقاتsetClearMediaItemsOnStop(false)
في أداة الربط.
- يُمحو الزر
- إضافة البث:
- إضافة FFmpeg:
- اجعل
build_ffmpeg.sh
يعتمد على أدوات bin utils من 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
(#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، مثل إدراج الإعلانات من خلال حزمة تطوير البرامج (SDK) لإعلانات الوسائط التفاعلية
لمزيد من المعلومات، يُرجى الاطّلاع على مشروع Media3 على GitHub.
كان ExoPlayer مستضافًا سابقًا في مشروع ExoPlayer على GitHub منفصل. في Media3، اسم الحزمة هو androidx.media3.exoplayer
. نخطّط لمواصلة صيانة و
إصدار مشروع ExoPlayer على GitHub لبعض الوقت لإتاحة الوقت للتطبيقات لنقل بياناتها إلى
Media3. تتضمّن Media3 بدائل لجميع وحدات ExoPlayer، باستثناء
إضافات media2 وmediasession القديمة التي تم استبدالها بالوحدة الجديدة
media3-session
. يوفر ذلك عملية دمج مباشرة بين مشغّلات التطبيقات وجلسات الوسائط بدون الحاجة إلى استخدام فئة محوِّل/موصّل.