الوسائط 3

مكتبات الدعم لحالات استخدام الوسائط
التعديل الأخير الإصدار المستقر سحب المرشح الإصدار التجريبي إصدار أولي
26 يونيو 2024 1.3.1 - 1.4.0-beta01 1.4.0-alpha02

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

لإضافة تبعية إلى Media3، يجب إضافة مستودع Google Maven إلى مشروعك. يمكنك الاطّلاع على مستودع Maven من Google للحصول على مزيد من المعلومات.

أضِف العناصر الاعتمادية الخاصة بالعناصر التي تحتاج إليها في ملف build.gradle لتطبيقك أو وحدتك:

رائع

dependencies {
    def media3_version = "1.3.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"
}

Kotlin

dependencies {
    val media3_version = "1.3.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")
}

لمزيد من المعلومات عن العناصر التابعة، يُرجى الاطّلاع على إضافة تبعيات الإصدار.

ملاحظات

تساعدنا ملاحظاتك في تحسين Jetpack. يمكنك استخدام أداة تتبُّع مشاكل Media3 للعثور على إجابات عن الأسئلة والمشاكل المعروفة وطلبات الميزات وكذلك للإبلاغ عن مشاكل جديدة.

الإصدار 1.4.0

الإصدار 1.4.0-beta01

26 يونيو 2024

تم طرح androidx.media3:media3-*:1.4.0-beta01. يحتوي الإصدار 1.4.0-beta01 على عمليات التنفيذ هذه.

  • ExoPlayer:
    • يمكنك إضافة ExoPlayer.isReleased() للتحقّق مما إذا تم استدعاء Exoplayer.release().
    • أضف ExoPlayer.Builder.setMaxSeekToPreviousPositionMs لضبط الحد الأقصى للموضع الذي تسعى seekToPrevious() إليه إلى العنصر السابق (#1425).
  • المحوِّل:
    • إزالة حقل ExportResult.processedInputs إذا كنت تستخدم هذا الحقل للحصول على تفاصيل برنامج الترميز، استخدِم DefaultDecoderFactory.listener بدلاً من ذلك. وفي حال انطباق استثناء برنامج الترميز، ستتوفر تفاصيل برنامج الترميز في ExportException.codecInfo.
  • أدوات استخلاص البيانات:
    • إصلاح استخراج تنسيق صوت PCM في حاويات AVI.
  • الصورة:
    • تسمح هذه السياسة بتفعيل null كمَعلمة في ExoPlayer.setImageOutput بمحو سمة ImageOutput تم إعدادها سابقًا.
  • التأثير:
    • أزِل OverlaySettings.useHdr غير المستخدَم لأنّ النطاق الديناميكي للتراكب والإطار يجب أن يتطابق.
    • يمكنك إضافة إمكانية استخدام النطاق العالي الديناميكية (HDR) إلى قناة TextOverlay. يمكن تعديل إضاءة النص المركَّب باستخدام OverlaySettings.setHdrLuminanceMultiplier.
  • الجلسة:
    • يمكنك إضافة MediaSession.Callback.onPlayerInteractionFinished لإعلامك بالجلسات عند انتهاء سلسلة من تفاعلات اللاعب من وحدة تحكّم محدّدة.
    • أضِف SessionError واستخدِمه في SessionResult وLibraryResult بدلاً من رمز الخطأ لتوفير مزيد من المعلومات عن الخطأ وكيفية حلّه إن أمكن.
    • انشر الرمز الخاص بتطبيق اختبار وحدة التحكم Media3 الذي يمكن استخدامه لاختبار التفاعلات مع التطبيقات التي تنشر جلسة وسائط.
    • يمكنك نشر الميزات الإضافية التي تم تمريرها إلى MediaSession[Builder].setSessionExtras() الخاص بـmedia3 إلى PlaybackStateCompat.getExtras() الخاصة بوحدة التحكم في media1.
    • ربط الأخطاء الفادحة وغير الفادحة من جلسة المنصة وإليها. تم ربط PlaybackException بحالة خطأ فادحة في PlaybackStateCompat. تم ربط SessionError التي تم إرسالها إلى وحدة التحكّم بإشعارات الوسائط باستخدام MediaSession.sendError(ControllerInfo, SessionError) بخطأ غير فادح في PlaybackStateCompat، ما يعني أنّه تم ضبط رمز الخطأ والرسالة ولكن تظل حالة جلسة النظام الأساسي مختلفة على STATE_ERROR.
  • واجهة المستخدم:
    • يمكنك إضافة إمكانية عرض الصور إلى "PlayerView" عند الاتصال بـ ExoPlayer (#1144).
    • يمكنك إضافة تخصيص لرموز متنوعة في PlayerControlView من خلال سمات xml للسماح بإدراج عناصر قابلة للرسم مختلفة لكل مثيل PlayerView، بدلاً من عمليات الإلغاء العامة (#1200).
  • إضافة HLS:
    • إصلاح خطأ عدم تحديث قوائم التشغيل التي يتم تشغيلها بشكل أساسي أثناء التشغيل المباشر (#1240)
  • أزِل الرموز التي تم إيقافها نهائيًا:
    • إزالة الواجهة Bundleable ويشمل ذلك إزالة جميع الحقول الثابتة Bundleable.Creator<Foo> CREATOR. وعلى المتصلين أن يستخدموا الطريقتَين Bundle toBundle() وstatic Foo fromBundle(Bundle) مع كل نوع بدلاً من ذلك.

الإصدار 1.4.0-alpha02

7 يونيو 2024

تم طرح androidx.media3:media3-*:1.4.0-alpha02. يحتوي الإصدار 1.4.0-alpha02 على عمليات التنفيذ هذه.

  • المكتبة المشتركة:
    • تهدف عملية إعادة التوجيه التي يُفترض أن تكون بلا عمليات إلى استخدام طريقتَي BasePlayer.seekTo وSimpleBasePlayer.handleSeek المحميتَين بدلاً من تجاهلها. في حال تنفيذ هذه الطرق في مشغّل مخصّص، قد تحتاج إلى التعامل مع هذه الطلبات الإضافية باستخدام mediaItemIndex == C.INDEX_UNSET.
    • أزِل تبعية التجميع من إزالة لغة البرمجة Java 8 المحسّنة (#1312).
    • تأكَّد من تجاهل المدة التي تم ضبطها على السمة MediaItem.Builder.setImageDurationMs بالنسبة إلى السمة MediaItem التي لا تتضمّن صورة (كما هو موثَّق).
  • ExoPlayer:
    • أضِف reset إلى BasePreloadManager لتحرير جميع مصادر الاحتفاظ بالبيانات مع الاحتفاظ بمثيل مدير التحميل المُسبق.
    • أضِف ExoPlayer.setPriorityBuilder.setPriority) لتحديد قيمة الأولوية المستخدَمة في PriorityTaskManager ولأهمية MediaCodec من واجهة برمجة التطبيقات 35.
    • يُرجى حلّ المشكلة المتعلّقة بتعديل آخر وقت للمخزن المؤقت، ما أدى إلى ظهور مفتاح bs (تجويع المخزن المؤقت) غير صحيح في أداة CMCD (#1124).
    • أضِف PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) للإشارة إلى تحميل المصدر حتى النهاية. يتيح هذا الإجراء لعمليات تنفيذ DefaultPreloadManager وPreloadMediaSource.PreloadControl المخصّصة تحميل المصدر التالي مسبقًا أو اتّخاذ إجراءات أخرى.
    • إصلاح الخطأ الذي قد يؤدي فيه تخطّي كتم الصوت عند نهاية العناصر إلى استثناء تشغيل الفيديو
    • يمكنك إضافة clear إلى PreloadMediaSource لتجاهل فترة التحميل المُسبق.
    • إضافة رمز خطأ جديد PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED يتم استخدامه عند استرداد موارد برنامج الترميز لتنفيذ مهام ذات أولوية أعلى
    • السماح لـ AdsMediaSource بتحميل إعلانات ما قبل التشغيل قبل اكتمال التحضير الأولي لوسائط المحتوى (#1358).
    • يجب إصلاح الخطأ الذي تسبب في نقل التشغيل إلى STATE_ENDED عند إعادة إعداد بث مباشر DASH متعدد الفترات بعد إزالة الفترة الأصلية من ملف البيان.
    • إعادة تسمية "onTimelineRefreshed" إلى "onSourcePrepared" و"onPrepared" إلى "onTracksSelected" في PreloadMediaSource.PreloadControl. عليك أيضًا إعادة تسمية IntDefs في DefaultPreloadManager.Stage وفقًا لذلك.
    • يمكنك إضافة دعم تجريبي للجدولة الديناميكية من أجل مواءمة العمل بشكل أفضل مع دورات تنشيط وحدة المعالجة المركزية (CPU) وتأخير الاستيقاظ حتى وقت تقدم العارضات. يمكنك تفعيل هذا الخيار باستخدام experimentalSetDynamicSchedulingEnabled عند إعداد مثيل ExoPlayer.
    • إضافة Renderer.getDurationToProgressMs ويمكن لـ Renderer تنفيذ هذه الطريقة للعودة إلى ExoPlayer لمدة يجب أن ينتقل خلالها العرض إلى أن يتقدم العارض. إذا تم ضبط السمة ExoPlayer على experimentalSetDynamicSchedulingEnabled، سيستدعي ExoPlayer هذه الطريقة عند احتساب الوقت لجدولة مهمة العمل.
    • يمكنك إضافة MediaCodecAdapter#OnBufferAvailableListener للتنبيه عندما تكون المخزن المؤقت للإدخالات والمخرجات متاحة للاستخدام بحلول MediaCodecRenderer. سيشير MediaCodecRenderer إلى ExoPlayer عند تلقّي عمليات معاودة الاتصال هذه وإذا تم ضبط ExoPlayer على experimentalSetDynamicSchedulingEnabled، سيجدول ExoPlayer حلقة العمل الخاصة به حيث يمكن للعارضين إحراز تقدم.
    • استخدِم فئة البيانات لطرق LoadControl بدلاً من المعلَمات الفردية.
  • المحوِّل:
    • تفادي حدوث خطأ في برنامج فك الترميز حيث تم تقييد عدد القنوات الصوتية بصوت الاستيريو عند التعامل مع إدخال PCM.
    • عند اختيار مقاطع صوتية في ExoPlayerAssetLoader، تجاهل قيود عدد القنوات الصوتية لأنها تنطبق على التشغيل فقط.
    • استبدِل واجهة androidx.media3.transformer.Muxer بـ androidx.media3.muxer.Muxer وأزِل androidx.media3.transformer.Muxer.
    • أصلح تحميل صورة HEIC من مخططات معرِّف الموارد المنتظم (URI) للمحتوى. (#1373)
    • اضبط مدة المقطع الصوتي في AudioGraphInput لتحسين مزامنة الصوت والفيديو.
  • أدوات استخلاص البيانات:
    • MPEG-TS: تقديم التغيير لضمان عرض الإطار الأخير من خلال تمرير وحدة الوصول الأخيرة من البث إلى قائمة انتظار النماذج (#7909). دمج الإصلاحات لحلّ المشاكل التي ظهرت في مجموعات بث HLS(#1150) وH.262 HLS (#1126) من خلال إطار I-frame فقط
    • تنسيق MP3: يمكنك تفضيل حجم البيانات من إطار Info على الحجم الذي قدّمه مصدر البيانات الأساسي (مثل حجم الملف أو عنوان HTTP يتضمّن السمة Content-Length). ويساعد ذلك في استبعاد بيانات المقاطع الدعائية غير القابلة للتشغيل (مثل صورة الألبوم) من عمليات احتساب البحث عن معدل نقل البيانات المستمر، ما يجعل عملية البحث أكثر دقة (#1376).
    • MP3: استخدِم عدد اللقطات والبيانات الأخرى في إطار Info (إذا كان متوفرًا) لاحتساب متوسط معدل نقل البيانات للتقديم أو الترجيع بشكل ثابت لمعدّل نقل البيانات، بدلاً من الاستخراج من معدّل نقل بيانات الإطار بعد الإطار Info، الذي قد يكون صغيرًا بشكل زائف، مثل إطار PCUT (#1376).
  • الصوت:
    • إصلاح سمات الترميز DTS:X Profile 2 للتشغيل أثناء التشغيل (#1299)
    • بالنسبة إلى التشغيل الذي تم إلغاء تحميله، عليك إعادة ضبط حقل التتبّع لاكتمال البث في DefaultAudioSink قبل طلب AudioTrack.stop()، لكي يتعرّف AudioTrack.StreamEventCallback#onPresentationEnded بشكل صحيح على وقت تشغيل جميع البيانات المعلّقة.
    • يجب إصلاح الخطأ في SilenceSkippingAudioProcessor حيث إنّ الانتقال بين تنسيقات الصوت المختلفة (مثلاً الاستيريو إلى الصوت الأحادي) قد يفرض استثناءً على معالج البيانات (#1352).
    • نفِّذ MediaCodecAudioRenderer.getDurationToProgressUs بحيث يجدول ExoPlayer بشكلٍ ديناميكي حلقة العمل الرئيسية الخاصة به إلى الوقت الذي يمكن فيه لبرنامج MediaCodecAudioRenderer إحراز تقدم.
  • الفيديو:
    • إصلاح المنطق الاحتياطي لبرنامج فك الترميز لكي تستخدم تقنية Dolby Vision برنامج فك ترميز AV1 متوافق إذا لزم الأمر (#1389).
  • النص:
    • يجب حلّ مشكلة تخطّي الترجمات التي تبدأ قبل موضع التقديم/الترجيع. تم طرح هذه المشكلة فقط في Media3 1.4.0-alpha01.
    • غيِّر السلوك التلقائي لتحليل الترجمة بحيث يتم تنفيذه أثناء الاستخراج بدلاً من إجراؤه خلال العرض (راجِع الرسم البياني لبنية ExoPlayer لمعرفة الفرق بين استخراج البيانات وعرضها).
      • ويمكن إلغاء هذا التغيير من خلال استدعاء كل من MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) وTextRenderer.experimentalSetLegacyDecodingEnabled(true). اطّلِع على مستندات حول التخصيص لمعرفة كيفية دمج هذه المكوّنات في مثيل ExoPlayer. وستتم إزالة هذه الطرق (وكل الدعم الذي يتيحه فك ترميز العناوين الفرعية القديمة) في إصدار مستقبلي.
      • يجب تحديث التطبيقات التي تتضمن عمليات تنفيذ SubtitleDecoder مخصّصة لتنفيذ SubtitleParser بدلاً من ذلك (وSubtitleParser.Factory بدلاً من SubtitleDecoderFactory).
    • PGS: إصلاح فك ترميز مدة التشغيل لمعالجة 0 كفهرس ألوان بدلاً من قيمة لون حرفي (#1367).
    • CEA-708: تجاهُل قيمة rowLock. تنص مواصفات CEA-708-E S-2023 على أنّه يجب افتراض أنّ القيمة rowLock وcolumnLock صحيحة، بغض النظر عن القيم الواردة في البث (لم يتم تنفيذ دعم columnLock، ولذلك يُفترض أن تكون خاطئة دائمًا).
      • تم تضمين هذا التغيير في الأصل في ملاحظات إصدار 1.3.0-alpha01، ولكن تم إرجاع التغيير عن طريق الخطأ قبل إصدار 1.3.0-rc01. لقد تم إصلاح هذه المشكلة الآن، وبالتالي أصبح التغيير معروضًا من جديد.
    • CEA-708: تجنَّب إضافة أسطر جديدة مكرّرة من خلال طريقة تعامل ExoPlayer بطريقة سلِسة مع الأمر "set pen location" (ضبط موقع القلم) (#1315).
  • البيانات الوصفية:
    • إصلاح ربط علامات الترتيب بتنسيق MP4 إلى ID3. في السابق، كانت علامات MP4 الخاصة بـ "ترتيب الألبوم" (soal) و"ترتيب الفنانين" (soar) و"ترتيب فنان الألبوم" (soaa) تم بشكل غير صحيح ربط علامات TSO2 وTSOA وTSOP بأرقام التعريف 3 (#1302).
    • يجب إصلاح قراءة علامات gnre الرقمية (النوع) وtmpo (الإيقاع) بتنسيق MP4 عندما يتجاوز طول القيمة بايت واحد.
    • انشر إطار رقم التعريف3 TCON على MediaMetadata.genre (#1305).
  • الصورة:
    • أضِف السماح لشبكات الصور المصغّرة غير المربّعة على شكل DASH (#1300).
    • إضافة إمكانية استخدام AVIF لواجهة برمجة التطبيقات 34+
  • مصدر البيانات:
    • السماح لـ ByteArrayDataSource بتحويل عنوان URI إلى مصفوفة بايت أثناء open()، بدلاً من أن يكون ثابتًا أثناء الإنشاء (#1405).
  • إدارة الحقوق الرقمية:
    • السماح بضبط LoadErrorHandlingPolicy على DefaultDrmSessionManagerProvider (#1271).
  • التأثير:
    • إصلاح الخطأ الذي يحدث فيه تعطُّل TimestampWrapper عند استخدامه مع ExoPlayer#setVideoEffects (#821)
    • تغيير مساحة العمل التلقائية المستخدَمة في تنسيق SDR من الألوان الخطية إلى الألوان الكهربائية BT 709 SDR قم أيضًا بتوفير الخيار الثالث للاحتفاظ بمساحة اللون الأصلية.
    • السماح بتحديد ترتيب z غير محدد لـ EditedMediaItemSequences (#1055).
    • الحفاظ على نطاق إضاءة ثابت في مختلف قطع محتوى النطاق العالي الديناميكية (باستخدام نطاق HLG)
    • يمكنك إضافة إمكانية استخدام تركيبات بدقة HDR فائقة (صورة نقطية) على محتوى HDR.
    • السماح باستخدام تأثيرات SeparableConvolution قبل واجهة برمجة التطبيقات 26
  • إضافة إعلانات الوسائط التفاعلية:
    • روِّج لواجهة برمجة التطبيقات المطلوبة لكي تعمل التطبيقات على تثبيت مصادر إعلانات "إدراج إعلان ديناميكي" ثابتة.
    • أضِف replaceAdTagParameters(Map <String, String>) إلى ImaServerSideAdInsertionMediaSource.AdLoader بما يسمح باستبدال مَعلمات علامات الإعلانات في وقت التشغيل.
    • إصلاح الخطأ الذي لم يكن يتم فيه استدعاء VideoAdPlayer.VideoAdPlayerCallback.onError عند حدوث خطأ في المشغّل أثناء تشغيل الإعلان (#1334).
    • عليك ترقية إصدار حزمة تطوير البرامج لإعلانات الوسائط التفاعلية إلى 3.33.0 لإصلاح NullPointerException عند استخدام معرّفات الموارد المنتظمة (URI) لعلامة الإعلان data:// (#700).
  • الجلسة:
    • يمكنك إخفاء شريط التمرير في إشعار الوسائط لأحداث البث المباشر من خلال عدم ضبط المدة على البيانات الوصفية لجلسة النظام الأساسي (#1256).
    • يجب محاذاة تحويل MediaMetadata إلى MediaDescriptionCompat لاستخدام نفس الترتيب والمنطق المفضّلين عند اختيار خصائص البيانات الوصفية كما في media1.
    • أضِف MediaSession.sendError() الذي يسمح بإرسال الأخطاء غير الفادحة إلى وحدة التحكّم في Media3. عند استخدام وحدة التحكّم في الإشعارات (راجِع MediaSession.getMediaNotificationControllerInfo())، يتم استخدام الخطأ المخصّص لتعديل PlaybackState جلسة النظام الأساسي إلى حالة خطأ باستخدام معلومات الخطأ المحدّدة (#543).
  • إضافة Cronet:
    • إصلاح SocketTimeoutException في CronetDataSource في بعض إصدارات Cronet، لا يكون الطلب المقدم من معاودة الاتصال مماثلاً دائمًا. يؤدي ذلك إلى عدم اكتمال معاودة الاتصال وانتهاء مهلة الطلب (https://issuetracker.google.com/328442628).
  • إضافة HLS:
    • إصلاح الخطأ الذي تم فيه تفويض نماذج EMSG المُعلَّقة التي كانت تنتظر انقطاع الخدمة في HlsSampleStreamWrapper مع إزاحة غير صحيحة تؤدي إلى حدوث IndexOutOfBoundsException أو IllegalArgumentException (#1002)
    • يجب إصلاح الخطأ الذي يكمن في إعادة تحميل قوائم التشغيل غير الأساسية لأحداث البث من خلال LL-HLS (#1240).
    • إصلاح الخطأ الذي أدّى فيه تفعيل بروتوكول CMCD لبروتوكول HLS مع مقاطع الإعداد إلى حدوث Source Error وIllegalArgumentException.
  • إضافة DASH:
    • إصلاح خطأ يؤدي إلى ظهور خطأ IndexOutOfBoundsException (#1329) من خلال إعادة إعداد بث مباشر متعدد الفترات
    • يمكنك إضافة إمكانية استخدام عناوين URL لترخيص dashif:Laurl (#1345).
  • إضافة Cast:
    • إصلاح الخطأ الذي أدّى إلى تحويل عنوان ألبوم MediaQueueItem إلى اسم الفنان في عنصر الوسائط Media3 (#1255).
  • التطبيق التجريبي:
    • ويمكنك السماح بإعداد وضع التكرار باستخدام Intent وسيطات من سطر الأوامر (#1266).
  • أزِل الرموز التي تم إيقافها نهائيًا:
    • إزالة طريقة setContentTypePredicate(Predicate) من DefaultHttpDataSource وOkHttpDataSource وCronetDataSource استخدِم الطريقة المكافئة لكل XXXDataSource.Factory بدلاً من ذلك.
    • إزالة طرق الإنشاء OkHttpDataSource وOkHttpDataSourceFactory يمكنك استخدام OkHttpDataSource.Factory كبديل.
    • إزالة PlayerMessage.setHandler(Handler) استخدِم setLooper(Looper) بدلاً من ذلك.
    • إزالة حقل Timeline.Window.isLive استخدِم طريقة isLive() بدلاً من ذلك.
    • إزالة طرق الإنشاء DefaultHttpDataSource استخدِم DefaultHttpDataSource.Factory بدلاً من ذلك.
    • إزالة DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS استخدِم DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS بدلاً من ذلك.
    • إزالة MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean) يمكنك استخدام MediaCodecInfo.canReuseCodec(Format, Format) كبديل.
    • أزِل الطريقة DrmSessionManager.DUMMY وgetDummyDrmSessionManager(). يمكنك استخدام DrmSessionManager.DRM_UNSUPPORTED كبديل.
    • إزالة AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)، AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)، AudioRendererEventListener.onAudioInputFormatChanged(Format)، VideoRendererEventListener.onVideoInputFormatChanged(Format). ويمكنك بدلاً من ذلك استخدام حِمل البيانات الزائد التي يتم احتسابها من خلال DecoderReuseEvaluation.
    • إزالة RendererSupport.FormatSupport IntDef وFORMAT_HANDLED وFORMAT_EXCEEDS_CAPABILITIES وFORMAT_UNSUPPORTED_DRM وFORMAT_UNSUPPORTED_SUBTYPE وFORMAT_UNSUPPORTED_TYPE ثوابت. استخدِم IntDef والثوابت المكافئة في androidx.media3.common.C بدلاً من ذلك (مثل C.FORMAT_HANDLED).

الإصدار 1.4.0-alpha01

17 أبريل 2024

تم طرح androidx.media3:media3-*:1.4.0-alpha01. يحتوي الإصدار 1.4.0-alpha01 على عمليات التنفيذ هذه.

  • ExoPlayer:
    • أضِف السمة BasePreloadManager التي تعمل على تنسيق التحميل المُسبق لمصادر متعددة استنادًا إلى الأولويات المحدّدة في السمة rankingData. يمكن التخصيص من خلال تمديد هذه الفئة. أضِف DefaultPreloadManager الذي يستخدم PreloadMediaSource لتحميل عيّنات وسائط من المصادر مسبقًا إلى الذاكرة، كما يستخدم عددًا صحيحًا rankingData يشير إلى فهرس أحد العناصر على واجهة المستخدم.
    • يمكنك إضافة PlayerId إلى معظم طُرق LoadControl لتفعيل عمليات تنفيذ LoadControl لإتاحة إمكانية تشغيل عدّة مشغّلات.
    • إزالة Buffer.isDecodeOnly() وC.BUFFER_FLAG_DECODE_ONLY وليست هناك حاجة إلى ضبط هذه العلامة إذ ستقرّر برامج العرض وفك الترميز تخطّي المخازن المؤقتة بناءً على الطابع الزمني. يجب أن تتحقّق عمليات تنفيذ Renderer المخصّصة ما إذا كانت مدة المخزن المؤقت BaseRenderer.getLastResetPositionUs() على الأقل لتحديد ما إذا كان يجب عرض عيّنة يمكن لعمليات تنفيذ SimpleDecoder المخصّصة التحقّق من isAtLeastOutputStartTimeUs إذا لزم الأمر أو وضع علامة DecoderOutputBuffer.shouldBeSkipped على الموارد الاحتياطية الأخرى لتخطّيها.
    • ويمكنك السماح بعرض قيمة فارغة من خلال "TargetPreloadStatusControl.getTargetPreloadStatus(T)" للإشارة إلى عدم تحميل MediaSource مسبقًا باستخدام rankingData المحدَّد.
    • إضافة remove(MediaSource) إلى BasePreloadManager
  • المحوِّل:
    • أضِف audioConversionProcess وvideoConversionProcess إلى ExportResult للإشارة إلى كيفية إنشاء المقطع الصوتي ذي الصلة في ملف المخرجات.
    • عمليات التحقّق من مستوى H.264 لتحسين عملية تقليل الصوت
    • يمكنك إضافة إمكانية التبديل بين وسائط إدخال SDR وHDR بشكل تسلسلي.
    • يمكنك إضافة دعم للتأثيرات الصوتية على مستوى المقطوعة الموسيقية.
    • يمكنك إضافة إمكانية تحويل ترميز الصور التي تعمل بتقنية HDR الفائقة إلى فيديوهات HDR.
    • أصلِح المشكلة التي لا تُخرج فيها DefaultAudioMixer الحجم الصحيح من وحدات البايت بعد إعادة ضبطها وإعادة استخدامها.
  • الفيديو:
    • يجب حلّ المشكلة المتعلّقة بوصول Listener.onRenderedFirstFrame() مبكرًا جدًا عند تبديل مساحات العرض أثناء التشغيل.
  • مصدر البيانات:
    • تنفيذ إتاحة معرّفات الموارد المنتظمة (URI) للموارد الأولية android.resource://package/id في حال اختلاف package عن حزمة التطبيق الحالي لم يتم توثيق هذا سابقًا للعمل، ولكنه طريقة أكثر فاعلية للوصول إلى الموارد في حزمة أخرى من الاسم.
    • تحقق بعناية من أن url ليس قيمة خالية في دوال الإنشاء DataSpec. تمت إضافة تعليق توضيحي على هذه المعلمة لتكون غير خالية.
  • التأثير:
    • يمكنك إتاحة عدة تغييرات للسرعة ضمن EditedMediaItem أو Composition نفسها في SpeedChangeEffect.
    • دعم إخراج HLG وPQ من إدخال الصور النقطية بتقنية HDR الفائقة
    • يمكنك إضافة دعم لـ EGL_GL_ColorSPACE_BT2020_HLG_EXT، ما يؤدي إلى تحسين ناتج سطح HLG في ExoPlayer.setVideoEffect وDebugView في Transformer.
    • عدِّل تنفيذ مصفوفة التراكب لتتوافق مع المستندات من خلال قلب قيمتي x وy المطبقة في setOverlayFrameAnchor(). في حال استخدام OverlaySettings.Builder.setOverlayFrameAnchor()، اقلب قيمتَي x وy بضربهما في -1.
  • الجلسة:
    • غيِّر القيمة التلقائية من CommandButton.enabled إلى true وتأكَّد من أنّ القيمة يمكن أن تظل "خطأ" لوحدات التحكّم حتى في حال توفّر الأمر المرتبط.
    • أضِف ثوابت رموز لـ CommandButton التي يجب استخدامها بدلاً من موارد الرموز المخصّصة.
    • يمكنك إضافة MediaSessionService.isPlaybackOngoing() للسماح للتطبيقات بالاستعلام عمّا إذا كان يجب إيقاف الخدمة في onTaskRemoved() (#1219).
    • يمكنك إضافة MediaSessionService.pauseAllPlayersAndStopSelf() الذي يتيح بسهولة إيقاف تشغيل كل الجلسات مؤقتًا وطلب stopSelf لإنهاء دورة حياة MediaSessionService.
    • يمكنك إلغاء MediaSessionService.onTaskRemoved(Intent) لتوفير عملية تنفيذ تلقائية آمنة تُبقي الخدمة قيد التشغيل في المقدّمة إذا كان التشغيل مستمرًا أو يوقف الخدمة بطريقة أخرى.
  • عمليات التنزيل:
    • يُرجى التأكُّد من عدم تسريب DownloadHelper لمثيلات Renderer التي لم يتم إصدارها، ما قد يؤدي في النهاية إلى تعطُّل التطبيق مع IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • أدوات مساعدة للاختبار:
    • تنفيذ onInit() وonRelease() في FakeRenderer
    • غيِّر طريقة TestPlayerRunHelper.runUntil/playUntil إذا تعذّر تطبيقها على الأخطاء غير الفادحة (مثل الأخطاء التي تم الإبلاغ عنها إلى AnalyticsListener.onVideoCodecError)، واستخدِم سلسلة الطريقة TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() الجديدة لإيقاف هذا السلوك.
  • التطبيق التجريبي:
    • يمكنك استخدام "DefaultPreloadManager" في التطبيق التجريبي للصيغة المختصرة.
  • أزِل الرموز التي تم إيقافها نهائيًا:
    • إزالة CronetDataSourceFactory استخدِم CronetDataSource.Factory بدلاً من ذلك.
    • أزِل بعض منصات إنشاء DataSpec. يمكنك استخدام DataSpec.Builder كبديل.

الإصدار 1.3.0

الإصدار 1.3.1

11 أبريل 2024

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

  • المكتبة المشتركة:
    • أضِف Format.labels للسماح بالتصنيفات المترجَمة أو البديلة الأخرى.
  • ExoPlayer:
    • يجب حلّ المشكلة التي تمنع PreloadMediaPeriod من الاحتفاظ بالبثّ عند تحميله مسبقًا من جديد.
    • طبِّق السمة TrackSelectionResult المقابلة الصحيحة على فترة التشغيل في إعادة اختيار المسار.
    • يجب عدم بدء برامج العرض التي تم تفعيل الميزة فيها قبل إطلاقها إلا بعد تقدّم مدة التشغيل عند الانتقال بين ملفات الوسائط (#1017).
    • أضِف نوع الإرجاع غير المتوفّر إلى قاعدة Proguard -keepclasseswithmembers للحساب DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • المحوِّل:
    • إضافة حل بديل للاستثناء الذي تم طرحه بسبب عدم دعم MediaMuxer للطوابع الزمنية السلبية للعروض التقديمية قبل واجهة برمجة التطبيقات 30.
  • اختيار المقطع الصوتي:
    • DefaultTrackSelector: تفضيل مقاطع الفيديو التي يكون عدد اللقطات في الثانية فيها "معقول" (أكبر من أو تساوي 10 لقطات في الثانية) بدلاً من المقاطع الصوتية التي يكون عدد اللقطات في الثانية فيها أقل أو بدون ضبط. ويضمن ذلك أن يحدّد المشغّل المقطع الصوتي "الحقيقي" بتنسيق MP4 الذي يتم استخلاصه من صور الحركة التي يمكن أن يحتوي على مسارين بتنسيق HEVC حيث يكون أحدهما عالي الدقة ولكن يضم عددًا قليلاً جدًا من اللقطات (#1051).
  • أدوات استخلاص البيانات:
    • يجب حل مشكلة عدم تخطّي المساحة المتروكة عند قراءة أجزاء ذات حجم فردي من ملفات WAV (#1117).
    • MP3: عليك تعبئة Format.averageBitrate من إطارات البيانات الوصفية، مثل XING وVBRI.
    • MPEG-TS: يجب العودة عن التغيير الذي يهدف إلى ضمان عرض الإطار الأخير من خلال تمرير وحدة الوصول الأخيرة من البث إلى قائمة انتظار النماذج (#7909). ويرجع ذلك إلى التغيير الذي يتسبّب في حدوث مشاكل جديدة في مجموعات بث HLS فقط ضمن إطار I-frame (#1150) والبث المباشر وفق بروتوكول H.262 (#1126).
  • الصوت:
    • يمكنك السماح باسترداد بيانات العارض من خلال إيقاف "إلغاء التحميل" في حال تعذّر إعداد المقطع الصوتي في وضع "إلغاء التحميل".
  • الفيديو:
    • إضافة حل بديل لمشكلة في الجهاز على أجهزة Galaxy Tab S7 FE و"Chromecast مع Google TV" وLenovo M10 FHD Plus ويتم وضع علامة "غير متوافقة" على أحداث البث بمعدل 60 لقطة في الثانية H265.
    • أضِف حلاً بديلاً يضمن عرض الإطار الأول دائمًا أثناء إنشاء النفق حتى إذا لم ينفِّذ الجهاز ذلك تلقائيًا على النحو الذي تتطلّبه واجهة برمجة التطبيقات (#1169). (#966)
    • يجب حلّ المشكلة التي تؤدي فيها معالجة معلومات ألوان HDR إلى سوء سلوك برنامج الترميز وتمنع تبديل التنسيق التكيُّفي لمقاطع الفيديو ذات التنسيق SDR (#1158).
  • النص:
    • WebVTT: منع الإشارات المتتالية بشكل مباشر من إنشاء مثيلات CuesWithTiming إضافية زائفة من WebvttParser.parse (#1177).
  • إدارة الحقوق الرقمية:
    • عليك حلّ NoSuchMethodError التي يمكن عرضها في إطار عمل MediaDrm بدلاً من ResourceBusyException أو NotProvisionedException على بعض أجهزة Android 14 (#1145).
  • التأثير:
    • تحسين ربط الألوان من PQ إلى SDR عن طريق تحويل مساحات الألوان
  • الجلسة:
    • حل مشكلة عودة الموضع الحالي مرة أخرى عندما تحل وحدة التحكم محل العنصر الحالي (#951).
    • يُرجى حل المشكلة التي تمنع نقل MediaMetadata مع extras غير فارغة بين وحدات التحكّم في الوسائط والجلسات (#1176).
  • واجهة المستخدم:
    • الإجراء الاحتياطي لتضمين اسم لغة المقطع الصوتي في حال تعذّر على Locale تحديد الاسم المعروض (#988).
  • إضافة DASH:
    • عليك تعبئة جميع عناصر Label من البيان في Format.labels (#1054).
  • إضافة RTSP:
    • تخطي قيم معلومات الجلسة الفارغة (علامات i-tag) في تحليل SDP (#1087).
  • إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
    • أوقِف إضافة MIDI كتبعية محلية تلقائيًا لأنّها تتطلب إعداد مستودع Maven إضافي. يمكن للمستخدمين الذين يحتاجون إلى هذه الوحدة من خلال تبعية محلية إعادة تفعيلها.

الإصدار 1.3.0

‫6 مارس 2024

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

  • المكتبة المشتركة:
    • تنفيذ إتاحة معرّفات الموارد المنتظمة (URI) الخاصة بـ android.resource://package/[type/]name في الحالات التي يختلف فيها package عن حزمة التطبيق الحالي. لقد تم توثيق هذا دائمًا للعمل، ولكن لم يتم تنفيذه بشكل صحيح حتى الآن.
    • يمكنك تسوية أنواع MIME التي تم ضبطها من خلال رمز التطبيق أو قراءتها من الوسائط لتكون بأحرف صغيرة تمامًا.
    • تحديد الإعلانات باستخدام MediaItem كاملة بدلاً من Uri واحد في AdPlaybackState.
    • رفع minSdk إلى 19 (Android KitKat) ويتوافق هذا مع جميع مكتبات AndroidX الأخرى، ويتطلب منا الترقية إلى أحدث الإصدارات من ملحقات AndroidX.
    • يمكنك تعبئة كل من artworkUri وartworkData في MediaMetadata.Builder.populate(MediaMetadata) عندما يكون أحدهما على الأقل غير فارغ (#964).
  • ExoPlayer:
    • أضِف السمتَين PreloadMediaSource وPreloadMediaPeriod اللذين يسمحان للتطبيقات بتحميل مصدر وسائط المحتوى مسبقًا في موضع بدء محدّد قبل التشغيل. يتولى PreloadMediaSource مهمة إعداد مصدر وسائط المحتوى للحصول على Timeline، وإعداد الفترة وتخزينها مؤقتًا عند نقطة البداية المحددة، واختيار المقاطع الصوتية وتحميل بيانات الوسائط لهذه الفترة. تتحكم التطبيقات في تقدم التحميل المسبق من خلال تنفيذ PreloadMediaSource.PreloadControl وتعيين المصدر المحمَّل مسبقًا على المشغّل للتشغيل.
    • أضِف ExoPlayer.setImageOutput الذي يسمح للتطبيقات بضبط ImageRenderer.ImageOutput.
    • تقدّم حزمة DefaultRenderersFactory الآن ImageRenderer للمشغّل بشكل تلقائي مع تضمين ImageOutput وImageDecoder.Factory.DEFAULT فارغَين.
    • إطلاق حدث Player.Listener.onPositionDiscontinuity عند تخطّي كتم الصوت (#765)
    • إضافة دعم تجريبي لتحليل الترجمات أثناء الاستخراج. يمكنك تفعيل هذه الميزة باستخدام MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • إتاحة مصادر الوسائط التكيّفية باستخدام PreloadMediaSource
    • نفِّذ HttpEngineDataSource، وهو HttpDataSource باستخدام واجهة برمجة التطبيقات HttpEngine.
    • منع التصنيف الفرعي CompositeSequenceableLoader. كان هذا المكوّن قابلاً للتوسع في السابق، ولكن لم يتم تصنيفه ضمن فئة فرعية في المكتبة. يمكن إجراء عمليات التخصيص من خلال إحاطة مثيل باستخدام نمط أداة التصميم وتنفيذ علامة CompositeSequenceableLoaderFactory مخصّصة.
    • أصلِح المشكلة التي يؤدي فيها التكرار في الوقت نفسه إلى محو البيانات الوصفية من هذا العنصر (#1007).
    • إعادة تسمية طُرق experimentalSetSubtitleParserFactory على BundledChunkExtractor.Factory وDefaultHlsExtractorFactory إلى setSubtitleParserFactory وعدم السماح باجتياز null. استخدم طرق experimentalParseSubtitlesDuringExtraction(boolean) الجديدة للتحكم في سلوك التحليل.
    • يمكنك إضافة إمكانية تخصيص SubtitleParser.Factory المستخدَم أثناء الاستخراج. ويمكن تحقيق ذلك باستخدام MediaSource.Factory.setSubtitleParserFactory().
    • أضِف بادئة المصدر إلى جميع حقول Format.id التي تم إنشاؤها من MergingMediaSource. ويساعد ذلك في تحديد المصدر الذي أنتج Format (#883).
    • يمكنك إصلاح التعبير العادي المستخدَم في التحقّق من صحة أسماء مفاتيح بيانات عميل الوسائط الشائعة (CMCD) المخصّصة عن طريق تعديله للتحقّق من الواصلة فقط (#1028).
    • أوقِف الترميز المزدوج لمَعلمات طلب البحث CMCD (#1075).
  • المحوِّل:
    • يمكنك إضافة إمكانية لتسوية فيديوهات التصوير البطيء H.265/HEVC SEF.
    • عليك زيادة سرعة تحويل المُهملات، خاصةً لتعديلات "إزالة الفيديو".
    • يمكنك إضافة واجهة برمجة تطبيقات لضمان بدء ملف الإخراج على إطار فيديو. وقد يساعد ذلك في جعل نتائج عمليات القطع أكثر توافقًا مع عمليات تنفيذ المشغّل التي لا تعرض إطار الفيديو الأول حتى الطابع الزمني للعرض التقديمي (#829).
    • يمكنك إضافة دعم لتحسين عمليات قطع ملفات MP4 لمواد العرض الفردية.
    • يمكنك إضافة دعم لضمان توفُّر الطابع الزمني الأول لإطار الفيديو في ملف الناتج. يعمل على إصلاح ملفات الإخراج التي تبدأ بإطار أسود في المشغّلات المستندة إلى iOS (#829).
  • اختيار المقطع الصوتي:
    • أضِف DefaultTrackSelector.selectImageTrack لتفعيل اختيار مسار الصورة.
    • أضِف TrackSelectionParameters.isPrioritizeImageOverVideoEnabled لتحديد ما إذا كنت تريد اختيار مسار صورة ما إذا كان كلاً من مسار صورة ومقطع فيديو متاحين. والقيمة التلقائية هي false، ما يعني منح الأولوية لاختيار مقطع فيديو.
  • أدوات استخلاص البيانات:
    • أضِف تحليل AV1C الإضافي إلى أداة استخراج MP4 لاسترداد قيم ColorInfo.colorSpace وColorInfo.colorTransfer وColorInfo.colorRange (#692).
    • تنسيق MP3: استخدام معدل نقل بيانات ثابت (CBR) للبحث عن الملفات ذات العنوان Info (أي CBR المكافئ للعنوان Xing) في السابق، استخدمنا جدول التقديم/الترجيع من عنوان Info، ولكن هذه النتائج كانت في البحث بدقة أقل مقارنةً بتجاهله مع افتراض أنّ الملف CBR.
    • MPEG2-TS: إضافة دعم DTS وDTS-LBR وDTS:X Profile2 (#275)
    • يمكنك استخراج أنواع الصوت من أدوات وصف TS وربطها بعلامات الأدوار، ما يتيح للمستخدمين تحديد المقاطع الصوتية بشكل مستنير (#973).
  • الصوت:
    • يمكنك تحسين خوارزمية التخطّي من أجل كتم الصوت من خلال خفض الصوت بشكل سلس، مع الحفاظ على الحدّ الأدنى من فترات كتم الصوت وفترات صمت طبيعية أكثر (#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. يتم اقتصاص الصور على شكل مربّعات ويتم توفير صور مصغّرة فردية في "ImageOutput" بالقرب من أوقات العرض.
  • إدارة الحقوق الرقمية:
    • يجب تشغيل نماذج "محو العميل المحتمل" غير المشفَّرة في محتوى DRM على الفور تلقائيًا، حتى إذا لم تكن المفاتيح للنماذج المُشفَّرة اللاحقة جاهزة بعد. وقد يؤدي ذلك إلى عرض أخطاء أثناء التشغيل إذا كانت المفاتيح لا تزال غير جاهزة عندما يصل موضع التشغيل إلى النماذج المشفَّرة (ولكنّ التشغيل السابق لم يكن ليبدأ على الإطلاق عند هذه النقطة). يمكن إيقاف هذا السلوك باستخدام MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey أو DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.
  • إضافة إعلانات الوسائط التفاعلية:
    • أصلِح المشكلة التي تمنع تشغيل إعلانات DASH وHLS بدون امتداد الملف المناسب.
  • الجلسة:
    • إيقاف رصد النقر مرّتين لتطبيقات التلفزيون (#962)
    • يُرجى حل مشكلة عدم نقل MediaItem.RequestMetadata الذي يتضمن إضافات غير فارغة بين وحدات التحكّم في الوسائط والجلسات.
    • أضِف دالة إنشاء إلى MediaLibrarySession.Builder تستخدم Context بدلاً من MediaLibraryService.
  • إضافة HLS:
    • تقليل HlsMediaPeriod إلى إذن الوصول الخاص بالحزمة. لا ينبغي الاعتماد على هذا النوع بشكل مباشر من خارج حزمة HLS.
    • يسعى الحلّ إلى بدء القسم بكفاءة أكبر (#1031).
  • إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
    • برنامج فك ترميز MIDI: تجاهل رسائل أحداث SysEx (#710).
  • أدوات مساعدة للاختبار:
    • عدم إيقاف التشغيل مؤقتًا بعد TestPlayerRunHelper.playUntilPosition ويبقي الاختبار التشغيل في حالة تشغيل، ولكنه يعلّق التقدم إلى أن يتمكن الاختبار من إضافة تأكيدات وإجراءات أخرى.
  • التطبيق التجريبي:
    • أضِف وحدة عرض توضيحي مختصر لعرض استخدام PreloadMediaSource مع حالة استخدام المحتوى القصير.

الإصدار 1.3.0-rc01

22 فبراير 2024

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

الإصدار 1.3.0-beta01

7 فبراير 2024

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

الإصدار 1.3.0-alpha01

15 يناير 2024

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

الإصدار 1.2.0

الإصدار 1.2.1

9 يناير 2024

  • ExoPlayer:
    • يجب حلّ المشكلة التي تؤدي فيها عمليات البحث اليدوي خارج نطاق LiveConfiguration.min/maxOffset إلى الاستمرار في تعديل الإزاحة مرة أخرى إلى min/maxOffset.
    • يجب حلّ المشكلة التي تشير إلى أنّ تنسيقات قنوات OPUS وVORBIS خاطئة لـ 3 و5 و6 و7 و8 قنوات (#8396).
    • يجب حلّ المشكلة التي تؤدي إلى صفر في خيارات المقطع الصوتي بعد البث المباشر والسماح ببدء البث من موضعه التلقائي (#9347).
    • أصلِح المشكلة المتمثلة في تلقّي مثيلات جديدة من CmcdData.Factory قيمًا سلبية لـ bufferedDurationUs من مصادر المقاطع، ما أدى إلى حدوث IllegalArgumentException (#888).
  • المحوِّل:
    • حاول حل مشكلة يتسبب فيها برنامج الترميز في وقت الإعداد بسبب ضبط معدل تشغيل مرتفع.
  • أدوات استخلاص البيانات:
    • ضَع علامة على مسارات HEVC الثانوية (غير القابلة للتشغيل) في الصور الحيّة بتنسيق JPEG على أنّها ROLE_FLAG_ALTERNATE لمنع اختيارها تلقائيًا للتشغيل بسبب ارتفاع درجة دقتها.
    • إصلاح الأخطاء في رصد الإطارات الرئيسية غير الصحيحة لأحداث بث TS H264 (#864)
    • إصلاح المدة المقدَّرة لأحداث البث المباشر التي تزيد مدتها عن 47721 ثانية (#855)
  • الصوت:
    • يمكنك إصلاح التعامل مع EOS لـ SilenceSkippingAudioProcessor عند استدعائها عدة مرات (#712).
  • الفيديو:
    • إضافة حل لمشكلة أحد الأجهزة على Galaxy Tab S7 FE و"Chromecast مع Google TV" وLenovo M10 FHD Plus، ما يؤدي إلى وضع علامة "غير متوافقة" على بث الفيديو بمعدل 60 لقطة في الثانية (#693).
  • البيانات الوصفية:
    • إصلاح الخطأ الذي أدّى إلى تعبئة MediaMetadata فقط من تعليقات Vorbis التي تستخدم مفاتيح الأحرف الكبيرة (#876)
    • يمكنك تسجيل OutOfMemoryError عند تحليل إطارات ID3 كبيرة جدًا، ما يعني أنّه يمكن مواصلة التشغيل بدون معلومات العلامة بدلاً من تعذُّر التشغيل بشكل كامل.
  • إدارة الحقوق الرقمية:
    • يمكنك تمديد الحل البديل لترخيص ClearKey https://default.url الزائف إلى عنوان URL لواجهة برمجة التطبيقات 33 أو الإصدارات الأحدث (كان الحل البديل ينطبق سابقًا على واجهة برمجة التطبيقات 33 فقط بالضبط) (#837).
    • يجب إصلاح الخطأ ERROR_DRM_SESSION_NOT_OPENED عند التبديل من المحتوى المشفّر إلى محو المحتوى بدون سطح مرتبط بالمشغّل. يرجع الخطأ إلى استخدام برنامج فك ترميز آمن بشكل غير صحيح لتشغيل المحتوى الواضح.
  • الجلسة:
    • يمكنك وضع المفاتيح والقيم المخصّصة في MediaMetadataCompat على MediaMetadata.extras وMediaMetadata.extras على MediaMetadataCompat (#756, #802).
    • إصلاح بث notifyChildrenChanged لوحدات التحكّم القديمة (#644).
    • إصلاح خطأ يؤدي فيه ضبط وقت سلبي للإيقاف المؤقت للإشعار setWhen إلى تعطُّل بعض الأجهزة (#903).
    • يمكنك إصلاح الخطأ IllegalStateException عندما لا تكتمل عملية ربط وحدة التحكّم في إشعارات الوسائط عند طلب التحديث الأول للإشعارات (#917).
  • واجهة المستخدم:
    • يمكنك حل المشكلة التي تؤدي إلى عدم ظهور زرَّي التقديم والترجيع عند استخدامهما مع "التصميم المتعدد الأبعاد" في BottomSheetDialogFragment (#511).
    • يجب حلّ مشكلة عدم محاذاة الأرقام في زر التقديم السريع على PlayerControlView (#547).
  • إضافة DASH:
    • يُرجى تحليل "f800" كعدد القنوات الذي يبلغ 5 قنوات Dolby في بيان DASH (#688).
  • إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
    • MIDI: يمكنك حلّ المشكلة التي تؤدي فيها التقديم إلى تخطّي أحداث تغيير البرنامج (#704).
    • نقل البيانات إلى الإصدار FFmpeg 6.0 وتحديث NDK المتوافقة إلى r26b (#707، #867)
  • إضافة Cast:
    • يجب تصحيح عملية إنشاء "Timeline" لكي لا يتم إيقاف التطبيق عند تحميل وسائط على جهاز البث (#708).

الإصدار 1.2.0

15 تشرين الثاني (نوفمبر) 2023

  • المكتبة المشتركة:
    • أضِف معلَمة @Nullable Throwable إلى الطرق في واجهة Log.Logger. لم تعد المعلَمة message بهذه الطرق تحتوي على أي معلومات عن Throwable التي تم ضبطها على طرق Log.{d,i,w,e}()، لذا يجب أن تُلحق عمليات التنفيذ هذه المعلومات يدويًا إذا لزم الأمر (ربما باستخدام Logger.appendThrowableString(String, Throwable)).
    • يجب حل مشكلة توافق Kotlin التي لا يتم فيها اكتشاف معلمات النوع العامة القابلة للقيم الفارغة وأنواع العناصر الصفيفة القابلة للقيم الفارغة. ومن الأمثلة على ذلك معلمتا الطريقة TrackSelectorResult وSimpleDecoder (#6792).
    • يمكنك تغيير واجهة المستخدم التلقائية وسلوك الإشعارات في Util.shouldShowPlayButton لعرض الزر "تشغيل" عندما يكون التشغيل مكتومًا مؤقتًا (مثلاً بسبب فقدان التركيز مؤقتًا على الصوت). ويمكن الحفاظ على السلوك القديم باستخدام PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) أو MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • يُرجى ترقية "androidx.annotation:annotation-experimental" إلى "1.3.1" لحلّ المشكلة https://issuetracker.google.com/251172715.
    • نقل ExoPlayer.setAudioAttributes إلى واجهة Player
  • ExoPlayer:
    • إصلاح مشاكل البحث عن المحتوى في أحداث بث AC4 الناتجة عن عدم تحديد نماذج فك الترميز فقط بشكل صحيح (#11000).
    • إضافة ميزة إيقاف التشغيل على أجهزة إخراج الصوت غير المناسبة (مثل مكبّر الصوت المدمج على أجهزة Wear OS) عند تفعيل هذه الميزة عبر ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput سيتم تعديل سبب إيقاف التشغيل باسم Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT إذا تمت محاولة التشغيل عند عدم توفّر مخرجات صوت مناسبة أو إذا انقطعت كل مصادر المخرجات الملائمة أثناء التشغيل. ستتم إزالة سبب الإيقاف عند توصيل ناتج مناسب.
    • يمكنك إضافة "MediaSource.canUpdateMediaItem" و"MediaSource.updateMediaItem" لقبول تعديلات "MediaItem" بعد الإنشاء من خلال "Player.replaceMediaItem(s)".
    • السماح بتحديث MediaItem لجميع صفوف MediaSource التي توفّرها المكتبة من خلال Player.replaceMediaItem(s) (#33، #9978)
    • إعادة تسمية "MimeTypes.TEXT_EXOPLAYER_CUES" إلى MimeTypes.APPLICATION_MEDIA3_CUES
    • يمكنك إضافة PngExtractor الذي يرسل ويقرأ ملف PNG بالكامل إلى TrackOutput كنموذج واحد.
    • يمكنك تحسين طريقة SequenceableLoader.continueLoading(long) في واجهة SequenceableLoader لتصبح SequenceableLoader.continueLoading(LoadingInfo loadingInfo). يحتوي LoadingInfo على معلَمات إضافية، من بينها playbackSpeed وlastRebufferRealtimeMs بالإضافة إلى playbackPositionUs الحالي.
    • يمكنك تحسين طريقة ChunkSource.getNextChunk(long, long, List, ChunkHolder) في واجهة ChunkSource لتصبح ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • أضِف حقولاً إضافية إلى تسجيل بيانات عميل الوسائط الشائعة (CMCD): المخزن المؤقت المجاعة (bs) والموعد النهائي (dl) ومعدل التشغيل (pr) وبدء التشغيل (su) (#8699).
    • أضِف عمق بت luma والكروما إلى ColorInfo (#491).
    • أضِف حقولاً إضافية إلى تسجيل بيانات عميل الوسائط الشائعة (CMCD): طلب الكائن التالي (nor) وطلب النطاق التالي (nrr) (#8699).
    • إضافة وظائف لنقل بيانات عميل الوسائط الشائعة (CMCD) باستخدام معلمات طلب البحث (#553).
    • إصلاح ConcurrentModificationException في ExperimentalBandwidthMeter (#612).
    • إضافة مَعلمة MediaPeriodId إلى CompositeMediaSource.getMediaTimeForChildMediaTime
    • يمكنك إتاحة ClippingMediaSource (والمصادر الأخرى التي تتضمّن إزاحات زمنية في الفترة أو الفترة) في ConcatenatingMediaSource2 (#11226).
    • يمكنك تغيير BaseRenderer.onStreamChanged() لتلقّي وسيطة MediaPeriodId أيضًا.
  • المحوِّل:
    • تحليل بيانات تدوير EXIF لإدخالات الصور
    • أزِل نوع التعليق التوضيحي TransformationRequest.HdrMode والثوابت المرتبطة به. استخدِم Composition.HdrMode والثوابت المرتبطة بها بدلاً من ذلك.
    • يمكنك تبسيط OverlaySettings لحلّ مشاكل عرض الإعلانات بالتناوب.
    • تم تغيير المعلمتين frameRate وdurationUs من SampleConsumer.queueInputBitmap إلى TimestampIterator.
  • اختيار المقطع الصوتي:
    • يمكنك إضافة DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness للسماح صراحةً بالتكيّف غير السلس أو عدم السماح به. وتظل القيمة التلقائية على سلوكها الحالي، وهو true.
  • أدوات استخلاص البيانات:
    • MPEG-TS: تأكد من عرض الإطار الأخير من خلال تمرير آخر وحدة وصول لبث إلى قائمة انتظار النماذج (#7909).
    • إصلاح الأخطاء الإملائية عند تحديد rotationDegrees. تم تغيير projectionPosePitch إلى projectionPoseRoll (#461).
    • أزِل الافتراض بأنّه يمكن فحص مثيلات Extractor مباشرةً باستخدام instanceof. إذا أردت الوصول إلى بيئة التشغيل إلى تفاصيل تنفيذ Extractor، عليك أولاً استدعاء Extractor.getUnderlyingInstance.
    • إضافة BmpExtractor
    • إضافة WebpExtractor
    • إضافة HeifExtractor
    • أضِف دعم QuickTime الكلاسيكي إلى Mp4Extractor.
  • الصوت:
    • يمكنك إضافة دعم لـ PCM كبيرة الحجم 24/32 بت في MP4 وMatroska، وتحليل ترميز PCM لـ lpcm في MP4.
    • يمكنك إضافة دعم لاستخراج صوت Vorbis بتنسيق MP4.
    • أضِف AudioSink.getFormatOffloadSupport(Format) الذي يسترجع مستوى توافق التفريغ الذي يمكن أن يوفره الحوض للتنسيق من خلال DefaultAudioOffloadSupportProvider. وتعرض قيمة AudioOffloadSupport الجديدة التي تحتوي على isFormatSupported وisGaplessSupported وisSpeedChangeSupported.
    • أضِف AudioSink.setOffloadMode() الذي يتم من خلاله ضبط إعدادات التفريغ في حوض الصوت. القيمة التلقائية هي AudioSink.OFFLOAD_MODE_DISABLED.
    • يمكن تفعيل نقل البيانات من خلال setAudioOffloadPreference في TrackSelectionParameters. في حال تفعيل الإعدادات المفضَّلة التي تم ضبطها، يتيح الجهاز نقل بيانات التنسيق مع ضبط المقطع الصوتي على مقطع صوتي واحد، سيتم تفعيل نقل الصوت.
    • في حال ضبط السمة audioOffloadModePreference على AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED، لن يختار DefaultTrackSelector مقطعًا صوتيًا إلا إذا كان تنسيق هذا المقطع الصوتي متوافقًا مع نقل البيانات. إذا لم يتم دعم أي مقطع صوتي عند إلغاء التحميل، لن يتم اختيار أي مقطع صوتي.
    • إيقاف إمكانية توفير البيانات بدون أي ثغرات عند الانتقال إلى مستوى ما قبل واجهة برمجة التطبيقات 33 بسبب مشكلة في موضع التشغيل بعد نقل المسار
    • إزالة المعلمة enableOffload من توقيع طريقة DefaultRenderersFactory.buildAudioSink.
    • إزالة الطريقة DefaultAudioSink.Builder.setOffloadMode
    • إزالة قيمة intdef DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
    • يمكنك إتاحة البيانات الوصفية بدون ثغرة في Opus أثناء تشغيل المحتوى الذي تمت إزالته.
    • يمكنك السماح باسترداد بيانات العارض من خلال إيقاف نقل البيانات في حال تعذُّر الكتابة في البداية (#627).
    • يمكنك تفعيل "جدولة إلغاء التحميل" تلقائيًا لتشغيل المحتوى الصوتي فقط بلا إنترنت.
    • يمكنك حذف ExoPlayer.experimentalSetOffloadSchedulingEnabled وAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • تمت إعادة تسمية "onExperimentalSleepingForOffloadChanged" باسم "onSleepingForOffloadChanged" و"onExperimentalOffloadedPlayback" ليصبح onOffloadedPlayback.
    • نقل واجهات TrackSelectionParameters وتعريفاتها المتعلقة بوضع إلغاء تحميل الصوت إلى فئة AudioOffloadPreferences داخلية
    • إضافة طلبات معاودة الاتصال onAudioTrackInitialized وonAudioTrackReleased إلى AnalyticsListener وAudioRendererEventListener و AudioSink.Listener.
    • يجب إصلاح مشكلة تدفق المخزن المؤقت للصوت لدى DTS Express (#650).
    • إصلاح خطأ يؤدي فيه التحقُّق من الإمكانيات عن E-AC3-JOC إلى عرض IllegalArgumentException (#677).
  • الفيديو:
    • يجب السماح لـ "MediaCodecVideoRenderer" باستخدام علامة VideoFrameProcessor.Factory مخصّصة.
    • يجب إصلاح الخطأ الذي أدّى إلى تعذّر عرض الإطار الأوّل إذا كان البث الصوتي يبدأ بطوابع زمنية سلبية (#291).
  • النص:
    • إزالة ExoplayerCuesDecoder يعالج TextRenderer الآن المقاطع الصوتية النصية التي تتضمّن sampleMimeType = application/x-media3-cues مباشرةً بدون الحاجة إلى مثيل SubtitleDecoder.
  • البيانات الوصفية:
    • لن يتم طلب MetadataDecoder.decode بعد الآن للنماذج "فك الترميز فقط" لأن عملية التنفيذ يجب أن تعرض قيمة فارغة على أي حال.
  • التأثير:
    • إضافة VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) لإدخال الصورة النقطية في "قائمة المحتوى التالي" حسب الطابع الزمني
    • غيِّر "VideoFrameProcessor.registerInputStream()" بحيث لا يؤدي إلى حظر الفيديو. يجب أن تنفّذ التطبيقات VideoFrameProcessor.Listener#onInputStreamRegistered().
    • تم تغيير المعلمتين frameRate وdurationUs من VideoFrameProcessor.queueInputBitmap إلى TimestampIterator.
  • إضافة إعلانات الوسائط التفاعلية:
    • إصلاح الخطأ الذي يؤدي فيه البث المباشر عبر DASH متعدد الفترات إلى استثناء هذَين العنصرَين (#571) في قائمة تشغيل
    • عليك رفع إصبعك عن StreamManager قبل الاتصال بـ AdsLoader.destroy().
    • ترقية إصدار حزمة تطوير البرامج لإعلانات الوسائط التفاعلية إلى الإصدار 3.31.0
  • الجلسة:
    • ضبط سلوك خدمة الإشعارات التي تعمل في المقدّمة على FOREGROUND_SERVICE_IMMEDIATE في DefaultMediaNotificationProvider (#167)
    • يُرجى استخدام android.media.session.MediaSession.setMediaButtonBroadcastReceiver() واجهة برمجة التطبيقات 31 أعلاه فقط لتجنُّب المشاكل المتعلّقة بإيقاف واجهة برمجة التطبيقات نهائيًا على أجهزة Samsung (#167).
    • استخدِم وحدة التحكّم بإشعارات الوسائط كخادم وكيل لضبط الأوامر المتاحة والتنسيق المخصّص المستخدَم لتعبئة الإشعارات وجلسة النظام الأساسي.
    • يمكنك تحويل أحداث أزرار الوسائط التي يتم تلقّيها من خلال "MediaSessionService.onStartCommand()" ضمن Media3 بدلاً من توجيهها إلى جلسة النظام الأساسي والعودة إلى Media3. من خلال ذلك، تكون "أداة التحكّم في المكالمات" هي دائمًا وحدة التحكّم في إشعارات الوسائط، ويمكن للتطبيقات التعرّف بسهولة على المكالمات الواردة من الإشعار بالطريقة نفسها على جميع مستويات واجهة برمجة التطبيقات المتوافقة.
    • إصلاح الخطأ الذي لا يتقدّم في إصدارات MediaController.getCurrentPosition() عند ربطه بجهاز MediaSessionCompat قديم.
    • يمكنك إضافة MediaLibrarySession.getSubscribedControllers(mediaId) لتسهيل الأمر.
    • يمكنك إلغاء MediaLibrarySession.Callback.onSubscribe() لتأكيد مدى توفّر المعرّف الرئيسي الذي تشترك فيه وحدة التحكّم. وفي حال نجاح الإجراء، سيتم قبول الاشتراك وسيتم استدعاء "notifyChildrenChanged()" على الفور لإعلام المتصفّح بذلك (#561).
    • أضِف وحدة العرض التوضيحي للجلسة لنظام التشغيل Automotive وفعِّل العرض التوضيحي للجلسة لنظام التشغيل Android Auto.
    • يُرجى عدم ضبط قائمة الانتظار لجلسة إطار العمل في حال عدم توفّر "COMMAND_GET_TIMELINE" لوحدة التحكّم في إشعارات الوسائط. عند استخدام ميزة Android Auto باعتبارها وحدة تحكم العميل التي تقرأ من جلسة إطار العمل، يؤدي ذلك إلى عدم عرض الزر "queue" في واجهة المستخدم الخاصة بتطبيق Android Auto (#339).
    • يمكنك استخدام DataSourceBitmapLoader تلقائيًا بدلاً من SimpleBitmapLoader (#271، #327).
    • يمكنك إضافة MediaSession.Callback.onMediaButtonEvent(Intent) الذي يسمح للتطبيقات بإلغاء المعالجة التلقائية لأحداث زر الوسائط.
  • واجهة المستخدم:
    • يمكنك إضافة طريقة تنفيذ Player.Listener لأجهزة Wear OS التي تعالج إيقاف التشغيل بسبب Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT، وذلك من خلال إطلاق مربّع حوار النظام للسماح للمستخدم بتوصيل جهاز الإخراج الصوتي المناسب (مثلاً، سمّاعات رأس بلوتوث). سيستأنف المستمع التشغيل تلقائيًا إذا تم توصيل جهاز مناسب خلال مهلة قابلة للتهيئة (تبلغ القيمة التلقائية 5 دقائق).
  • عمليات التنزيل:
    • تعريف نوع الخدمة التي تعمل في المقدّمة "مزامنة البيانات" لنظام DownloadService للتوافق مع الإصدار 14 من نظام التشغيل Android. عند استخدام هذه الخدمة، يحتاج التطبيق أيضًا إلى إضافة dataSync كـ foregroundServiceType في البيان وإضافة إذن FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • إضافة HLS:
    • أعِد تحميل قائمة التشغيل المباشر وفق بروتوكول HLS باستخدام فاصل زمني يتم احتسابه من وقت بدء التحميل الأخير بدلاً من وقت آخر عملية تحميل مكتملة (#663).
  • إضافة DASH:
    • السماح بمضاعفات معرّف DASH نفسه في عنوان URL لنموذج الشريحة.
    • إضافة دعم تجريبي لتحليل الترجمات أثناء الاستخراج. يتيح ذلك دمج الترجمات المتداخلة بشكل أفضل، بما في ذلك حلّ الوميض عند الانتقال بين مقاطع الترجمة. يمكنك تفعيل هذا الخيار باستخدام DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • إضافة RTSP:
    • يمكنك إصلاح حالة سباق قد تؤدي إلى IndexOutOfBoundsException عند الرجوع إلى بروتوكول التحكم بالنقل، أو تعليق التشغيل في بعض المواقف.
    • تحقَّق من الحالة في إعداد RTSP عند عرض حالة تحميل RtspMediaPeriod (#577).
    • تجاهُل طرق طلب Rtsp المخصّصة في العنوان العام لاستجابة الخيارات (#613).
    • ويمكنك استخدام قيمة مهلة استجابة إعداد RTSP في الفاصل الزمني لإرسال طلبات خيارات RTSP المستمرة (#662).
  • إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
    • إطلاق وحدة فك ترميز MIDI التي تتيح تشغيل ملفات MIDI العادية باستخدام مكتبة Jyn لتوليف الصوت
    • أضِف DecoderOutputBuffer.shouldBeSkipped لوضع علامة مباشرةً على الموارد الاحتياطية للمخرجات التي لا تحتاج إلى تقديمها. ويُفضَّل تحديد هذه القيمة على C.BUFFER_FLAG_DECODE_ONLY التي سيتم إيقافها نهائيًا.
    • أضِف Decoder.setOutputStartTimeUs وSimpleDecoder.isAtLeastOutputStartTimeUs للسماح لبرامج فك الترميز بإرسال نماذج لفك الترميز فقط قبل وقت البدء. من المفترض أن يتم اختيار "Buffer.isDecodeOnly" التي سيتم إيقافها نهائيًا.
    • إصلاح الخطأ في عنصر فك ترميز MIDI الذي تم نشره في مستودع Maven. تمت إعادة تسمية العناصر إلى media3-exoplayer-midi (#734).
  • إضافة Leanback:
    • أصلِح الخطأ الذي يؤدي فيه إيقاف سطح إلى حدوث ArithmeticException في رمز Leanback (#617).
  • أدوات مساعدة للاختبار:
    • اجعل TestExoPlayerBuilder وFakeClock متوافقَين مع اختبارات واجهة مستخدم Espresso واختبارات واجهة مستخدم Compose. يؤدي ذلك إلى إصلاح خطأ يتقدم التشغيل بشكل غير حاسم أثناء تفاعلات عرض Espresso أو Compose.
  • أزِل الرموز التي تم إيقافها نهائيًا:
    • إزالة TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) و TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). استخدِم السمة Composition.Builder.setHdrMode(int) ومرِّر Composition إلى Transformer.start(Composition, String) بدلاً من ذلك.
    • أزِل طريقة DownloadNotificationHelper.buildProgressNotification المتوقّفة نهائيًا، واستخدِم طريقة غير متوقفة تستخدم مَعلمة notMetRequirements بدلاً منها.

الإصدار 1.2.0-rc01

1 تشرين الثاني (نوفمبر) 2023

استخدام الإصدار الثابت 1.2.0

الإصدار 1.2.0-beta01

19 تشرين الأول (أكتوبر) 2023

استخدام الإصدار الثابت 1.2.0

الإصدار 1.2.0-alpha02

29 أيلول (سبتمبر) 2023

استخدام الإصدار الثابت 1.2.0

الإصدار 1.2.0-alpha01

17 آب (أغسطس) 2023

استخدام الإصدار الثابت 1.2.0

الإصدار 1.1.0

الإصدار 1.1.1

16 آب (أغسطس) 2023

  • المكتبة المشتركة:
    • أزِل تبعية multidex التي تمت إضافتها عن طريق الخطأ من جميع الوحدات (#499).
  • ExoPlayer:
    • يجب حل المشكلة في PlaybackStatsListener التي يتم فيها إنشاء PlaybackStats الزائف بعد محو قائمة التشغيل.
    • أضِف حقولاً إضافية إلى تسجيل بيانات عميل الوسائط الشائعة (CMCD): تنسيق البث (sf) ونوع البث (st) والإصدار (v) ومعدل نقل البيانات الأعلى (tb) ومدة العنصر (d) ومعدل نقل البيانات الذي يتم قياسه (mtp) ونوع العنصر (ot) (#8699).
  • الصوت:
    • إصلاح خطأ عدم انتقال Player.getState() إلى STATE_ENDED عند تشغيل ملفات قصيرة جدًا (#538).
  • نقل الصوت:
    • أضِف عنوان معرّف Ogg وصفحات رؤوس التعليق إلى البث المباشر لتشغيل المحتوى غير المتوفِّر وفقًا لمعيار RFC 7845.
  • الفيديو:
    • H.265/HEVC: إصلاح تحليل SPS لمعلومات الصورة المرجعية القصيرة والطويلة الأمد.
  • النص:
    • CEA-608: تغيير منطق اقتطاع الإشارة لمراعاة النص المرئي فقط كان يتم تضمين المسافة البادئة والإزاحة لعلامة التبويب في السابق عند تقييد طول الإشارة إلى 32 حرفًا (وهذا كان صحيحًا من الناحية الفنية من خلال المواصفات) (#11019).
  • إضافة إعلانات الوسائط التفاعلية:
    • ترقية إصدار حزمة تطوير البرامج لإعلانات الوسائط التفاعلية إلى الإصدار 3.30.3
  • الجلسة:
    • أضف تخطيطًا مخصصًا إلى حالة وحدة التحكم ووفر واجهة للوصول إليها. عند تغيير التنسيق المخصّص، يتم استدعاء MediaController.Listener.onCustomLayoutChanged. يمكن للتطبيقات التي تريد إرسال تنسيقات مخصّصة مختلفة إلى وحدة تحكّم مختلفة في Media3 إجراء ذلك في MediaSession.Callback.onConnect باستخدام AcceptedResultBuilder للتأكّد من توفُّر التنسيق المخصّص لوحدة التحكّم عند اكتمال الاتصال.
    • إصلاح الحالات التي أرسل فيها MediaLibraryServiceLegacyStub خطأً إلى Result لا يدعم ذلك، ما أدى إلى ظهور UnsupportedOperationException (#78).
    • عليك إصلاح طريقة إنشاء PlayerWrapper للسمة VolumeProviderCompat من خلال تحديد volumeControlType من خلال كل من الأمرَين القديمَين (COMMAND_ADJUST_DEVICE_VOLUME وCOMMAND_SET_DEVICE_VOLUME) والأوامر الجديدة (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS و COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).

الإصدار 1.1.0

5 تموز (يوليو) 2023

  • المكتبة المشتركة:
    • أضِف سببًا لإيقاف مسار الصوت غير الملائم، وشغِّل المحتوى عندما تكون جاهزًا، وغيّر سبب الإيقاف لفترة طويلة جدًا. (#15)
    • أضِف أوامر إلى "المشغّل":
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • يمكنك إضافة طرق لزيادة التحميل إلى المشغّل تسمح للمستخدمين بتحديد علامات معدل ارتفاع الصوت:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • إضافة Builder إلى DeviceInfo وإيقاف الدالة الإنشائية الحالية نهائيًا
    • يمكنك إضافة DeviceInfo.routingControllerId لتحديد معرّف وحدة التحكم في التوجيه لعمليات التشغيل عن بُعد.
    • أضِف Player.replaceMediaItem(s) كاختصار لإضافة العناصر وإزالتها في الموضع نفسه (#8046).
  • ExoPlayer:
    • يجب السماح لـ ExoPlayer بالتحكم في طرق مستوى صوت الجهاز فقط في حال الموافقة بشكل صريح. استخدِم ExoPlayer.Builder.setDeviceVolumeControlEnabled للوصول إلى:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) وsetDeviceVolume(int, int)
      • increaseDeviceVolume(int) وincreaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) وdecreaseDeviceVolume(int, int)
    • أضِف FilteringMediaSource الذي يسمح بفلترة أنواع الأغاني المتوفّرة من MediaSource.
    • توفير إمكانية تضمين بيانات عميل الوسائط الشائعة (CMCD) في الطلبات الصادرة لتنسيقات البث التكيُّفي DASH وHLS وSmoothStreaming تم دمج الحقول التالية، br وbl وcid وrtp وsid، (#8699). بنية واجهة برمجة التطبيقات وطرقها:
      • يكون تسجيل CMCD غير مفعَّل تلقائيًا، لذا استخدِم MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) لتفعيله.
      • تكون جميع المفاتيح مفعّلة تلقائيًا، ويمكنك إلغاء CmcdConfiguration.RequestConfig.isKeyAllowed(String key) لفلترة المفاتيح التي يتم تسجيلها.
      • يمكنك إلغاء CmcdConfiguration.RequestConfig.getCustomData() لتفعيل تسجيل المفتاح المخصّص.
    • أضِف إجراءً إضافيًا إلى بيان العرض التوضيحي الرئيسي لتسهيل بدء تطبيق العرض التوضيحي باستخدام ملف *.exolist.json مخصّص (#439).
    • أضِف ExoPlayer.setVideoEffects() عند استخدام Effect أثناء تشغيل الفيديو.
    • يجب تعديل SampleQueue لتخزين sourceId على أنّه long بدلاً من int. يؤدي هذا الإجراء إلى تغيير توقيعات الطريقتَين العامتَين SampleQueue.sourceId وSampleQueue.peekSourceId.
    • أضِف معلَمات إلى طريقتَي LoadControl shouldStartPlayback وonTracksSelected التي تسمح بربط هذه الطرق بـ MediaPeriod ذي الصلة.
    • يمكنك تغيير توقيع ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) من خلال إضافة مَعلمة مخطط زمني تحتوي على الفترات التي تتضمّن المُعرّفات الفريدة (UID) المستخدَمة كمفاتيح في الخريطة. وهذا الإجراء مطلوب لتجنُّب مشاكل التزامن مع أحداث البث المباشر المتعددة الفترات.
    • يمكنك إيقاف EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) و BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs) نهائيًا. ويمكن استدعاء الصيغ المختلفة للطرق بدون mediaTimeOffsetUs بدلاً من ذلك. يُرجى العلم أنّه حتى بالنسبة إلى خيارات المنتج المتوقّفة نهائيًا، لن تتم إضافة الإزاحة بعد الآن إلى startTimeUs وendTimeUs في كائنات MediaLoadData التي أرسلتها المُرسِل.
    • إعادة تسمية "ExoTrackSelection.blacklist" إلى "excludeTrack" و"isBlacklisted" إلى "isTrackExcluded"
    • يجب إصلاح السلوك غير المتسق بين ExoPlayer.setMediaItem(s) وaddMediaItem(s) عند استدعاء قائمة تشغيل فارغة.
  • المحوِّل:
    • إزالة Transformer.Builder.setMediaSourceFactory(MediaSource.Factory) استخدِم ExoPlayerAssetLoader.Factory(MediaSource.Factory) وTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory) بدلاً من ذلك.
    • إزالة Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
    • إصلاح الخطأ الذي قد يتوقّف فيه عملية التحويل (مما يؤدي إلى حدوث مهلة أكثر تشويقًا) إذا تمت الإشارة إلى انتهاء الفيديو المضمّن أثناء معالجة إطار الإدخال الذي كان في انتظار المعالجة
    • طلب البحث عن برامج الترميز من خلال MediaCodecList بدلاً من استخدام أدوات مساعدة findDecoder/EncoderForFormat لتوسيع نطاق الدعم
    • أزِل إعدادات الإطار B في DefaultEncoderFactory لأنّها لا تعمل على بعض الأجهزة.
  • اختيار المقطع الصوتي:
    • إضافة DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange تكون غير مفعّلة تلقائيًا عند تفعيل هذه السياسة، سيؤدي اختيار DefaultTrackSelector إلى اختيار قناة إصدار جديدة عند تغيُّر إمكانات العارض.
  • أدوات استخلاص البيانات:
    • 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 بعرض وارتفاع 0 في حال عدم توافق Player.getCurrentTracks مع الفيديو أو لم يتم بعد تحديد حجم الملف المدعوم.
  • إدارة الحقوق الرقمية:
    • تقليل ظهور العديد من الطرق الداخلية فقط على DefaultDrmSession والتي لا يُتوقع طلبها من خارج حزمة DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • صانع المحتوى:
    • أضِف مكتبة muxer جديدة يمكن استخدامها لإنشاء ملف حاوية MP4.
  • إضافة إعلانات الوسائط التفاعلية:
    • تفعيل أحداث البث المباشر المستندة إلى DASH متعددة الفترات باستخدام DAI يُرجى العِلم أنّ طريقة التنفيذ الحالية لا تتيح بعد التقديم في أحداث البث المباشر (#10912).
    • إصلاح خطأ يتمّ فيه إدراج مجموعة إعلانية جديدة في أحداث البث المباشر بسبب تفاوت موضع المحتوى المحسوب في المخططات الزمنية المتتالية بشكل طفيف.
  • الجلسة:
    • أضِف طريقة المساعدة MediaSession.getControllerForCurrentRequest للحصول على معلومات حول وحدة التحكّم التي تطلب حاليًا طريقة Player.
    • يمكنك إضافة androidx.media3.session.MediaButtonReceiver للسماح للتطبيقات باستئناف التشغيل مع أحداث أزرار الوسائط التي تم إرسالها من خلال سماعة رأس بلوتوث مثلاً (#167).
    • أضِف عملية التنفيذ التلقائية إلى MediaSession.Callback.onAddMediaItems للسماح بتمرير MediaItems المطلوب إلى Player إذا كانت تتضمّن LocalConfiguration (مثل معرّف الموارد المنتظم (URI)) (#282).
    • أضِف زرَّي الأمر "الانتقال إلى السابق" و "الانتقال إلى التالي" في عرض إشعارات الوسائط المكثّف تلقائيًا في نظام التشغيل Android 12 والإصدارات الأقدم (#410).
    • أضِف عملية التنفيذ التلقائية إلى MediaSession.Callback.onAddMediaItems للسماح بتمرير MediaItems المطلوب إلى Player إذا كانت تتضمّن LocalConfiguration (مثل معرّف الموارد المنتظم (URI)) (#282).
    • أضِف زرَّي الأمر "الانتقال إلى السابق" و "الانتقال إلى التالي" في عرض إشعارات الوسائط المكثّف تلقائيًا في نظام التشغيل Android 12 والإصدارات الأقدم (#410).
  • واجهة المستخدم:
    • أضف طريقتي الاستخدام shouldShowPlayButton وhandlePlayPauseButtonAction لكتابة عناصر واجهة المستخدم المخصصة باستخدام زر التشغيل/الإيقاف المؤقت.
  • إضافة RTSP:
    • بالنسبة إلى MPEG4-LATM، استخدِم القيمة التلقائية لمعرّف مستوى الملف الشخصي إذا لم تكن متوفّرة في وصف رسالة SDP للاستجابة (#302).
    • استخدِم معرّف الموارد المنتظم (URI) الأساسي لدقة المسار النسبي من جلسة بروتوكول RTSP إذا كان متوفرًا في عنوان الاستجابة DESCRIBE (#11160).
  • إضافة DASH:
    • يمكنك إزالة معادلة الوقت للوسائط من MediaLoadData.startTimeMs وMediaLoadData.endTimeMs لأحداث البث من خلال DASH متعدّدة الفترات.
    • إصلاح الخطأ الذي أدى إلى إنشاء IndexOutOfBoundsException (#10838) من خلال إعادة إعداد مصدر وسائط مباشر قائم على فترات متعددة
  • إضافة 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.
    • عليك إزالة ثوابت السلسلة التي تم إيقافها نهائيًا للأحرف (ASCII_NAME وUTF8_NAME وISO88591_NAME وUTF16_NAME وUTF16LE_NAME)، واستخدام مجموعات أحرف Kotlin من حزمة kotlin.text، أو java.nio.charset.StandardCharsets أو com.google.common.base.Charsets بدلاً من ذلك.
    • أزِل دالة الإنشاء WorkManagerScheduler المتوقّفة نهائيًا، واستخدِم دالة إنشاء غير متوقّفة نهائيًا تتضمن خيارًا لتوفير مَعلمة Context بدلاً من ذلك.
    • يجب إزالة الطرق التي تم إيقافها نهائيًا، مثل createVideoSampleFormat وcreateAudioSampleFormat وcreateContainerFormat وcreateSampleFormat، والتي تم استخدامها لإنشاء مثيل للفئة Format. بدلاً من ذلك، استخدِم Format.Builder لإنشاء مثيلات من Format.
    • يمكنك إزالة الطرق المتوقّفة نهائيًا copyWithMaxInputSize وcopyWithSubsampleOffsetUs وcopyWithLabel وcopyWithManifestFormatInfo وcopyWithGaplessInfo وcopyWithFrameRate وcopyWithDrmInitData وcopyWithMetadata وcopyWithBitrate وcopyWithVideoSize، واستخدام Format.buildUpon() وطرق الإعداد بدلاً من ذلك.
    • أزِل واجهة ExoPlayer.retry() المتوقّفة نهائيًا، واستخدِم prepare() بدلاً منها.
    • إزالة الدالة الإنشائية لنظام DefaultTrackSelector التي تم إيقافها نهائيًا بدون وسيطة، واستخدام DefaultTrackSelector(Context) بدلاً منها
    • إزالة الدالة الإنشائية OfflineLicenseHelper المتوقّفة نهائيًا، واستخدام OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher) بدلاً منها
    • أزِل الدالة الإنشائية DownloadManager المتوقّفة نهائيًا، واستخدِم الدالة الإنشائية التي تستخدِم السمة Executor بدلاً منها.
    • إزالة منصات إنشاء Cue المتوقّفة نهائيًا، واستخدام Cue.Builder بدلاً منها
    • إزالة الدالة الإنشائية OfflineLicenseHelper المتوقّفة نهائيًا، واستخدام OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher) بدلاً منها
    • أزِل أربع طُرق AnalyticsListener متوقّفة نهائيًا:
      • onDecoderEnabled، يمكنك استخدام onAudioEnabled و/أو onVideoEnabled بدلاً من ذلك.
      • onDecoderInitialized، يمكنك استخدام onAudioDecoderInitialized و/أو onVideoDecoderInitialized بدلاً من ذلك.
      • onDecoderInputFormatChanged، يمكنك استخدام onAudioInputFormatChanged و/أو onVideoInputFormatChanged بدلاً من ذلك.
      • onDecoderDisabled، يمكنك استخدام onAudioDisabled و/أو onVideoDisabled بدلاً من ذلك.
    • أزِل السمتَين Player.Listener.onSeekProcessed وAnalyticsListener.onSeekProcessed المتوقّفتَين نهائيًا، واستخدِم onPositionDiscontinuity مع DISCONTINUITY_REASON_SEEK بدلاً من ذلك.
    • يمكنك إزالة "ExoPlayer.setHandleWakeLock(boolean)" واستخدام "setWakeMode(int)" بدلاً من ذلك.
    • إزالة DefaultLoadControl.Builder.createDefaultLoadControl() المتوقّفة، واستخدام build() بدلاً من ذلك
    • أزِل واجهة MediaItem.PlaybackProperties المتوقّفة نهائيًا، واستخدِم MediaItem.LocalConfiguration بدلاً منها. تم إيقاف الحقل MediaItem.playbackProperties وأصبح الآن من النوع MediaItem.LocalConfiguration.

الإصدار 1.1.0-rc01

‫21 حزيران (يونيو) 2023

استخدام الإصدار الثابت 1.1.0

الإصدار 1.1.0-beta01

7 حزيران (يونيو) 2023

استخدام الإصدار الثابت 1.1.0

الإصدار 1.1.0-alpha01

10 أيار (مايو) 2023

استخدام الإصدار الثابت 1.1.0

الإصدار 1.0.0

الإصدار 1.0.2

18 أيار (مايو) 2023

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

يتوافق هذا الإصدار مع إصدار ExoPlayer 2.18.7.

يتضمّن هذا الإصدار التغييرات التالية منذ الإصدار 1.0.1:

  • المكتبة الأساسية:
    • أضِف السمة Buffer.isLastSample() التي تشير إلى ما إذا كانت السمة Buffer تتضمّن علامة C.BUFFER_FLAG_LAST_SAMPLE.
    • يجب حلّ المشكلة التي قد تؤدي إلى عدم عرض آخر إطار إذا تم إلغاء ضبط آخر عيّنة تحتوي على إطارات في قائمة المحتوى التالي بدون قراءة عيّنة "نهاية البث". (#11079).
  • أدوات استخلاص البيانات:
    • إصلاح تحليل H.265 SPS في ملفات MPEG-TS عن طريق إعادة استخدام منطق التحليل الذي تستخدمه بالفعل أدوات استخراج ملفات RTSP وMP4 (#303).
  • النص:
    • SSA: إتاحة استخدام ملفات UTF-16 إذا كانت تبدأ بعلامة ترتيب بايت (#319).
  • الجلسة:
    • يجب حلّ المشكلة المتعلّقة بعدم تعديل "MediaController" للأوامر المتاحة عند ربطه بنظام MediaSessionCompat قديم يعدِّل الإجراءات.
    • يجب إصلاح خطأ منع MediaLibraryService من عرض قيمة خالية لاستدعاء من واجهة مستخدم النظام إلى Callback.onGetLibraryRoot باستخدام params.isRecent == true على واجهة برمجة التطبيقات 30 (#355).
    • إصلاح تسرّب الذاكرة في MediaSessionService أو MediaLibraryService (#346)
    • إصلاح خطأ قد يؤدي فيه تعديل مجمّع للسمة Timeline والموضع في MediaSession إلى طرح MediaController IllegalStateException.

الإصدار 1.0.1

18 نيسان (أبريل) 2023

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

ويتوافق هذا الإصدار مع إصدار ExoPlayer 2.18.6.

  • المكتبة الأساسية:
    • إعادة ضبط تجاهل البث المباشر المستهدَف عند التقديم على الوضع التلقائي (#11051)
    • إصلاح الخطأ الذي قد يؤدي فيه إلى توقُّف تشغيل النماذج الفارغة في الوسائط
  • الجلسة:
    • إصلاح الخطأ الذي يؤدي فيه العديد من العناصر المتطابقة في قائمة الانتظار والتي تم نشرها بواسطة عنصر MediaSessionCompat قديم إلى استثناء في MediaController (#290).
    • أضِف ميزة إعادة التوجيه MediaSession.broadcastCustomCommand المفقودة إلى MediaControllerCompat.Callback.onSessionEvent القديمة (#293).
    • إصلاح الخطأ الذي لا يؤدي فيه طلب "MediaSession.setPlayer" إلى تعديل الطلبات المتاحة
    • يجب حلّ مشكلة تجاهل مثيلات TrackSelectionOverride المُرسَلة من "MediaController" في حال الإشارة إلى مجموعة تحتوي على Format.metadata (#296).
    • يجب حلّ المشكلة التي تتطلّب إتاحة Player.COMMAND_GET_CURRENT_MEDIA_ITEM للوصول إلى البيانات الوصفية من خلال الإصدار القديم من MediaSessionCompat.
    • يجب حلّ المشكلة التي تؤدي فيها مثيلات MediaSession في سلسلة محادثات في الخلفية إلى حدوث أعطال عند استخدامها في MediaSessionService (#318).
    • إصلاح المشكلة التي أفصحت فيها المكتبة عن مستقبل زر الوسائط بدون أن يقصد التطبيق ذلك (#314)
  • DASH:
    • إصلاح معالجة المخططات الزمنية للشرائح الفارغة (#11014).
  • بروتوكول RTSP:
    • أعِد المحاولة باستخدام بروتوكول TCP في حال تعذُّر إعداد RTSP باستخدام بروتوكول UDP مع ظهور خطأ RTSP 461 supportedTransport (#11069).

الإصدار 1.0.0

22 آذار (مارس) 2023

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

ويتوافق هذا الإصدار مع إصدار ExoPlayer 2.18.5.

لا توجد تغييرات منذ 1.0.0-rc02.

الإصدار 1.0.0-rc02

2 آذار (مارس) 2023

تم طرح androidx.media3:media3-*:1.0.0-rc02. يحتوي الإصدار 1.0.0-rc02 على هذه عمليات التنفيذ.

ويتوافق هذا الإصدار مع إصدار ExoPlayer 2.18.4.

  • المكتبة الأساسية:
    • إصلاح رصد نوع الشبكة على واجهة برمجة التطبيقات 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:
    • رصد الخطأ LEGALArgumentException الذي تم عرضه أثناء تحليل بروتوكول RTSP غير صالح وصف رسائل الاستجابة (#10971).
  • الجلسة:
    • إصلاح خطأ عدم تحديث زر تشغيل/إيقاف الإشعارات حسب حالة المشغّل (#192)
  • إضافة إعلانات الوسائط التفاعلية:
    • أصلِح خطأ منع بدء بث 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) عند تحليل ذرات البيانات.
    • يمكنك تخطّي العيّنات بشكل صحيح عند التقديم مباشرةً إلى إطار مزامنة في fMP4 (#10941).
  • الصوت:
    • استخدِم معدل نقل البيانات لتنسيق الصوت المضغوط لاحتساب الحد الأدنى لحجم المخزن المؤقت لـ AudioTrack في عمليات التشغيل المباشرة (المرور).
  • النص:
    • يجب حل مشكلة تمرير TextRenderer فهرسًا (سلبيًا) غير صالح إلى Subtitle.getEventTime إذا كان ملف الترجمة والشرح لا يحتوي على أي إشارات.
    • SubRip: يمكنك إتاحة استخدام ملفات UTF-16 إذا كانت تبدأ بعلامة ترتيب بايت.
  • البيانات الوصفية:
    • تحليل القيم المتعدّدة المفصولة فارغًا من إطارات ID3، على النحو المسموح به في الإصدار 2.4 من ID3.
    • أضِف MediaMetadata.mediaType للإشارة إلى نوع المحتوى أو نوع المجلد الموصوف في البيانات الوصفية.
    • إضافة MediaMetadata.isBrowsable كبديل لـ MediaMetadata.folderType وسيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
  • DASH:
    • يمكنك إضافة تحليل كامل لمجموعات تعديل الصور، بما في ذلك أعداد المربّعات (#3752).
  • واجهة المستخدم:
    • يجب حلّ المشاكل المتعلّقة بالإيقاف النهائي PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) لضمان نقل التغييرات في إذن الوصول إلى المستمع المسجَّل (#229).
    • يجب إصلاح ترتيب عناصر التحكم في المشغّل الأوسط في PlayerView عند استخدام تنسيق من اليمين إلى اليسار (RTL) (#227).
  • الجلسة:
    • أضِف ملخّص SimpleBasePlayer للمساعدة في تنفيذ واجهة Player للمشغّلات المخصّصة.
    • يمكنك إضافة طريقة مساعدة لتحويل الرمز المميّز لجلسة النظام الأساسي إلى Media3 SessionToken (#171).
    • استخدِم onMediaMetadataChanged لتشغيل تحديثات جلسة وسائط النظام الأساسي (#219).
    • أضِف جلسة الوسائط كوسيطة في getMediaButtons() للسمة DefaultMediaNotificationProvider واستخدِم القوائم غير القابلة للتغيير للإيضاح (#216).
    • يمكنك إضافة أداة معالجة معاودة الاتصال عبر onSetMediaItems لتوفير وسائل تعديل وضبط قائمة MediaItem، وبدء الفهرس وموضعه حسب الجلسة قبل ضبط المشغّل (#156).
    • تجنَّب اكتشاف النقر مرّتين لأحداث أزرار الوسائط التي لا تستخدم بلوتوث (#233).
    • اجعل QueueTimeline أكثر قوة في حال حالة جلسة قديمة مظللة (#241).
  • البيانات الوصفية:
    • تحليل القيم المتعدّدة المفصولة فارغًا من إطارات ID3، على النحو المسموح به في الإصدار 2.4 من ID3.
    • أضِف MediaMetadata.mediaType للإشارة إلى نوع المحتوى أو نوع المجلد الموصوف في البيانات الوصفية.
    • إضافة MediaMetadata.isBrowsable كبديل لـ MediaMetadata.folderType وسيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
  • إضافة البثّ:
    • نقل إصدار حزمة تطوير البرامج (SDK) لجهاز Google Cast إلى الإصدار 21.2.0
  • إضافة إعلانات الوسائط التفاعلية:
    • يمكنك إزالة مستمع المشغّل إلى ImaServerSideAdInsertionMediaSource في سلسلة محادثات التطبيق لتجنُّب مشاكل سلاسل المحادثات.
    • يمكنك إضافة السمة focusSkipButtonWhenAvailable إلى ImaServerSideAdInsertionMediaSource.AdsLoader.Builder لطلب التركيز على زر التخطّي على أجهزة التلفزيون وضبطه على "صحيح" تلقائيًا.
    • أضِف طريقة focusSkipButton() إلى ImaServerSideAdInsertionMediaSource.AdsLoader لطلب التركيز على زر التخطّي آليًا.
    • ترقية إصدار حزمة تطوير البرامج لإعلانات الوسائط التفاعلية إلى الإصدار 3.29.0
  • التطبيق التجريبي:
    • طلب إذن إرسال الإشعارات لإشعارات التنزيل في وقت التشغيل (#10884)

الإصدار 1.0.0-beta03

22 تشرين الثاني (نوفمبر) 2022

تم طرح androidx.media3:media3-*:1.0.0-beta03. يحتوي الإصدار 1.0.0-beta03 على عمليات التنفيذ هذه.

ويتوافق هذا الإصدار مع إصدار ExoPlayer 2.18.2.

  • المكتبة الأساسية:
    • يمكنك إضافة ExoPlayer.isTunnelingEnabled للتحقق مما إذا كان الاتصال النفقي مفعّلاً للمسارات المحدَّدة حاليًا (#2518).
    • إضافة WrappingMediaSource لتبسيط التفاف MediaSource واحدة (#7279).
    • تجاهل المخزن المؤقت قبل توقف التشغيل بسبب نقص الذاكرة المتاحة.
    • إغلاق كتلة التتبع "doSomeWork" عند تفعيل التحميل.
    • يمكنك إصلاح مشكلة تتبُّع الجلسات باستخدام ميزة التقديم السريع في PlaybackStatsListener (#180).
    • إرسال رسالة معاودة الاتصال من onMediaItemTransition عند طلب seekToNext أو seekToPrevious في قائمة تشغيل تتضمن عنصرًا واحدًا (#10667).
    • أضِف Player.getSurfaceSize التي تعرض حجم السطح الذي يتم عرض الفيديو عليه.
    • إصلاح الخطأ الذي قد تؤدي فيه إزالة المستمعين أثناء إصدار المُشغِّل إلى IllegalStateException (#10758).
  • الإصدار:
    • يمكنك فرض قيمة الحد الأدنى compileSdkVersion لتجنُّب أخطاء التجميع (#10684).
    • تجنَّب كتلة النشر عند تضمينها في إصدار Gradle آخر.
  • اختيار المقطع الصوتي:
    • تفضيل المسارات الأخرى لاستخدام Dolby Vision إذا كان العرض لا يتيح ذلك. (#8944)
  • عمليات التنزيل:
    • إصلاح حلقة لا نهائية محتملة في ProgressiveDownloader ناتجة عن التنزيل والتشغيل المتزامنين باستخدام PriorityTaskManager نفسها (#10570).
    • جعل إشعار التنزيل يظهر على الفور (#183)
    • قصر عمليات إزالة التنزيل المتوازية على 1 لتجنُّب إنشاء سلاسل محادثات زائدة (#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) لتحديد ما إذا كان العارض سيخرج البيانات الوصفية في وقت مبكر أو بالتزامن مع موضع المشغّل.
  • إدارة الحقوق الرقمية:
    • يجب معالجة خطأ في تنفيذ KeyKey في نظام التشغيل Android 13 الذي يعرض عنوان URL للترخيص غير فارغ ولكنه غير صالح.
    • إصلاح الخطأ setMediaDrmSession failed: session not opened عند التبديل بين أنظمة إدارة الحقوق الرقمية (DRM) في قائمة تشغيل (على سبيل المثال، من Widevine إلىClearKey)
  • النص:
    • CEA-608: تأكَّد من التعامل مع أوامر تبديل الخدمة في الحقل 2 بشكل صحيح (#10666).
  • DASH:
    • تحليل EventStream.presentationTimeOffset من البيانات (#10460).
  • واجهة المستخدم:
    • يمكنك استخدام إجراءات الإلغاء الحالية للمشغّل كما تم إعدادها مسبقًا في TrackSelectionDialogBuilder (#10429).
  • الجلسة:
    • تأكَّد من تنفيذ الأوامر دائمًا بالترتيب الصحيح حتى إذا كان بعضها يتطلب دقة غير متزامنة (#85).
    • أضِف DefaultMediaNotificationProvider.Builder لإنشاء DefaultMediaNotificationProvider مثيل. يمكن لأداة الإنشاء ضبط معرّف الإشعار ومعرّف قناة الإشعارات واسم قناة الإشعارات التي يستخدمها الموفِّر. يمكنك أيضًا إضافة طريقة DefaultMediaNotificationProvider.setSmallIcon(int) لضبط رمز صغير للإشعارات. (#104)
    • تأكَّد من عدم تجاهل الأوامر المُرسَلة قبل MediaController.release() (#99).
    • بإمكان SimpleBitmapLoader تحميل صورة نقطية من معرّفات الموارد المنتظمة (URI) لـ file:// (#108).
    • إصلاح التأكيد الذي يمنع MediaController من تقديم طلب خلال فترة زمنية (#122).
    • عند انتهاء التشغيل، يتم إيقاف MediaSessionService من المقدّمة ويتم عرض إشعار لإعادة تشغيل آخر عنصر وسائط تم تشغيله (#112).
    • عدم بدء خدمة تعمل في المقدّمة وتتضمن طلبًا في انتظار المراجعة للإيقاف المؤقت (#167).
    • إخفاء "الشارة" المرتبطة بالإشعار الذي تم إنشاؤه من قِبل "DefaultNotificationProvider" يدويًا على واجهة برمجة التطبيقات 26 وواجهة برمجة التطبيقات 27 (يتم إخفاء الشارة تلقائيًا على الإصدار 28 من واجهة برمجة التطبيقات والإصدارات الأحدث) (#131).
    • إصلاح الخطأ الذي يتسبب فيه اتصال المثبت الثاني من MediaSession القديمة إلى Media3 MediaController ويتسبب في UnknownStateExceptions (#49).
  • بروتوكول RTSP:
    • يمكنك إضافة طريقة معالجة حِزم H263 المجزّأة (#119).
    • يمكنك إضافة إمكانية استخدام MP4A-LATM (#162).
  • إعلانات الوسائط التفاعلية:
    • أضِف مهلة لتحميل معلومات الإعلان لمعالجة الحالات التي تتعطّل فيها حزمة تطوير البرامج لإعلانات الوسائط التفاعلية (#10510).
    • عدم تخطّي الإعلانات أثناء التشغيل عند التقديم/الترجيع إلى نهاية المحتوى (#10685)
    • احتسب المدة الزمنية بشكل صحيح لأحداث البث المباشر التي تتضمّن إعلانات مدرَجة من جهة الخادم، مثل إدراج إعلان ديناميكي لإعلانات الوسائط التفاعلية (#10764).
  • إضافة FFmpeg:
    • أضِف العلامات المطلوبة حديثًا لربط مكتبات FFmpeg بالإصدار 23.1.7779620 والإصدارات الأحدث (#9933).
  • إضافة AV1:
    • يجب تحديث إصدار CMake لتجنُّب حالات عدم التوافق مع أحدث إصدارات "استوديو Android" (#9933).
  • إضافة البثّ:
    • نفِّذ getDeviceInfo() لتتمكَّن من تحديد CastPlayer عند التحكّم في التشغيل باستخدام MediaController (#142).
  • المحوِّل:
    • يمكنك إضافة موقّت مراقب النظام الشامل لاكتشاف ما إذا كان إنشاء عينة إخراج بطيء جدًا.
  • أزِل الرموز التي تم إيقافها نهائيًا:
    • إزالة Transformer.Builder.setOutputMimeType(String) تمت إزالة هذه الميزة. وسيكون نوع MIME دائمًا بتنسيق MP4 عند استخدام المُخرِج التلقائي.

الإصدار 1.0.0-beta02

21 تموز (يوليو) 2022

تم طرح androidx.media3:media3-*:1.0.0-beta02. يحتوي الإصدار 1.0.0-beta02 على عمليات التنفيذ هذه.

ويتوافق هذا الإصدار مع إصدار ExoPlayer 2.18.1.

  • المكتبة الأساسية:
    • احرص على أن يؤدي تغيير ShuffleOrder باستخدام ExoPlayer.setShuffleOrder إلى طلب الرقم Player.Listener#onTimelineChanged باستخدام reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • بالنسبة إلى الوسائط التقدّمية، يمكنك تضمين المقاطع الصوتية المحدَّدة فقط في موضع التخزين المؤقت (#10361).
    • السماح ببرنامج المسجّل المخصص لجميع مخرجات سجل ExoPlayer (#9752).
    • إصلاح تنفيذ setDataSourceFactory في DefaultMediaSourceFactory، والذي كان لا يعمل في بعض الحالات (#116).
  • أدوات استخلاص البيانات:
    • إصلاح تحليل مجموعات الصور المرجعية القصيرة المدى H265 (#10316).
    • إصلاح تحليل معدّلات نقل البيانات من esds مربّع (#10381)
  • DASH:
    • تحليل عنوان URL لترخيص FreeKey من البيانات (#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 توجيه أحداث التشغيل وبيانات الأداء إلى النظام الأساسي، ما يساعد في توفير معلومات عن أداء النظام وتصحيح الأخطاء على الجهاز. ويمكن أن تجمع 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 على تنسيقات الصوت الاستيريو/الأحادية على تنسيقات الصوت المتعددة القنوات، إلا إذا كان من الممكن تحديد موضعها (الإصدار 12L والإصدارات الأحدث من Android) أو إذا كان تنسيق الصوت المحيطي Dolby. بالإضافة إلى ذلك، على الأجهزة التي تتيح تحديد مكاني الصوت، سيرصد DefaultTrackSelector التغيُّرات في خصائص المحدِّد المكاني وسيتم اختيار مقطع صوتي جديد بناءً عليها. يتم استبعاد الأجهزة التي تتضمّن television وضع واجهة المستخدم من هذه القيود، ويُفضّل استخدام التنسيق الذي يتضمّن أكبر عدد من القنوات. لتفعيل هذه الميزة، يجب إنشاء المثيل DefaultTrackSelector باستخدام Context.
  • الفيديو:
    • إعادة تسمية "DummySurface" إلى "PlaceholderSurface"
    • يمكنك إضافة دعم AV1 إلى MediaCodecVideoRenderer.getCodecMaxInputSize.
  • الصوت:
    • استخدام برنامج فك ترميز الصوت LG AC3 الذي يروّج لنوع MIME غير عادي
    • تغيير نوع إرجاع AudioAttributes.getAudioAttributesV21() من android.media.AudioAttributes إلى فئة برامج تضمين AudioAttributesV21 جديدة لتجنّب بطء التحقق من خلال ART على واجهة برمجة التطبيقات < 21
    • يمكنك إرسال طلب بحث إلى النظام الأساسي (واجهة برمجة التطبيقات 29+ ) أو افتراض عدد قنوات ترميز الصوت لانتقال الصوت عند عدم ضبط عدد القنوات الصوتية بالتنسيق، وهو ما يحدث عند إجراء الإعداد المقسّم باستخدام بروتوكول HLS (10204).
    • ضبط AudioTrack مع قناع القناة AudioFormat.CHANNEL_OUT_7POINT1POINT4 إذا أخرجت أداة فك الترميز صوت PCM بقيمة 12 قناة (#10322
  • إدارة الحقوق الرقمية
    • التأكّد دائمًا من تعديل جلسة إدارة الحقوق الرقمية بشكل صحيح عند التقديم/الترجيع مباشرةً بعد تغيير التنسيق (10274)
  • النص:
    • يمكنك تغيير Player.getCurrentCues() لعرض CueGroup بدلاً من List<Cue>.
    • SSA: إتاحة إعداد النمط OutlineColour عند ضبط BorderStyle == 3 (أي ضبط OutlineColour على خلفية الإشارة) (#8435).
    • CEA-708: تحليل البيانات إلى مجموعات خدمات متعددة وتجاهل المجموعات غير المرتبطة برقم الخدمة المحدد حاليًا.
    • إزالة RawCcExtractor الذي تم استخدامه فقط للتعامل مع تنسيق الترجمة داخليًا من Google.
  • أدوات استخلاص البيانات:
    • يمكنك إضافة دعم لـ 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 الأحادية القناة وغير التبادلية. حمولة AMR RTP المركّبة غير متوافقة. (#46)
    • أضِف قارئ RTP لـ VP8 (#47).
    • أضِف قارئ RTP لـ WAV (#56).
    • إصلاح عنوان التفويض الأساسي لـ RTSP. (#9544)
    • توقف عن التحقق من حقول SDP الإلزامية نظرًا لأن ExoPlayer لا يحتاجها (#10049).
    • عرض الاستثناء المحدد عند تحليل توقيت RTSP (#10165).
    • يمكنك إضافة قارئ بروتوكول النقل في الوقت الفعلي (RTP) لـ VP9 (#47).
    • أضِف قارئ RTP لتطبيق OPUS (#53).
  • مصادر البيانات:
    • إعادة تسمية "DummyDataSource" إلى "PlaceholderDataSource"
    • يمكنك حل المشكلة من خلال معالجة مقاطعة OkHttp.
  • الجلسة:
    • استبدِل MediaSession.MediaItemFiller بـ MediaSession.Callback.onAddMediaItems للسماح بالحل غير المتزامن للطلبات.
    • يمكنك استخدام طرق setMediaItems(s) عند اتصال MediaController بجلسة وسائط قديمة.
    • إزالة MediaController.setMediaUri وMediaSession.Callback.onSetMediaUri يمكن تنفيذ الوظيفة نفسها باستخدام MediaController.setMediaItem وMediaSession.Callback.onAddMediaItems.
    • يمكنك إعادة توجيه مكالمات MediaController القديمة لتشغيل الوسائط إلى "MediaSession.Callback.onAddMediaItems" بدلاً من "onSetMediaUri".
    • يمكنك إضافة MediaNotification.Provider وDefaultMediaNotificationProvider لتخصيص الإشعار.
    • أضِف BitmapLoader وSimpleBitmapLoader لتنزيل صور الأعمال الفنية.
    • أضِف MediaSession.setCustomLayout() للتوافق مع الأنظمة القديمة مع الجلسة القديمة.
    • أضِف MediaSession.setSessionExtras() لتحقيق التكافؤ بين الميزات في الجلسة القديمة.
    • إعادة تسمية "MediaSession.MediaSessionCallback" إلى "MediaSession.Callback" و"MediaLibrarySession.MediaLibrarySessionCallback" إلى "MediaLibrarySession.Callback" و"MediaSession.Builder.setSessionCallback" إلى "setCallback".
    • إصلاح NPE في MediaControllerImplLegacy (#59).
    • عدِّل معلومات موضع الجلسة عند تغيير المخطط الزمني(#51).
    • إصلاح NPE في MediaControllerImplBase بعد إطلاق وحدة التحكّم (#74).
  • تشغيل الإعلان / إعلانات الوسائط التفاعلية:
    • عليك تقليل معدّل استطلاع الإعلانات من كل 100 ملي ثانية إلى كل 200 ملي ثانية، للتوافق مع اقتراحات مجلس تقييم الوسائط (MRC).
  • إضافة FFmpeg:
    • يجب تحديث إصدار CMake إلى 3.21.0+ لتجنُّب حدوث خطأ CMake يتسبَّب في تعذُّر مزامنة Gradle في Android Studio (#9933).
  • أزِل الرموز التي تم إيقافها نهائيًا:
    • إزالة Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray) استخدِم Player.Listener.onTracksChanged(Tracks) بدلاً من ذلك.
    • إزالة Player.getCurrentTrackGroups وPlayer.getCurrentTrackSelections استخدِم Player.getCurrentTracks بدلاً من ذلك. يمكنك أيضًا مواصلة استخدام ExoPlayer.getCurrentTrackGroups وExoPlayer.getCurrentTrackSelections، مع العلم أنّ هاتَين الطريقتَين ستظلا متوقفتَين.
    • إزالة DownloadHelper DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT وDEFAULT_TRACK_SELECTOR_PARAMETERS ثابتَين استخدِم السمة getDefaultTrackSelectorParameters(Context) بدلاً منها إن أمكن و DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT بدلاً من ذلك.
    • إزالة الدالة الإنشائية DefaultTrackSelector(ExoTrackSelection.Factory) يمكنك استخدام DefaultTrackSelector(Context, ExoTrackSelection.Factory) كبديل.
    • إزالة Transformer.Builder.setContext ويجب تمرير Context إلى الدالة الإنشائية Transformer.Builder بدلاً من ذلك.

الإصدار 1.0.0-alpha03

14 آذار (مارس) 2022

تم طرح androidx.media3:media3-*:1.0.0-alpha03. يحتوي الإصدار 1.0.0-alpha03 على هذه عمليات التنفيذ.

ويتوافق هذا مع إصدار ExoPlayer 2.17.1.

  • الصوت:
    • إصلاح خطأ أثناء التحقّق من إمكانات الصوت في Dolby Atmos (E-AC3-JOC) في HLS
  • أدوات استخلاص البيانات:
    • FMP4: حل مشكلة إمكانية إخراج البيانات الوصفية لعيّنة الرسالة الإلكترونية بترتيب غير صحيح لأحداث البث التي تحتوي على ذرات الرسالة الإلكترونية v0 وv1 (#9996).
  • النص:
    • يجب إصلاح التفاعل بين SingleSampleMediaSource.Factory.setTrackId وMediaItem.SubtitleConfiguration.Builder.setId لمنح الأولوية للحقل SubtitleConfiguration والرجوع إلى القيمة Factory إذا لم يتم ضبطها (#10016).
  • تشغيل الإعلان:
    • حلّ مشكلة انخفاض عدد المقاطع الصوتية بين فترات الإعلان في أحداث البث المباشر المستندة إلى HLS SSAI

الإصدار 1.0.0-alpha02

2 آذار (مارس) 2022

تم طرح androidx.media3:media3-*:1.0.0-alpha02. يحتوي الإصدار 1.0.0-alpha02 على عمليات التنفيذ هذه.

ويتوافق هذا مع إصدار ExoPlayer 2.17.0.

  • المكتبة الأساسية:
    • أضِف طريقة محمية DefaultRenderersFactory.getCodecAdapterFactory() حتى تتمكّن الفئات الفرعية من DefaultRenderersFactory التي تلغي buildVideoRenderers() أو buildAudioRenderers() من الوصول إلى مصنع محوّل الترميز وتمريرها إلى MediaCodecRenderer مثيلات التي تم إنشاؤها.
    • انشر حقلي العنوان ICY name وgenre في MediaMetadata.station وMediaMetadata.genre على التوالي حتى يتمكنوا من الوصول إلى التطبيق من خلال Player.Listener.onMediaMetadataChanged() (#9677).
    • يمكنك إزالة المفاتيح الفارغة من DefaultHttpDataSource#getResponseHeaders.
    • السكون وإعادة المحاولة عند تعذُّر إنشاء مثيل MediaCodec. ويعمل ذلك على حل مشكلة تحدث على بعض الأجهزة عند تبديل سطح من برنامج ترميز آمن إلى برنامج ترميز آخر (#8696).
    • أضِف MediaCodecAdapter.getMetrics() للسماح للمستخدمين بالحصول على بيانات المقاييس من MediaCodec. (#9766).
    • إصلاح دقة تبعية Maven (#8353).
    • أوقِف التعديل التلقائي للسرعة في أحداث البث المباشر التي لا تتضمّن ميزات وقت الاستجابة المنخفض أو لا يطلب المستخدم ضبط السرعة (#9329).
    • إعادة تسمية "DecoderCounters#inputBufferCount" إلى "queuedInputBufferCount"
    • جعل SimpleExoPlayer.renderers خاصًا. يمكن الوصول إلى العارضين من خلال ExoPlayer.getRenderer.
    • تم تعديل بعض قيم AnalyticsListener.EventFlags الثابتة لمطابقة القيم في Player.EventFlags.
    • قسِّم AnalyticsCollector إلى واجهة وتنفيذ تلقائي للسماح بإزالتها بواسطة R8 إذا كان التطبيق لا يحتاج إليها.
  • اختيار المقطع الصوتي:
    • إتاحة علامات تحديد الأدوار المفضّلة للفيديو عند اختيار المقطع الصوتي (#9402)
    • عدِّل منطق اختيار المقطع الصوتي للفيديو لمراعاة أنواع MIME المفضّلة وعلامات الأدوار عند اختيار عدة مقاطع فيديو لتعديلها (#9519).
    • عدِّل منطق اختيار الفيديو والمقطع الصوتي ليتم فقط اختيار التنسيقات للخيارات التكيفية التي لها المستوى نفسه من برنامج فك الترميز ودعم الأجهزة (#9565).
    • عدِّل منطق اختيار مسار الفيديو لتفضيل برامج ترميز أكثر كفاءة إذا كانت برامج الترميز المتعددة متوافقة مع برامج فك الترميز الأساسية التي يتم تسريعها باستخدام الأجهزة (#4835).
    • تفضيل المحتوى الصوتي (مثل المقطع الصوتي "التلقائي" أو المقطع الصوتي الذي يتطابق مع اللغة المحلية للنظام) على قيود اختيار المقطع الصوتي الفني (على سبيل المثال، نوع MIME المفضل أو الحد الأقصى لعدد القنوات)
    • يجب إصلاح مشكلة اختيار قناة الإصدار التي لم يؤدّي فيها إلغاء مجموعة قنوات إصدار إلى إيقاف مجموعات قنوات الإصدار الأخرى من النوع نفسه (#9675).
    • يُرجى حل مشكلة اختيار المقطع الصوتي حيث لا يتم تطبيق مجموعة من تجاوزات المسارات الفارغة والفارغة بشكل صحيح (#9649).
    • حظر علامات TrackGroup المكرّرة في TrackGroupArray ويمكن دائمًا تمييز TrackGroup عن طريق وضع id في الدالة الإنشائية TrackGroup. يؤدي ذلك إلى إصلاح أي عطل عند استئناف التشغيل بعد تشغيل التطبيق في الخلفية مع إلغاء مسار نشط (#9718).
    • عليك تعديل المنطق في AdaptiveTrackSelection للسماح بزيادة الجودة ضمن معدل نقل البيانات الكافي للشبكة حتى إذا كان التشغيل قريبًا جدًا من حافة البث المباشر (#9784).
  • الفيديو:
    • إصلاح المنطق الاحتياطي لبرنامج فك الترميز لكي تستخدم تقنية Dolby Vision برنامج فك ترميز H264/H265 متوافق إذا لزم الأمر.
  • الصوت:
    • إصلاح المنطق الاحتياطي لبرنامج فك الترميز في Dolby Atmos (E-AC3-JOC) لاستخدام برنامج فك ترميز E-AC3 متوافق إذا لزم الأمر
    • غيِّر واجهات برمجة تطبيقات AudioCapabilities بحيث تتطلب ضبط النص AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES بشكل صريح بدلاً من null.
    • اسمح بتخصيص حساب حجم المخزن المؤقت AudioTrack من خلال إدخال AudioTrackBufferSizeProvider في DefaultAudioSink. (#8891).
    • يُرجى إعادة محاولة إنشاء AudioTrack إذا كان حجم المخزن المؤقت المطلوب أكبر من 1 ميغابايت. (#9712).
  • أدوات استخلاص البيانات:
    • WAV: يمكنك إضافة إمكانية بث المحتوى بمعيار RF64 (#9543).
    • إصلاح التحليل غير الصحيح لوحدات H.265 SPS NAL (#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 بدلاً من ذلك.
  • تشغيل الإعلان / إعلانات الوسائط التفاعلية:
  • واجهة المستخدم:
    • إصلاح لون الأرقام في زرَّي الترجيع والتقديم السريع في StyledPlayerView عند استخدام مظاهر معيّنة (#9765).
    • ترجمة سلاسل سرعة التشغيل بشكل صحيح (#9811)
  • DASH:
    • أضِف السمات الأساسية والتكميلية التي تم تحليلها إلى Representation (#9579).
    • دعم دور قناة الإصدار forced-subtitle (#9727).
    • إيقاف تفسير دور قناة الإصدار main على أنّه C.SELECTION_FLAG_DEFAULT.
    • يجب إصلاح منطق استبعاد عناوين URL الأساسية في البيانات التي لا تتضمّن مساحة اسم DVB (#9856).
    • إتاحة عناوين URL النسبية MPD.Location (#9939).
  • بروتوكول HLS:
    • يجب تعبئة Format.label بشكل صحيح لأحداث البث المباشر وفق بروتوكول HTTP (HLS) الصوتية فقط (#9608).
    • يمكنك إعداد المنتجات بشكل غير محدود تلقائيًا لتحسين وقت بدء التشغيل. إذا كانت فيديوهاتك تتضمّن مقاطع ترجمة وشرح مختلطة ولم يتم تضمينها في قائمة التشغيل الرئيسية، عليك إضافتها إلى قائمة التشغيل الرئيسية من أجل تشغيل مقاطع الترجمة والشرح فيها، أو إيقاف إعداد مقاطع الترجمة والشرح باستخدام HlsMediaSource.Factory.setAllowChunklessPreparation(false).
    • يمكنك إتاحة التقديم الدقيق للإطارات الرئيسية باستخدام بروتوكول HLS (#2882).
  • بروتوكول RTSP:
    • وفِّر واجهة برمجة تطبيقات للعميل لإلغاء SocketFactory المستخدَم لأي اتصال بالخادم (#9606).
    • يمكنك تفضيل طريقة مصادقة DIGEST على BASIC في حال إرسالهما (#9800).
    • المعالجة عند عدم توفُّر توقيت مسار RTSP (#9775).
    • وتجاهُل قيم عنوان RTP-Info غير الصالحة (#9619).
  • المحوِّل:
    • زيادة الحد الأدنى المطلوب إصدار واجهة برمجة التطبيقات إلى 21.
    • يُستخدَم TransformationException الآن لوصف الأخطاء التي تحدث أثناء التحويل.
    • أضِف TransformationRequest لتحديد خيارات التحويل.
    • السماح بتسجيل عدّة مستمعين
    • إصلاح توقُّف المحوِّل عند قراءة ناتج برنامج الترميز جزئيًا.
    • أصلِح NPE المحتملة في Transformer.getProgress عند إطلاق رميات الهجوم.
    • أضِف تطبيقًا تجريبيًا لتطبيق عمليات التحويل.
  • إضافة MediaSession:
    • وفقًا للإعدادات التلقائية، يتم الآن محو قائمة التشغيل عند الإيقاف من قِبل "MediaSessionConnector". يمكن للتطبيقات التي تريد الاحتفاظ بقائمة التشغيل الاتصال بـ setClearMediaItemsOnStop(false) على الموصِّل.
  • إضافة البثّ:
    • إصلاح الخطأ الذي منع CastPlayer من الاتصال بـ onIsPlayingChanged بشكل صحيح (#9792).
    • يمكنك إتاحة البيانات الوصفية للمحتوى الصوتي، بما في ذلك الأعمال الفنية، من خلال DefaultMediaItemConverter (#9663).
  • إضافة FFmpeg:
    • اجعل build_ffmpeg.sh تعتمد على أدوات bin LLVM بدلاً من GNU (#9933).
  • التوافق مع نظام التشغيل Android 12:
    • عليك ترقية إضافة Cast للاعتماد على com.google.android.gms:play-services-cast-framework:20.1.0. ولا تتوافق الإصدارات السابقة من play-services-cast-framework مع التطبيقات التي تستهدف الإصدار 12 من نظام التشغيل Android، وسيتعطّل مع IllegalArgumentException عند إنشاء PendingIntents (#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، على سبيل المثال، إدراج الإعلانات من خلال حزمة تطوير البرامج لإعلانات الوسائط التفاعلية.

لمزيد من المعلومات، يُرجى الاطّلاع على مشروع Media3 GitHub.

وقد تمت استضافة ExoPlayer في السابق من خلال مشروع ExoPlayer GitHub منفصل. في Media3، اسم الحزمة هو androidx.media3.exoplayer. ونخطط لمواصلة صيانة مشروع ExoPlayer GitHub وإصداره لفترة من الوقت لمنح التطبيقات الوقت اللازم لنقل البيانات إلى Media3. تم استبدال جميع وحدات Media3 بجميع وحدات ExoPlayer، باستثناء الإضافات القديمة Media2 وmediasessions والتي تم استبدالها بوحدة media3-session الجديدة. يوفر ذلك تكاملاً مباشرًا بين المشغلات وجلسات الوسائط دون الحاجة إلى استخدام فئة المحول/الموصل.