Media3

توفّر المكتبات لحالات استخدام الوسائط
آخر تعديل الإصدار الثابت إصدار محتمل الإصدار التجريبي الإصدار التجريبي الأول
27 تشرين الثاني (نوفمبر) 2024 1.5.0 - - -

الإعلان عن التبعيات

لإضافة تبعية على 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

27 تشرين الثاني (نوفمبر) 2024

تم إصدار androidx.media3:media3-*:1.5.0. يتضمّن الإصدار 1.5.0 عمليات الربط هذه.

  • المكتبة المشتركة:
    • أضِف ForwardingSimpleBasePlayer التي تتيح إعادة توجيه المحتوى إلى مشغّل آخر مع إجراء تعديلات طفيفة مع ضمان الاتساق الكامل ومعالجة المستمعين (#1183).
    • استبدِل SimpleBasePlayer.State.playlist بطريقة getPlaylist().
    • أضِف إلغاءً لـ SimpleBasePlayer.State.Builder.setPlaylist() لتحديد Timeline وTracks وMetadata حاليًا مباشرةً بدلاً من إنشاء بنية قائمة تشغيل.
    • ارفع الإصدار إلى 21 (Android Lollipop).minSdk ويتوافق ذلك مع جميع مكتبات AndroidX الأخرى.
    • إضافة عنصر androidx.media3:media3-common-ktx يقدّم وظائف خاصة بلغة Kotlin تم إنشاؤها على أساس المكتبة الشائعة
    • أضِف Player.listen دالة إضافة تعليق مؤقت لتشغيل دالة معالجة متزامنة لمحاولة الاستماع إلى Player.Events في مكتبة media3-common-ktx.
    • أزِل التعليقات التوضيحية @DoNotInline من العلامات الترميزية الداخلية التي تم وضعها يدويًا خارج الصفوف والمصمّمة لتجنُّب أخطاء التحقّق من فئة وقت التشغيل. في الإصدارات الحديثة من R8، تتم الآن تلقائيًا إزالة المكالمات غير المضمّنة مثل هذه لتجنُّب أخطاء وقت التشغيل (لذلك لم يعُد من الضروري إزالة الخطوط يدويًا). يجب أن يكون جميع مستخدمي Gradle للمكتبة يستخدمون حاليًا إصدارًا من المكوّن الإضافي لنظام Gradle المتوافق مع Android يستخدم إصدارًا من R8 ينفّذ ذلك، بسبب compileSdk = 35. على مستخدمي المكتبة الذين يستخدمون أنظمة إنشاء غير Gradle التأكّد من أنّ خطوة التصغير/التشويه المعادل لـ R8 تُجري عملية مماثلة تلقائية لإزالة الربط من أجل تجنُّب حالات تعذُّر التحقّق من فئة وقت التشغيل. سبق أن تم تنفيذ هذا التغيير في مكتبات AndroidX الأخرى.
  • 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() للإشارة إلى الحالات التي تسمح فيها أدوات التحويل الفردية ببدء التشغيل.
    • إصلاح مشكلة ظهور 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 عمليات الاستدعاء بينما يتم تجاهل أخطاء التحليل بدون إشعار (هذا السلوك متوفّر مسبقًا).
    • تم إصلاح خطأ كان يؤدي إلى تجميد اللقطات في نهاية العنصر في قوائم التشغيل أو الفترات في أحداث البث باستخدام DASH المتعدّدة الفترات التي لا تتطابق مدّتها مع المحتوى الفعلي (‎#1698).
    • أضِف طريقة ضبط إلى SntpClient لضبط الحد الأقصى للوقت المنقضي منذ آخر تعديل، وبعد ذلك تتم إعادة تهيئة العميل مجددًا (#1794).
  • المحوِّل:
    • أضِف SurfaceAssetLoader، الذي يتيح إضافة بيانات الفيديو إلى "Surface" في "Surface".
    • يُبلغ ImageAssetLoader عن الإدخال غير المتوافق من خلال AssetLoader.onError بدلاً من طرح IllegalStateException.
    • يجب جعل ضبط مدة الصورة باستخدام MediaItem.Builder.setImageDurationMs إلزاميًا لتصدير الصور.
    • إضافة إمكانية التصدير للفواصل في تسلسلات عناصر EditedMediaItem الصوتية
  • اختيار المقطع الصوتي:
    • DefaultTrackSelector: نفضّل استخدام المحتوى الصوتي المستند إلى العناصر بدلاً من المحتوى الصوتي المستنِد إلى القناة عند تساوي العوامل الأخرى.
  • برامج الاستخراج:
    • اسمح لـ Mp4Extractor وFragmentedMp4Extractor بتحديد عيّنات H264 التي لا يتم استخدامها كمرجع من قِبل عيّنات لاحقة.
    • إضافة خيار لتفعيل التقديم أو الإيقاف بالاستناد إلى الفهرس في AmrExtractor
    • التعامل مع ملفات MP3 التي يزيد حجمها عن 128 كيلوبايت بين الإطارات الصالحة على أنّها مقطوعة (بدلاً من غير صالحة) وهذا يعني أنّ الملفات التي تحتوي على بيانات غير MP3 في نهايتها، وبدون بيانات وصفية أخرى للإشارة إلى طول وحدات بت MP3، ستتوقف الآن عن التشغيل عند نهاية بيانات MP3 بدلاً من تعذُّر تشغيلها مع رمز الخطأ ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (الخطأ 1563).
    • إصلاح مشكلة في معالجة عيّنات "العرض الإعلاني ما قبل التشغيل" لمواضع بدء الوسائط غير المرتبطة بإطار رئيسي عند معالجة قوائم التعديل في ملفات MP4 (‎#1659)
    • تحسين عملية احتساب معدّل عرض اللقطات باستخدام مدة الوسائط من مربّع mdhd في Mp4Extractor وFragmentedMp4Extractor (‎#1531)
    • حلّ مشكلة التوسيع غير الصحيح media_time في قوائم تعديل MP4 على الرغم من أنّه سبق أن تمّت زيادة حجم ملف segment_duration بشكلٍ صحيح باستخدام مقياس زمنه، تمّ الآن زيادة حجم ملف media_time بشكلٍ صحيح باستخدام مقياس زمنه، كما هو محدّد في معيار تنسيق MP4 (#1792).
    • التعامل مع اللقطات غير المرتبطة بترتيب معيّن في عملية احتساب endIndices لملفات MP4 باستخدام قائمة تعديل (‎#1797)
    • حلّ مشكلة تحليل مدة الوسائط في مربّع mdhd لملفات MP4 لمعالجة قيم -1 (‎#1819)
    • إتاحة إمكانية تحديد مربّع h263 في ملفات MP4 للفيديوهات بتنسيق H.263 (‎#1821)
    • إتاحة تنسيق ملف الوسائط الأساسي AC-4 من المستوى 4 وفقًا لمعيار ISO (‎#1265)
  • DataSource:
    • تعديل HttpEngineDataSource للسماح باستخدام الإصدار S الإضافة 7 بدلاً من المستوى 34 لواجهة برمجة التطبيقات (‎#1262)
    • DataSourceContractTest: تأكّد من أنّ DataSource.getUri() يعرض عنوان URI الذي تمّ حلّه (كما هو موضّح في المستندات). إذا كان هذا العنوان مختلفًا عن عنوان ملف التمهيد الذي تمّ طلبه، يمكن أن تشير الاختبارات إلى ذلك باستخدام الطريقة الجديدة DataSourceContractTest.TestResource.Builder.setResolvedUri().
    • DataSourceContractTest: تأكَّد من أنّ DataSource.getUri() و getResponseHeaders() يعرضان القيمة "مفتوح" بعد تعذُّر الاتصال بمحاولة open() (بسبب عدم العثور على مورد) وقبل إجراء محاولة متعاقبة لتحميل close().
      • يتيح إلغاء القيمة DataSourceContractTest.getNotFoundResources() لفئات فرعية اختبارية تقديم موارد متعددة "لم يتم العثور عليها"، و تقديم أي رؤوس متوقّعة أيضًا. يتيح ذلك التمييز بين رمز الخطأ HTTP 404 (مع الرؤوس) و "تعذّر العثور على الخادم" (بدون رؤوس).
  • الصوت:
    • ضبط البيانات الوصفية لمستوى الصوت CTA-2075 تلقائيًا في برنامج الترميز إذا كانت متوفّرة في الوسائط
    • تأكَّد من خفض مستوى الصوت بسلاسة عند التقديم أو الإيقاف.
    • حلّ مشكلة الأصوات المنبعثة أثناء الانتقال إلى أجزاء مختلفة من الفيديو
    • إصلاح تراكم أخطاء القطع في خوارزمية التمديد الزمني/تغيير الدرجة الصوتية في Sonic
    • إصلاح خطأ في SpeedChangingAudioProcessor يؤدي إلى حذف لقطات الإخراج
  • الفيديو:
    • MediaCodecVideoRenderer يتجنّب فك ترميز العيّنات التي لا يتم عرضها أو استخدامها كمرجع من قِبل عيّنات أخرى.
    • في الإصدار 35 من واجهة برمجة التطبيقات والإصدارات الأحدث، يمكن أن يتلقّى MediaCodecAdapter الآن null Surface في configure ويطلب إجراءً جديدًا detachOutputSurface لإزالة Surface تم ضبطه سابقًا إذا كان برنامج الترميز يتيح ذلك (MediaCodecInfo.detachedSurfaceSupported).
    • استخدِم قيم نسبة عرض البكسل إلى ارتفاعه المقدَّمة في MediaCodecAdapter إذا تم تقديمها عند معالجة onOutputFormatChanged (‎#1371).
    • إضافة حلّ بديل لمشكلة في جهاز Galaxy Tab S7 FE تؤدي إلى وضع علامة "غير متوافقة" على عمليات بث H264 المشفَّرة التي تبلغ سرعتها 60 لقطة في الثانية (‎#1619).
    • إضافة حلّ بديل لبرامج الترميز التي تتعذّر إكمالها بعد العيّنة الأخيرة بدون عرض إشارة نهاية البث
  • النص:
    • أضِف VoiceSpan مخصّصًا واملأه لتحديد مقطع الترجمة والشرح الصوتي في WebVTT (#1632).
    • تأكَّد من عرض WebVTT في HLS مع الطوابع الزمنية للترجمة والشرح الكبيرة جدًا (التي تتجاوز long ‎64 بت عند تمثيلها بالميكرو ثانية ومضاعفة 90,000 قاعدة وقت MPEG) (‎#1763).
    • إتاحة مقاطع الترجمة والشرح بتنسيق CEA-608 في محتوى Dolby Vision (‎#1820)
    • إصلاح مشكلة تعليق التشغيل في أحداث البث المتعدّدة الفترات باستخدام DASH عند تفعيل ملفّات ترجمة CEA-608 (‎#1863)
  • البيانات الوصفية:
    • يمكنك تحديد النوع C.TRACK_TYPE_METADATA للمقاطع الصوتية التي تحتوي على محتوى icy أو vnd.dvb.ait.
  • الصورة:
    • أضِف ExternallyLoadedImageDecoder لدمج مبسّط مع مكتبات تحميل الصور الخارجية، مثل Glide أو Coil.
  • DataSource:
    • أضِف FileDescriptorDataSource، وهو DataSource جديد يمكن استخدامه للقيام بقراءة بيانات من FileDescriptor (#3757).
  • التأثير:
    • أضِف DefaultVideoFrameProcessor حلاً بديلاً لتحسين SurfaceTexture الأداء بشكل بسيط. قد يتضمّن SurfaceTexture تصغيرًا صغيرًا يقطع حدود 1 بكسل حول حافة مساحة تخزين تم اقتصاصها. تمّت معالجة ذلك الآن كي يكون الناتج أقرب إلى المتوقّع.
    • زيادة السرعة DefaultVideoFrameProcessor.queueInputBitmap() ونتيجةً لذلك، تتم عملية تصدير الصور إلى الفيديوهات باستخدام Transformer بشكل أسرع.
  • إضافة IMA:
    • تم إصلاح الخلل الذي كان يؤدي إلى ظهور رمز ArrayIndexOutOfBoundsException في ImaServerSideAdInsertionMediaSource عند محو قائمة التشغيل.
    • إصلاح خطأ كان يؤدي إلى ظهور ArrayIndexOutOfBoundsException عند تشغيل المحتوى بعد انتهاء آخر إعلان أثناء عرض (الخطأ رقم 1741) في أحداث DAI المُدرَجة من جهة الخادم بدون إعلان ما قبل التشغيل
  • الجلسة:
    • أضِف MediaButtonReceiver.shouldStartForegroundService(Intent) للسماح للتطبيقات بمنع تلقّي أمر تشغيل لاستئناف التشغيل من خلال تجاوز هذه الطريقة. يتم تشغيل الخدمة تلقائيًا في كل الأوقات، ولا يمكن إيقاف التشغيل بدون أن يؤدي النظام إلى تعطيل الخدمة باستخدام ForegroundServiceDidNotStartInTimeException (‎#1528).
    • تم إصلاح الخلل الذي كان يتسبب في توجيه الطلبات المخصّصة المُرسَلة من 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).
    • إصلاح خطأ يمنع ظهور خيار "بدون" في ميزة اختيار النص إذا كانت هناك إعدادات مفضّلة لاختيار مقاطع الترجمة والشرح تحدّدها التطبيقات
  • إضافة DASH:
    • إتاحة الفترات التي تبدأ في منتصف شريحة (‎#1440)
  • إضافة "البث السلس":
    • إصلاح خطأ Bad magic number for Bundle عند تشغيل أحداث البث باستخدام تقنية SmoothStreaming التي تتضمّن مقاطع نصية (‎#1779)
  • إضافة RTSP:
    • حلّ مشكلة إزالة معلومات المستخدمين لعناوين URL التي تحتوي على أحرف @ مُشفَّرة (‎#1138)
    • إصلاح الأعطال عند تحليل حزم RTP التي تحتوي على إضافات رؤوس (#1225)
  • إضافات برامج الترميز (FFmpeg وVP9 وAV1 وما إلى ذلك):
    • أضِف وحدة ترميز IAMF التي تتيح تشغيل ملفات MP4 التي تحتوي على مقاطع صوتية بتنسيق IAMF باستخدام مكتبة libiamf الأصلية ل synthesizing audio.
      • يمكن تشغيل الفيديوهات بتنسيق الاستيريو وتنسيق 5.1 مع الصوت المكاني، بالإضافة إلى تفعيل ميزة تتبُّع حركة الرأس الاختيارية، ولكن لا تتوفّر إمكانية تشغيل الفيديوهات بتنسيق الاستيريو الثنائي حاليًا.
    • إضافة دعم لصفحات بحجم 16 كيلوبايت لإضافات برامج الترميز على Android 15 (‎#1685)
  • إضافة البث:
    • إيقاف تنظيف المخطط الزمني بعد انقطاع الاتصال بجلسة البث، ما يتيح لتطبيق المُرسِل استئناف التشغيل على الجهاز بعد انقطاع الاتصال
    • تعبئة DeviceInfo في CastPlayer عند توفير Context يتيح ذلك ربط MediaSession بـ RoutingSession، وهو ضروري لدمج "محوِّل الإخراج" (‎#1056).
  • أدوات الاختبار:
    • يتضمّن DataSourceContractTest الآن اختبارات لإثبات ما يلي:
      • تم تعديل مصدر البيانات read position.
      • تم تطبيق وحدة تخزين مؤقت للإخراج offset بشكل صحيح.
  • التطبيق التجريبي
    • حلّ مشاكل تسرُّب الذاكرة في التطبيق التجريبي المخصّص لفيديوهات Shorts القصيرة (‎#1839)
  • إزالة الرموز المتوقّفة نهائيًا:
    • أزِل العمودَين Player.hasPrevious وPlayer.hasPreviousWindow() اللذَين تم إيقافهما نهائيًا. استخدِم Player.hasPreviousMediaItem() بدلاً من ذلك.
    • أزِل الطريقة Player.previous() التي تم إيقاف استخدامها. استخدِم Player.seekToPreviousMediaItem() بدلاً من ذلك.
    • أزِل الطريقة DrmSessionEventListener.onDrmSessionAcquired التي تم إيقاف استخدامها.
    • أزِل وظائف إنشاء DefaultEncoderFactory المتوقّفة نهائيًا. استخدِم DefaultEncoderFactory.Builder بدلاً من ذلك.

الإصدار 1.5.0-rc02

19 تشرين الثاني (نوفمبر) 2024

استخدِم الإصدار الثابت 1.5.0.

الإصدار 1.5.0-rc01

13 تشرين الثاني (نوفمبر) 2024

استخدِم الإصدار الثابت 1.5.0.

الإصدار 1.5.0-beta01

30 تشرين الأول (أكتوبر) 2024

استخدِم الإصدار الثابت 1.5.0.

الإصدار 1.5.0-alpha01

10 أيلول (سبتمبر) 2024

استخدِم الإصدار الثابت 1.5.0.

الإصدار 1.4.0

الإصدار 1.4.1

27 آب (أغسطس) 2024

تم إصدار androidx.media3:media3-*:1.4.1. يحتوي الإصدار 1.4.1 على عمليات الربط هذه.

  • ExoPlayer:
    • معالجة عمليات الاستدعاء المُسبَقة للتحميل بشكل غير متزامن في PreloadMediaSource (#1568).
    • السماح بالتشغيل بغض النظر عن مدة التخزين المؤقت عند تعذُّر التحميل (‎#1571)
  • برامج الاستخراج:
    • ‫MP3: يجب إصلاح الخطأ Searched too many bytes من خلال تجاهل data غير MP3 في نهاية الملف بشكلٍ صحيح استنادًا إلى حقل الطول في إطار Info (‎#1480).
  • النص:
    • ملف TTML: إصلاح معالجة قيم النسبة المئوية tts:fontSize لضمان اكتسابها بشكل صحيح من العقد الرئيسية التي تحتوي على قيم النسبة المئوية tts:fontSize
    • إصلاح IndexOutOfBoundsException في LegacySubtitleUtil بسبب التعامل بشكل غير صحيح مع حالة وقت بدء الإخراج المطلوب أكبر من أو يساوي وقت الحدث النهائي في Subtitle (‎#1516).
  • إدارة الحقوق الرقمية:
    • إصلاح خطأ android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE على الأجهزة التي تعمل بالإصدار 31 من واجهة برمجة التطبيقات أو الإصدارات الأحدث عند تشغيل محتوى L1 Widevine يرجع سبب حدوث هذا الخطأ إلى عدم اكتمال تنفيذ أسلوب الإطار العمل MediaDrm.requiresSecureDecoder (#1603).
  • التأثير:
    • أضِف طريقة release() إلى GlObjectsProvider.
  • الجلسة:
    • حوِّل النقر مرّتين على KEYCODE_HEADSETHOOK إلى إجراء "الانتقال إلى المحتوى التالي"، كما هو موضح في الوثائق (‎#1493).
    • تعامل مع KEYCODE_HEADSETHOOK كطلب "تشغيل" في MediaButtonReceiver عند تحديد ما إذا كنت تريد تجاهله لتجنُّب ForegroundServiceDidNotStartInTimeException (#1581).
  • إضافة 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 بدلاً من الحجم الذي يُبلِغ عنه البث الأساسي (مثل حجم الملف أو عنوان HTTP Content-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 مرتبطة بشكل خاطئ بعلامات ID3 TSO2 وTSOA وTSOP (‎#1302).
    • إصلاح قراءة علامتَي MP4 (/iTunes) الرقميتَين gnre (النوع) وtmpo (السرعة) عندما تكون القيمة أطول من بايت واحد
    • انشر إطار TCON بتنسيق ID3 إلى MediaMetadata.genre (#1305).
  • الصورة:
    • إتاحة استخدام شبكات الصور المصغّرة غير المربّعة في DASH (‎#1300)
    • إتاحة استخدام تنسيق AVIF مع الإصدار 34 من واجهة برمجة التطبيقات والإصدارات الأحدث
    • السماح باستخدام null كمَعلمة لـ ExoPlayer.setImageOutput() لمحو ImageOutput تم ضبطه سابقًا
  • DataSource:
    • يجب توفير إمكانية استخدام عناوين URL لمواد العرض الأوّلية android.resource://package/id حيث يختلف package عن حزمة التطبيق الحالي. لم يكن هذا الإجراء موثَّقًا في السابق، ولكنه يمثّل طريقة أكثر فعالية للوصول إلى الموارد في حزمة أخرى مقارنةً بالوصول إليها بالاسم.
    • تأكَّد من أنّ url غير فارغ في وظائف الإنشاء DataSpec. سبق أن تم وضع تعليق توضيحي على هذه القيمة لتكون غير فارغة.
    • اسمح لـ ByteArrayDataSource بتحويل عنوان URL إلى صفيف بايت أثناء open()، بدلاً من برمجته بشكل ثابت عند الإنشاء (#1405).
  • إدارة الحقوق الرقمية:
    • السماح بضبط 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)
  • إضافة DASH:
    • تم إصلاح خطأ كان يؤدي إلى ظهور خطأ عند إعادة إعداد بث مباشر يتضمن عدّة فترات IndexOutOfBoundsException (#1329).
    • إتاحة عناوين URL الخاصة بترخيص dashif:Laurl (‎#1345)
  • إضافة البث:
    • تم إصلاح الخطأ الذي كان يحوّل عنوان الألبوم في 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 لملف APK‏ DefaultVideoFrameProcessor.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).
  • إدارة الحقوق الرقمية:
    • يمكنك معالجة خطأ NoSuchMethodError الذي يمكن أن يُرسِله إطار عمل MediaDrm بدلاً من ResourceBusyException أو NotProvisionedException على بعض أجهزة Android 14 (‎#1145).
  • التأثير:
    • تحسين ميزة ربط درجات الألوان من PQ إلى SDR من خلال تحويل مساحات اللون
  • الجلسة:
    • تم حلّ المشكلة التي تؤدي إلى قفزة للخلف في الموضع الحالي عندما يستبدل جهاز التحكّم العنصر الحالي (‎#951).
    • تم حلّ المشكلة المتعلّقة بعدم إرسال MediaMetadata مع extras غير صفري فقط بين وحدات التحكّم بالوسائط والجلسات (‎#1176).
  • واجهة المستخدم:
    • يمكنك استخدام الاسم البديل للغة المقطع الصوتي إذا تعذّر على 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)
  • الصوت:
    • تحسين خوارزمية تخطّي الصمت من خلال زيادة مستوى الصوت بسلاسة، مع الاحتفاظ بحد أدنى من الصمت ومدد صمت أكثر طبيعية (‎#7423)
    • الإبلاغ عن المقاطع الصوتية التي تم تخطّيها بشكل أكثر تحديدًا (‎#1035)
  • الفيديو:
    • غيِّر الدالة الإنشائية 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بقرب وقت عرضها.
  • إدارة الحقوق الرقمية:
    • يتم تشغيل عيّنات "المحتوى الرئيسي" غير المشفَّرة في المحتوى الخاضع لإدارة الحقوق الرقمية على الفور تلقائيًا، حتى إذا لم تكن مفاتيح العيّنات المشفَّرة اللاحقة جاهزة بعد. وقد يؤدي ذلك إلى توقُّف التشغيل أثناء التشغيل إذا لم تكن المفاتيح جاهزة عند وصول موضع التشغيل إلى العيّنات المشفَّرة (ولكن في السابق، لم يكن من الممكن بدء التشغيل على الإطلاق في هذه المرحلة). يمكن إيقاف هذا السلوك باستخدام 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 غير الصالح لترخيص ClearKeyhttps://default.url لتشمل المستوى 33 من واجهة برمجة التطبيقات والإصدارات الأحدث (في السابق، كان الحلّ البديل ينطبق على المستوى 33 من واجهة برمجة التطبيقات بالضبط فقط) (‎#837)
    • حلّ مشكلة ERROR_DRM_SESSION_NOT_OPENED عند التبديل من محتوى مشفّر إلى محتوى واضح بدون سطح مرتبط بالوسيط حدث الخطأ بسبب استخدام وحدة فك ترميز آمنة بشكل غير صحيح لتشغيل المحتوى الواضح.
  • الجلسة:
    • ضَع المفاتيح والقيم المخصّصة في MediaMetadataCompat إلى MediaMetadata.extras وMediaMetadata.extras إلى MediaMetadataCompat (#756، #802).
    • إصلاح بث notifyChildrenChanged لأجهزة التحكّم القديمة (‎#644)
    • تم إصلاح خطأ كان يؤدي إلى تعطُّل بعض الأجهزة عند ضبط وقت سلبي لموقّت setWhen غير مفعّل للإشعار (‎#903).
    • إصلاح IllegalStateException عندما لا يكتمل اتصال وحدة التحكّم في إشعارات الوسائط عند طلب تعديل الإشعار الأول (‎#917)
  • واجهة المستخدم:
    • إصلاح مشكلة عدم ظهور زرَّي التقديم والترجيع عند استخدامهما مع Material Design في BottomSheetDialogFragment (‎#511)
    • تم إصلاح مشكلة عدم محاذاة الأرقام في زرّ التقديم السريع في PlayerControlView (‎#547).
  • إضافة DASH:
    • عالج القيمة "f800" على أنّها عدد قنوات يبلغ 5 قنوات لملفات بيان Dolby في DASH (#688).
  • إضافات برامج الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
    • ‫MIDI: حلّ مشكلة تخطّي أحداث تغيير البرنامج عند التقديم (‎#704)
    • انتقِل إلى FFmpeg 6.0 وعدِّل حزمة NDK المتوافقة إلى الإصدار r26b (#707، #867).
  • إضافة البث:
    • يجب فحص عملية إنشاء 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
  • الفيديو:
    • اسمح لتطبيق 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() لتفعيل تسجيل المفاتيح المخصّص.
    • إضافة إجراء إضافي إلى بيان التطبيق التجريبي الرئيسي لتسهيل بدء التطبيق التجريبي باستخدام ملف *.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) عند استدعائهما في قائمة تشغيل فارغة
  • المحوِّل:
    • أزِل 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 ، سيتم اختيار مسار جديد عند تغيُّر إمكانات أداة التحويل.
  • برامج الاستخراج:
    • ‫Ogg: إصلاح خطأ عند التقديم أو الإيقاف في الملفات التي تبلغ مدّتها وقتًا طويلاً (‎#391)
    • ‫FMP4: إصلاح مشكلة تؤدي إلى إعداد TimestampAdjuster لمعلمة توقيت تسجيل غير صحيحة باستخدام وقت عيّنة البيانات الوصفية من عنصر emsg atom (‎#356).
  • الصوت:
    • تم إصلاح الخلل الذي كان يؤدي إلى تعذُّر تشغيل بعض المحتوى عند تفعيل وضع النفق واستخدام ميزة 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 لكتابة عناصر واجهة مستخدِم مخصّصة تتضمّن زرَّي تشغيل/إيقاف مؤقت.
  • إضافة RTSP:
    • بالنسبة إلى MPEG4-LATM، استخدِم القيمة التلقائية لـ profile-level-id في حال عدم توفّرها في رسالة SDP لوصف الردّ (#302).
    • استخدِم معرّف الموارد المنتظم الأساسي لتحديد المسار النسبي من جلسة RTSP إذا كان متوفرًا في عنوان استجابة DESCRIBE (‎#11160).
  • إضافة DASH:
    • أزِل مدة بدء عرض الوسائط من MediaLoadData.startTimeMs و MediaLoadData.endTimeMs لأحداث البث باستخدام بروتوكول DASH ذات الفترات المتعددة.
    • تم إصلاح خطأ كان يؤدي إلى ظهور IndexOutOfBoundsException (‎#10838) عند إعادة إعداد مصدر وسائط Dash المباشر المتعدّد الفترات.
  • إضافة HLS:
    • أضِف HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) لضبط مهلة لمؤشر تحميل السلسلة من أجل انتظار بدء TimestampAdjuster. إذا لم يكتمل الإعداد قبل انتهاء المهلة، يتم طرح PlaybackException لتجنُّب توقّف التشغيل بشكلٍ لا نهائي. يتم ضبط المهلة على صفر تلقائيًا (#323).
  • أدوات الاختبار:
    • تحقَّق من عدم حساسية نظام URI لحالة الأحرف في DataSourceContractTest.
  • إزالة الرموز المتوقّفة نهائيًا:
    • أزِل وظائف الإنشاء 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.

  • المكتبة الأساسية:
    • إصلاح مشكلة رصد نوع الشبكة في المستوى 33 لواجهة برمجة التطبيقات (‎#10970)
    • يجب حلّ المشكلة في NullPointerException عند الاتصال بالرقم ExoPlayer.isTunnelingEnabled (‎#10977).
  • عمليات التنزيل:
    • يمكنك ضبط الحد الأقصى للفرق في وقت بدء شريحتَين سيتم دمجهما في SegmentDownloader والفئات الفرعية (#248).
  • الصوت:
    • إصلاح مشكلة عدم تشغيل ملفات MP3 بدون انقطاع على أجهزة Samsung (‎#8594)
    • إصلاح خطأ كان يؤدي إلى إلغاء سرعات التشغيل التي تم ضبطها مباشرةً بعد إيقاف الصوت (‎#10882)
  • الفيديو:
    • ربط تنسيق HEVC HDR10 بـ HEVCProfileMain10HDR10 بدلاً من HEVCProfileMain10
    • إضافة حلّ بديل لمشكلة في جهاز "‏Chromecast مع Google TV" وجهاز Lenovo M10 FHD Plus تؤدي إلى وضع علامة "غير متوافقة" على عمليات بث AVC بمعدّل 60 لقطة في الثانية (‎#10898).
    • حلّ مشاكل الأداء في ميزة "إخلاء الإطار" عند تشغيل الوسائط بمعدّل ملفه أعلى بكثير من معدّل تحديث الشاشة
  • البث:
    • إصلاح الرمز المؤقت STATE_IDLE عند الانتقال بين عناصر الوسائط (‎#245)
  • ‫RTSP:
    • عليك رصد IllegalArgumentException الذي يتم طرحه عند تحليل طلب RTSP غير الصالح، ووصف رسائل الاستجابة (#10971).
  • الجلسة:
    • إصلاح خلل يؤدي إلى عدم تعديل زر التشغيل/الإيقاف في الإشعارات تبعًا لحالة المشغّل (‎#192)
  • إضافة IMA:
    • إصلاح خطأ كان يمنع بدء أحداث DAI بدون أي إعلانات لأنّه لم يتم استلام الحدث LOADED الأول (والوحيد في حال عدم عرض الإعلانات).

الإصدار 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)
  • واجهة المستخدم:
    • يجب إصلاح العنصر الذي سيتم إيقافه نهائيًا PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) لضمان نقل تغييرات مستوى العرض إلى المستمع المسجَّل (#229).
    • يجب إصلاح ترتيب عناصر التحكّم في مشغّل الفيديو في PlayerView عند استخدام تنسيق من اليمين إلى اليسار (RTL) (‎#227).
  • الجلسة:
    • أضِف SimpleBasePlayer مجردة للمساعدة في تنفيذ واجهة Player للاعبين المخصّصين.
    • إضافة طريقة مساعدة لتحويل الرمز المميّز لجلسة المنصة إلى Media3 SessionToken (#171)
    • استخدِم onMediaMetadataChanged لتشغيل تعديلات جلسة وسائط المنصة (#219).
    • أضِف جلسة الوسائط كوسيطة getMediaButtons() في DefaultMediaNotificationProvider واستخدِم القوائم الثابتة للوضوح (#216).
    • أضِف مستمعًا لطلب onSetMediaItems لتوفير وسائل لتعديل/ضبط قائمة MediaItem والفهرس الأولي والموقع حسب الجلسة قبل ضبط على "مشغّل الوسائط" (‎#156).
    • تجنَّب رصد النقر مرّتين لأحداث أزرار الوسائط غير المزوّدة بتقنية البلوتوث (#233).
    • جعل QueueTimeline أكثر أمانًا في حال حدوث حالة جلسة قديمة مشكوك فيها (#241).
  • البيانات الوصفية:
    • تحليل قيم متعددة مفصولة بقيم فارغة من إطارات ID3، على النحو المسموح به في ملف 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)
  • عمليات التنزيل:
    • إصلاح حلقة مفرغة محتملة في ProgressiveDownloader بسبب التنزيل والتشغيل المتزامنين باستخدام PriorityTaskManager نفسه (‎#10570)
    • ظهور إشعار التنزيل على الفور (‎#183)
    • الحد من عمليات إزالة التنزيلات المتوازيّة إلى عملية واحدة لتجنّب إنشاء سلاسل محادثات مفرطة (‎#10458)
  • الفيديو:
    • جرِّب وحدة ترميز بديلة لتقنية 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 قديم بأحد مكونات Media3 MediaController.
  • ‫RTSP:
    • إضافة معالجة الحِزم المجزّأة في H263 (‎#119)
    • إتاحة استخدام MP4A-LATM (#162)
  • 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).
  • برامج الاستخراج:
    • إصلاح تحليل مجموعات الصور المرجعية قصيرة المدى في H265 (‎#10316)
    • إصلاح تحليل معدّلات نقل البيانات من صناديق esds (‎#10381)
  • DASH:
    • تحليل عنوان URL لترخيص ClearKey من ملفات البيان (‎#10246)
  • واجهة المستخدم:
    • تأكَّد من أنّ TalkBack يُعلِن عن خيار السرعة النشطة حاليًا في قائمة عناصر التحكّم في التشغيل (‎#10298).
  • ‫RTSP:
    • إضافة معالجة الحِزم المجزّأة في VP8 (#110)
  • إضافة Leanback:
    • استمع إلى التغييرات في playWhenReady في LeanbackAdapter (10420).
  • البث:
    • استخدِم القيمة MediaItem التي تم تمريرها إلى طرق قوائم التشغيل على أنّها Window.mediaItem في CastTimeline (‎#25، ‎#8212).
    • إتاحة Player.getMetadata() وListener.onMediaMetadataChanged() مع CastPlayer (#25)

الإصدار 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 للسماح للّاعبين بتحديد عنصر واحد.
  • اختيار الأغنية:
    • دمج فئة 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.
  • برامج الاستخراج:
    • إتاحة استخدام تنسيق AVI (#2092)
    • Matroska: تحليل DiscardPadding للمقاطع الصوتية بتنسيق Opus
    • ‫MP4: تحليل معدلات نقل البيانات من صناديق esds
    • Ogg: السماح بعناوين مكرّرة لمعرّف Opus وتعليقات (‎#10038)
  • واجهة المستخدم:
    • حلّ مشكلة إرسال الأحداث إلى 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 بشكل صريح إذا لزم الأمر.
  • ‫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).
  • إزالة الرموز المتوقّفة نهائيًا:
    • أزِل 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يمكن دائمًا تمييز TrackGroups من خلال ضبط id في constructor TrackGroup. يعالج هذا الخلل مشكلة الأعطال عند استئناف التشغيل بعد وضع التطبيق في الخلفية مع إلغاء مسار نشط (‎#9718).
    • عدِّل المنطق في AdaptiveTrackSelection للسماح بزيادة الجودة في حال توفّر معدل نقل بيانات كافٍ على الشبكة حتى إذا كان التشغيل قريبًا جدًا من الحدود القصوى المسموح بها (‎#9784).
  • الفيديو:
    • إصلاح منطق التراجع لبرنامج فك الترميز في Dolby Vision لاستخدام برنامج فك ترميز H264/H265 متوافق إذا لزم الأمر
  • الصوت:
    • إصلاح منطق التراجع عن فك الترميز في Dolby Atmos ‏ (E-AC3-JOC) لاستخدام فاقِّك رمز E-AC3 متوافق إذا لزم الأمر
    • غيِّر واجهات برمجة التطبيقات AudioCapabilities لتطلب بشكل صريح استخدام AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES بدلاً من null.
    • السماح بتخصيص عملية احتساب حجم ذاكرة التخزين المؤقت AudioTrack من خلال إدخال AudioTrackBufferSizeProvider إلى DefaultAudioSink (‎#8891)
    • أعِد محاولة إنشاء AudioTrack إذا كان حجم ذاكرة التخزين المؤقت المطلوبة أكبر من 1 ميغابايت. (‎#9712)
  • برامج الاستخراج:
    • ‫WAV: إتاحة أحداث البث بتنسيق RF64 (‎#9543)
    • إصلاح التحليل غير الصحيح لوحدات NAL الخاصة بـ H.265 SPS (‎#9719)
    • تحليل تعليقات Vorbis (بما في ذلك METADATA_BLOCK_PICTURE) في ملفات Ogg Opus وملفات Ogg Vorbis
  • النص:
    • أضِف حقل MediaItem.SubtitleConfiguration.id يتم نشره في حقل Format.id لمسار الترجمة الذي تم إنشاؤه من الإعدادات (‎#9673).
    • إتاحة ترجمة WebVTT الأساسية في حاويات Matroska (‎#9886)
    • منع Cea708Decoder من قراءة أكثر من الحجم المحدَّد لشدَّة الخدمة
  • إدارة الحقوق الرقمية:
    • عليك إزالة playbackLooper من DrmSessionManager.(pre)acquireSession. عندما يستخدم تطبيق DrmSessionManager في MediaSource مخصّص، يجب تمرير playbackLooper إلى DrmSessionManager.setPlayer بدلاً من ذلك.
  • تشغيل الإعلانات / IMA:
    • إتاحة استخدام ميزة إدراج الإعلانات الديناميكية في IMA (DAI) (‎#8213)
    • أضِف طريقة إلى AdPlaybackState للسماح بإعادة ضبط مجموعة إعلانية لكي يمكن تشغيلها مرة أخرى (#9615).
    • فرض سرعة تشغيل 1.0 أثناء تشغيل الإعلان (‎#9018)
    • تم إصلاح مشكلة كانت تؤدي إلى إعادة ضبط التشغيل على الفور في حال تعذّر تحميل مجموعة إعلانية (‎#9929).
  • واجهة المستخدم:
    • إصلاح لون الأرقام في زرَّي StyledPlayerViewالترجيع والتقديم السريع عند استخدام مظاهر معيّنة (‎#9765)
    • ترجمة سلاسل سرعة التشغيل بشكل صحيح (‎#9811)
  • 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:
    • يجب توفير واجهة برمجة تطبيقات للعملاء لتجاوز SocketFactory المستخدَمة لأي اتصال بالخادم (‎#9606).
    • يُفضَّل استخدام طريقة مصادقة DIGEST بدلاً من BASIC إذا كانتا متوفّرتين (#9800).
    • التعامل مع عدم توفّر معلومات توقيت المسار في RTSP (‎#9775)
    • تجاهل قيم رأس RTP-Info غير الصالحة (‎#9619).
  • المحوِّل:
    • يجب زيادة الحد الأدنى المطلوب لإصدار واجهة برمجة التطبيقات إلى 21.
    • يُستخدَم الرمز TransformationException الآن لوصف الأخطاء التي تحدث أثناء عملية التحويل.
    • أضِف TransformationRequest لتحديد خيارات التحويل.
    • السماح بتسجيل مستمعين متعدّدين
    • إصلاح مشكلة توقف Transformer عند قراءة ناتج ترميز الصوت والفيديو جزئيًا
    • حلّ مشكلة "الخطأ في وقت التشغيل" المحتمَلة في Transformer.getProgress عند رمي muxer throws
    • أضِف تطبيقًا تجريبيًا لتطبيق عمليات التحويل.
  • إضافة MediaSession:
    • يُمحو الزر MediaSessionConnector تلقائيًا قائمة التشغيل عند إيقاف التشغيل. يمكن للتطبيقات التي تريد الاحتفاظ بقائمة التشغيل الاتصال بواجهة برمجة التطبيقات setClearMediaItemsOnStop(false) في أداة الربط.
  • إضافة البث:
    • تم إصلاح الخلل الذي كان يمنع CastPlayer من الاتصال برقم onIsPlayingChanged بشكل صحيح (‎#9792).
    • إتاحة البيانات الوصفية للمحتوى الصوتي، بما في ذلك العمل الفني باستخدام DefaultMediaItemConverter (‎#9663)
  • إضافة 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).
  • إزالة الرموز المتوقّفة نهائيًا:
    • أزِل 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. يوفر ذلك عملية دمج مباشرة بين مشغّلات التطبيقات وجلسات الوسائط بدون الحاجة إلى استخدام فئة محوِّل/موصّل.