Media3

مكتبات الدعم لحالات استخدام الوسائط
آخر الأخبار الإصدار الثابت إصدار محتمل الإصدار التجريبي الإصدار الأوّلي
‫2 يوليو 2025 1.7.1 - 1.8.0-beta01 1.8.0-alpha01

تعريف التبعيات

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

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

Groovy

dependencies {
    def media3_version = "1.6.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 using Compose
    implementation "androidx.media3:media3-ui-compose:$media3_version"
    // For building media playback UIs using Views
    implementation "androidx.media3:media3-ui:$media3_version"
    // For building media playback UIs using Jetpack Compose
    implementation "androidx.media3:media3-ui-compose:$media3_version"
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation "androidx.media3:media3-ui-leanback:$media3_version"

    // For exposing and controlling media sessions
    implementation "androidx.media3:media3-session:$media3_version"

    // For extracting data from media containers
    implementation "androidx.media3:media3-extractor:$media3_version"

    // For integrating with Cast
    implementation "androidx.media3:media3-cast:$media3_version"

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version"

    // For transforming media files
    implementation "androidx.media3:media3-transformer:$media3_version"

    // For applying effects on video frames
    implementation "androidx.media3:media3-effect:$media3_version"

    // For muxing media files
    implementation "androidx.media3:media3-muxer:$media3_version"

    // Utilities for testing media components (including ExoPlayer components)
    implementation "androidx.media3:media3-test-utils:$media3_version"
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation "androidx.media3:media3-test-utils-robolectric:$media3_version"

    // Common functionality for reading and writing media containers
    implementation "androidx.media3:media3-container:$media3_version"
    // Common functionality for media database components
    implementation "androidx.media3:media3-database:$media3_version"
    // Common functionality for media decoders
    implementation "androidx.media3:media3-decoder:$media3_version"
    // Common functionality for loading data
    implementation "androidx.media3:media3-datasource:$media3_version"
    // Common functionality used across multiple media libraries
    implementation "androidx.media3:media3-common:$media3_version"
    // Common Kotlin-specific functionality
    implementation "androidx.media3:media3-common-ktx:$media3_version"
}

Kotlin

dependencies {
    val media3_version = "1.6.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 using Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs using Views
    implementation("androidx.media3:media3-ui:$media3_version")
    // For building media playback UIs using Jetpack Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation("androidx.media3:media3-ui-leanback:$media3_version")

    // For exposing and controlling media sessions
    implementation("androidx.media3:media3-session:$media3_version")

    // For extracting data from media containers
    implementation("androidx.media3:media3-extractor:$media3_version")

    // For integrating with Cast
    implementation("androidx.media3:media3-cast:$media3_version")

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version")

    // For transforming media files
    implementation("androidx.media3:media3-transformer:$media3_version")

    // For applying effects on video frames
    implementation("androidx.media3:media3-effect:$media3_version")

    // For muxing media files
    implementation("androidx.media3:media3-muxer:$media3_version")

    // Utilities for testing media components (including ExoPlayer components)
    implementation("androidx.media3:media3-test-utils:$media3_version")
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation("androidx.media3:media3-test-utils-robolectric:$media3_version")

    // Common functionality for reading and writing media containers
    implementation("androidx.media3:media3-container:$media3_version")
    // Common functionality for media database components
    implementation("androidx.media3:media3-database:$media3_version")
    // Common functionality for media decoders
    implementation("androidx.media3:media3-decoder:$media3_version")
    // Common functionality for loading data
    implementation("androidx.media3:media3-datasource:$media3_version")
    // Common functionality used across multiple media libraries
    implementation("androidx.media3:media3-common:$media3_version")
    // Common Kotlin-specific functionality
    implementation("androidx.media3:media3-common-ktx:$media3_version")
}

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

الملاحظات

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

الإصدار 1.8.0

الإصدار 1.8.0-beta01

‫2 يوليو 2025

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

  • المكتبة المشتركة:
    • إضافة إمكانية استبدال مشغّل الفيديو في ForwardingSimpleBasePlayer
  • ExoPlayer:
    • إضافة إمكانية استخدام معرّف الجهاز الافتراضي من Context الذي تم تمريره إلى ExoPlayer.Builder
    • تفعيل الجدولة الديناميكية تلقائيًا في وضع التقديم السريع
    • تجنَّب إعادة تحميل مصدر غير ضرورية عند الانتقال إلى نهاية عنصر.
    • استخدام MediaCodec.BUFFER_FLAG_DECODE_ONLY تلقائيًا في وضع التقديم السريع والترجيع
    • يتم عرض الخطأ IllegalStateException عند تشغيل PreloadMediaSource بواسطة ExoPlayer مع سلسلة تشغيل مختلفة عن سلسلة التحميل المُسبَق (#2495).
    • إضافة cloneAndMove إلى ShuffleMode مع تنفيذ تلقائي (#2226)
    • تغيير السلوك التلقائي للدالة Renderer.getMinDurationToProgressUs لعرض قيمة أكبر إذا لم يكن من الضروري استدعاء الدالة render
    • تم إصلاح الخطأ الذي كان يتسبّب في تأخير عرض الإطار الأخير عند الانتقال إلى نهاية الفيديو أثناء الإيقاف المؤقت. في الوقت الحالي، لن يتم تطبيق إصلاح الخطأ إلا في حال تفعيل ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled.
  • المحوّل:
    • أضِف CodecDbLite التي تتيح تحسينات خاصة بشرائح المعالجة لإعدادات ترميز الفيديو.
    • أضِف العلامة setEnableCodecDbLite إلى DefaultEncoderFactory لتفعيل ميزة تحسين إعدادات CodecDB Lite. ويتم ضبط هذا الخيار تلقائيًا على "خطأ".
  • أدوات استخراج البيانات:
    • إضافة إمكانية البحث في ملفات MP4 المجزّأة التي تحتوي على عدة عناصر sidx يمكن تفعيل هذا السلوك باستخدام العلامة FLAG_MERGE_FRAGMENTED_SIDX على FragmentedMp4Extractor (#9373).
    • تجاهُل جداول البحث الفارغة في ملفات FLAC (بما في ذلك تلك التي تحتوي على نقاط بحث نائبة فقط)، والرجوع إلى البحث الثنائي إذا كانت مدة الملف معروفة (#2327)
    • تم إصلاح مشكلة تحليل وحدات معلومات SEI في H.265 لتخطّي أنواع معلومات SEI غير المعروفة بالكامل (#2456).
    • عدِّل WavExtractor لاستخدام بيانات SubFormat الخاصة بإضافة العنوان لتحديد تنسيق الصوت عند تحليل ملف من النوع WAVE_FORMAT_EXTENSIBLE.
    • ‫MP4: تمت إضافة إمكانية استخدام مربّعات ipcm وfpcm لتحديد مقاطع صوت PCM الأولية (لا تتوفّر إمكانية استخدام PCM بنقطة عائمة 64 بت).
    • ‫MP4: التعامل مع جزء التدوير في مصفوفات التحويل tkhd التي تدور وتعكس الفيديو. يضمن ذلك أن تعرض الفيديوهات المعكوسة التي تم التقاطها باستخدام الكاميرا الأمامية في iPhone الاتجاه الصحيح، ولكنها ستظهر معكوسة بشكل غير صحيح على المحور الصادي (#2012).
  • الصوت:
    • إضافة دعم لجميع تنسيقات عيّنات PCM الخطية في ChannelMappingAudioProcessor وTrimmingAudioProcessor
    • إتاحة استخدام فجوات صوتية في CompositionPlayer
    • إزالة المكالمة غير المرغوب فيها إلى BaseAudioProcessor#flush() من BaseAudioProcessor#reset()
  • الفيديو:
    • تحسين عرض الفيديو بسلاسة عند بدء التشغيل عندما لا تبدأ عيّنات الصوت في الموضع المطلوب تمامًا
    • توسيع نطاق الحلّ البديل للأسطح المنفصلة ليشمل أجهزة "realme"‏ (#2059)
  • النص:
    • إصلاح مشكلة توقّف التشغيل مؤقتًا عندما يتعذّر تحميل جزء من الترجمة والشرح في البداية ثم يتم تحميله بنجاح، يليه عدّة أجزاء فارغة من الترجمة والشرح (#2517)
  • البيانات الوصفية:
    • تمت إضافة إمكانية استرداد مدة الوسائط وTimeline إلى MetadataRetriever، وتم نقلها إلى واجهة برمجة تطبيقات AutoCloseable مستندة إلى مثيل. استخدِم Builder الجديد لإنشاء مثيل من MediaItem، ثم استدعِ retrieveTrackGroups() وretrieveTimeline() وretrieveDurationUs() للحصول على ListenableFuture للبيانات الوصفية. تم الآن إيقاف استخدام الطرق الثابتة السابقة (#2462).
  • الصورة:
    • يجب حصر وحدات البكسل التي تم فك ترميزها بحجم الشاشة في BitmapFactoryImageDecoder، وذلك لتجنُّب تعطُّل التطبيق مع Canvas: trying to draw too large bitmap. من PlayerView عند محاولة عرض صور كبيرة جدًا (مثل 50 ميغابكسل).
    • غيِّر توقيع الدالة DefaultRenderersFactory.getImageDecoderFactory() لتأخذ المَعلمة Context.
    • يجب أن يكون الحد الأقصى لحجم إخراج الصورة النقطية المستخدَم في CompositionPlayer مطابقًا للحجم المستخدَم في Transformer (ما يعني أنّ CompositionPlayer لا يأخذ حجم الشاشة في الاعتبار عند فك ترميز الصور النقطية، على عكس ExoPlayer).
  • Muxers:
    • إصلاح الخطأ الذي كان يؤدي إلى عدم ضبط علامات العيّنات الصحيحة لعيّنات الصوت في ملفات MP4 المجزّأة.
  • الجلسة:
    • تم إصلاح الخطأ الذي كان يتسبّب في ظهور IllegalStateException (#2265) عند استدعاء setSessionExtras من سلسلة المحادثات الرئيسية عند تشغيل المشغّل من سلسلة محادثات تطبيق مختلفة عن سلسلة المحادثات الرئيسية.
    • عدم عرض إشعار تلقائيًا إذا تم إعداد مشغّل باستخدام عناصر وسائط بدون إعدادها أو تشغيلها (#2423https://github.com/androidx/media/issues/2423). يمكن ضبط هذا السلوك من خلال MediaSessionService.setShowNotificationForIdlePlayer.
    • إضافة PlaybackException مخصّص إلى جميع وحدات التحكّم أو وحدات التحكّم المحدّدة
    • إصلاح الخطأ الذي يؤدي إلى ظهور IllegalArgumentException عند محاولة التقديم أو الترجيع في بث مباشر على جهاز MediaController
    • بالنسبة إلى أحداث البث المباشر، أوقِف نشر موضع التشغيل وإمكانية البحث في العنصر الحالي لوحدات التحكّم في الوسائط على المنصة، وذلك لتجنُّب حدوث تشوّهات في الموضع في واجهة مستخدم Android Auto (وغيرها من وحدات التحكّم التي تستخدم هذه المعلومات من جلسة الوسائط على المنصة) (#1758).
  • إضافة Cronet:
    • إضافة معالجة تلقائية لملفات تعريف الارتباط (#5975)
  • إضافة HLS:
    • إصلاح تحليل قائمة التشغيل لقبول \f (تغذية النموذج) في قيم سمات السلسلة المقتبسة (#2420).
    • إتاحة تعديل الإعلانات البينية التي تحمل المعرّف نفسه (#2427)
    • تم إصلاح الخطأ الذي كان يتسبّب أحيانًا في عدم نشر أخطاء تحميل قائمة التشغيل عند نفاد مقاطع البث المباشر (#2401https://github.com/androidx/media/issues/2401).
    • تجميع عروض الترجمة والشرح حسب علامة NAME، على غرار طريقة تجميع عروض الصوت الحالية (#1666).
  • إضافة DASH:
    • تم إصلاح الخطأ الذي يتسبّب في ظهور استثناء عند تقصير مدة فترة DASH إذا كانت خطوة العرض قد قرأت عيّنات تتجاوز المدة الجديدة (#2440).
    • تم إصلاح الخطأ الذي كان يؤدي إلى عدم اتّباع عملية إعادة التوجيه عند استخدام مَعلمات طلب بحث CMCD (#2475).
  • إضافة RTSP:
    • تم إصلاح الخطأ RtspClient لاستخدام معرّف الموارد المنتظم الخاص بالموقع الجغرافي كما هو محدّد عند معالجة الردّ HTTP 302 (#2398).
  • إضافات برامج الترميز (FFmpeg وVP9 وAV1 وما إلى ذلك):
    • تم إصلاح الخطأ الذي لا يؤدي فيه استخدام DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange إلى أي تأثير في إضافات برامج فك ترميز الصوت (#2258).
  • إضافة البث:
    • إضافة دعم setVolume() وgetVolume() (#2279)
    • منع CastPlayer من الانتقال إلى STATE_BUFFERING عندما يكون المخطط الزمني فارغًا.
  • أدوات الاختبار:
    • أضِف advance(player).untilPositionAtLeast وuntilMediaItemIndex إلى TestPlayerRunHelper من أجل تقدّم اللاعب إلى أن يتم الوصول إلى موضع محدّد. في معظم الحالات، تكون هذه الطرق أكثر موثوقية من طريقتَي untilPosition وuntilStartOfMediaItem الحالية.
    • انقل FakeDownloader إلى الوحدة test-utils-robolectric لإعادة استخدامه في اختبارات أخرى.

الإصدار 1.8.0-alpha01

‫19 مايو 2025

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

  • ExoPlayer:
    • أضِف طريقة الدفع ExoPlayer.setScrubbingModeEnabled(boolean). ويؤدي ذلك إلى تحسين أداء المشغّل عند إجراء عمليات بحث متكررة (على سبيل المثال، عندما يسحب المستخدم شريط التمرير). يمكن تخصيص سلوك وضع التقديم السريع باستخدام setScrubbingModeParameters(..) على ExoPlayer وExoPlayer.Builder.
    • السماح بتخصيص مدى التفاوت في البحث الجزئي في وضع البحث السريع
    • زيادة معدّل تشغيل الترميز في وضع التقديم السريع أو الترجيع
    • تم إصلاح الخطأ الذي قد يؤدي إلى عدم الإبلاغ عن أخطاء الإعداد في محتوى AdsMediaSource (#2337).
    • إصلاح تسريب الذاكرة في MergingMediaSource، على سبيل المثال، عند تحميل الترجمة والشرح بشكل جانبي (#2338)
    • السماح بعرض CmcdConfiguration.Factory لإيقاف تسجيل بيانات CMCD لعناصر وسائط معيّنة (#2386).null
    • زيادة حجم المخزن المؤقت التلقائي للصور من 128 كيلوبايت (خطأ في النسخ واللصق من مسارات النص) إلى 26 ميغابايت، وهو حجم كبير بما يكفي لصور Ultra HDR بدقة 50 ميغابكسل (#2417).
    • أضِف PreCacheHelper الذي يتيح للتطبيقات التخزين المؤقت المسبق لوسائط فردية مع تحديد موضع البدء والمدة.
  • المحوّل:
    • عند ملء فجوة أولية (تمت إضافتها من خلال addGap()) بمقطع صوتي صامت، يجب الآن ضبط experimentalSetForceAudioTrack(true) بشكل صريح في EditedMediaItemSequence.Builder. إذا كانت الفجوة في منتصف التسلسل، لن تكون هذه العلامة مطلوبة.
    • نقل واجهة Muxer من media3-transformer إلى media3-muxer
    • اجعل الإعداد MediaItem.Builder().setImageDuration(long) إلزاميًا لاستيراد عنصر وسائط كصورة.
    • أضِف Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean) الذي يتضمّن قائمة تعديل بتنسيق MP4 عند الاقتصاص لتوجيه اللاعبين إلى تجاهل العيّنات بين إطار المفتاح قبل نقطة بداية الاقتصاص ونقطة بداية الاقتصاص.
    • تعديل تطبيق Composition Demo لاستخدام Kotlin وJetpack Compose، وإضافة VideoCompositorSettings مخصّص لترتيب التسلسلات في تنسيق 2x2 أو "صورة داخل صورة"
  • أدوات استخراج البيانات:
    • ‫MP3: استخدام المدة وحجم البيانات من البيانات الوصفية غير القابلة للبحث الخاصة بمعدل نقل البيانات المتغير (VBRI) وXing وما شابه ذلك عند الرجوع إلى البحث بمعدل نقل بيانات ثابت بسبب FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) (#2194).
  • الصوت:
    • السماح بتعديل مستوى الصوت باستمرار في DefaultAudioMixer
    • إتاحة ChannelMappingAudioProcessor وTrimmingAudioProcessor وToFloatPcmAudioProcessor للجميع (#2339)
    • استخدِم AudioTrack#getUnderrunCount() في AudioTrackPositionTracker للكشف عن نقص البيانات في DefaultAudioSink بدلاً من التقدير بأفضل جهد.
    • تحسين تسوية الطابع الزمني للصوت عند حدوث انحراف غير متوقّع في الموضع من جهاز إخراج الصوت
    • تم إصلاح الخطأ الذي يؤدي إلى عدم مزامنة الصوت والفيديو خلال أول 10 ثوانٍ بعد استئناف التشغيل من الإيقاف المؤقت عند الاتصال بأجهزة بلوتوث.
    • تم إصلاح الخطأ الذي كان يتسبّب في عدم تسجيل AnalyticsListener.onAudioPositionAdvancing للوقت الذي بدأ فيه الصوت بالتقدّم، بل كان يسجّل وقت القياس الأول.
  • الفيديو:
    • أضِف واجهة برمجة التطبيقات التجريبية ExoPlayer لتضمين العلامة MediaCodec.BUFFER_FLAG_DECODE_ONLY عند وضع مخازن مؤقتة للإدخال مخصّصة لفك الترميز فقط في قائمة الانتظار. ستشير هذه العلامة إلى برنامج الترميز بتخطّي المخازن المؤقتة التي يتم فك ترميزها فقط، ما يؤدي إلى تسريع عملية البحث. يمكنك تفعيلها باستخدام DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag.
    • تحسين عمليات التحقّق من أداء برامج ترميز الفيديو. وقد يؤدي ذلك إلى تصنيف بعض الأغاني الإضافية على أنّها EXCEEDS_CAPABILITIES.
    • إصلاح أخطاء تشغيل VP9 Widevine على بعض الأجهزة (#2408).
  • النص:
    • إصلاح SSA وSubRip لعرض إشارة قيد التقدم عند تفعيل الترجمة والشرح (#2309)
    • تم إصلاح مشكلة توقّف التشغيل عند التبديل من بث مباشر يتضمّن خطأ في الترجمة والشرح إلى بث مباشر يتضمّن مسار ترجمة وشرح فارغًا (#2328).
    • إصلاح مشكلة ظهور ترجمة وشرح مشوّشة بتنسيق CEA-608 عند تشغيل بث H.262 يتضمّن إطارات B (‫#2372)
    • إضافة دعم لترجمة SSA مع CodecId = S_TEXT/SSA في ملفات Matroska في السابق، كان MatroskaExtractor يتيح استخدام CodecId = S_TEXT/ASS فقط، وهو مصمّم لتمثيل الإصدار "المتقدّم" (الإصدار 4 أو الإصدارات الأحدث) من ترجمات SubStation Alpha (ولكن منطق تحليل ExoPlayer هو نفسه لكلا الإصدارَين) (#2384).
    • إضافة إمكانية استخدام السمة layer في ملفات ترجمة SubStation Alpha (SSA) التي تُستخدَم لتحديد ترتيب العرض على المحور Z للإشارات عندما يتم عرض أكثر من إشارة واحدة على الشاشة في الوقت نفسه (#2124)
  • التأثير:
    • أضِف Presentation.createForShortSide(int) لإنشاء Presentation يضمن أنّ الجانب الأقصر يتطابق دائمًا مع القيمة المحدّدة، بغض النظر عن اتجاه الإدخال.
  • Muxers:
    • تستخدم واجهة برمجة التطبيقات writeSampleData() الآن الفئة BufferInfo الخاصة ببرنامج دمج الصوت والفيديو بدلاً من MediaCodec.BufferInfo.
    • أضِف Muxer.Factory#supportsWritingNegativeTimestampsInEditList التي تكون قيمتها التلقائية خطأ.
  • إضافة "إعلانات الوسائط التفاعلية":
    • تم إصلاح الخطأ الذي يؤدي إلى إبطال مجموعة إعلانية أخرى عن طريق الخطأ عند حدوث خطأ في تحميل إعلان واحد.
    • تم إصلاح الخطأ الذي كان يؤدي إلى توقّف التشغيل مؤقتًا في المجموعات الإعلانية بعد انتهاء فترة عرض الفيديو عند الطلب. لم تعُد المجموعات الإعلانية التي يتجاوز وقت بدئها الفترة الزمنية المحدّدة تتم إضافتها إلى قائمة الانتظار في MediaPeriodQueue (#2215).
  • الجلسة:
    • تم إصلاح الخطأ الذي كان يؤدي إلى ظهور NullPointerException عند تمرير قيمة فارغة إلى getLibraryRoot في MediaBrowser مرتبط بـ MediaBrowserServiceCompat قديم.
    • تم إصلاح الخطأ الذي كان يؤدي إلى تعطُّل تطبيق الجلسة القديم عند إرسال إجراءات مخصّصة أو نتيجة بحث أو طلب getItem مع ظهور ClassNotFoundException.
    • تم إصلاح الخطأ الذي كان يؤدي إلى مشاركة MediaItem.LocalConfiguration.uri مع MediaMetadata في جلسات المنصة. لمشاركة معرّف موارد منتظم (URI) عن قصد للسماح لأدوات التحكّم بإعادة طلب الوسائط، اضبط MediaItem.RequestMetadata.mediaUri بدلاً من ذلك.
  • UI:
    • تم إصلاح خطأ في Compose أدّى إلى حدوث فجوة بين ضبط حالات الزر الأولية ومراقبة التغيير في الحالة (مثل أشكال الرموز أو التفعيل). يتم الآن رصد أي تغييرات يتم إجراؤها على "اللاعب" خارج فترة المراقبة (#2313).
    • أضِف عناصر الاحتفاظ بالحالة وعناصر قابلة للإنشاء إلى الوحدة media3-ui-compose الخاصة بـ SeekBackButtonState وSeekForwardButtonState.
    • أضِفنا إمكانية استخدام وضع التنظيف في ExoPlayer إلى PlayerControlView. عند تفعيل هذا الخيار، يتم وضع المشغّل في وضع التقديم السريع أو الترجيع عندما يبدأ المستخدم في سحب شريط التقديم السريع أو الترجيع، ويتم إصدار طلب player.seekTo لكل حركة، ثم يتم الخروج من وضع التقديم السريع أو الترجيع عند رفع الإصبع عن الشاشة. يمكن تفعيل عملية التكامل هذه باستخدام time_bar_scrubbing_enabled = true في XML أو الطريقة setTimeBarScrubbingEnabled(boolean) من Java/Kotlin.
    • اجعل PlayerSurface تقبل وسيطة Player تقبل القيم الخالية.
  • عمليات التنزيل:
    • إضافة إمكانية التنزيل الجزئي للجداول المتدفقة التدريجية يمكن للتطبيقات إعداد بث تدريجي باستخدام DownloadHelper، وطلب DownloadRequest من التطبيق المساعد مع تحديد مواضع البدء والانتهاء للوسائط المستندة إلى الوقت التي يجب أن يغطيها التنزيل. يحمل DownloadRequest نطاق البايت الذي تم تحديده، والذي يمكن استخدامه لإنشاء ProgressiveDownloader وتنزيل المحتوى المناسب.
    • أضِف DownloadHelper.Factory التي سيتم استبدال طرق DownloadHelper.forMediaItem() الثابتة بها.
    • أضِف Factory لعمليات التنفيذ SegmentDownloader.
    • إضافة إمكانية التنزيل الجزئي لعمليات البث التكيّفي يمكن للتطبيقات إعداد بث متكيّف باستخدام DownloadHelper، وطلب DownloadRequest من التطبيق المساعد مع تحديد مواضع البدء والانتهاء للوسائط المستندة إلى الوقت التي يجب أن يغطيها التنزيل. تحمل السمة DownloadRequest النطاق الزمني الذي تم تحديده، والذي يمكن من خلاله إنشاء SegmentDownloader ملموس وتنزيل المحتوى وفقًا لذلك.
  • إضافة HLS:
    • تتيح هذه السمة استخدام X-ASSET-LIST وعمليات البث المباشر مع HlsInterstitialsAdsLoader.
  • إضافة RTSP:
    • إضافة إمكانية تحليل SessionDescriptions التي تحتوي على أسطر تتضمّن أحرف مسافات بيضاء لاحقة (#2357)
  • إضافة البث:
    • إتاحة استخدام getDeviceVolume() وsetDeviceVolume() وgetDeviceMuted() وsetDeviceMuted() (#2089).
  • أدوات الاختبار:
    • تمت إزالة transformer.TestUtil.addAudioDecoders(String...) وtransformer.TestUtil.addAudioEncoders(String...) وtransformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...). يمكنك استخدام ShadowMediaCodecConfig لضبط برامج الترميز وفك الترميز الثانوية بدلاً من ذلك.
    • تم استبدال البادئة "exotest" بالبادئة "media3" في أسماء برامج الترميز التي تعرضها السمة ShadowMediaCodecConfig.
  • إزالة الرموز المتوقّفة نهائيًا:
    • تمت إزالة الدالة الإنشائية SegmentDownloader المتوقّفة نهائيًا SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) والدوال الإنشائية المقابلة في فئاتها الفرعية DashDownloader وHlsDownloader وSsDownloader.
    • تمت إزالة Player.hasNext() وPlayer.hasNextWindow() اللذين تم إيقافهما نهائيًا. استخدِم Player.hasNextMediaItem() بدلاً من ذلك.
    • تمت إزالة Player.next() التي تم إيقافها نهائيًا. استخدِم Player.seekToNextMediaItem() بدلاً من ذلك.
    • تمت إزالة Player.seekToPreviousWindow() التي تم إيقافها نهائيًا. استخدِم Player.seekToPreviousMediaItem() بدلاً من ذلك.
    • تمت إزالة Player.seekToNextWindow() التي تم إيقافها نهائيًا. استخدِم Player.seekToNextMediaItem() بدلاً من ذلك.
    • تمت إزالة BaseAudioProcessor المتوقّفة نهائيًا في الوحدة exoplayer. استخدِم BaseAudioProcessor ضمن وحدة common.
    • إزالة الدالة الإنشائية المتوقّفة نهائيًا MediaCodecVideoRenderer MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider)

الإصدار 1.7.0

الإصدار 1.7.1

‫16 مايو 2025

يحتوي هذا الإصدار على الرمز البرمجي نفسه المتوفّر في الإصدار 1.6.1، ويتم إطلاقه لضمان ظهوره كإصدار "أحدث" من الإصدار 1.7.0 الذي كان إصدارًا أوليًا تم تصنيفه عن طريق الخطأ على أنّه إصدار ثابت (راجِع ما يلي).

الإصدار 1.7.0

‫16 مايو 2025

كان من المفترض أن يكون هذا الإصدار 1.7.0-alpha01، ولكن تم تصنيفه عن طريق الخطأ على أنّه 1.7.0 (أي إصدار ثابت) على maven.google.com. يُرجى عدم استخدامه. يمكنك البقاء على الإصدار 1.6.1 أو الترقية إلى الإصدار 1.7.1 (الذي يتضمّن الرمز البرمجي نفسه المتوفّر في الإصدار 1.6.1).

الإصدار 1.6.0

1.6.1

‫14 أبريل 2025

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

  • المكتبة المشتركة:
    • تمت إضافة طريقة PlaybackParameters.withPitch(float) لتسهيل نسخ PlaybackParameters مع قيمة pitch جديدة (#2257).
  • ExoPlayer:
    • تم إصلاح المشكلة التي يتعذّر فيها الانتقال إلى عنصر وسائط بسبب خطأ قابل للاسترداد في أداة العرض أثناء تهيئة عنصر الوسائط التالي (#2229).
    • تم إصلاح المشكلة التي تؤدي إلى ظهور الخطأ ProgressiveMediaPeriod IllegalStateException عندما يحاول PreloadMediaSource استدعاء getBufferedDurationUs() قبل أن يصبح جاهزًا (#2315).
    • تم إصلاح مشكلة إرسال CmcdData في طلبات البيان الخاصة ببروتوكولات DASH وHLS وSmoothStreaming (#2253).
    • التأكّد من إمكانية استخدام AdPlaybackState.withAdDurationsUs(long[][]) بعد إزالة المجموعات الإعلانية سيظل على المستخدم إدخال مصفوفة من المدد لمجموعات الإعلانات التي تمت إزالتها، ويمكن أن تكون فارغة أو بقيمة فارغة (#2267).
  • أدوات استخراج البيانات:
    • MP4: يجب تحليل alternate_group من المربّع tkhd وعرضه كإدخال Mp4AlternateGroupData في Format.metadata لكل مقطع (#2242).
  • الصوت:
    • تم إصلاح مشكلة إيقاف التحميل مؤقتًا حيث قد يتوقف الموضع عند تشغيل قائمة تشغيل تتضمّن محتوًى قصيرًا (#1920).
  • الجلسة:
    • تقليل مهلة التجميع لعمليات ردّ الاتصال في النظام الأساسي MediaSession من 500 إلى 100 ملي ثانية وإضافة أداة ضبط تجريبية للسماح للتطبيقات بضبط هذه القيمة
    • تم إصلاح المشكلة التي تؤدي إلى ظهور الإشعارات مجددًا بعد أن يرفضها المستخدم (#2302).
    • تم إصلاح خطأ كان يؤدي إلى عرض الجلسة لمخطط زمني يتضمّن عنصرًا واحدًا عندما يكون المشغّل المضمّن فارغًا في الواقع. حدث ذلك عندما لا يتوفّر COMMAND_GET_TIMELINE في المشغّل المضمّن، بينما يتوفّر COMMAND_GET_CURRENT_MEDIA_ITEM، وكان المشغّل المضمّن فارغًا (#2320).
    • تم إصلاح خطأ كان يؤدي إلى تجاهل طلب الاتصال بـ MediaSessionService.setMediaNotificationProvider بدون إشعار بعد التفاعل مع الخدمة بطرق أخرى، مثل setForegroundServiceTimeoutMs (#2305).
  • UI:
    • فعِّل PlayerSurface للعمل مع ExoPlayer.setVideoEffects وCompositionPlayer.
    • تم إصلاح الخطأ الذي كان يؤدي إلى عدم إمكانية إعادة إنشاء PlayerSurface باستخدام Player جديد.
  • إضافة HLS:
    • تم إصلاح المشكلة المتمثّلة في عدم ضبط مدة الأجزاء في CmcdData لوسائط HLS، ما يؤدي إلى حدوث خطأ في التأكيد عند معالجة مقاطع الوسائط المشفّرة (#2312).
  • إضافة RTSP:
    • إضافة إمكانية استخدام معرّف الموارد المنتظم (URI) مع نظام RTSPT كطريقة لإعداد جلسة RTSP لاستخدام TCP (#1484)
  • إضافة البث:
    • إضافة إمكانية استخدام البيانات الوصفية لقوائم التشغيل (#2235)

1.6.0

‫26 مارس 2025

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

  • المكتبة المشتركة:
    • أضِف AudioManagerCompat وAudioFocusRequestCompat لاستبدال الفئات المكافئة في androidx.media.
    • ترقية Kotlin من الإصدار 1.9.20 إلى الإصدار 2.0.20 واستخدام المكوّن الإضافي Compose Compiler Gradle تمت ترقية مكتبة KotlinX Coroutines من الإصدار 1.8.1 إلى الإصدار 1.9.0.
    • أزِل طريقة Format.toBundle(boolean excludeMetadata) واستخدِم Format.toBundle() بدلاً منها.
    • تم إصلاح الخطأ في SimpleBasePlayer حيث لا تؤدي إضافة currentMediaItemIndex جديد في State بعد setPlaylist باستخدام null MediaMetadata إلى إعادة تقييم البيانات الوصفية (#1940).
    • تغيير إذن الوصول إلى SimpleBasePlayer.State من "محمي" إلى "عام" لتسهيل التعامل مع التحديثات في صفوف أخرى (#2128)
  • ExoPlayer:
    • أضِف MediaExtractorCompat، وهي فئة جديدة توفّر ميزات مكافئة للمنصة MediaExtractor.
    • إضافة دعم تجريبي لعملية "التسخين المُسبَق" في ExoPlayer لتشغيل المحتوى باستخدام MediaCodecVideoRenderer. يمكنك ضبط DefaultRenderersFactory من خلال experimentalSetEnableMediaCodecVideoRendererPrewarming لتوفير MediaCodecVideoRenderer ثانوي إلى ExoPlayer. في حال تفعيل هذه الميزة، تعالج ExoPlayer مسبقًا فيديو عناصر الوسائط المتتالية أثناء التشغيل لتقليل وقت استجابة الانتقال بين عناصر الوسائط.
    • خفض القيم التلقائية لكل من bufferForPlaybackMs وbufferForPlaybackAfterRebufferMs في DefaultLoadControl إلى 1000 و2000 ملي ثانية على التوالي
    • يمكنك ضبط DeviceInfo ومستوى صوت الجهاز بشكل غير متزامن (في حال تفعيل setDeviceVolumeControlEnabled). لا تتوفّر هذه القيم فورًا بعد ExoPlayer.Builder.build()، وتُعلم Player.Listener بالتغييرات من خلال onDeviceInfoChanged وonDeviceVolumeChanged.
    • لم يعُد رقم تعريف جلسة الصوت الأولية متاحًا على الفور بعد إنشاء المشغّل. يمكنك استخدام AnalyticsListener.onAudioSessionIdChanged للاستماع إلى التحديث الأولي إذا لزم الأمر.
    • يجب مراعاة اللغة عند اختيار مقطع فيديو. يتم تلقائيًا اختيار مقطع فيديو &quot;رئيسي&quot; يتطابق مع لغة المقطع الصوتي المحدّد، إذا كان متاحًا. يمكن التعبير عن إعدادات اللغة المفضّلة للفيديوهات التي تتضمّن محتوًى فاضحًا باستخدام TrackSelectionParameters.Builder.setPreferredVideoLanguage(s).
    • أضِف المَعلمة selectedAudioLanguage إلى الطريقة DefaultTrackSelector.selectVideoTrack().
    • أضِف المَعلمة retryCount إلى MediaSourceEventListener.onLoadStarted وطُرق MediaSourceEventListener.EventDispatcher المقابلة.
    • تم إصلاح الخطأ الذي كان يؤدي إلى توقّف عرض الإطارات في نهاية عناصر قائمة التشغيل أو الفترات في بثوق DASH المتعددة الفترات التي تتضمّن مدة لا تتطابق مع المحتوى الفعلي (‫1698#).
    • انقل BasePreloadManager.Listener إلى PreloadManagerListener على مستوى أعلى.
    • يمكن تنفيذ RenderersFactory.createSecondaryRenderer لتوفير عارضات ثانوية لعملية التسخين المُسبَق. تتيح ميزة "التحضير المسبق" الانتقال بشكل أسرع بين عناصر الوسائط أثناء التشغيل.
    • فعِّل إرسال CmcdData لطلبات ملفات البيان بتنسيقات البث التكيّفي DASH وHLS وSmoothStreaming (#1951).
    • يجب تقديم MediaCodecInfo لبرنامج الترميز الذي سيتم إعداده في MediaCodecRenderer.onReadyToInitializeCodec (#1963).
    • غيِّر AdsMediaSource للسماح AdPlaybackStates بالنمو من خلال إضافة مجموعات إعلانية. يتم رصد التعديلات غير الصالحة ويتم طرح استثناء.
    • تم إصلاح مشكلة عرض لقطات إضافية مخصّصة لفك الترميز فقط بشكل متسلسل وسريع عند الانتقال إلى وسائط المحتوى بعد عرض إعلان أثناء التشغيل.
    • اجعل DefaultRenderersFactory يضيف مثيلَين من MetadataRenderer لتمكين التطبيقات من تلقّي مخطّطَين مختلفَين للبيانات الوصفية تلقائيًا.
    • إعادة تقييم ما إذا كان يجب إلغاء التحميل المستمر لجزء من المحتوى عند إيقاف التشغيل مؤقتًا (#1785)
    • إضافة خيار إلى ClippingMediaSource للسماح بقص مقاطع من الوسائط التي لا يمكن البحث فيها
    • تم إصلاح الخطأ الذي كان يؤدي إلى حظر الانتقال إلى عنصر الوسائط التالي عند البحث باستخدام ميزة "التحميل المسبق".
    • تم إصلاح الخطأ الذي يتسبّب في بقاء ExoPlayer.isLoading() على true حتى بعد الانتقال إلى STATE_IDLE أو STATE_ENDED (#2133).
    • إضافة lastRebufferRealtimeMs إلى LoadControl.Parameter (#2113)
  • المحوّل:
    • إضافة إمكانية تحويل الترميز إلى تنسيقات بديلة متوافقة مع الأنظمة القديمة
    • إضافة إمكانية تحويل الترميز وتغيير تنسيق Dolby Vision (الملف الشخصي 8).
    • تعديل مَعلمات VideoFrameProcessor.registerInputStream وVideoFrameProcessor.Listener.onInputStreamRegistered لاستخدام Format
    • إنشاء بيانات وصفية ثابتة بتنسيق HDR عند استخدام DefaultEncoderFactory
    • فعِّل إمكانية استخدام بيانات تشخيص النظام الأساسي Android باستخدام MediaMetricsManager. تعيد خدمة Transformer توجيه أحداث التعديل وبيانات الأداء إلى المنصة، ما يساعد في توفير معلومات عن أداء النظام وتصحيح الأخطاء على الجهاز. ويمكن أن تجمع Google هذه البيانات أيضًا إذا فعّل المستخدم خيار مشاركة بيانات الاستخدام والتشخيص. يمكن للتطبيقات إيقاف المشاركة في بيانات تشخيص Transformer على المنصة باستخدام Transformer.Builder.setUsePlatformDiagnostics(false).
    • قسِّم InAppMuxer إلى InAppMp4Muxer وInAppFragmentedMp4Muxer. يمكنك استخدام InAppMp4Muxer لإنشاء ملف MP4 غير مقسَّم، بينما يمكنك استخدام InAppFragmentedMp4Muxer لإنشاء ملف MP4 مقسَّم.
    • نقل واجهة Muxer من media3-muxer إلى media3-transformer
    • أضِف MediaProjectionAssetLoader، الذي يوفّر وسائط من MediaProjection لتسجيل الشاشة، وأضِف إمكانية تسجيل الشاشة إلى تطبيق Transformer التجريبي.
    • أضِف #getInputFormat() إلى واجهة Codec.
    • يجب نقل مسؤولية تحرير GlObjectsProvider إلى المتصل في DefaultVideoFrameProcessor وDefaultVideoCompositor عندما يكون ذلك ممكنًا.
  • أدوات استخراج البيانات:
    • ‫AVI: إصلاح معالجة الملفات التي تتضمّن صوتًا مضغوطًا بمعدل بت ثابت حيث يخزّن عنوان البث عدد وحدات البايت بدلاً من عدد الأجزاء.
    • إصلاح معالجة وحدات NAL التي يتم التعبير عن أطوالها ببايت واحد أو بايتَين (بدلاً من 4 بايتات).
    • إصلاح ArrayIndexOutOfBoundsException في قوائم تعديل ملفات MP4 عندما تبدأ قائمة التعديل بإطار غير متزامن بدون إطار متزامن سابق (#2062)
    • تم إصلاح المشكلة التي قد تؤدي إلى توقّف بث TS على بعض الأجهزة (#2069).
    • ‫FLAC: إضافة إمكانية استخدام ملفات FLAC بمعدّل 32 بت في السابق، كان يتعذّر تشغيل هذه الفيديوهات مع IllegalStateException: Playback stuck buffering and not loading (#2197).
  • الصوت:
    • تم تعديل onAudioPositionAdvancing ليتم استدعاؤه عند استئناف التشغيل (كان يتم استدعاؤه سابقًا عند إيقاف التشغيل مؤقتًا).
    • عدم تجاوز SonicAudioProcessor عندما يتم ضبط SpeedChangingAudioProcessor باستخدام المَعلمات التلقائية
    • تم إصلاح مشكلة نقص سعة التخزين المؤقت في Sonic#getOutputSize() التي قد تؤدي إلى توقّف DefaultAudioSink.
    • يجب إصلاح MediaCodecAudioRenderer.getDurationToProgressUs() وDecoderAudioRenderer.getDurationToProgressUs() لكي تؤدي عمليات البحث إلى إعادة ضبط المدد المقدَّمة بشكل صحيح.
    • اجعل الرقم androidx.media3.common.audio.SonicAudioProcessor نهائيًا.
    • أضفنا إمكانية استخدام PCM ذي الفاصلة العائمة في ChannelMappingAudioProcessor وTrimmingAudioProcessor.
  • الفيديو:
    • تغيير MediaCodecVideoRenderer.shouldUsePlaceholderSurface إلى محمي حتى تتمكّن التطبيقات من تجاهل ذلك وحظر استخدام مساحات العناصر النائبة (#1905).
    • إضافة تحليل تجريبي ExoPlayer لاعتمادية عيّنات AV1 من أجل تسريع عملية البحث يمكنك تفعيلها باستخدام واجهة برمجة التطبيقات الجديدة DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies.
    • أضِف واجهة برمجة التطبيقات التجريبية ExoPlayer لإسقاط مخازن مؤقتة لبيانات إدخال برنامج الترميز MediaCodecVideoRenderer المتأخرة التي لا تعتمد عليها. يمكنك تفعيلها باستخدام DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs.
    • تم إصلاح مشكلة كان فيها اللاعب الذي لا يملك سطحًا جاهزًا على الفور، وكان فك ترميز أي إطارات معلّقة بطيئًا جدًا (#1973).
    • استبعِد أجهزة Xiaomi وOPPO من وضع &quot;السطح المنفصل&quot; لتجنُّب وميض الشاشة (#2059).
  • النص:
    • إتاحة ترجمة VobSub‏ (‎#8260)
    • إيقاف التحميل المسبق لجميع ملفات الترجمة والشرح التي تم ضبطها باستخدام MediaItem.Builder.setSubtitleConfigurations، والتحميل المسبق لملف واحد فقط في حال اختياره من خلال أداة اختيار مقاطع الفيديو (#1721)
    • ‫TTML: إضافة إمكانية الإشارة إلى tts:origin وtts:extent باستخدام style (#2953)
    • يجب أن تكون الطوابع الزمنية في ملفات WebVTT وSubRip مؤلّفة من 3 منازل عشرية بالضبط. في السابق، كنا نحلّل بشكل غير صحيح أي عدد من المنازل العشرية، ولكننا كنا نفترض دائمًا أنّ القيمة بالملي ثانية، ما يؤدي إلى طوابع زمنية غير صحيحة (#1997).
    • إصلاح مشكلة تعليق التشغيل عندما تحتوي قائمة تشغيل على مقاطع تتضمّن ترجمة وشرحًا بتنسيق CEA-608 أو CEA-708
    • إصلاح الخطأ IllegalStateException عندما يحتوي ملف SSA على إشارة مدتها صفر (وقت البدء ووقت الانتهاء متساويان) (#2052)
    • إخفاء (وتسجيل) أخطاء تحليل الترجمة والشرح عند دمجها في الحاوية نفسها التي تضم الصوت والفيديو (#2052)
    • تم إصلاح مشكلة معالجة أحرف UTF-8 المتعددة البايتات في ملفات WebVTT باستخدام نهايات الأسطر CR (‎#2167).
  • DRM:
    • تم إصلاح الخطأ MediaCodec$CryptoException: Operation not supported in this configuration الذي يحدث عند تشغيل محتوى ClearKey على الأجهزة التي تعمل بإصدار أقل من 27 لواجهة برمجة التطبيقات (#1732).
  • التأثير:
    • تم نقل وظيفة OverlaySettings إلى StaticOverlaySettings. يمكن إنشاء فئة فرعية من OverlaySettings للسماح بإعدادات تراكب ديناميكية.
  • Muxers:
    • تم نقل MuxerException خارج واجهة Muxer لتجنُّب اسم مؤهَّل طويل جدًا.
    • تمت إعادة تسمية طريقة setSampleCopyEnabled() إلى setSampleCopyingEnabled() في كل من Mp4Muxer.Builder وFragmentedMp4Muxer.Builder.
    • تعرض الآن Mp4Muxer.addTrack() وFragmentedMp4Muxer.addTrack() معرّف مسار int بدلاً من TrackToken.
    • لم يعُد Mp4Muxer وFragmentedMp4Muxer ينفّذان واجهة Muxer.
    • إيقاف Mp4Muxer تجميع العيّنات ونسخها تلقائيًا
    • تم إصلاح خطأ في FragmentedMp4Muxer يؤدي إلى إنشاء الكثير من الأجزاء عند كتابة المقطع الصوتي فقط.
  • الجلسة:
    • الاحتفاظ بحالة الخدمة التي تعمل في المقدّمة لمدة 10 دقائق إضافية عند إيقاف التشغيل مؤقتًا أو إيقافه أو تعذّره ويسمح ذلك للمستخدمين باستئناف التشغيل خلال فترة المهلة هذه بدون التعرّض لخطر فرض قيود على الخدمة التي تعمل في المقدّمة على الأجهزة المختلفة. يُرجى العِلم أنّه لم يعُد بإمكانك استخدام استدعاء player.pause() لإيقاف الخدمة التي تعمل في المقدّمة قبل stopSelf() عند إلغاء onTaskRemoved، بل عليك استخدام MediaSessionService.pauseAllPlayersAndStopSelf() بدلاً من ذلك.
    • إبقاء الإشعار مرئيًا عندما يحدث خطأ في التشغيل أو يتوقف. لا تتم إزالة الإشعار إلا إذا تم محو قائمة التشغيل أو تم إيقاف المشغّل.
    • تحسين طريقة التعامل مع إجراءات MediaSession في منصة Android،‏ ACTION_PLAY وACTION_PAUSE، لضبط أحدهما فقط وفقًا للأوامر المتاحة، وقبول ضبط أحدهما فقط.
    • أضِف Context كمَعلمة إلى MediaButtonReceiver.shouldStartForegroundService (#1887).
    • تم إصلاح الخطأ الذي كان يؤدي إلى تجاهل التغييرات من عملية تعديل معلّقة عند استدعاء طريقة Player في MediaController مرتبطة بجلسة قديمة.
    • إتاحة قبول قيمة فارغة في MediaSession.setSessionActivity(PendingIntent)(#2109)
    • إصلاح الخطأ الذي كان يؤدي إلى بقاء إشعار قديم مرئيًا عند محو قائمة التشغيل (#2211)
  • UI:
    • أضِف عناصر قابلة للإنشاء وحاويات للحالة إلى الوحدة media3-ui-compose من أجل PlayerSurface وPresentationState وPlayPauseButtonState وNextButtonState وPreviousButtonState وRepeatButtonState وShuffleButtonState وPlaybackSpeedState.
  • عمليات التنزيل:
    • إصلاح الخطأ في CacheWriter الذي يترك مصادر البيانات مفتوحة ومناطق ذاكرة التخزين المؤقت مقفلة في حال عرض مصدر البيانات للخطأ Exception غير IOException (#9760).
  • إضافة HLS:
    • أضِف الإصدار الأول من HlsInterstitialsAdsLoader. يقرأ أداة تحميل الإعلانات الإعلانات البينية المتوافقة مع بروتوكول HLS في قائمة تشغيل الوسائط المتوافقة مع بروتوكول HLS، ويربطها بـ AdPlaybackState الذي يتم تمريره إلى AdsMediaSource. لا يتوافق هذا الإصدار الأوّلي إلا مع بث HLS VOD الذي يتضمّن سمات X-ASSET-URI.
    • أضِف HlsInterstitialsAdsLoader.AdsMediaSourceFactory. ويمكن للتطبيقات استخدامها لإنشاء مثيلات AdsMediaSource تستخدم HlsInterstitialsAdsLoader بطريقة مريحة وآمنة.
    • تحليل العلامة SUPPLEMENTAL-CODECS من قائمة تشغيل HLS لرصد تنسيقات Dolby Vision (#1785)
    • تخفيف شرط البحث عن مزامنة المواضع في بث مباشر وفق بروتوكول HTTP ‏(HLS) (‫2209#)
  • إضافة DASH:
    • إضافة دعم تنسيق AC-4 المستوى 4 إلى DASH (#1898)
    • تم حلّ مشكلة عند احتساب الفاصل الزمني للتحديث من أجل إدراج الإعلانات في عمليات البث المباشر المتعددة الفترات (#1698).
    • تحليل السمة scte214:supplementalCodecs من بيان DASH لرصد تنسيقات Dolby Vision (#1785)
    • تحسين معالجة عمليات الانتقال بين الفترات في أحداث البث المباشر التي تحتوي فيها الفترة على عيّنات وسائط تتجاوز مدة الفترة المحدّدة (#1698)
    • تم إصلاح المشكلة التي يتم فيها دمج مجموعات التكيّف التي تحمل العلامة adaptation-set-switching ولكنها تتضمّن لغات أو علامات أدوار مختلفة (#2222).
  • إضافات برامج الترميز (FFmpeg وVP9 وAV1 وما إلى ذلك):
    • أضِف وحدة فك ترميز MPEG-H التي تستخدم أداة فك ترميز MPEG-H المضمّنة لفك ترميز الصوت MPEG-H (#1826).
  • إضافة MIDI:
    • إدخال مثيلات AudioSink وAudioRendererEventListener المخصّصة في MidiRenderer
  • إضافة البث:
    • تمت ترقية إصدار التبعية play-services-cast-framework إلى 21.5.0 لإصلاح عطل FLAG_MUTABLE في التطبيقات التي تستهدف المستوى 34 من واجهة برمجة التطبيقات أو المستويات الأحدث على الأجهزة التي تم تثبيت &quot;خدمات Google Play&quot; عليها ولكن تم إيقافها (#2178).
  • التطبيق التجريبي:
    • يمكنك توسيع نطاق demo-compose باستخدام أزرار إضافية وتحسين تكامل PlayerSurface من خلال إتاحة التكبير/التصغير واستخدام الغالق.
  • إزالة الرموز المتوقّفة نهائيًا:
    • إزالة الطريقة المتوقّفة نهائيًا AudioMixer.create() استخدِم DefaultAudioMixer.Factory().create() بدلاً من ذلك.
    • أزِل طرق Transformer.Builder المتوقّفة نهائيًا التالية:
      • setTransformationRequest()، يُرجى استخدام setAudioMimeType() وsetVideoMimeType() وsetHdrMode() بدلاً منها.
      • setAudioProcessors()، اضبط معالج الصوت في EditedMediaItem.Builder.setEffects()، ثم مرِّره إلى Transformer.start() بدلاً من ذلك.
      • setVideoEffects()، اضبط تأثير الفيديو في EditedMediaItem.Builder.setEffects()، ثم أرسِله إلى Transformer.start() بدلاً من ذلك.
      • setRemoveAudio()، استخدِم EditedMediaItem.Builder.setRemoveAudio() لإزالة الصوت من EditedMediaItem الذي تم تمريره إلى Transformer.start() بدلاً من ذلك.
      • setRemoveVideo()، استخدِم EditedMediaItem.Builder.setRemoveVideo() لإزالة الفيديو من EditedMediaItem الذي تم تمريره إلى Transformer.start() بدلاً من ذلك.
      • setFlattenForSlowMotion()، استخدِم EditedMediaItem.Builder.setFlattenForSlowMotion() لتسوية EditedMediaItem التي تم تمريرها إلى Transformer.start() بدلاً من ذلك.
      • setListener()، يُرجى استخدام addListener() أو removeListener() أو removeAllListeners() بدلاً منها.
    • أزِل طرق Transformer.Listener المتوقّفة نهائيًا التالية:
      • onTransformationCompleted(MediaItem)، استخدِم onCompleted(Composition, ExportResult) بدلاً من ذلك.
      • onTransformationCompleted(MediaItem, TransformationResult)، استخدِم onCompleted(Composition, ExportResult) بدلاً من ذلك.
      • onTransformationError(MediaItem, Exception)، استخدِم onError(Composition, ExportResult, ExportException) بدلاً من ذلك.
      • onTransformationError(MediaItem, TransformationException)، استخدِم onError(Composition, ExportResult, ExportException) بدلاً من ذلك.
      • onTransformationError(MediaItem, TransformationResult, TransformationException)، استخدِم onError(Composition, ExportResult, ExportException) بدلاً من ذلك.
      • onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest)، استخدِم onFallbackApplied(Composition, TransformationRequest, TransformationRequest) بدلاً من ذلك.
    • إزالة الفئة TransformationResult المتوقّفة نهائيًا استخدِم ExportResult بدلاً من ذلك.
    • إزالة الفئة TransformationException المتوقّفة نهائيًا استخدِم ExportException بدلاً من ذلك.
    • إزالة Transformer.PROGRESS_STATE_NO_TRANSFORMATION المتوقّف نهائيًا استخدِم Transformer.PROGRESS_STATE_NOT_STARTED بدلاً من ذلك.
    • إزالة Transformer.setListener() المتوقّف نهائيًا استخدِم Transformer.addListener() أو Transformer.removeListener() أو Transformer.removeAllListeners() بدلاً من ذلك.
    • إزالة Transformer.startTransformation() المتوقّف نهائيًا استخدِم Transformer.start(MediaItem, String) بدلاً من ذلك.
    • إزالة SingleFrameGlShaderProgram المتوقّف نهائيًا استخدِم BaseGlShaderProgram بدلاً من ذلك.
    • إزالة Transformer.flattenForSlowMotion استخدِم EditedMediaItem.flattenForSlowMotion بدلاً من ذلك.
    • تمت إزالة ExoPlayer.VideoComponent وExoPlayer.AudioComponent وExoPlayer.TextComponent وExoPlayer.DeviceComponent.
    • تمت إزالة androidx.media3.exoplayer.audio.SonicAudioProcessor.
    • تمت إزالة طرق DownloadHelper المتوقّفة نهائيًا التالية:
      • استخدِم الدالة الإنشائية DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]) بدلاً من DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList).
      • يمكن تحقيق وظائف مكافئة getRendererCapabilities(RenderersFactory) من خلال إنشاء DefaultRendererCapabilitiesList باستخدام RenderersFactory واستدعاء DefaultRendererCapabilitiesList.getRendererCapabilities().
    • تمت إزالة الطريقة PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat). استخدِم PlayerNotificationManager.setMediaSessionToken(MediaSession.Token) و(MediaSession.Token) compatToken.getToken() بدلاً من ذلك.

‫1.6.0-rc02

‫19 مارس 2025

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

‫1.6.0-rc01

‫12 مارس 2025

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

‫1.6.0-beta01

‫26 فبراير 2025

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

الإصدار 1.6.0-alpha03

‫6 فبراير 2025

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

الإصدار 1.6.0-alpha02

‫30 يناير 2025

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

الإصدار 1.6.0-alpha01

‫20 ديسمبر 2024

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

الإصدار 1.5

الإصدار 1.5.1

‫19 ديسمبر 2024

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

  • ExoPlayer:
    • إيقاف استخدام فك التشفير غير المتزامن في MediaCodec لتجنُّب مشاكل انتهاء المهلة التي تم الإبلاغ عنها في برنامج الترميز مع واجهة برمجة التطبيقات هذه (‎#1641).
  • أدوات استخراج البيانات:
    • ‫MP3: لا توقِف التشغيل مبكرًا عندما لا يغطّي جدول محتويات إطار VBRI جميع بيانات MP3 في ملف (‫#1904).
  • الفيديو:
    • تم التراجع عن استخدام قيم نسبة عرض البكسل إلى ارتفاعه MediaCodecAdapter المقدَّمة عند توفيرها أثناء معالجة onOutputFormatChanged (#1371).
  • النص:
    • إصلاح الخطأ في ReplacingCuesResolver.discardCuesBeforeTimeUs الذي كان يؤدي إلى تجاهل الإشارة النشطة في timeUs (بدأت قبل ذلك ولكنها لم تنتهِ بعد) بشكل غير صحيح (#1939)
  • البيانات الوصفية:
    • استخراج أرقام الأقراص/المقاطع الموسيقية والنوع من تعليقات Vorbis إلى MediaMetadata (#1958).

الإصدار 1.5.0

‫27 نوفمبر 2024

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

  • المكتبة المشتركة:
    • أضِف ForwardingSimpleBasePlayer التي تتيح إعادة التوجيه إلى مشغّل آخر مع إجراء تعديلات بسيطة مع ضمان التوافق الكامل والتعامل مع المستمعين (#1183).
    • استبدِل SimpleBasePlayer.State.playlist بالطريقة getPlaylist().
    • أضِف عملية إلغاء لـ SimpleBasePlayer.State.Builder.setPlaylist() لتحديد Timeline وTracks وMetadata الحالية مباشرةً بدلاً من إنشاء بنية قائمة تشغيل.
    • زيادة قيمة minSdk إلى 21 (Android Lollipop) يتوافق ذلك مع جميع مكتبات AndroidX الأخرى.
    • أضِف حزمة androidx.media3:media3-common-ktx توفّر وظائف خاصة بلغة Kotlin تستند إلى المكتبة المشتركة.
    • أضِف دالة تعليق مؤقت إلى دالة الإضافة لتشغيل روتين فرعي للاستماع إلى Player.Events في مكتبة media3-common-ktx.Player.listen
    • إزالة التعليقات التوضيحية @DoNotInline من الفئات الداخلية التي تم إعدادها يدويًا خارج السطر لتجنُّب أخطاء التحقّق من الفئة في وقت التشغيل تتجاهل الإصدارات الحديثة من R8 تلقائيًا عمليات الاستدعاء غير المضمّنة لتجنُّب حدوث أخطاء أثناء وقت التشغيل (وبالتالي، لم يعُد من الضروري تجاهل عمليات الاستدعاء يدويًا). يجب أن يكون جميع مستخدمي Gradle الذين يستخدمون إصدارًا أقدم من 0x0A قد استخدموا إصدارًا من "مكوّن Android الإضافي في Gradle" يستخدِم إصدارًا من R8 يتيح ذلك، بسبب compileSdk = 35. على مستخدمي المكتبة الذين لديهم أنظمة إنشاء غير Gradle التأكّد من أنّ خطوة التصغير/التشويش المكافئة لـ R8 تنفّذ عملية مماثلة تلقائية لإزالة التداخل لتجنُّب حدوث أخطاء في التحقّق من فئة وقت التشغيل. تم إجراء هذا التغيير في مكتبات AndroidX الأخرى.
  • ExoPlayer:
    • يمكن الآن طلب MediaCodecRenderer.onProcessedStreamChange() لكل عنصر وسائط. في السابق، لم يكن يتم تحصيل رسوم مقابل أول عملية. استخدِم MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart() لتفعيل هذه الميزة.
    • أضِف PreloadMediaSource.PreloadControl.onPreloadError للسماح بتنفيذ PreloadMediaSource.PreloadControl لإجراءات عند حدوث خطأ.
    • أضِف BasePreloadManager.Listener لنشر أحداث التحميل المُسبَق إلى التطبيقات.
    • السماح بتغيير مهلة برنامج SNTP وإعادة محاولة العناوين البديلة عند انتهاء المهلة (#1540)
    • إزالة الحقل MediaCodecAdapter.Configuration.flags لأنّ قيمته كانت دائمًا صفرًا.
    • السماح للمستخدم باختيار مكبّر الصوت المدمج لتشغيل المحتوى على الإصدار 35 من Wear OS API أو الإصدارات الأحدث (حيث يعلن الجهاز عن إتاحة هذه الميزة)
    • تأجيل حظر المكالمة إلى Context.getSystemService(Context.AUDIO_SERVICE) إلى حين تفعيل ميزة التعامل مع التركيز الصوتي يضمن ذلك عدم حظر المكالمة إذا لم يتم تفعيل ميزة معالجة التركيز الصوتي (#1616).
    • السماح بالتشغيل بغض النظر عن مدة التخزين المؤقت عند تعذُّر التحميل (#1571)
    • أضِف AnalyticsListener.onRendererReadyChanged() للإشارة إلى الوقت الذي تسمح فيه أدوات العرض الفردية بأن يصبح التشغيل جاهزًا.
    • تم إصلاح المشكلة التي تؤدي إلى ظهور الخطأ MediaCodec.CryptoException أحيانًا على أنّه "خطأ غير متوقّع في وقت التشغيل" عند تشغيل MediaCodec في الوضع غير المتزامن (السلوك التلقائي على الإصدار 31 من واجهة برمجة التطبيقات أو الإصدارات الأحدث).
    • مرِّر bufferedDurationUs بدلاً من bufferedPositionUs مع PreloadMediaSource.PreloadControl.onContinueLoadingRequested(). تتضمّن هذه السمة أيضًا تغييرًا من DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS إلى DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS، ويجب أن تمرّر التطبيقات بعد ذلك قيمة تمثّل مدة معيّنة من موضع البدء التلقائي الذي يجب أن يتم التحميل المُسبَق لمصدر الوسائط المقابل باستخدام IntDef هذا، بدلاً من موضع.
    • أضِف عملية تنفيذ ForwardingRenderer تعيد توجيه جميع طلبات الطرق إلى أداة عرض أخرى (1703).
    • إضافة ميزة التحميل المُسبَق لقوائم التشغيل للعنصر التالي في قائمة التشغيل يمكن للتطبيقات تفعيل التحميل المُسبَق من خلال استدعاء ExoPlayer.setPreloadConfiguration(PreloadConfiguration) وفقًا لذلك. يكون التحميل المُسبق غير مفعَّل تلقائيًا. عند تفعيل ميزة التحميل المسبق، لا تتداخل DefaultLoadControl مع التشغيل، بل تقتصر على البدء والاستمرار فقط عندما لا يتم تحميل المشغّل للتشغيل. يمكن للتطبيقات تغيير هذا السلوك من خلال تنفيذ LoadControl.shouldContinuePreloading() وفقًا لذلك (مثلما يحدث عند تجاوز هذه الطريقة في DefaultLoadControl). يؤدي التنفيذ التلقائي لـ LoadControl إلى إيقاف التحميل المُسبَق في حال كان التطبيق يستخدم تنفيذًا مخصّصًا لـ LoadControl.
    • إضافة الطريقة MediaSourceEventListener.EventDispatcher.dispatchEvent() للسماح باستدعاء أحداث أدوات معالجة الفئة الفرعية (1736)
    • أضِف DefaultPreloadManager.Builder الذي ينشئ مثيلات DefaultPreloadManager وExoPlayer باستخدام إعدادات مشتركة بشكل متّسق.
    • أزِل المَعلمة Renderer[] من LoadControl.onTracksSelected() لأنّ عملية تنفيذ DefaultLoadControl يمكنها استرداد أنواع البث من ExoTrackSelection[].
    • تم إيقاف DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) نهائيًا وتم وضع علامة على الطريقة باعتبارها نهائية لمنع عمليات التجاوز. يجب استخدام DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]) الجديد بدلاً من ذلك.
    • تسجيل بيانات أحداث MediaSourceEventListener من مصادر ثانوية في MergingMediaSource سيؤدي ذلك إلى تسجيل أحداث بدء التحميل/الخطأ/الإلغاء/الاكتمال للترجمة والشرح المحمّلة بشكل جانبي (تلك التي تمت إضافتها باستخدام MediaItem.LocalConfiguration.subtitleConfigurations)، والتي قد تظهر كأحداث تحميل مكرّرة صادرة من AnalyticsListener.
    • منع أخطاء الترجمة والبيانات الوصفية من إيقاف التشغيل تمامًا بدلاً من ذلك، يتم إيقاف المقطع الصوتي الذي يتضمّن المشكلة ويستمر تشغيل المقاطع الصوتية المتبقية (#1722).
      • في عملية معالجة الترجمة والشرح الجديدة (أثناء الاستخراج)، يتم إرسال أخطاء التحليل المرتبطة (مثل بيانات الترجمة والشرح غير الصالحة) وأخطاء التحميل (مثل HTTP 404) من خلال عمليات معاودة الاتصال onLoadError.
      • في معالجة الترجمة والشرح القديمة (أثناء العرض)، يتم إرسال أخطاء التحميل المرتبطة فقط من خلال عمليات رد الاتصال onLoadError، بينما يتم تجاهل أخطاء التحليل بدون إشعار (هذا السلوك موجود مسبقًا).
    • تم إصلاح الخطأ الذي كان يؤدي إلى توقّف عرض الإطارات في نهاية عناصر قائمة التشغيل أو الفترات في بثوق DASH المتعددة الفترات التي تتضمّن مدة لا تتطابق مع المحتوى الفعلي (‫1698#).
    • إضافة دالة setter إلى SntpClient لضبط الحد الأقصى للوقت المنقضي منذ آخر تعديل، وبعده تتم إعادة تهيئة العميل (#1794).
  • المحوّل:
    • أضِف SurfaceAssetLoader، الذي يتيح وضع بيانات الفيديو في قائمة انتظار Transformer من خلال Surface.
    • تعرض الدالة ImageAssetLoader تقارير عن الإدخال غير المتوافق من خلال AssetLoader.onError بدلاً من عرض IllegalStateException.
    • اجعل ضبط مدة عرض الصورة باستخدام MediaItem.Builder.setImageDurationMs إلزاميًا عند تصدير الصورة.
    • إضافة إمكانية تصدير الفجوات في تسلسلات EditedMediaItems الصوتية
  • اختيار المقطع الصوتي:
    • DefaultTrackSelector: يجب تفضيل الصوت المستند إلى عناصر على الصوت المستند إلى قنوات عندما تكون العوامل الأخرى متساوية.
  • أدوات استخراج البيانات:
    • السماح لـ Mp4Extractor وFragmentedMp4Extractor بتحديد عيّنات H264 التي لا تستخدم كمرجع للعيّنات اللاحقة
    • إضافة خيار لتفعيل البحث المستند إلى الفهرس في AmrExtractor
    • يجب التعامل مع ملفات MP3 التي تتضمّن أكثر من 128 كيلوبايت بين الإطارات الصالحة على أنّها مقطوعة (بدلاً من غير صالحة). هذا يعني أنّ الملفات التي تتضمّن بيانات غير MP3 في نهايتها، بدون أي بيانات وصفية أخرى للإشارة إلى طول وحدات بايت MP3، ستتوقف الآن عن التشغيل عند نهاية بيانات MP3 بدلاً من عرض الخطأ ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
    • تم إصلاح مشكلة معالجة عيّنات الإعلانات التمهيدية لمواضع بدء الوسائط غير إطارات المفاتيح عند معالجة قوائم التعديل في ملفات MP4 ‏(‫#1659).
    • تم تحسين عملية احتساب عدد اللقطات في الثانية من خلال استخدام مدة الوسائط من المربّع mdhd في Mp4Extractor وFragmentedMp4Extractor (#1531).
    • إصلاح مشكلة تغيير الحجم بشكل غير صحيح في media_time في قوائم تعديل ملفات MP4 مع أنّ segment_duration كان يتم قياسه بشكل صحيح باستخدام مقياس الوقت الخاص بالفيلم، يتم الآن قياس media_time بشكل صحيح باستخدام مقياس الوقت الخاص بالمقطع، كما هو محدّد في معيار تنسيق MP4 (#1792).
    • التعامل مع اللقطات غير المرتبة في عملية احتساب endIndices لملفات MP4 التي تتضمّن قائمة تعديل (#1797)
    • تم إصلاح تحليل مدة الوسائط في المربّع mdhd لملفات MP4 من أجل التعامل مع القيم -1 (#1819).
    • إضافة إمكانية تحديد المربّع h263 في ملفات MP4 لفيديو H.263 (#1821)
    • إضافة دعم لتنسيق ملفات الوسائط الأساسية ISO من المستوى 4 بتنسيق AC-4 (#1265)
  • DataSource:
    • تعديل HttpEngineDataSource للسماح باستخدامه بدءًا من الإصدار S extension 7 بدلاً من المستوى 34 لواجهة برمجة التطبيقات (#1262)
    • DataSourceContractTest: تأكَّد من أنّ DataSource.getUri() تعرض عنوان URI الذي تم تحويله (كما هو موضّح في المستندات). وفي حال اختلاف ذلك عن معرّف الموارد الموحّد المطلوب، يمكن أن تشير الاختبارات إلى ذلك باستخدام الطريقة الجديدة DataSourceContractTest.TestResource.Builder.setResolvedUri().
    • DataSourceContractTest: تأكَّد من أنّ DataSource.getUri() وgetResponseHeaders() تعرضان القيمة "مفتوح" بعد تعذُّر إجراء طلب إلى open() (بسبب عدم العثور على المورد) وقبل إجراء طلب close() لاحق.
      • تتيح عملية إلغاء DataSourceContractTest.getNotFoundResources() لفئات الاختبار الفرعية توفير مراجع متعددة "لم يتم العثور عليها"، كما تتيح توفير أي عناوين متوقّعة أيضًا. يتيح ذلك التمييز بين الخطأ HTTP 404 (مع العناوين) والخطأ "لم يتم العثور على الخادم" (بدون عناوين).
  • الصوت:
    • ضبط البيانات الوصفية لمستوى الصوت وفقًا لمعيار CTA-2075 تلقائيًا على برنامج الترميز إذا كانت متوفّرة في الوسائط
    • ضمان خفض مستوى الصوت بسلاسة عند البحث
    • إصلاح أصوات النقر التي قد تحدث أثناء عمليات البحث
    • إصلاح تراكم أخطاء الاقتطاع في خوارزمية Sonic لتغيير سرعة التشغيل/درجة الصوت
    • تم إصلاح الخطأ في SpeedChangingAudioProcessor الذي يتسبب في حذف إطارات الإخراج.
  • الفيديو:
    • يتجنّب MediaCodecVideoRenderer فك ترميز العيّنات التي لا يتم عرضها ولا يتم استخدامها كمرجع من قِبل عيّنات أخرى.
    • في الإصدار 35 من واجهة برمجة التطبيقات والإصدارات الأحدث، يمكن أن تتلقّى MediaCodecAdapter الآن null Surface في configure واستدعاءات إلى طريقة جديدة detachOutputSurface لإزالة Surface تم ضبطه سابقًا إذا كان برنامج الترميز يتيح ذلك (MediaCodecInfo.detachedSurfaceSupported).
    • استخدِم قيم نسبة عرض البكسل إلى ارتفاعه MediaCodecAdapter المقدَّمة إذا تم توفيرها عند معالجة onOutputFormatChanged (#1371).
    • تمت إضافة حلّ بديل لمشكلة في جهاز Galaxy Tab S7 FE تؤدي إلى وضع علامة &quot;غير متوافق&quot; على عمليات بث H264 الآمنة بمعدل 60 إطارًا في الثانية (#1619).
    • إضافة حلّ بديل لبرامج الترميز التي تتوقف بعد آخر عيّنة بدون عرض إشارة نهاية البث.
  • النص:
    • أضِف VoiceSpan مخصّصًا واملأه بـ فترات صوت WebVTT (#1632).
    • يجب التأكّد من عرض ملفات WebVTT في HLS التي تتضمّن طوابع زمنية كبيرة جدًا للترجمة والشرح (والتي تتجاوز long 64 بت عند تمثيلها بالميكروثانية وضربها في 90,000 MPEG timebase) (#1763).
    • إتاحة ترجمة CEA-608 في محتوى Dolby Vision (#1820)
    • إصلاح مشكلة تعليق التشغيل في أحداث البث المتعددة الفترات بتنسيق DASH عند تفعيل الترجمة والشرح بتنسيق CEA-608 (#1863)
  • البيانات الوصفية:
    • عيِّن النوع C.TRACK_TYPE_METADATA للمقاطع الصوتية التي تتضمّن محتوى icy أو vnd.dvb.ait.
  • الصورة:
    • إضافة ExternallyLoadedImageDecoder لتبسيط عملية الدمج مع مكتبات تحميل الصور الخارجية، مثل Glide أو Coil
  • DataSource:
    • أضِف FileDescriptorDataSource، وهو DataSource جديد يمكن استخدامه للقراءة من FileDescriptor (#3757).
  • التأثير:
    • إضافة DefaultVideoFrameProcessor حلّ بديل لمشكلة SurfaceTexture تغيير الحجم الطفيف قد يتضمّن SurfaceTexture تغييرًا بسيطًا في الحجم يؤدي إلى قطع حدود بعرض بكسل واحد حول حافة المخزن المؤقت الذي تم اقتصاصه. يتم الآن التعامل مع هذه الحالة بطريقة تجعل الناتج أقرب إلى المتوقّع.
    • تسريع DefaultVideoFrameProcessor.queueInputBitmap() نتيجةً لذلك، أصبح بإمكانك تصدير الصور إلى فيديوهات باستخدام Transformer بشكل أسرع.
  • إضافة "إعلانات الوسائط التفاعلية":
    • تم إصلاح الخطأ الذي قد يؤدي فيه محو قائمة التشغيل إلى حدوث خطأ ArrayIndexOutOfBoundsException في ImaServerSideAdInsertionMediaSource.
    • تم إصلاح الخطأ الذي كان يؤدي إلى ظهور ArrayIndexOutOfBoundsException عند تشغيل بث مباشر يتضمّن إعلانات ديناميكية مدرَجة من جهة الخادم بدون إعلان تمهيدي، وذلك بعد تجاوز آخر إعلان أثناء التشغيل (#1741).
  • الجلسة:
    • أضِف MediaButtonReceiver.shouldStartForegroundService(Intent) للسماح للتطبيقات بمنع تنفيذ أمر تشغيل وارد لاستئناف التشغيل من خلال إلغاء هذه الطريقة. يتم بدء الخدمة دائمًا بشكل تلقائي، ولا يمكن إيقاف التشغيل بدون أن يعطّل النظام الخدمة بسبب الخطأ ForegroundServiceDidNotStartInTimeException (#1528).
    • تم إصلاح الخطأ الذي كان يتسبّب في إرسال الأوامر المخصّصة من MediaBrowser إلى MediaSessionCompat.Callback بدلاً من إصدار MediaBrowserServiceCompat من الطريقة عند الاتصال بخدمة قديمة. وقد أدّى ذلك إلى منع MediaBrowser من تلقّي قيمة العائد الفعلية التي أرسلتها الخدمة القديمة (#1474).
    • التعامل مع الخطأ IllegalArgumentException الذي تعرضه أجهزة بعض الشركات المصنّعة عند ضبط أداة استقبال البث لتلقّي طلبات تنفيذ إجراءات زر الوسائط (‎#1730)
    • إضافة أزرار أوامر لعناصر الوسائط يؤدي ذلك إلى إضافة Media3 API إلى ما كان يُعرف باسم Custom browse actions مع المكتبة القديمة التي تحمل الرقم MediaBrowserCompat. يُرجى العِلم أنّ أزرار أوامر Media3 لعناصر الوسائط متاحة لكل من MediaBrowser وMediaController. يمكنك الاطّلاع على إجراءات التصفّح المخصّصة في نظام التشغيل Android Automotive.
    • تم إصلاح الخطأ الذي كان يؤدي أحيانًا إلى عدم تمكُّن وحدة التحكّم Media3 من السماح لتطبيق جلسة ببدء خدمة تعمل في المقدّمة بعد طلب play().
    • يجب حصر CommandButton.Builder.setIconUri في قبول معرّفات الموارد المنتظمة (URI) الخاصة بالمحتوى فقط.
    • تمرير إشارات ربط متصفّح Media3 إلى MediaBrowserCompat الأولي عند الربط بـ MediaBrowserCompat قديم يمكن للخدمة تلقّي تلميحات الاتصال التي تم تمريرها كتلميحات جذرية مع أول طلب إلى onGetRoot().
    • تم إصلاح الخطأ الذي كان يؤدي إلى عدم تلقّي MediaBrowser المرتبط بخدمة متصفّح قديمة للخطأ الذي أرسلته الخدمة بعد اشتراك المتصفّح في parentid.
    • تحسين سلوك التشغيل التفاعلي، كي لا يطلب متصفّح Media3 المرتبط بـ MediaBrowserService القديم عناصر parentId مرتين عند الاشتراك في عنصر رئيسي
  • UI:
    • تفعيل الحلّ البديل للفيديوهات الممدّدة/المقتصة في PlayerViewComposeAndroidView بسبب المشاكل في عمليات الانتقال المشتركة المستندة إلى XML على التطبيقات التي تستخدم PlayerView داخل AndroidView استدعاء PlayerView.setEnableComposeSurfaceSyncWorkaround من أجل الموافقة على المشاركة (#1237, #1594).
    • أضِف setFullscreenButtonState إلى PlayerView للسماح بتحديث رمز زر ملء الشاشة عند الطلب، أي خارج النطاق وليس بشكل تفاعلي عند النقر (#1590 و#184).
    • إصلاح الخطأ الذي لا يعمل فيه الخيار "بلا" في اختيار النص إذا كانت هناك إعدادات مفضّلة لاختيار مسار النص محدّدة في التطبيق.
  • إضافة DASH:
    • إضافة إمكانية استخدام فترات تبدأ في منتصف مقطع (#1440)
  • إضافة Smooth Streaming:
    • تم إصلاح الخطأ Bad magic number for Bundle الذي كان يحدث عند تشغيل بث SmoothStreaming يتضمّن مقاطع نصية (#1779).
  • إضافة RTSP:
    • تم إصلاح مشكلة إزالة معلومات المستخدم من عناوين URL التي تحتوي على أحرف @ مرمّزة (#1138).
    • إصلاح مشكلة التعطُّل عند تحليل حِزم RTP مع امتدادات العناوين (#1225)
  • إضافات برامج الترميز (FFmpeg وVP9 وAV1 وما إلى ذلك):
    • أضِف وحدة فك ترميز IAMF التي تتيح تشغيل ملفات MP4 التي تحتوي على مقاطع IAMF باستخدام مكتبة libiamf الأصلية لتركيب الصوت.
      • يمكن تشغيل المحتوى بتنسيق ستيريو بالإضافة إلى 5.1 مع ميزة "التجسيم الصوتي" وتفعيل ميزة "تتبُّع حركة الرأس" الاختيارية، ولكن لا تتوفّر حاليًا إمكانية تشغيل المحتوى بتنسيق ثنائي الأذن.
    • إضافة إمكانية استخدام صفحات بحجم 16 كيلوبايت مع إضافات برامج الترميز على Android 15 (#1685)
  • إضافة Cast:
    • إيقاف تنظيف المخطط الزمني بعد إلغاء ربط CastSession، ما يتيح لتطبيق المرسِل استئناف التشغيل محليًا بعد إلغاء الربط
    • ملء DeviceInfo الخاص بفئة CastPlayer عند توفير Context يتيح ذلك ربط MediaSession بـ RoutingSession، وهو أمر ضروري لدمج أداة Output Switcher (‎#1056).
  • أدوات الاختبار:
    • يتضمّن DataSourceContractTest الآن اختبارات للتحقّق من:
      • تم تعديل مصدر البيانات read position.
      • يتم تطبيق مخزن البيانات المؤقتة للإخراج offset بشكل صحيح.
  • تطبيق تجريبي
    • حلّ مشاكل تسرُّب الذاكرة في تطبيق العرض التوضيحي القصير(#1839)
  • إزالة الرموز المتوقّفة نهائيًا:
    • إزالة Player.hasPrevious وPlayer.hasPreviousWindow() اللذين تم إيقافهما يمكنك استخدام Player.hasPreviousMediaItem() كبديل.
    • إزالة الطريقة Player.previous() التي تم إيقاف استخدامها استخدِم Player.seekToPreviousMediaItem() بدلاً من ذلك.
    • إزالة الطريقة المتوقّفة نهائيًا DrmSessionEventListener.onDrmSessionAcquired
    • أزِل أدوات إنشاء DefaultEncoderFactory المتوقّفة نهائيًا. استخدِم DefaultEncoderFactory.Builder بدلاً من ذلك.

الإصدار 1.5.0-rc02

‫19 نوفمبر 2024

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

الإصدار 1.5.0-rc01

‫13 نوفمبر 2024

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

الإصدار 1.5.0-beta01

‫30 أكتوبر 2024

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

الإصدار 1.5.0-alpha01

‫10 سبتمبر 2024

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

الإصدار 1.4.0

الإصدار 1.4.1

‫27 أغسطس 2024

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

  • ExoPlayer:
    • التعامل مع عمليات معاودة الاتصال المسبقة التحميل بشكل غير متزامن في PreloadMediaSource (#1568)
    • السماح بالتشغيل بغض النظر عن مدة التخزين المؤقت عند تعذُّر التحميل (#1571)
  • أدوات استخراج البيانات:
    • ‫MP3: إصلاح الخطأ Searched too many bytes من خلال تجاهل البيانات غير التابعة لملف MP3 بشكل صحيح استنادًا إلى حقل الطول في إطار Info (#1480).
  • النص:
    • ‫TTML: تم إصلاح معالجة قيم النسبة المئوية tts:fontSize لضمان اكتسابها بشكل صحيح من العُقد الرئيسية التي تتضمّن قيم النسبة المئوية tts:fontSize.
    • تم إصلاح الخطأ IndexOutOfBoundsException في LegacySubtitleUtil بسبب التعامل غير الصحيح مع حالة وقت بدء الإخراج المطلوب الأكبر من أو يساوي وقت الحدث النهائي في Subtitle (#1516).
  • DRM:
    • إصلاح الخطأ android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE على الأجهزة التي تعمل بالإصدار 31 من واجهة برمجة التطبيقات أو الإصدارات الأحدث عند تشغيل محتوى Widevine L1 يرجع حدوث هذا الخطأ إلى عدم اكتمال تنفيذ طريقة MediaDrm.requiresSecureDecoder في إطار العمل (#1603).
  • التأثير:
    • أضِف طريقة release() إلى GlObjectsProvider.
  • الجلسة:
    • تحويل النقر مرّتين على KEYCODE_HEADSETHOOK إلى إجراء "الانتقال إلى التالي"، كما هو موضّح (#1493).
    • يجب التعامل مع KEYCODE_HEADSETHOOK كأمر "تشغيل" في MediaButtonReceiver عند تحديد ما إذا كان سيتم تجاهله لتجنُّب ForegroundServiceDidNotStartInTimeException (#1581).
  • إضافة RTSP:
    • تخطّي أوصاف الوسائط غير الصالحة عند تحليل بروتوكول وصف الجلسة (SDP) (#1087)

الإصدار 1.4.0

‫25 يوليو 2024

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

  • المكتبة المشتركة:
    • إعادة توجيه طلبات البحث التي يُفترض أنّها لا تؤدي إلى أي عملية إلى الطريقتَين المحميتَين BasePlayer.seekTo() وSimpleBasePlayer.handleSeek() بدلاً من تجاهلها إذا كنت تنفّذ هذه الطرق في مشغّل مخصّص، قد تحتاج إلى معالجة هذه الطلبات الإضافية باستخدام mediaItemIndex == C.INDEX_UNSET.
    • إزالة تبعية وقت التجميع من عملية إزالة التشويش المحسّنة في Java 8 (#1312)
    • تأكَّد من تجاهل المدة التي تم تمريرها إلى MediaItem.Builder.setImageDurationMs() بالنسبة إلى MediaItem غير الصورة (كما هو موثّق).
    • أضِف Format.customData لتخزين معلومات مخصّصة يوفّرها التطبيق حول مثيلات Format.
  • ExoPlayer:
    • أضِف BasePreloadManager الذي ينسّق عملية التحميل المُسبَق لمصادر متعدّدة استنادًا إلى الأولويات المحدّدة في rankingData. يمكن إجراء التخصيص عن طريق توسيع هذه الفئة. أضِف DefaultPreloadManager الذي يستخدم PreloadMediaSource لتحميل عيّنات الوسائط مسبقًا من المصادر إلى الذاكرة، ويستخدم عددًا صحيحًا rankingData يشير إلى فهرس عنصر في واجهة المستخدم.
    • أضِف PlayerId إلى معظم طرق LoadControl لتفعيل عمليات تنفيذ LoadControl التي تتيح مشاركة عدة لاعبين.
    • إزالة Buffer.isDecodeOnly() وC.BUFFER_FLAG_DECODE_ONLY لا حاجة إلى ضبط هذه العلامة لأنّ أدوات العرض وبرامج الترميز ستتجاهل المخازن المؤقتة استنادًا إلى الطابع الزمني. يجب أن تتحقّق عمليات تنفيذ Renderer المخصّصة مما إذا كان وقت التخزين المؤقت BaseRenderer.getLastResetPositionUs() على الأقل لتحديد ما إذا كان يجب عرض عيّنة. يمكن لعمليات التنفيذ المخصّصة SimpleDecoder التحقّق isAtLeastOutputStartTimeUs() إذا لزم الأمر أو وضع علامة DecoderOutputBuffer.shouldBeSkipped على المخازن المؤقتة الأخرى لتخطّيها.
    • السماح بعرض قيمة فارغة من خلال TargetPreloadStatusControl.getTargetPreloadStatus(T) للإشارة إلى عدم التحميل المُسبَق لـ MediaSource باستخدام rankingData المحدّدة
    • إضافة remove(MediaSource) إلى BasePreloadManager
    • أضِف reset() إلى BasePreloadManager لتحرير جميع مصادر التحميل المسبق مع الاحتفاظ بمثيل "أداة إدارة التحميل المسبق".
    • أضِف ExoPlayer.setPriority()Builder.setPriority()) لتحديد قيمة الأولوية المستخدَمة في PriorityTaskManager وأهمية MediaCodec من واجهة برمجة التطبيقات 35.
    • تم إصلاح مشكلة في تعديل آخر وقت لإعادة التخزين المؤقت، ما أدّى إلى ظهور المفتاح bs (نقص في المخزن المؤقت) غير الصحيح في CMCD (#1124).
    • أضِف PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) للإشارة إلى أنّه تم تحميل المصدر إلى النهاية. يتيح ذلك لعمليات التنفيذ DefaultPreloadManager وPreloadMediaSource.PreloadControl المخصّصة التحميل المُسبَق للمصدر التالي أو اتّخاذ إجراءات أخرى.
    • تم إصلاح الخطأ الذي يتسبّب في حدوث استثناء في التشغيل عند تخطّي الصمت في نهاية العناصر.
    • أضِف clear إلى PreloadMediaSource لتجاهل فترة التحميل المُسبق.
    • إضافة رمز خطأ جديد PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED يُستخدَم عند استرداد موارد الترميز والتشفير لمهام ذات أولوية أعلى
    • السماح لـ AdsMediaSource بتحميل الإعلانات قبل التشغيل قبل اكتمال إعداد وسائط المحتوى الأولية (#1358)
    • تم إصلاح الخطأ الذي يؤدي إلى نقل التشغيل إلى STATE_ENDED عند إعادة إعداد بث مباشر بتنسيق DASH متعدد الفترات بعد أن تمت إزالة الفترة الأصلية من ملف البيان.
    • أعِد تسمية onTimelineRefreshed() إلى onSourcePrepared() وonPrepared() إلى onTracksSelected() في PreloadMediaSource.PreloadControl. أعِد أيضًا تسمية IntDefs في DefaultPreloadManager.Stage وفقًا لذلك.
    • أضفنا دعمًا تجريبيًا للجدولة الديناميكية من أجل مواءمة العمل بشكل أفضل مع دورات تنشيط وحدة المعالجة المركزية وتأخير التنشيط إلى حين إمكانية تقدّم أدوات العرض. يمكنك تفعيل هذا الخيار باستخدام experimentalSetDynamicSchedulingEnabled() عند إعداد مثيل ExoPlayer.
    • أضِف Renderer.getDurationToProgressUs(). يمكن Renderer تنفيذ هذه الطريقة لإرجاع المدة التي يجب أن يتقدّم فيها التشغيل إلى ExoPlayer لكي يتقدّم العارض. إذا تم ضبط ExoPlayer على experimentalSetDynamicSchedulingEnabled()، سيستدعي ExoPlayer هذه الطريقة عند احتساب الوقت اللازم لتحديد موعد لمهمة العمل.
    • أضِف MediaCodecAdapter#OnBufferAvailableListener لتلقّي تنبيه عندما تصبح مخازن الإدخال والإخراج المؤقتة متاحة للاستخدام من قِبل MediaCodecRenderer. سترسل MediaCodecRenderer إشارة إلى ExoPlayer عند تلقّي عمليات الرجوع هذه، وإذا تم ضبط ExoPlayer باستخدام experimentalSetDynamicSchedulingEnabled()، سيجدول ExoPlayer حلقة العمل الخاصة به بما أنّ أدوات العرض يمكنها إحراز تقدّم.
    • استخدِم فئة البيانات لطُرق LoadControl بدلاً من المَعلمات الفردية.
    • أضِف ExoPlayer.isReleased() للتحقّق مما إذا تم استدعاء Exoplayer.release().
    • أضِف ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() لضبط الحد الأقصى للموضع الذي يحاول seekToPrevious() الانتقال إلى العنصر السابق فيه (#1425).
    • تم إصلاح بعض حالات عدم الاتساق في تركيز الصوت، مثل عدم الإبلاغ عن فقدان التركيز الكامل أو المؤقت أثناء إيقاف المشغّل مؤقتًا (#1436).
    • تم إصلاح مشكلة محتملة IndexOutOfBoundsException ناتجة عن إبلاغ أدوات الاستخراج عن مسارات إضافية بعد خطوة الإعداد الأولية (#1476).
    • سيحصل المستخدمون الذين يضبطون المنطقة الزمنية على Effects في ExoPlayer.setVideoEffect() على الطوابع الزمنية بعد إزالة إزاحة أداة العرض (#1098).
    • إصلاح IllegalArgumentException محتمل عند التعامل مع خطأ في المشغّل حدث أثناء القراءة المسبقة لعنصر آخر في قائمة التشغيل (#1483)
  • المحوّل:
    • أضِف audioConversionProcess وvideoConversionProcess إلى ExportResult للإشارة إلى كيفية إنشاء المقطع الصوتي المعنيّ في ملف الإخراج.
    • إيقاف عمليات التحقّق من مستوى H.264 لتحسين عملية القص
    • إضافة إمكانية التبديل بين وسائط الإدخال SDR وHDR في تسلسل
    • إتاحة تأثيرات صوتية على مستوى الأغنية
    • إضافة إمكانية تحويل ترميز صور Ultra HDR إلى فيديوهات HDR
    • تم إصلاح المشكلة التي لا تعرض فيها DefaultAudioMixer عدد وحدات البايت الصحيح بعد إعادة ضبطها وإعادة استخدامها.
    • حلّ مشكلة في برنامج الترميز حيث تم تحديد عدد القنوات الصوتية بصوت ستيريو عند معالجة إدخال PCM.
    • عند اختيار المقاطع في ExoPlayerAssetLoader، تجاهل القيود المفروضة على عدد قنوات الصوت لأنّها تنطبق فقط على التشغيل.
    • استبدِل واجهة androidx.media3.transformer.Muxer بواجهة androidx.media3.muxer.Muxer وأزِل androidx.media3.transformer.Muxer.
    • إصلاح مشكلة تحميل صور HEIC من مخططات معرّف الموارد المنتظم للمحتوى (#1373).
    • اضبط مدة المقطع الصوتي في AudioGraphInput لتحسين مزامنة الصوت والفيديو.
    • إزالة الحقل "ExportResult.processedInputs" إذا كنت تستخدم هذا الحقل لتضمين تفاصيل برنامج الترميز، استخدِم DefaultDecoderFactory.listener بدلاً من ذلك. في حال حدوث استثناء في برنامج الترميز، ستتوفّر تفاصيل برنامج الترميز في ExportException.codecInfo.
  • أدوات استخراج البيانات:
    • MPEG-TS: يجب تطبيق التغيير مع ضمان عرض آخر إطار من خلال تمرير آخر وحدة وصول لتدفق إلى قائمة انتظار العيّنات (#7909). تم دمج إصلاحات لحلّ المشاكل التي ظهرت في بث مباشر وفق بروتوكول HTTP ‏(HLS) يتضمّن إطارات أساسية فقط (#1150) وبث مباشر وفق بروتوكول HTTP ‏(HLS) يتضمّن ترميز H.262 (#1126).
    • ‫MP3: يُفضّل استخدام حجم البيانات من إطار Info بدلاً من الحجم الذي يحدّده المصدر الأساسي (مثل حجم الملف أو عنوان HTTP Content-Length). يساعد ذلك في استبعاد بيانات المقطورة غير القابلة للتشغيل (مثل صورة الألبوم) من عمليات احتساب البحث بمعدل نقل ثابت للبيانات، ما يجعل عمليات البحث أكثر دقةً (#1376).
    • ‫MP3: استخدِم عدد اللقطات والبيانات الأخرى في لقطة Info (إذا كانت متوفرة) لاحتساب متوسط معدل البت للبحث عن معدل بت ثابت، بدلاً من الاستقراء من معدل البت للقطة التي تلي لقطة Info، والذي قد يكون صغيرًا بشكل مصطنع، مثلاً لقطة PCUT (#1376).
    • تم إصلاح مشكلة استخراج تنسيق الصوت PCM في حاويات AVI.
  • الصوت:
    • إصلاح سمات ترميز DTS:X Profile 2 لتشغيل المحتوى بدون تعديل (#1299)
    • بالنسبة إلى التشغيل المحمّل، أعِد ضبط حقل التتبُّع الخاص باكتمال البث في DefaultAudioSink قبل طلب AudioTrack.stop()، وذلك لكي تحدّد AudioTrack.StreamEventCallback#onPresentationEnded بشكل صحيح الوقت الذي تم فيه تشغيل جميع البيانات المعلقة.
    • تم إصلاح الخطأ في SilenceSkippingAudioProcessor حيث يمكن أن تؤدي عمليات الانتقال بين تنسيقات صوتية مختلفة (مثل الاستيريو إلى الأحادي) إلى حدوث استثناء في المعالج (#1352).
    • نفِّذ MediaCodecAudioRenderer.getDurationToProgressUs() لكي يجدول ExoPlayer حلقة العمل الرئيسية بشكل ديناميكي عندما يتمكّن MediaCodecAudioRenderer من إحراز تقدّم.
  • الفيديو:
    • تم إصلاح المشكلة التي كانت تؤدي إلى وصول Listener.onRenderedFirstFrame() مبكرًا جدًا عند التبديل بين الأسطح أثناء التشغيل.
    • إصلاح منطق الرجوع إلى أداة فك الترميز الاحتياطية في Dolby Vision لاستخدام أداة فك ترميز AV1 متوافقة عند الحاجة (#1389).
    • إصلاح خطأ برنامج الترميز الذي قد يحدث بسبب تفعيل عارض فيديو أثناء التشغيل
  • النص:
    • تم إصلاح المشكلة التي يتم فيها تخطّي الترجمة والشرح اللذين يبدآن قبل موضع البحث. تم طرح هذه المشكلة في الإصدار 1.4.0-alpha01 من Media3 فقط.
    • تغيير السلوك التلقائي لتحليل الترجمة والشرح لكي يتم ذلك أثناء الاستخراج بدلاً من العرض (راجِع مخطط بنية 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 البسيطة في التعامل مع الأمر "تحديد موضع القلم" (‎#1315)
    • إصلاح IllegalArgumentException من LegacySubtitleUtil عندما لا تحتوي عيّنة ترجمة وشرح WebVTT على أي إشارات، مثلاً كجزء من بث DASH (#1516).
  • البيانات الوصفية:
    • إصلاح عملية ربط ملفات MP4 بعلامات الفرز ID3 في السابق، تم ربط علامات MP4 الخاصة بـ "ترتيب الألبوم" (soal) و"ترتيب الفنان" (soar) و"ترتيب فنّان الألبوم" (soaa) بشكل خاطئ بعلامات ID3 الخاصة بـ TSO2 وTSOA وTSOP (#1302).
    • إصلاح مشكلة قراءة علامات MP4 (/iTunes) الرقمية gnre (النوع) وtmpo (الإيقاع) عندما تكون القيمة أطول من بايت واحد
    • نشر إطار ID3 TCON إلى MediaMetadata.genre (#1305)
  • الصورة:
    • إضافة إمكانية استخدام شبكات صور مصغّرة غير مربّعة بتنسيق DASH (#1300)
    • إتاحة استخدام تنسيق AVIF للإصدار 34 من واجهة برمجة التطبيقات والإصدارات الأحدث
    • السماح باستخدام null كمَعلمة لـ ExoPlayer.setImageOutput() من أجل محو ImageOutput تم ضبطه سابقًا
  • DataSource:
    • تنفيذ دعم لمعرّفات الموارد الموحّدة android.resource://package/id الأولية حيث يختلف package عن حزمة التطبيق الحالي لم يكن هذا الإجراء متاحًا في السابق، ولكنّه طريقة أكثر فعالية للوصول إلى الموارد في حزمة أخرى بدلاً من استخدام الاسم.
    • يجب التأكّد من أنّ url ليس قيمة فارغة في دوال الإنشاء DataSpec. تمت إضافة تعليق توضيحي إلى هذه المَعلمة من قبل للإشارة إلى أنّها لا يمكن أن تكون فارغة.
    • السماح لـ ByteArrayDataSource بتحويل معرّف الموارد المنتظم (URI) إلى مصفوفة بايت أثناء open()، بدلاً من أن يكون مبرمَجًا بشكل ثابت عند الإنشاء (#1405)
  • DRM:
    • السماح بتعيين LoadErrorHandlingPolicy على DefaultDrmSessionManagerProvider (#1271)
  • التأثير:
    • إمكانية إجراء تغييرات متعدّدة على السرعة ضمن EditedMediaItem أو Composition نفسهما في SpeedChangeEffect
    • إتاحة إخراج HLG وPQ من إدخال صورة نقطية بدقة HDR الفائقة
    • إضافة إمكانية استخدام EGL_GL_COLORSPACE_BT2020_HLG_EXT، ما يؤدي إلى تحسين إخراج سطح HLG في ExoPlayer.setVideoEffect وDebug SurfaceView في Transformer.
    • عدِّل تنفيذ مصفوفة Overlay لتصبح متوافقة مع المستندات من خلال تبديل قيمتَي x وy المطبّقتَين في setOverlayFrameAnchor(). في حال استخدام OverlaySettings.Builder.setOverlayFrameAnchor()، اقلب قيمتَي x وy عن طريق ضربهما في -1.
    • تم إصلاح الخطأ الذي يؤدي إلى تعطُّل TimestampWrapper عند استخدامه مع ExoPlayer#setVideoEffects (#821).
    • تغيير مساحة العمل التلقائية لألوان SDR من الألوان الخطية إلى فيديو SDR كهربائي بتنسيق BT 709 يجب توفير خيار ثالث للاحتفاظ بمساحة الألوان الأصلية.
    • السماح بتحديد ترتيب z غير محدّد لـ EditedMediaItemSequences (#1055)
    • الحفاظ على نطاق إضاءة ثابت في مختلف أجزاء المحتوى المتوافق مع تكنولوجيا النطاق العالي الديناميكية (يستخدم نطاق HLG)
    • إتاحة استخدام تراكبات Ultra HDR (صورة نقطية) على المحتوى المعروض بتقنية HDR
    • السماح باستخدام تأثيرات SeparableConvolution قبل الإصدار 26 من واجهة برمجة التطبيقات
    • أزِل OverlaySettings.useHdr غير المستخدَم لأنّ النطاق الديناميكي للتراكب والإطار يجب أن يكونا متطابقَين.
    • إضافة إمكانية استخدام النطاق العالي الديناميكية (HDR) في TextOverlay يمكن ضبط مستوى سطوع النص المركّب باستخدام OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • إضافة "إعلانات الوسائط التفاعلية":
    • ترقية واجهة برمجة التطبيقات المطلوبة لتشغيل بث إعلانات DAI في التطبيقات إلى إصدار ثابت
    • أضِف replaceAdTagParameters(Map <String, String>) إلى ImaServerSideAdInsertionMediaSource.AdLoader التي تتيح استبدال مَعلمات علامة الإعلان في وقت التشغيل.
    • تم إصلاح الخطأ الذي لم يتم فيه استدعاء VideoAdPlayer.VideoAdPlayerCallback.onError() عند حدوث خطأ في المشغّل أثناء تشغيل الإعلان (#1334).
    • تمت ترقية إصدار حزمة IMA SDK إلى 3.33.0 لإصلاح الخطأ NullPointerException عند استخدام معرّفات الموارد المنتظمة (URI) لعلامات الإعلانات data:// (#700).
  • الجلسة:
    • غيِّر القيمة التلقائية لـ CommandButton.enabled إلى true وتأكَّد من أنّ القيمة يمكن أن تظل خطأ بالنسبة إلى وحدات التحكّم حتى إذا كان الأمر المرتبط متاحًا.
    • أضِف ثوابت الرموز الخاصة بـ CommandButton التي يجب استخدامها بدلاً من موارد الرموز المخصّصة.
    • أضِف MediaSessionService.isPlaybackOngoing() للسماح للتطبيقات بالاستعلام عمّا إذا كانت الخدمة بحاجة إلى التوقف في onTaskRemoved() (#1219).
    • أضِف MediaSessionService.pauseAllPlayersAndStopSelf() الذي يتيح إيقاف تشغيل جميع الجلسات مؤقتًا واستدعاء stopSelf() لإنهاء دورة حياة MediaSessionService.
    • يمكنك تجاهل MediaSessionService.onTaskRemoved(Intent) لتوفير تنفيذ تلقائي آمن يُبقي الخدمة قيد التشغيل في المقدّمة إذا كان التشغيل مستمرًا أو يوقف الخدمة في الحالات الأخرى.
    • إخفاء شريط البحث في إشعار الوسائط لأحداث البث المباشر من خلال عدم ضبط المدة في البيانات الوصفية لجلسة النظام الأساسي (#1256)
    • تتم محاذاة عملية تحويل MediaMetadata إلى MediaDescriptionCompat، وذلك لاستخدام الترتيب والمنطق المفضّلين نفسيهما عند اختيار خصائص البيانات الوصفية كما هو الحال في media1.
    • أضِف MediaSession.sendError() التي تسمح بإرسال أخطاء غير خطيرة إلى وحدة التحكّم Media3. عند استخدام أداة التحكّم في الإشعارات (راجِع MediaSession.getMediaNotificationControllerInfo())، يتم استخدام الخطأ المخصّص لتعديل PlaybackState لجلسة النظام الأساسي إلى حالة خطأ تتضمّن معلومات الخطأ المحدّدة (#543).
    • أضِف MediaSession.Callback.onPlayerInteractionFinished() لإعلام الجلسات عند انتهاء سلسلة من تفاعلات اللاعبين من وحدة تحكّم معيّنة.
    • أضِف SessionError واستخدِمه في SessionResult وLibraryResult بدلاً من رمز الخطأ لتقديم المزيد من المعلومات حول الخطأ وكيفية حلّه إذا أمكن.
    • نشر رمز تطبيق اختبار أداة التحكّم في Media3 الذي يمكن استخدامه لاختبار التفاعلات مع التطبيقات التي تنشر جلسة وسائط
    • نقل البيانات الإضافية التي تم تمريرها إلى MediaSession[Builder].setSessionExtras() في Media3 إلى PlaybackStateCompat.getExtras() في أداة تحكّم Media1
    • ربط الأخطاء الفادحة وغير الفادحة بجلسة المنصة يتم ربط PlaybackException بحالة خطأ فادح في PlaybackStateCompat. يتم ربط SessionError المُرسَل إلى وحدة التحكّم في إشعار الوسائط مع MediaSession.sendError(ControllerInfo, SessionError) بخطأ غير فادح في PlaybackStateCompat، ما يعني أنّه يتم ضبط رمز الخطأ والرسالة، ولكن تظل حالة جلسة النظام الأساسي مختلفة عن STATE_ERROR.
    • السماح بضبط نشاط الجلسة لكل وحدة تحكّم لتجاوز نشاط الجلسة العام يمكن تحديد نشاط الجلسة لوحدة تحكّم في وقت الاتصال من خلال إنشاء ConnectionResult باستخدام AcceptedResultBuilder.setSessionActivivty(PendingIntent). بعد الاتصال، يمكن تعديل نشاط الجلسة باستخدام MediaSession.setSessionActivity(ControllerInfo, PendingIntent).
    • تحسين عملية تكرار الأخطاء في طلبات البيانات من واجهة برمجة التطبيقات MediaLibrarySession.Callback يمكن الآن ضبط عملية تكرار الخطأ باستخدام MediaLibrarySession.Builder.setLibraryErrorReplicationMode() لاختيار نوع الخطأ أو إيقاف عملية تكرار الخطأ التي تكون مفعّلة تلقائيًا.
  • UI:
    • إضافة إمكانية عرض الصور إلى PlayerView عند توصيله بـ ExoPlayer (#1144)
    • إضافة خيار تخصيص الرموز المختلفة في PlayerControlView من خلال سمات xml للسماح باستخدام عناصر قابلة للرسم مختلفة لكل مثيل من PlayerView، بدلاً من عمليات الإلغاء العامة (#1200)
    • حلّ مشكلة في النظام الأساسي تؤدي إلى عرض الفيديو بشكل ممدود أو مقصوص عند استخدام SurfaceView داخل AndroidView في Compose على الإصدار 34 من واجهة برمجة التطبيقات (#1237).
  • عمليات التنزيل:
    • تأكَّد من أنّ DownloadHelper لا يؤدي إلى تسرُّب مثيلات Renderer غير المُصدرة، ما قد يؤدي في النهاية إلى تعطُّل التطبيق مع ظهور IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • إضافة Cronet:
    • حلّ المشاكل في SocketTimeoutException في CronetDataSource في بعض إصدارات Cronet، لا يكون الطلب الذي توفّره دالة الرجوع هو نفسه دائمًا. يؤدي ذلك إلى عدم اكتمال عملية رد الاتصال وانتهاء مهلة الطلب (https://issuetracker.google.com/328442628).
  • إضافة HLS:
    • تم إصلاح الخطأ الذي كان يؤدي إلى تفويض عيّنات EMSG المعلقة التي تنتظر انقطاعًا في HlsSampleStreamWrapper مع إزاحة غير صحيحة، ما يؤدي إلى حدوث IndexOutOfBoundsException أو IllegalArgumentException (#1002).
    • إصلاح الخطأ الذي كان يؤدي إلى إعادة تحميل قوائم التشغيل غير الأساسية بشكل متكرر عند بث محتوى وفق بروتوكول LL-HLS (#1240)
    • تم إصلاح الخطأ الذي كان يؤدي إلى ظهور Source Error وIllegalArgumentException عند تفعيل CMCD لبروتوكول HLS مع مقاطع الإعداد التي تقل عن 0x0A.
    • إصلاح الخلل الذي كان يؤدي إلى عدم إعادة تحميل قوائم التشغيل غير الأساسية أثناء تشغيل المحتوى المباشر (#1240).
    • تم إصلاح الخطأ الذي كان يتسبّب في حدوث ArrayIndexOutOfBoundsException (#1395) عند تفعيل CMCD لأحداث البث المباشر وفق بروتوكول HTTP ‏(HLS).
  • إضافة DASH:
    • تم إصلاح الخطأ الذي كان يتسبّب في ظهور IndexOutOfBoundsException (#1329) عند إعادة إعداد بث مباشر يتضمّن فترات متعددة.
    • إضافة دعم dashif:Laurl لعناوين URL الخاصة بالترخيص (#1345)
  • إضافة Cast:
    • تم إصلاح الخطأ الذي كان يحوّل عنوان الألبوم الخاص بـ MediaQueueItem إلى اسم الفنان في عنصر الوسائط Media3 (#1255).
  • أدوات الاختبار:
    • تنفيذ onInit() وonRelease() في FakeRenderer
    • تغيير طرق TestPlayerRunHelper.runUntil()/playUntil() لتعطيل الأخطاء غير الخطيرة (مثل تلك التي يتم الإبلاغ عنها إلى AnalyticsListener.onVideoCodecError()). استخدِم سلسلة طرق TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() الجديدة لإيقاف هذا السلوك.
  • التطبيق التجريبي:
    • استخدِم DefaultPreloadManager في تطبيق العرض التوضيحي للفيديوهات القصيرة.
    • السماح بضبط وضع التكرار باستخدام وسيطات Intent من سطر الأوامر (#1266)
    • استخدِم HttpEngineDataSource كـ HttpDataSource عندما يكون ذلك متاحًا على الجهاز.
  • إزالة الرموز المتوقّفة نهائيًا:
    • إزالة CronetDataSourceFactory استخدِم CronetDataSource.Factory بدلاً من ذلك.
    • أزِل بعض DataSpec المنشئات. يمكنك استخدام DataSpec.Builder كبديل.
    • إزالة طريقة الدفع setContentTypePredicate(Predicate) من DefaultHttpDataSource وOkHttpDataSource وCronetDataSource استخدِم الطريقة المكافئة على كل XXXDataSource.Factory بدلاً من ذلك.
    • أزِل عناصر إنشاء OkHttpDataSource وOkHttpDataSourceFactory. يمكنك استخدام OkHttpDataSource.Factory كبديل.
    • إزالة PlayerMessage.setHandler(Handler) استخدِم setLooper(Looper) بدلاً من ذلك.
    • إزالة الحقل "Timeline.Window.isLive" استخدِم طريقة isLive() بدلاً من ذلك.
    • إزالة دوال الإنشاء DefaultHttpDataSource استخدِم DefaultHttpDataSource.Factory بدلاً من ذلك.
    • إزالة DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS استخدِم DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS بدلاً من ذلك.
    • إزالة MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean) يمكنك استخدام MediaCodecInfo.canReuseCodec(Format, Format) كبديل.
    • إزالة الطريقتَين DrmSessionManager.DUMMY وgetDummyDrmSessionManager() يمكنك استخدام DrmSessionManager.DRM_UNSUPPORTED كبديل.
    • إزالة AnalyticsListener.onAudioInputFormatChanged(EventTime, Format) وAnalyticsListener.onVideoInputFormatChanged(EventTime, Format) وAudioRendererEventListener.onAudioInputFormatChanged(Format) وVideoRendererEventListener.onVideoInputFormatChanged(Format) استخدِم عمليات التحميل الزائد التي تقبل DecoderReuseEvaluation بدلاً من ذلك.
    • إزالة RendererSupport.FormatSupport IntDef والثوابت FORMAT_HANDLED وFORMAT_EXCEEDS_CAPABILITIES وFORMAT_UNSUPPORTED_DRM وFORMAT_UNSUPPORTED_SUBTYPE وFORMAT_UNSUPPORTED_TYPE استخدِم IntDef والثوابت المكافئة في androidx.media3.common.C بدلاً من ذلك (مثل C.FORMAT_HANDLED).
    • إزالة واجهة Bundleable ويشمل ذلك إزالة جميع الحقول الثابتة في Bundleable.Creator<Foo> CREATOR. على المتصلين استخدام الطريقتَين Bundle toBundle() وstatic Foo fromBundle(Bundle) لكل نوع بدلاً من ذلك.

الإصدار 1.4.0-rc01

‫10 يوليو 2024

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

الإصدار 1.4.0-beta01

‫26 يونيو 2024

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

الإصدار 1.4.0-alpha02

‫7 يونيو 2024

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

الإصدار 1.4.0-alpha01

‫17 أبريل 2024

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

الإصدار 1.3.0

الإصدار 1.3.1

‫11 أبريل 2024

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

  • المكتبة المشتركة:
    • أضِف Format.labels للسماح باستخدام تصنيفات مترجمة أو بديلة أخرى.
  • ExoPlayer:
    • تم إصلاح مشكلة عدم احتفاظ PreloadMediaPeriod بعمليات البث عند إعادة التحميل المسبق.
    • طبِّق TrackSelectionResult الصحيح والمناسب على فترة التشغيل عند إعادة اختيار المقطع الصوتي.
    • يجب بدء أدوات العرض التي تم تفعيل ميزة "البدء المبكر" فيها بعد تقديم فترة التشغيل عند الانتقال بين عناصر الوسائط (#1017).
    • إضافة نوع الإرجاع الناقص إلى قاعدة 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 الذي يتضمّن إطارات أساسية فقط (#1150) وفي بث HLS الذي يتضمّن ترميز H.262 (#1126).
  • الصوت:
    • السماح باستعادة أداة العرض من خلال إيقاف ميزة "التفريغ" إذا تعذّر تهيئة مسار الصوت في وضع "التفريغ".
  • الفيديو:
    • إضافة حلّ بديل لمشكلة في الأجهزة على Galaxy Tab S7 FE وChromecast with Google TV وLenovo M10 FHD Plus تؤدي إلى تصنيف بث H265 بمعدل 60 إطارًا في الثانية على أنّه غير متوافق
    • إضافة حلّ بديل يضمن عرض الإطار الأول دائمًا أثناء النقل عبر الأنفاق حتى إذا لم ينفّذ الجهاز ذلك تلقائيًا على النحو المطلوب من خلال واجهة برمجة التطبيقات (‎#1169). (#966)
    • تم إصلاح المشكلة التي يتسبّب فيها التعامل مع معلومات ألوان HDR في حدوث سلوك غير صحيح في برنامج الترميز، كما تم إصلاح المشكلة التي تمنع التبديل التكيّفي للتنسيق في مسارات فيديو SDR (#1158).
  • النص:
    • WebVTT: منع الإشارات المتتالية مباشرةً من إنشاء نسخ إضافية غير صحيحة من CuesWithTiming من WebvttParser.parse (#1177).
  • DRM:
    • حلّ مشكلة NoSuchMethodError التي قد يعرضها إطار MediaDrm بدلاً من ResourceBusyException أو NotProvisionedException على بعض أجهزة Android 14 (#1145)
  • التأثير:
    • تم تحسين عملية ربط الدرجات بين PQ وSDR من خلال تحويل مساحات الألوان.
  • الجلسة:
    • تم إصلاح المشكلة التي تؤدي إلى الرجوع إلى الموضع الحالي عندما يستبدل جهاز التحكّم العنصر الحالي (#951).
    • تم إصلاح المشكلة المتمثّلة في عدم نقل MediaMetadata التي تحتوي على extras غير فارغة فقط بين وحدات التحكّم في الوسائط والجلسات (#1176).
  • UI:
    • الرجوع إلى تضمين اسم لغة المقطع الصوتي إذا تعذّر على Locale تحديد اسم معروض (#988)
  • إضافة DASH:
    • املأ جميع عناصر Label من ملف البيان في Format.labels (#1054).
  • إضافة RTSP:
    • تخطّي قيم معلومات الجلسة الفارغة (علامات i) في تحليل SDP (#1087)
  • إضافات برامج الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
    • إيقاف إضافة MIDI كعنصر تابع محلي تلقائيًا لأنّها تتطلّب ضبط مستودع Maven إضافي يمكن للمستخدمين الذين يحتاجون إلى هذا الوحدة من تبعية محلية إعادة تفعيلها.

الإصدار 1.3.0

‫6 مارس 2024

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

  • المكتبة المشتركة:
    • تنفيذ إمكانية استخدام معرّفات الموارد الموحّدة (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).
    • إصلاح التعبير العادي المستخدَم للتحقّق من صحة أسماء مفاتيح Common Media Client Data (CMCD) المخصّصة من خلال تعديله للتحقّق من وجود شرطة فقط (#1028)
    • إيقاف الترميز المزدوج لمَعلمات طلب البحث CMCD (#1075)
  • المحوّل:
    • إضافة إمكانية تسوية فيديوهات التصوير البطيء بتنسيق H.265/HEVC SEF
    • زيادة سرعة نقل البيانات، خاصةً عند إجراء تعديلات من النوع "إزالة الفيديو"
    • أضِف واجهة برمجة التطبيقات لضمان بدء ملف الإخراج بإطار فيديو. يمكن أن يؤدي ذلك إلى جعل نتائج عمليات الاقتصاص أكثر توافقًا مع عمليات تنفيذ المشغّل التي لا تعرض إطار الفيديو الأول إلا بعد ظهور الطابع الزمني للعرض التقديمي (#829).
    • إضافة إمكانية تحسين عمليات قص ملفات MP4 لمادة عرض واحدة
    • إضافة دعم لضمان احتواء إطار الفيديو على الطابع الزمني الأول في ملف الإخراج إصلاح مشكلة بدء ملفات الإخراج بإطار أسود على مشغّلات iOS (#829)
  • اختيار المقطع الصوتي:
    • أضِف DefaultTrackSelector.selectImageTrack لتفعيل خيار اختيار مسار الصورة.
    • أضِف TrackSelectionParameters.isPrioritizeImageOverVideoEnabled لتحديد ما إذا كان سيتم اختيار مقطع صورة إذا كان كل من مقطع الصورة ومقطع الفيديو متاحَين. القيمة التلقائية هي false، ما يعني أنّ الأولوية تكون لاختيار مقطع فيديو.
  • أدوات استخراج البيانات:
    • إضافة تحليل AV1C إضافي إلى أداة استخراج MP4 لاسترداد قيم ColorInfo.colorSpace وColorInfo.colorTransfer وColorInfo.colorRange (#692)
    • ‫MP3: استخدِم معدّل نقل بيانات ثابت (CBR) للبحث عن الملفات التي تتضمّن العنوان Info (معدّل نقل البيانات الثابت المكافئ للعنوان Xing). في السابق، كنا نستخدم جدول البحث من العنوان Info، ولكن يؤدي ذلك إلى بحث أقل دقة مقارنةً بما إذا تجاهلناه وافترضنا أنّ الملف هو CBR.
    • ‫MPEG2-TS: إضافة دعم DTS وDTS-LBR وDTS:X Profile2 (#275)
    • استخراج أنواع الصوت من واصفات TS وربطها بعلامات الأدوار، ما يتيح للمستخدمين اتّخاذ قرارات أفضل بشأن اختيار المقاطع الصوتية (#973).
  • الصوت:
    • تحسين خوارزمية تخطّي الصمت من خلال زيادة مستوى الصوت بسلاسة، والاحتفاظ بالحد الأدنى من الصمت ومدد الصمت الأكثر طبيعية (#7423)
    • الإبلاغ عن حالات كتم الصوت التي تم تخطّيها بشكل أكثر تحديدًا (#1035)
  • الفيديو:
    • غيِّر الدالة الإنشائية MediaCodecVideoRenderer التي تأخذ الوسيطة VideoFrameProcessor.Factory واستبدلها بدالة إنشائية تأخذ الوسيطة VideoSinkProvider. يمكن للتطبيقات التي تريد إدخال VideoFrameProcessor.Factory مخصّص إنشاء CompositingVideoSinkProvider يستخدم VideoFrameProcessor.Factory المخصّص وتمرير موفّر مصدر الفيديو إلى MediaCodecVideoRenderer.
  • النص:
    • إصلاح تسلسل إشارات الصور النقطية لحلّ الخطأ Tried to marshall a Parcel that contained Binder objects عند استخدام DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836)
    • ‫CEA-708: تجاهُل قيمة rowLock توضّح مواصفات CEA-708-E S-2023 أنّه يجب افتراض أنّ كلتا القيمتين rowLock وcolumnLock صحيحتان، بغض النظر عن القيم المعروضة في البث (لم يتم تنفيذ دعم columnLock، لذا يُفترض أنّها خاطئة دائمًا).
  • الصورة:
    • إضافة إمكانية عرض الصور المصغّرة بتنسيق DASH يتم اقتصاص صور الشبكة وتوفير صور مصغّرة فردية ImageOutput بالقرب من أوقات عرضها.
  • DRM:
    • تشغيل عيّنات "التقدّم الواضح" غير المشفرة في المحتوى الخاضع لإدارة الحقوق الرقمية على الفور بشكل تلقائي، حتى إذا لم تكن مفاتيح العيّنات المشفرة اللاحقة جاهزة بعد قد يؤدي ذلك إلى توقّف التشغيل مؤقتًا في منتصفه إذا لم تكن المفاتيح جاهزة بعد عندما يصل موضع التشغيل إلى العيّنات المشفّرة (ولكن في السابق، لم يكن التشغيل ليبدأ على الإطلاق عند هذه النقطة). يمكن إيقاف هذا السلوك باستخدام MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey أو DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.
  • إضافة "إعلانات الوسائط التفاعلية":
    • تم إصلاح مشكلة تعذُّر تشغيل إعلانات DASH وHLS التي لا تتضمّن امتداد الملف المناسب.
  • الجلسة:
    • إيقاف رصد النقر المزدوج في تطبيقات التلفزيون (#962)
    • تم إصلاح المشكلة المتمثّلة في عدم نقل MediaItem.RequestMetadata التي تحتوي على إضافات غير فارغة فقط بين أدوات التحكّم في الوسائط والجلسات.
    • أضِف أداة إنشاء إلى MediaLibrarySession.Builder لا تقبل سوى Context بدلاً من MediaLibraryService.
  • إضافة HLS:
    • تقليل HlsMediaPeriod إلى مستوى الظهور الخاص بالحزمة يجب عدم الاعتماد على هذا النوع مباشرةً من خارج حزمة HLS.
    • يحلّ Resolve المشكلة المتعلقة بالبحث عن بداية مقطع فيديو بشكل أكثر فعالية (#1031).
  • إضافات برامج الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
    • برنامج فك ترميز MIDI: تجاهل رسائل أحداث SysEx (#710).
  • أدوات الاختبار:
    • لا توقِف التشغيل مؤقتًا في TestPlayerRunHelper.playUntilPosition. يحافظ الاختبار على حالة التشغيل، ولكنّه يعلّق مستوى التقدّم إلى أن يتمكّن الاختبار من إضافة تأكيدات وإجراءات أخرى.
  • التطبيق التجريبي:
    • أضِف وحدة عرض توضيحية للمحتوى القصير من أجل عرض كيفية استخدام PreloadMediaSource مع حالة استخدام المحتوى القصير.

الإصدار 1.3.0-rc01

‫22 فبراير 2024

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

الإصدار 1.3.0-beta01

‫7 فبراير 2024

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

الإصدار 1.3.0-alpha01

‫15 يناير 2024

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

الإصدار 1.2.0

الإصدار 1.2.1

‫9 يناير 2024

  • ExoPlayer:
    • تم إصلاح المشكلة التي كانت تتسبّب في استمرار تعديل الإزاحة إلى min/maxOffset عند إجراء عمليات بحث يدوي خارج النطاق LiveConfiguration.min/maxOffset.
    • تم إصلاح مشكلة عدم صحة تنسيقات قنوات OPUS وVORBIS لـ 3 و5 و6 و7 و8 قنوات (#8396).
    • تم إصلاح المشكلة التي تؤدي إلى بدء البث المباشر من الموضع التلقائي عند تحديد مقاطع صوتية بعد الانتقال إلى الموضع صفر (#9347).
    • تم إصلاح المشكلة التي كانت تتلقّى فيها مثيلات جديدة من CmcdData.Factory قيمًا سالبة لـ bufferedDurationUs من مصادر الأجزاء، ما كان يؤدي إلى ظهور الخطأ IllegalArgumentException (#888).
  • المحوّل:
    • حلّ مشكلة كانت تؤدي إلى حدوث خطأ في برنامج الترميز أثناء عملية الإعداد بسبب ضبط معدّل تشغيل مرتفع.
  • أدوات استخراج البيانات:
    • ضَع علامة ROLE_FLAG_ALTERNATE على مسارات HEVC الثانوية (غير القابلة للتشغيل) في صور JPEG المتحركة لمنع اختيارها تلقائيًا للتشغيل بسبب دقتها العالية.
    • إصلاح مشكلة عدم رصد الإطارات الرئيسية بشكل صحيح في بث TS H264 (#864)
    • تم إصلاح مشكلة تقدير مدة بث TS الذي تزيد مدته عن 47721 ثانية (#855).
  • الصوت:
    • إصلاح مشكلة معالجة نهاية البث (EOS) في SilenceSkippingAudioProcessor عند استدعائها عدّة مرات (#712)
  • الفيديو:
    • تمت إضافة حلّ بديل لمشكلة في أجهزة Galaxy Tab S7 FE وChromecast with Google TV وLenovo M10 FHD Plus تؤدي إلى تصنيف بث AVC بمعدل 60 إطارًا في الثانية على أنّه غير متوافق (#693).
  • البيانات الوصفية:
    • تم إصلاح الخطأ الذي كانت تتم فيه تعبئة MediaMetadata من تعليقات Vorbis فقط باستخدام مفاتيح بأحرف كبيرة (#876).
    • تم إصلاح الخطأ OutOfMemoryError عند تحليل إطارات ID3 الكبيرة جدًا، ما يعني أنّه يمكن مواصلة التشغيل بدون معلومات العلامة بدلاً من تعذُّر التشغيل تمامًا.
  • DRM:
    • توسيع نطاق الحلّ البديل لعنوان URL غير صحيح لترخيص ClearKey https://default.url ليشمل المستوى 33 من واجهة برمجة التطبيقات والإصدارات الأحدث (كان الحلّ البديل ينطبق سابقًا على المستوى 33 من واجهة برمجة التطبيقات فقط) (‫#837)
    • إصلاح الخطأ في ERROR_DRM_SESSION_NOT_OPENED عند التبديل من محتوى مشفّر إلى محتوى غير مشفّر بدون ربط سطح بمشغّل الفيديو حدث الخطأ بسبب استخدام برنامج فك ترميز آمن بشكل غير صحيح لتشغيل المحتوى غير المحمي.
  • الجلسة:
    • ضَع المفاتيح والقيم المخصّصة في MediaMetadataCompat إلى MediaMetadata.extras وMediaMetadata.extras إلى MediaMetadataCompat (#756, #802).
    • إصلاح مشكلة البث notifyChildrenChanged لوحدات التحكّم القديمة (#644)
    • تم إصلاح الخطأ الذي كان يؤدي إلى تعذُّر عمل بعض الأجهزة عند ضبط وقت سلبي setWhen لمؤقت الإشعار الذي تم إيقافه (#903).
    • إصلاح الخطأ IllegalStateException الذي يحدث عندما لا يكتمل ربط أداة التحكّم في إشعارات الوسائط عند طلب أول تحديث للإشعارات (#917)
  • UI:
    • تم إصلاح المشكلة المتمثلة في عدم ظهور زرَّي التقديم السريع والترجيع عند استخدامهما مع Material Design في BottomSheetDialogFragment (#511).
    • تم إصلاح مشكلة عدم محاذاة الأرقام في زر التقديم السريع ضمن PlayerControlView (#547).
  • إضافة DASH:
    • يجب تحليل "f800" على أنّه عدد القنوات 5 لبرنامج Dolby في بيان DASH (#688).
  • إضافات برامج الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
    • ‫MIDI: تم إصلاح المشكلة التي تؤدي إلى تخطّي أحداث تغيير البرنامج عند البحث للأمام (#704).
    • انتقِل إلى FFmpeg 6.0 وعدِّل NDK المتوافق إلى r26b (#707, #867).
  • إضافة 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.
    • انتقِل إلى واجهة Player.ExoPlayer.setAudioAttributes
  • 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)
    • إضافة حقول إضافية إلى تسجيل بيانات Common Media Client Data (CMCD): نقص البيانات في المخزن المؤقت (bs) والموعد النهائي (dl) ومعدّل التشغيل (pr) والبدء (su) (#8699)
    • أضِف عمق البتات الخاص بالسطوع واللون إلى ColorInfo (#491).
    • إضافة حقول إضافية إلى تسجيل بيانات Common Media Client Data (CMCD): طلب العنصر التالي (nor) وطلب النطاق التالي (nrr) (#8699)
    • إضافة وظيفة لنقل بيانات Common Media Client Data (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 classic في 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).
    • تم إصلاح الخطأ الذي يؤدي إلى ظهور IllegalArgumentException (#677) عند التحقّق من إمكانات E-AC3-JOC.
  • الفيديو:
    • السماح للمكوّن 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 OS وفعِّل العرض التوضيحي للجلسة على Android Auto.
    • لا تضبط قائمة انتظار جلسة إطار العمل عندما لا يكون COMMAND_GET_TIMELINE متاحًا لوحدة التحكّم في إشعار الوسائط. عندما يكون Android Auto هو أداة التحكّم في العميل التي تقرأ من جلسة إطار العمل، يؤدي ذلك إلى عدم عرض الزر queue في واجهة مستخدم Android Auto (#339).
    • استخدِم DataSourceBitmapLoader تلقائيًا بدلاً من SimpleBitmapLoader (#271، #327).
    • أضِف MediaSession.Callback.onMediaButtonEvent(Intent) الذي يسمح للتطبيقات بتجاوز معالجة أحداث زر الوسائط التلقائية.
  • UI:
    • أضِف عملية تنفيذ Player.Listener لأجهزة Wear OS تعالج إيقاف التشغيل بسبب Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT من خلال عرض مربّع حوار نظام للسماح للمستخدم بتوصيل جهاز إخراج صوتي مناسب (مثل سماعات رأس تعمل بالبلوتوث). سيستأنف المستمع التشغيل تلقائيًا إذا تم توصيل جهاز مناسب خلال مهلة قابلة للضبط (المهلة التلقائية هي 5 دقائق).
  • عمليات التنزيل:
    • يجب تقديم بيان عن نوع الخدمة التي تعمل في المقدّمة "مزامنة البيانات" من أجل توفير التوافق مع DownloadService على Android 14. عند استخدام هذه الخدمة، يجب أن يضيف التطبيق أيضًا dataSync كـ foregroundServiceType في ملف البيان، وأن يضيف إذن FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • إضافة HLS:
    • إعادة تحميل قائمة تشغيل البث المباشر بتنسيق HLS بفاصل زمني يتم احتسابه من وقت بدء التحميل الأخير بدلاً من وقت اكتمال التحميل الأخير (#663)
  • إضافة DASH:
    • السماح بتضمين عدة معرّفات DASH متطابقة في عنوان URL لنموذج المقطع
    • إضافة دعم تجريبي لتحليل الترجمة والشرح أثناء الاستخراج يتيح هذا التنسيق دمج الترجمة والشرح المتداخلَين بشكل أفضل، بما في ذلك حلّ مشكلة الوميض عند الانتقال بين مقاطع الترجمة والشرح. يمكنك تفعيل هذه الميزة باستخدام DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • إضافة RTSP:
    • تم إصلاح مشكلة تزامن قد تؤدي إلى ظهور الخطأ IndexOutOfBoundsException عند الرجوع إلى بروتوكول TCP أو توقّف التشغيل مؤقتًا في بعض الحالات.
    • التحقّق من الحالة في إعداد RTSP عند عرض حالة التحميل RtspMediaPeriod (#577)
    • تجاهل طرق طلبات Rtsp المخصّصة في العنوان العام لردّ الخيارات (#613).
    • استخدِم قيمة مهلة الردّ على طلب إعداد RTSP في الفاصل الزمني لإرسال طلبات خيارات RTSP لإبقاء الاتصال نشطًا (#662).
  • إضافات برامج الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
    • إصدار وحدة فك ترميز MIDI التي تتيح تشغيل ملفات MIDI العادية باستخدام مكتبة Jsyn لتركيب الصوت
    • أضِف DecoderOutputBuffer.shouldBeSkipped لوضع علامة مباشرةً على مخازن البيانات المؤقتة للإخراج التي لا يلزم عرضها. هذا الخيار أفضل من C.BUFFER_FLAG_DECODE_ONLY الذي سيتم إيقافه نهائيًا.
    • أضِف Decoder.setOutputStartTimeUs وSimpleDecoder.isAtLeastOutputStartTimeUs للسماح لبرامج الترميز بإسقاط عيّنات الترميز فقط قبل وقت البدء. ويجب استخدام هذا الخيار بدلاً من Buffer.isDecodeOnly الذي سيتم إيقافه نهائيًا.
    • إصلاح الخطأ الذي يمنع نشر أداة فك ترميز MIDI في مستودع Maven تمت إعادة تسمية العنصر إلى media3-exoplayer-midi (#734).
  • إضافة Leanback:
    • تم إصلاح الخطأ الذي كان يؤدي إلى ظهور ArithmeticException في رمز Leanback عند إيقاف مساحة عرض (#617).
  • أدوات الاختبار:
    • إتاحة توافق TestExoPlayerBuilder وFakeClock مع اختبارات واجهة مستخدم Espresso واختبارات واجهة مستخدم Compose يحلّ هذا الإصدار خطأً يؤدي إلى تقدّم التشغيل بشكل غير حتمي أثناء التفاعل مع طرق العرض في Espresso أو Compose.
  • إزالة الرموز المتوقّفة نهائيًا:
    • إزالة TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) و TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean) استخدِم Composition.Builder.setHdrMode(int) ومرِّر Composition إلى Transformer.start(Composition, String) بدلاً من ذلك.
    • أزِل الطريقة DownloadNotificationHelper.buildProgressNotification التي تم إيقافها نهائيًا، واستخدِم طريقة أخرى غير متوقّفة نهائيًا تأخذ المَعلمة notMetRequirements بدلاً منها.

الإصدار 1.2.0-rc01

‫1 نوفمبر 2023

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

الإصدار 1.2.0-beta01

‫19 أكتوبر 2023

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

الإصدار 1.2.0-alpha02

‫29 سبتمبر 2023

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

الإصدار 1.2.0-alpha01

‫17 أغسطس 2023

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

الإصدار 1.1.0

الإصدار 1.1.1

‫16 أغسطس 2023

  • المكتبة المشتركة:
    • إزالة تبعية multidex التي تمت إضافتها عن طريق الخطأ من جميع الوحدات(#499)
  • ExoPlayer:
    • تم إصلاح المشكلة في PlaybackStatsListener حيث يتم إنشاء PlaybackStats غير صحيح بعد محو قائمة التشغيل.
    • إضافة حقول إضافية إلى تسجيل بيانات Common Media Client Data (CMCD): تنسيق البث (sf) ونوع البث (st) والإصدار (v) وأعلى معدّل نقل بيانات (tb) ومدة العنصر (d) ومعدّل نقل البيانات المقاس (mtp) ونوع العنصر (ot) (#8699).
  • الصوت:
    • تم إصلاح الخطأ الذي لم يتم فيه الانتقال من Player.getState() إلى STATE_ENDED عند تشغيل ملفات قصيرة جدًا (#538).
  • تفريغ الصوت:
    • إضافة صفحات Ogg ID Header وComment Header إلى دفق البتات لتشغيل Opus بدون اتصال بالإنترنت وفقًا لمعيار RFC 7845
  • الفيديو:
    • ‫H.265/HEVC: تم إصلاح تحليل معلومات صورة المرجع القصيرة والطويلة الأمد في SPS.
  • النص:
    • ‫CEA-608: تغيير منطق اقتطاع الإشارات لكي يأخذ في الاعتبار النص المرئي فقط في السابق، كان يتم تضمين المسافة البادئة وإزاحة علامة التبويب عند الحدّ من طول الإشارة إلى 32 حرفًا (وهو ما كان صحيحًا من الناحية الفنية وفقًا للمواصفات) (#11019).
  • إضافة "إعلانات الوسائط التفاعلية":
    • تمت ترقية إصدار "حزمة تطوير البرامج لإعلانات الوسائط التفاعلية" إلى 3.30.3.
  • الجلسة:
    • أضِف تخطيطًا مخصّصًا إلى حالة وحدة التحكّم وقدِّم دالة getter للوصول إليه. عندما يتغيّر التنسيق المخصّص، يتم استدعاء 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

  • المكتبة المشتركة:
    • Add suppression reason for unsuitable audio route and play when ready change reason for suppressed too long. (#15)
    • إضافة أوامر إلى "المشغّل":
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • أضِف طرقًا محمّلة بشكل زائد إلى Player تتيح للمستخدمين تحديد علامات مستوى الصوت:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • إضافة Builder لـ DeviceInfo وإيقاف الدالة الإنشائية الحالية نهائيًا
    • أضِف DeviceInfo.routingControllerId لتحديد معرّف وحدة التحكّم في التوجيه لتشغيل المحتوى عن بُعد.
    • إضافة Player.replaceMediaItem(s) كاختصار لإضافة عناصر وإزالتها في الموضع نفسه (#8046)
  • ExoPlayer:
    • يجب السماح لـ ExoPlayer بالتحكّم في طرق مستوى صوت الجهاز فقط في حال تم تفعيلها بشكل صريح. استخدِم ExoPlayer.Builder.setDeviceVolumeControlEnabled للوصول إلى:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) وsetDeviceVolume(int, int)
      • increaseDeviceVolume(int) وincreaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) وdecreaseDeviceVolume(int, int)
    • أضِف FilteringMediaSource التي تتيح فلترة أنواع المسارات المتاحة من MediaSource.
    • إضافة إمكانية تضمين بيانات Common Media Client Data (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() بـ enable لتفعيل تسجيل المفاتيح المخصّصة.
    • إضافة إجراء إضافي إلى ملف البيان الخاص بالتطبيق التجريبي الرئيسي لتسهيل بدء تشغيل التطبيق التجريبي باستخدام ملف *.exolist.json مخصّص (#439).
    • أضِف ExoPlayer.setVideoEffects() لاستخدام Effect أثناء تشغيل الفيديو.
    • عدِّل SampleQueue لتخزين sourceId كـ long بدلاً من int. يؤدي ذلك إلى تغيير تواقيع الطريقتَين العلنيتَين SampleQueue.sourceId وSampleQueue.peekSourceId.
    • أضِف مَعلمات إلى الطريقتَين LoadControl وshouldStartPlayback وonTracksSelected التي تتيح ربط هاتين الطريقتَين بـ MediaPeriod ذي الصلة.
    • غيِّر توقيع ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) من خلال إضافة مَعلمة مخطط زمني تحتوي على الفترات التي يتم فيها استخدام أرقام التعريف الفريدة كمفاتيح في الخريطة. هذا الإجراء مطلوب لتجنُّب حدوث مشاكل التزامن مع أحداث البث المباشر المتعددة الفترات.
    • إيقاف EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) وBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs) يمكن بدلاً من ذلك طلب صيغة الطرق بدون mediaTimeOffsetUs. يُرجى العِلم أنّه حتى بالنسبة إلى المتغيرات المتوقّفة نهائيًا، لم يعُد يتم إضافة الإزاحة إلى startTimeUs وendTimeUs لعناصر MediaLoadData التي يتم إرسالها بواسطة أداة الإرسال.
    • أعِد تسمية ExoTrackSelection.blacklist إلى excludeTrack وisBlacklisted إلى isTrackExcluded.
    • إصلاح السلوك غير المتسق بين ExoPlayer.setMediaItem(s) وaddMediaItem(s) عند استدعائهما على قائمة تشغيل فارغة
  • المحوّل:
    • إزالة Transformer.Builder.setMediaSourceFactory(MediaSource.Factory) استخدِم ExoPlayerAssetLoader.Factory(MediaSource.Factory) وTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory) بدلاً منهما.
    • إزالة Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
    • تم إصلاح الخطأ الذي كان يؤدي إلى توقُّف عملية التحويل (ما يؤدي إلى انتهاء مهلة برنامج دمج الصوت والفيديو) إذا تم إرسال إشارة إلى نهاية بث الفيديو في الوقت الذي كانت فيه معالجة إطار إدخال معلّقة.
    • يمكنك طلب برامج الترميز من خلال MediaCodecList بدلاً من استخدام أدوات findDecoder/EncoderForFormat، وذلك لتوسيع نطاق التوافق.
    • إزالة إعدادات B-frame في DefaultEncoderFactory لأنّها لا تعمل على بعض الأجهزة
  • اختيار المقطع الصوتي:
    • أضِف DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange الذي يكون غير مفعَّل تلقائيًا. عند تفعيل هذا الخيار، سيؤدي DefaultTrackSelector إلى بدء عملية اختيار مسار جديد عند تغيير إمكانات العارض.
  • أدوات استخراج البيانات:
    • ‫Ogg: تم إصلاح الخطأ الذي يحدث عند البحث في الملفات ذات المدة الطويلة (#391).
    • FMP4: تم إصلاح المشكلة التي تؤدي إلى تهيئة TimestampAdjuster لإزاحة طابع زمني غير صحيح باستخدام وقت عيّنة البيانات الوصفية من عنصر emsg (#356).
  • الصوت:
    • إصلاح الخطأ الذي يؤدي إلى تعذُّر تشغيل بعض الفيديوهات عند تفعيل ميزة &quot;النفق&quot; وتفعيل AudioProcessors، مثلاً عند قص الفيديو بدون فواصل (#10847)
    • تغليف إطارات Opus في حِزم Ogg في عمليات التشغيل المباشر (التفريغ)
    • استقراء الموقع الجغرافي الحالي أثناء وضع السكون باستخدام ميزة جدولة نقل البيانات
    • أضِف Renderer.release() وAudioSink.release() لإصدار الموارد في نهاية عمر اللاعب.
    • الاستماع إلى تغييرات إمكانات الصوت في DefaultAudioSink أضِف المَعلمة المطلوبة context في الدالة الإنشائية الخاصة بـ DefaultAudioSink، والتي سيتم من خلالها تسجيل DefaultAudioSink كمعالج للأحداث في AudioCapabilitiesReceiver وتعديل السمة audioCapabilities عند إعلامها بتغيير في الإمكانات.
    • نشر تغييرات إمكانات الصوت من خلال حدث جديد onAudioCapabilitiesChanged في واجهة AudioSink.Listener، وواجهة جديدة RendererCapabilities.Listener تؤدي إلى تشغيل أحداث onRendererCapabilitiesChanged.
    • أضِف ChannelMixingAudioProcessor لتطبيق التوسيع/المزج على قنوات الصوت.
    • أضِف قيمة عدد صحيح جديدة DISCARD_REASON_AUDIO_BYPASS_POSSIBLE إلى DecoderDiscardReasons لإيقاف برنامج ترميز الصوت عندما يكون وضع التجاوز متاحًا بعد تغيير إمكانات الصوت.
    • إضافة إمكانية التشغيل المباشر لتنسيقات DTS Express وDTS:X (#335)
  • الفيديو:
    • اجعل MediaCodecVideoRenderer يعرض VideoSize بعرض وارتفاع 0 عند إيقاف أداة العرض. يتم استدعاء Player.Listener.onVideoSizeChanged وفقًا لذلك عند حدوث تغيير في Player.getVideoSize(). بموجب هذا التغيير، سيصبح عرض وارتفاع حجم الفيديو في ExoPlayer مع MediaCodecVideoRenderer هو 0 عندما لا يتيح Player.getCurrentTracks عرض الفيديو، أو عندما لم يتم تحديد حجم مسار الفيديو المتوافق بعد.
  • DRM:
    • تقليل مدى رؤية عدة طرق داخلية فقط في DefaultDrmSession لا يُتوقّع استدعاؤها من خارج حزمة إدارة الحقوق الرقمية:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • إضافة مكتبة جديدة لدمج الصوت والفيديو يمكن استخدامها لإنشاء ملف حاوية MP4.
  • إضافة "إعلانات الوسائط التفاعلية":
    • فعِّل أحداث البث المباشر المتعددة الفترات بتنسيق DASH من أجل ميزة "إدراج الإعلانات الديناميكي". يُرجى العِلم أنّ الإصدار الحالي لا يتيح بعد التنقّل في أحداث البث المباشر (#10912).
    • تم إصلاح الخطأ الذي يؤدي إلى إدراج مجموعة إعلانية جديدة في البث المباشر لأنّ موضع المحتوى المحسوب في المخططات الزمنية المتتالية يختلف قليلاً.
  • الجلسة:
    • أضِف طريقة المساعد MediaSession.getControllerForCurrentRequest للحصول على معلومات حول وحدة التحكّم التي تستدعي حاليًا طريقة Player.
    • أضِف androidx.media3.session.MediaButtonReceiver للسماح للتطبيقات بتنفيذ ميزة استئناف التشغيل باستخدام أحداث زر الوسائط التي يتم إرسالها من خلال، على سبيل المثال، سماعة رأس مزوّدة بتقنية البلوتوث (#167).
    • أضِف عملية تنفيذ تلقائية إلى MediaSession.Callback.onAddMediaItems للسماح بتمرير MediaItems المطلوبة إلى Player إذا كانت تتضمّن LocalConfiguration (مثل URI) (#282).
    • إضافة زرَّي الأوامر "الانتقال إلى المحتوى السابق" و "الانتقال إلى المحتوى التالي" إلى العرض المضغوط لإشعارات الوسائط تلقائيًا على الإصدار 12 من نظام التشغيل Android والإصدارات الأقدم (‎#410)
    • أضِف عملية تنفيذ تلقائية إلى MediaSession.Callback.onAddMediaItems للسماح بتمرير MediaItems المطلوبة إلى Player إذا كانت تتضمّن LocalConfiguration (مثل URI) (#282).
    • إضافة زرَّي الأوامر "الانتقال إلى المحتوى السابق" و "الانتقال إلى المحتوى التالي" إلى العرض المضغوط لإشعارات الوسائط تلقائيًا على الإصدار 12 من نظام التشغيل Android والإصدارات الأقدم (‎#410)
  • UI:
    • أضِف طريقتَي Util shouldShowPlayButton وhandlePlayPauseButtonAction لكتابة عناصر مخصّصة في واجهة المستخدم تتضمّن زر تشغيل/إيقاف مؤقت.
  • إضافة RTSP:
    • بالنسبة إلى MPEG4-LATM، استخدِم قيمة profile-level-id التلقائية إذا لم تكن متوفرة في رسالة Describe Response SDP (#302).
    • استخدِم معرّف الموارد المنتظم الأساسي لتحديد المسار النسبي من جلسة RTSP إذا كان متوفّرًا في عنوان استجابة DESCRIBE (#11160).
  • إضافة DASH:
    • أزِل إزاحة الوقت للوسائط من MediaLoadData.startTimeMs وMediaLoadData.endTimeMs لعمليات بث DASH المتعددة الفترات.
    • تم إصلاح الخطأ الذي كان يتسبّب في ظهور IndexOutOfBoundsException (#10838) عند إعادة إعداد مصدر وسائط Dash مباشر متعدد الفترات.
  • إضافة HLS:
    • أضِف HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) لضبط مهلة مؤقتة لمؤشر التحميل كي ينتظر إلى أن يتم تهيئة TimestampAdjuster. إذا لم يكتمل الإعداد قبل انتهاء المهلة، سيتم عرض الخطأ PlaybackException لتجنُّب توقّف التشغيل إلى الأبد. تم ضبط المهلة على صفر تلقائيًا (#323).
  • أدوات الاختبار:
    • التحقّق من عدم حساسية نظام معرّف الموارد المنتظم (URI) لحالة الأحرف في DataSourceContractTest
  • إزالة الرموز المتوقّفة نهائيًا:
    • أزِل دوال إنشاء DefaultAudioSink واستخدِم DefaultAudioSink.Builder بدلاً منها.
    • إزالة HlsMasterPlaylist واستخدام HlsMultivariantPlaylist بدلاً منها
    • إزالة Player.stop(boolean) استخدِم Player.stop() وPlayer.clearMediaItems() (إذا كانت قيمة reset هي true) بدلاً من ذلك.
    • أزلنا اثنين من أدوات إنشاء SimpleCache المتوقّفة نهائيًا، واستخدمنا أداة إنشاء غير متوقّفة نهائيًا تأخذ DatabaseProvider بدلاً من ذلك لتحسين الأداء.
    • أزِل الدالة الإنشائية DefaultBandwidthMeter واستخدِم DefaultBandwidthMeter.Builder بدلاً منها.
    • أزِل دوال إنشاء DefaultDrmSessionManager، واستخدِم DefaultDrmSessionManager.Builder بدلاً منها.
    • إزالة اثنين من أدوات إنشاء HttpDataSource.InvalidResponseCodeException التي تم إيقافها نهائيًا، واستخدام أداة إنشاء غير متوقّفة نهائيًا تقبل حقولاً إضافية(cause وresponseBody) لتحسين تسجيل الأخطاء
    • إزالة DownloadHelper.forProgressive وDownloadHelper.forHls وDownloadHelper.forDash وDownloadHelper.forSmoothStreaming واستخدام DownloadHelper.forMediaItem بدلاً منها
    • أزِل الدالة الإنشائية DownloadService المتوقّفة نهائيًا، واستخدِم دالة إنشائية غير متوقّفة نهائيًا تتضمّن خيار توفير المَعلمة channelDescriptionResourceId.
    • أزِل ثوابت السلسلة التي تم إيقافها نهائيًا لمجموعات الرموز (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 عمليات الدمج التالية.

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

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

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

الإصدار 1.0.1

‫18 أبريل 2023

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

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

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

الإصدار 1.0.0

‫22 مارس 2023

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

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

لم يتم إجراء أي تغييرات منذ الإصدار 1.0.0-rc02.

الإصدار 1.0.0-rc02

‫2 مارس 2023

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

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

  • المكتبة الأساسية:
    • إصلاح مشكلة رصد نوع الشبكة على الإصدار 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:
    • Catch the IllegalArgumentException thrown in parsing of invalid RTSP Describe response messages (#10971).
  • الجلسة:
    • إصلاح الخطأ الذي كان يؤدي إلى عدم تعديل زر التشغيل/الإيقاف المؤقت في الإشعار وفقًا لحالة المشغّل (#192)
  • إضافة "إعلانات الوسائط التفاعلية":
    • تم إصلاح خطأ كان يمنع بدء بث DAI بدون أي إعلانات لأنّه لم يتم تلقّي حدث LOADED الأول (والوحيد في حالة عدم عرض إعلانات).

الإصدار 1.0.0-rc01

‫16 فبراير 2023

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

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

  • المكتبة الأساسية:
    • عدِّل منطق ترتيب أداة فك الترميز في أداة العرض للحفاظ على إعدادات MediaCodecSelector المفضّلة، حتى إذا أفادت أداة فك الترميز بأنّها قد لا تتمكّن من تشغيل الوسائط بأداء جيد. على سبيل المثال، باستخدام أداة الاختيار التلقائية، سيتم تفضيل أداة فك ترميز الأجهزة التي تتوافق مع الوظائف فقط على أداة فك ترميز البرامج التي تتوافق مع التنسيق بالكامل (#10604).
    • أضِف ExoPlayer.Builder.setPlaybackLooper الذي يضبط سلسلة تشغيل حالية مسبقًا لمثيل ExoPlayer جديد.
    • السماح بإزالة أدوات مساعدة مدير التنزيل (#10776)
    • أضِف مَعلمة إلى BasePlayer.seekTo للإشارة أيضًا إلى الأمر المستخدَم في البحث.
    • استخدام المظهر عند تحميل عناصر قابلة للرسم على الإصدار 21 من واجهة برمجة التطبيقات أو الإصدارات الأحدث (#220)
    • إضافة ConcatenatingMediaSource2 تتيح دمج عناصر وسائط متعددة في نافذة واحدة (#247)
  • أدوات استخراج البيانات:
    • يتم عرض الخطأ ParserException بدلاً من NullPointerException إذا كان جدول العيّنات (stbl) لا يتضمّن وصفًا مطلوبًا للعيّنات (stsd) عند تحليل وحدات trak.
    • تخطّي العيّنات بشكل صحيح عند الانتقال مباشرةً إلى إطار مزامنة في fMP4 (#10941)
  • الصوت:
    • استخدِم معدّل نقل البيانات بتنسيق الصوت المضغوط لحساب الحد الأدنى لحجم المخزن المؤقت لـ AudioTrack في عمليات التشغيل المباشر (passthrough).
  • النص:
    • إصلاح مشكلة TextRenderer تمرير فهرس غير صالح (سالب) إلى Subtitle.getEventTime إذا كان ملف الترجمة والشرح لا يحتوي على أي إشارات
    • ‫SubRip: تمت إضافة دعم لملفات UTF-16 إذا كانت تبدأ بعلامة ترتيب البايتات.
  • البيانات الوصفية:
    • تحليل قيم متعدّدة مفصولة بقيم فارغة من إطارات ID3، على النحو المسموح به في ID3 الإصدار 2.4
    • أضِف MediaMetadata.mediaType للإشارة إلى نوع المحتوى أو نوع المجلد الموصوفَين بالبيانات الوصفية.
    • أضِف MediaMetadata.isBrowsable كبديل MediaMetadata.folderType. سيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
  • DASH:
    • إضافة تحليل كامل لمجموعات تعديل الصور، بما في ذلك عدد المربّعات (#3752)
  • UI:
    • إصلاح السمة المتوقّفة نهائيًا PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) لضمان نقل تغييرات مستوى العرض إلى أداة معالجة الأحداث المسجّلة (#229)
    • تم إصلاح ترتيب عناصر التحكّم في مشغّل الوسائط في منتصف الشاشة في PlayerView عند استخدام تنسيق من اليمين إلى اليسار (#227).
  • الجلسة:
    • أضِف فئة مجرّدة SimpleBasePlayer للمساعدة في تنفيذ واجهة Player للمشغّلات المخصّصة.
    • إضافة طريقة مساعدة لتحويل الرمز المميز لجلسة النظام الأساسي إلى Media3 SessionToken (‎#171)
    • استخدِم onMediaMetadataChanged لتفعيل تحديثات لجلسة وسائط المنصة (#219).
    • أضِف جلسة الوسائط كمعلَمة للدالة getMediaButtons() من DefaultMediaNotificationProvider واستخدِم قوائم غير قابلة للتغيير لتوضيح المعنى (#216).
    • أضِف أداة معالجة onSetMediaItems callback لتوفير وسائل لتعديل/ضبط قائمة MediaItem، وفهرس البدء والموضع حسب الجلسة قبل الضبط على "المشغّل" (#156).
    • تجنُّب رصد النقر المزدوج لأحداث زر الوسائط غير المرتبطة بالبلوتوث (#233)
    • زيادة فعالية QueueTimeline في حال كانت حالة الجلسة القديمة مشبوهة (#241).
  • البيانات الوصفية:
    • تحليل قيم متعدّدة مفصولة بقيم فارغة من إطارات ID3، على النحو المسموح به في ID3 الإصدار 2.4
    • أضِف MediaMetadata.mediaType للإشارة إلى نوع المحتوى أو نوع المجلد الموصوفَين بالبيانات الوصفية.
    • أضِف MediaMetadata.isBrowsable كبديل MediaMetadata.folderType. سيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
  • إضافة البث:
    • تمت ترقية إصدار حزمة تطوير البرامج (SDK) لخدمة 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 على عمليات الإيداع هذه.

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

  • المكتبة الأساسية:
    • أضِف 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)
    • تم حصر عمليات إزالة التنزيل المتوازي في عملية واحدة لتجنُّب إنشاء عدد كبير جدًا من سلاسل المحادثات (#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) لتحديد ما إذا كان عارض البيانات الوصفية سيُخرج البيانات الوصفية مبكرًا أو بشكل متزامن مع موضع المشغّل.
  • DRM:
    • حلّ مشكلة في تنفيذ ClearKey على Android 13 تؤدي إلى عرض عنوان URL غير فارغ ولكن غير صالح للترخيص.
    • إصلاح الخطأ setMediaDrmSession failed: session not opened عند التبديل بين أنظمة إدارة الحقوق الرقمية في قائمة تشغيل (مثل Widevine إلى ClearKey)
  • النص:
    • ‫CEA-608: التأكّد من التعامل مع أوامر تبديل الخدمة في الحقل 2 بشكل صحيح (#10666)
  • DASH:
    • تحليل EventStream.presentationTimeOffset من ملفات البيانات (#10460)
  • UI:
    • استخدام الإعدادات الحالية التي تم تجاهلها في المشغّل كإعدادات مُسبقة في 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)
    • تم إصلاح الخطأ الذي كان يؤدي إلى حدوث IllegalStateExceptions عند إنشاء رابط ثانٍ بين MediaSession قديم وMediaController في Media3 (#49).
  • RTSP:
    • إضافة معالجة الحِزم المجزّأة بتنسيق H263 (#119)
    • إضافة دعم لتنسيق MP4A-LATM (#162)
  • IMA:
    • إضافة مهلة لتحميل معلومات الإعلان للتعامل مع الحالات التي تتعذّر فيها على حزمة تطوير البرامج لإعلانات الوسائط التفاعلية تحميل إعلان (#10510).
    • منع تخطّي الإعلانات أثناء التشغيل عند الانتقال إلى نهاية المحتوى (#10685)
    • احتساب مدة النافذة بشكل صحيح للبث المباشر الذي يتضمّن إعلانات يتم إدراجها من جهة الخادم، مثل "إعلانات الوسائط التفاعلية" الديناميكية (#10764)
  • إضافة FFmpeg:
    • إضافة علامات جديدة مطلوبة لربط مكتبات FFmpeg بإصدار NDK 23.1.7779620 والإصدارات الأحدث (#9933)
  • إضافة AV1:
    • تحديث إصدار CMake لتجنُّب حالات عدم التوافق مع أحدث إصدارات &quot;استوديو Android&quot; (#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 على عمليات الإيداع هذه.

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

  • المكتبة الأساسية:
    • تأكَّد من أنّ تغيير ShuffleOrder باستخدام ExoPlayer.setShuffleOrder يؤدي إلى إجراء مكالمة إلى Player.Listener#onTimelineChanged مع reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • بالنسبة إلى الوسائط المتدفّقة، أدرِج المسارات المحدّدة فقط في الموضع المخزّن مؤقتًا (#10361).
    • السماح باستخدام أداة تسجيل مخصّصة لجميع نواتج سجلّ ExoPlayer (#9752)
    • تم إصلاح مشكلة عدم عمل setDataSourceFactory في DefaultMediaSourceFactory في بعض الحالات (#116).
  • أدوات استخراج البيانات:
    • إصلاح تحليل مجموعات صور المرجع القصيرة المدى لبرنامج الترميز H265 (#10316)
    • إصلاح تحليل معدّلات نقل البيانات من مربّعات esds (#10381)
  • DASH:
    • تحليل عنوان URL لترخيص ClearKey من ملفات البيانات (#10246)
  • UI:
    • تأكَّد من أنّ 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 على عمليات الإيداع هذه.

يتوافق ذلك مع الإصدار 2.18.0 من ExoPlayer.

  • المكتبة الأساسية:
    • فعِّل إمكانية جمع بيانات تشخيص نظام 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. ويشمل ذلك &quot;إلغاء الإيقاف النهائي&quot; لاسم الطريقة Player.Listener.onTracksChanged، ولكن مع أنواع مختلفة من المَعلمات.
    • غيِّر DefaultTrackSelector.buildUponParameters وDefaultTrackSelector.Parameters.buildUpon لعرض DefaultTrackSelector.Parameters.Builder بدلاً من DefaultTrackSelector.ParametersBuilder المتوقّف نهائيًا.
    • أضِف DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities الذي يكون مفعَّلاً تلقائيًا. عند تفعيل هذا الخيار، سيفضّل DefaultTrackSelector مسارات الصوت التي لا يتجاوز عدد قنواتها إمكانات إخراج الجهاز. على الأجهزة المحمولة، سيتم استخدام تنسيقات الصوت الأحادي أو الاستريو بدلاً من تنسيقات الصوت المتعدد القنوات، ما لم يكن من الممكن تطبيق تأثيرات الصوت المكاني على تنسيق الصوت المتعدد القنوات (الإصدار 12L من نظام التشغيل Android أو الإصدارات الأحدث) أو إذا كان تنسيق صوت محيطي من Dolby.DefaultTrackSelector بالإضافة إلى ذلك، على الأجهزة التي تتوافق مع ميزة "تحديد الموقع المكاني للصوت"، ستراقب السمة DefaultTrackSelector التغييرات في خصائص "تحديد الموقع المكاني للصوت" وستؤدي إلى اختيار مقطع صوتي جديد عند حدوث هذه التغييرات. يتم استبعاد الأجهزة التي تستخدم television وضع واجهة المستخدم من هذه القيود، وسيتم تفضيل التنسيق الذي يتضمّن أكبر عدد من القنوات. لتفعيل هذه الميزة، يجب إنشاء مثيل DefaultTrackSelector باستخدام Context.
  • الفيديو:
    • أعِد تسمية DummySurface إلى PlaceholderSurface.
    • إضافة إمكانية استخدام ترميز AV1 في MediaCodecVideoRenderer.getCodecMaxInputSize
  • الصوت:
    • يستخدم LG AC3 audio decoder نوع MIME غير عادي للإعلان.
    • غيِّر نوع الإرجاع الخاص بـ AudioAttributes.getAudioAttributesV21() من android.media.AudioAttributes إلى برنامج تضمين AudioAttributesV21 جديد للفئة، وذلك لتجنُّب بطء عملية التحقّق من ART على الإصدارات الأقدم من المستوى 21 لواجهة برمجة التطبيقات.
    • يمكنك طلب البيانات من النظام الأساسي (الإصدار 29 من واجهة برمجة التطبيقات أو الإصدارات الأحدث) أو افتراض عدد قنوات ترميز الصوت لتمرير الصوت عندما لا يتم ضبط عدد قنوات تنسيق الصوت، وهو ما يحدث عند إعداد HLS بدون تقسيم إلى أجزاء (10204).
    • اضبط AudioTrack باستخدام قناع القناة AudioFormat.CHANNEL_OUT_7POINT1POINT4 إذا كان برنامج الترميز يخرج صوت PCM بـ 12 قناة (#10322).
  • DRM
    • يجب التأكّد من تعديل جلسة إدارة الحقوق الرقمية بشكل صحيح دائمًا عند البحث عن محتوى بعد تغيير التنسيق مباشرةً (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)
  • UI:
    • إصلاح مشكلة عدم إرسال الأحداث إلى 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 بشكل صريح إذا كان ذلك مطلوبًا.
  • Smooth Streaming:
    • يمنع هذا الخيار تمرير 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).
    • تعديل معلومات موضع الجلسة على المخطط الزمني change(#51)
    • إصلاح خطأ NPE في MediaControllerImplBase بعد تحرير وحدة التحكّم (#74).
  • تشغيل الإعلان / IMA:
    • تقليل معدّل طلب الإعلانات من كل 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 على عمليات الإيداع هذه.

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

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

الإصدار 1.0.0-alpha02

‫2 مارس 2022

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

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

  • Core Library:
    • أضِف طريقة محمية 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. يمكن دائمًا تمييز TrackGroups من خلال ضبط 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)
    • تم إصلاح مشكلة التحليل غير الصحيح لوحدات SPS NAL بتنسيق H.265 (#9719).
    • تحليل تعليقات Vorbis (بما في ذلك METADATA_BLOCK_PICTURE) في ملفات Ogg Opus وOgg Vorbis
  • النص:
    • أضِف حقل MediaItem.SubtitleConfiguration.id يتم نشره إلى الحقل Format.id في مقطع الترجمة والشرح الذي تم إنشاؤه من الإعدادات (#9673).
    • إضافة دعم أساسي لترجمة WebVTT في حاويات Matroska (#9886)
    • منع Cea708Decoder من قراءة أكثر من الحجم المحدّد لكتلة خدمة
  • DRM:
    • إزالة playbackLooper من DrmSessionManager.(pre)acquireSession عندما يستخدم تطبيق DrmSessionManager في MediaSource مخصّص، يجب تمرير playbackLooper إلى DrmSessionManager.setPlayer بدلاً من ذلك.
  • تشغيل الإعلان / IMA:
    • إضافة دعم ميزة "إدراج الإعلان الديناميكي" (DAI) في IMA (#8213)
    • أضِف طريقة إلى AdPlaybackState للسماح بإعادة ضبط مجموعة إعلانية كي يمكن تشغيلها مرة أخرى (#9615).
    • فرض سرعة تشغيل 1.0 أثناء تشغيل الإعلان (#9018)
    • تم إصلاح المشكلة التي كانت تؤدي إلى إعادة ضبط التشغيل على الفور (#9929) عند تعذّر تحميل مجموعة إعلانية.
  • UI:
    • إصلاح لون الأرقام في زرَّي StyledPlayerViewالترجيع والتقديم السريع عند استخدام مظاهر معيّنة (#9765)
    • ترجمة سلاسل سرعة التشغيل بشكل صحيح (#9811)
  • DASH:
    • أضِف السمات الأساسية والتكميلية التي تم تحليلها إلى Representation (#9579).
    • توفير دعم لدور مسار forced-subtitle (#9727)
    • إيقاف تفسير دور مسار main على أنّه C.SELECTION_FLAG_DEFAULT
    • إصلاح منطق استبعاد عنوان URL الأساسي للبيانات الوصفية التي لا تحدّد مساحة اسم DVB (‫#9856)
    • إتاحة عناوين URL النسبية MPD.Location (#9939)
  • HLS:
    • املأ Format.label بشكل صحيح لبث HLS الصوتي فقط (#9608).
    • استخدِم الإعداد التلقائي "التحضير بدون تقسيم" لتحسين وقت بدء التشغيل. إذا كانت عروضك تتضمّن مسارات ترجمة وشرح مدمجة غير معرَّفة في قائمة التشغيل الرئيسية، عليك إضافتها إلى قائمة التشغيل الرئيسية لتصبح متاحة للتشغيل، أو إيقاف الإعداد بدون تقسيم إلى أجزاء باستخدام HlsMediaSource.Factory.setAllowChunklessPreparation(false).
    • إتاحة البحث الدقيق عن إطارات المفاتيح في HLS (#2882)
  • RTSP:
    • توفير واجهة برمجة تطبيقات للعميل لتجاوز SocketFactory المستخدَم في أي اتصال بالخادم (#9606)
    • تفضيل طريقة المصادقة DIGEST على BASIC إذا كانتا متوفّرتَين (#9800)
    • التعامل مع الحالات التي لا يتوفّر فيها توقيت مسار RTSP (#9775).
    • تجاهُل قيم عنوان RTP-Info غير الصالحة (#9619)
  • المحوّل:
    • زيادة الحد الأدنى المطلوب من إصدار واجهة برمجة التطبيقات إلى 21
    • يُستخدم TransformationException الآن لوصف الأخطاء التي تحدث أثناء عملية تحويل.
    • أضِف TransformationRequest لتحديد خيارات التحويل.
    • السماح بتسجيل عدة مستمعين
    • إصلاح مشكلة تعليق Transformer عند قراءة جزء من ناتج الترميز.
    • إصلاح خطأ محتمل في NPE في Transformer.getProgress عند طرح استثناءات أثناء تحرير أداة الدمج
    • أضِف تطبيقًا تجريبيًا لتطبيق عمليات التحويل.
  • إضافة MediaSession:
    • بشكلٍ تلقائي، يمحو الزر MediaSessionConnector قائمة التشغيل عند إيقافها. يمكن للتطبيقات التي تريد الاحتفاظ بقائمة التشغيل استدعاء setClearMediaItemsOnStop(false) على الموصّل.
  • إضافة البث:
    • تم إصلاح الخطأ الذي كان يمنع CastPlayer من استدعاء onIsPlayingChanged بشكل صحيح (#9792).
    • توفير إمكانية استخدام البيانات الوصفية الصوتية، بما في ذلك الأعمال الفنية، مع DefaultMediaItemConverter (#9663)
  • إضافة FFmpeg:
    • يجب أن يعتمد build_ffmpeg.sh على أدوات LLVM الثنائية بدلاً من أدوات GNU (#9933).
  • التوافق مع Android 12:
    • رقِّي إضافة Cast لتعتمد على com.google.android.gms:play-services-cast-framework:20.1.0. الإصدارات الأقدم من play-services-cast-framework غير متوافقة مع التطبيقات التي تستهدف الإصدار 12 من نظام التشغيل Android، وستتعطّل مع ظهور IllegalArgumentException عند إنشاء PendingIntent (#9528).
  • إزالة الرموز المتوقّفة نهائيًا:
    • إزالة Player.EventListener يمكنك استخدام Player.Listener كبديل.
    • إزالة MediaSourceFactory#setDrmSessionManager وMediaSourceFactory#setDrmHttpDataSourceFactory وMediaSourceFactory#setDrmUserAgent استخدِم MediaSourceFactory#setDrmSessionManagerProvider بدلاً من ذلك.
    • إزالة MediaSourceFactory#setStreamKeys استخدِم MediaItem.Builder#setStreamKeys بدلاً من ذلك.
    • إزالة MediaSourceFactory#createMediaSource(Uri) استخدِم MediaSourceFactory#createMediaSource(MediaItem) بدلاً من ذلك.
    • إزالة setTag من DashMediaSource وHlsMediaSource وSsMediaSource يمكنك استخدام MediaItem.Builder#setTag كبديل.
    • إزالة DashMediaSource#setLivePresentationDelayMs(long, boolean) استخدِم MediaItem.Builder#setLiveConfiguration و MediaItem.LiveConfiguration.Builder#setTargetOffsetMs لتجاوز ملف البيان، أو DashMediaSource#setFallbackTargetLiveOffsetMs لتقديم قيمة احتياطية.
    • إزالة (Simple)ExoPlayer.setThrowsWhenUsingWrongThread لم يعُد بإمكانك إيقاف ميزة فرض استخدام سلاسل المحادثات.
    • إزالة ActionFile وActionFileUpgradeUtil استخدِم الإصدار 2.16.1 من ExoPlayer أو إصدارًا أقدم لاستخدام 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، مثل إدراج الإعلانات من خلال حزمة تطوير البرامج للإعلانات التفاعلية (IMA SDK).

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

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