Media3

مكتبات الدعم لحالات استخدام الوسائط
آخر الأخبار الإصدار الثابت إصدار محتمل الإصدار التجريبي الإصدار الأولي
‫24 يونيو 2026 1.10.1 - - 1.11.0-alpha01

تحديد الاعتماديات

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

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

Groovy

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

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

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

    // For inspecting media files
    implementation "androidx.media3:media3-inspector:$media3_version"
    // For extracting and processing video frames
    implementation "androidx.media3:media3-inspector-frame:$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 applying Lottie effects on video frames
    implementation "androidx.media3:media3-effect-lottie:$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.10.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 inspecting media files
    implementation("androidx.media3:media3-inspector:$media3_version")
    // For extracting and processing video frames
    implementation("androidx.media3:media3-inspector-frame:$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 applying Lottie effects on video frames
    implementation("androidx.media3:media3-effect-lottie:$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.11.0

1.11.0-alpha01

  • المكتبة المشتركة:
    • أضِف Format.channelMask لتمثيل قناع قناة الصوت بشكل صريح، وUtil.getAudioTrackChannelConfig(Format) جديدًا لحلّه بأمان.
    • تمت ترقية Kotlin من الإصدار 2.0.20 إلى الإصدار 2.2.0.
  • ExoPlayer:
    • تم إصلاح خطأ التزامن الذي يعتمد على التوقيت والذي قد يتسبّب في حدوث IllegalStateException أو IndexOutOfBoundsException في ExoPlayer.
    • تخفيف عمليات التحقّق من عدد المجموعات الإعلانية في AdsMediaSource للسماح بانخفاض عدد المجموعات الإعلانية عند معالجة مجموعة إعلانية بالكامل (hasUnplayedAds() هو false)، ما يتيح تغيير حجم المجموعة الإعلانية الديناميكية أثناء عمليات إعادة الضبط.
    • إتاحة عرض الإعلانات في المحتوى المتعدد الفترات (مثل DASH) من خلال تقسيم AdPlaybackState وإزاحته لكل فترة
    • أضِف getFlags() وFLAG_STRICT_DURATION إلى SampleStream للسماح لعمليات البث بالإبلاغ عن العلامات، وعدِّل أدوات العرض للتحقّق من هذه العلامات ديناميكيًا.
    • الرجوع إلى أداة تقدير عدد اللقطات في الثانية في MediaCodecVideoRenderer وإلى تنسيق إخراج الترميز في MediaCodecAudioRenderer لاحتساب معدّل تشغيل الترميز عندما لا توفّر تنسيقات البث قيمة صالحة، وتجنُّب إعادة ضبط الترميز بدون داعٍ
    • إزالة قصاصات المحتوى للإعلانات التي يتم إدراجها من جهة العميل في مشغّل الفيديو الأساسي بدلاً من ذلك، تتولّى السمة AdsMediaSource مهمة منطق الاقتصاص. يجب تعديل مصادر الإعلانات المخصّصة التي يتم إدخالها من جهة العميل لتنفيذ عملية قص المحتوى داخليًا.
    • يجب وضع علامة supported=NO_EXCEEDS_CAPABILITIES على المقاطع الصوتية التي تتضمّن ملف تعريف أو مستوى ترميز مكتوبًا بشكل صحيح ولكن غير معروف، بدلاً من وضع علامة supported=YES (وهي العلامة التي يتم وضعها على المقاطع الصوتية التي تتضمّن معلومات غير صحيحة أو غير مكتملة عن ملف التعريف أو المستوى). يضمن ذلك عدم اختيار هذه المقاطع الصوتية (التي من غير المحتمل أن تكون متوافقة مع الجهاز) عندما تتوفّر بدائل متوافقة بشكل أفضل.
    • أضِف DefaultPreloadManager.SimpleRankingDataComparator، وهو RankingDataComparator يقارن ترتيب ملفات الوسائط استنادًا إلى المسافة بينها وبين فهرس ملف الوسائط الذي يتم تشغيله حاليًا. يمكن للتطبيقات إلغاء طريقة compare(Integer, Integer) إذا دعت الحاجة إلى منطق مقارنة أكثر دقة. يمكن إدخال SimpleRankingDataComparator المخصّص من خلال دالة إنشاء جديدة خاصة بالفئة DefaultPreloadManager.Builder.
    • تقليل خطر حدوث خطأ OOM في DefaultLoadControl.prioritizeTimeOverSizeThresholds من خلال الرجوع إلى حدود حجم بايت المخزن المؤقت إذا كانت ذاكرة الكومة المتاحة تبدو محدودة.
    • تعديل طريقة التعامل مع الصور الثابتة عندما لا يتم ضبط MediaItem.imageDurationUs: أصبحت الصور الثابتة بتنسيقَي JPEG وHEIC "تُعرض" الآن بمدة تلقائية قصيرة جدًا (بالطريقة نفسها التي كانت تُعرض بها الصور بتنسيق PNG وغيرها من الصور سابقًا).
    • أضِف MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter) إلى BandwidthMeter لتوصيلها بـ MediaSource. سيظل يتم استدعاء الطريقة المتوقّفة نهائيًا التي تتضمّن تنفيذًا مخصّصًا تلقائيًا، ولكن يُنصح بتنفيذ الطريقة الجديدة واستخدام BandwidthMeter.getTransferListener() لتحقيق التكافؤ مع الطريقة القديمة.
    • في DefaultBandwidthMeter، أضِف دعمًا لـ InitialBitrateSupplier. يتيح ذلك للتطبيقات توفير منطقها الخاص لتحديد تقدير معدّل نقل البيانات الأولي، والذي سيتم استخدامه عند إنشاء DefaultBandwidthMeter وعند تغيير أنواع الشبكات. يمكن ضبط المورّد من خلال DefaultBandwidthMeter.Builder.setInitialBitrateSupplier().
    • تفعيل الجدولة الديناميكية تلقائيًا سيتم تشغيل حلقة عمل ExoPlayer التشغيل بشكل ديناميكي بدلاً من تشغيلها على فترات زمنية ثابتة.
    • إزالة عملية إعادة ضبط غير ضرورية يمكن أن تحدث عند دمج مقاطع صوتية تتضمّن عيّنات ما قبل التشغيل مع تشغيل نشط
    • في DefaultBandwidthMeter، يمكنك تحسين getInitialBitrateCountryGroupAssignment لعرض مهام مجموعات البلدان المجمّعة في عدد صحيح 32 بت بدلاً من مصفوفة، ما يقلّل من حجم الرمز البرمجي ويتجنّب عمليات التخصيص.
    • تم إصلاح حالات تعذُّر تهيئة AudioTrack على بعض الأجهزة من خلال التأكّد من أنّ منطق إعادة المحاولة يحاول دائمًا استخدام الحد الأدنى لحجم ذاكرة التخزين المؤقت وهو ثانية واحدة إذا لم تنجح محاولات إعادة المحاولة الأخرى (عن طريق خفض حجم المخزن المؤقت إلى النصف) (#3207).
    • إصلاح مشكلة الترميز على بعض الأجهزة التي كان الترميز فيها يستهلك جميع العيّنات إذا تم مسحها سابقًا قبل تلقّي مخازن مؤقتة للإدخال
    • أضِف ExoPlayer.Builder.enablePerStreamMediaProgression() التجريبي للسماح بتقديم معالجة الوسائط على أساس كل بث. يؤدي ذلك إلى تقليل وقت الاستجابة عند بدء التشغيل بين عناصر قائمة التشغيل وتجنُّب توقّف التشغيل بشكل مفاجئ عند عرض محتوى قصير جدًا (#3122).
    • تم إصلاح مشكلة حالة التزامن المتعلّقة باستخدام معرّف جلسة الصوت، حيث سيتم استخدام معرّف جلسة الصوت الأوّلي الذي يتم إنشاؤه تلقائيًا بواسطة ExoPlayer بدلاً من القيمة التي تم ضبطها بواسطة setAudioSessionId (#3241).
    • إضافة دعم تجريبي لتشغيل البيانات الوصفية الموقّتة بتنسيق HAGC (ST 2094-50) للوسائط المتدفقة (مثل MP4 وMatroska) يدمج المشغّل تلقائيًا مسارات البيانات الوصفية بتنسيق HAGC مع مسار الفيديو المرتبط بها، ويقدّم البيانات الوصفية خارج النطاق إلى برنامج الترميز على الأجهزة التي تعمل بالإصدار 37 من واجهة برمجة التطبيقات أو الإصدارات الأحدث. يمكن إيقاف هذا السلوك من خلال DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false).
  • CompositionPlayer:
    • تم إصلاح مشكلة عدم إصدار مثيلات TrackSelector.
  • المحوّل:
    • تم إصلاح مشكلة قد تؤدي إلى الإبلاغ عن ExportResult.fileSizeBytes بشكل مفرط.
  • اختيار المقطع الصوتي:
    • عرِّض BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR وأضِف AdaptiveTrackSelection.Factory.setTrackFormatComparator للسماح بترتيب التنسيقات المخصّصة وتحديد أولوية اختيار معدّل نقل البيانات التكيّفي (ABR) بما يتجاوز الترتيب حسب معدّل نقل البيانات فقط.
  • أدوات الاستخراج:
    • ‫MP4 وMP3 وFLAC: أضِف FLAG_DISABLE_ARTWORK_METADATA للسماح بتجاهل الصور المرفقة وبيانات الغلاف الوصفية أثناء تحليل الحاوية لتقليل استهلاك الذاكرة أثناء التشغيل (#2077). يمكن أيضًا تفعيل هذه الميزة بشكل مركزي من خلال DefaultExtractorsFactory.setDisableArtworkMetadata.
    • ‫MP4: إضافة إمكانية استخراج مسارات البيانات الوصفية الموقّتة ITU-T T.35 (it35)
    • ‫MP4: إضافة إمكانية استخراج البيانات الوصفية الخاصة بالفصول (بتنسيقي Nero وQuickTime). يُفضَّل استخدام فصول QuickTime إذا كان كلاهما متوفّرًا. يتم عرض معلومات الفصول المستخرَجة كإدخالات Chapter ضمن Metadata للمسار، ما يتيح التنقّل بين الفصول في ملفات MP4 وM4A وM4B (مثل الكتب الصوتية وبرامج البودكاست) (#2803).
    • ‫WAV وMatroska وMP4: تمت إضافة إمكانية استخدام صوت PCM بنقطة عائمة 64 بت (#3090).
    • Matroska: استخدِم البيانات الوصفية لترميز البث المباشر لبرنامج الترميز من أجل ملء ColorInfo بدقة.
    • ‫MP4: تمت إضافة إمكانية البحث في ملفات MP4 المجزّأة باستخدام المربّع mfra عند عدم توفّر المربّع sidx. لتفعيل ذلك، يجب تقديم FLAG_READ_MFRA_FOR_SEEK_MAP إلى FragmentedMp4Extractor، ويتم ذلك تلقائيًا في DefaultExtractorsFactory (#3088).
    • تجاهُل بيانات av1C التي تتضمّن إصدارًا غير متوافق
    • ‫MP4: إضافة دعم لـ PCM ذي النقطة العائمة الكبيرة في مربّعات fpcm
    • ‫Matroska: تحليل معلومات الفصول إلى إدخالات Chapter في Metadata لمقطع صوتي
    • ‫MPEG-TS: تحسين استخراج بث DTS-HD وDTS Express من خلال دمج البث الفرعي الأساسي والبث الفرعي الإضافي في عيّنة واحدة، ما يؤدي إلى حلّ مشاكل التشغيل التي كان يتم فيها عرض البثين كعينات منفصلة (#3147).
    • ‫MP4: منع الحلقات المتكرّرة والقراءات خارج النطاق عند تحليل عناصر علامة البيانات الوصفية الفارغة (#3191).ilst
    • MPEG-TS: تأكَّد من عرض الإطار الأخير في عمليات البث التي تكون فيها حزمة PES الأخيرة ذات طول معروف (#3206).
    • ‫MP3: إصلاح عملية إعداد التقارير عن معدل نقل البيانات للملفات التي تتضمّن عنوان Xing وVBRI
    • Matroska: التعامل مع المقاطع الصوتية المحدّدة في المجموعة الأخيرة (#3250)
    • Matroska: إضافة دعم لبرنامج ALAC (#3268)
    • ‫MP4: السماح بمربّعات sgpd ذات طول متغير في ملفات MP4 المجزّأة (#3243)
  • الصوت:
    • إضافة فترة سماح مدتها 100 ملي ثانية في أدوات عرض الصوت في ExoPlayer عند الانتقال من حالة "جاهز" إلى حالة "غير جاهز"، وذلك لتجنُّب حالات نقص مؤقتة في المخزن المؤقت وتجنُّب حالات التخزين المؤقت غير المتوقّعة أثناء البث النشط (‫#3210).
    • تغيير منطق حجم المخزن المؤقت التلقائي لترميز PCM في DefaultAudioTrackBufferSizeProvider لاستخدام مخزن مؤقت ثابت يبلغ 500 ملي ثانية لتقليل الاعتماد على الجهاز
    • تعديل MediaCodecAudioRenderer لاستخراج spatial channelMask من برنامج الترميز الخاص بالنظام الأساسي، ما يتيح DefaultAudioSink استخدام هذه القناع الواضح بدلاً من استنتاج قناع من عدد القنوات
    • حوِّل مَعلمات AudioSink.configure إلى فئة بيانات. يجب نقل عمليات الإلغاء المخصّصة لـ ForwardingAudioSink.configure إلى توقيع الطريقة الجديد.
    • إضافة إمكانية الحفاظ على درجة الصوت عند تغيير سرعة تشغيل بث صوتي باستخدام EditedMediaItem.Builder#setSpeed(SpeedParameters)
    • تحسين ToFloatPcmAudioProcessor لتتيح تحويل 8-bit PCM و16-bit big-endian PCM و64-bit floating point PCM إلى 32-bit floating point PCM (#3090).
    • تغيير قيمة الإرجاع الخاصة بـ DecoderAudioRenderer.getChannelMapping إلى ImmutableIntArray
    • تم إصلاح الخطأ الذي يتسبّب في توقُّف التشغيل عند تشغيل قائمة تشغيل تتضمّن ملفات صوتية متواصلة في وضع النقل المضغوط.
    • أرسِل Timeline والمعرّف الفريد العالمي للفترة إلى AudioSink.configure وAudioProcessor.StreamMetadata لتوفير سياق قائمة التشغيل لمعالجات الصوت (#418).
    • اضبط AudioProcessor.StreamMetadata.positionOffsetUs الصحيح للسماح بمعالجة الصوت المستندة إلى الوقت (#418).
    • إضافة دعم لترميز PCM ذي الفاصلة العائمة 32 بت و64 بت بنظام الترتيب الكبير.
  • الفيديو:
    • تم إصلاح منطق الانضمام إلى الفيديو لاحتساب المخازن المؤقتة التي تم إسقاطها أثناء الانضمام على أنّها تم تخطّيها بدلاً من إسقاطها.
    • إصلاح قرار العرض الفوري عند ضبط سطح جديد لتجنُّب فقدان إطارات على الأجهزة التي لا تتوافق مع أسطح العناصر النائبة
    • إصلاح تقدير عدد اللقطات في الثانية في MediaCodecVideoRenderer ليكون أكثر دقة من خلال احتساب اللقطات التي تم إسقاطها أو تخطّيها
    • السماح بضبط الحدّ المستخدَم لتحديد موعد عرض الإطارات مبكرًا. القيمة التلقائية هي 50 ملي ثانية، ولكن يمكن تخصيص القيمة من خلال MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold().
  • النص:
    • ‫TTML: الرجوع إلى displayAlign من style للمناطق (#2559)
    • ‫TTML: اكتساب وقت بدء الإشارة من العنصر الأصل لعناصر <p> (#3246)
  • البيانات الوصفية:
    • أضِف حقل MediaMetadata.discSubtitle وحلِّله من بيانات ID3v2.4 TSST وVorbis DISCSUBTITLE.
    • تحليل رقم القرص وعدده من إطار ID3 TPOS
  • التأثير:
    • محو حالة إعادة الرسم في FinalShaderProgramWrapper عند إفراغ المخزن المؤقت لمنع توقّف المشغّل عند البحث
  • Muxers:
    • إضافة إمكانية استخدام مراجع المسارات (المربّع tref) في Mp4Muxer من خلال واجهة برمجة تطبيقات addTrackReference جديدة يتيح ذلك إنشاء علاقات بين المقاطع، مثل ربط مقطع بيانات وصفية بمقطع الفيديو الذي يصفه.
    • أضِف OggMuxer للسماح بدمج وسائط OPUS أو VORBIS في تنسيق الملف ogg.
    • أضِف WavMuxer لإنشاء ملف WAV (يتوافق مع PCM ذي الأعداد الصحيحة والأعداد العشرية).
    • أضِف setAttemptStreamableOutputEnabled إلى InAppMp4Muxer.Factory للسماح بكتابة ملفات أصغر غير قابلة للبث بدون مساحة محجوزة.
    • إتاحة استخدام تنسيق IAMF الصوتي في Mp4Muxer وFragmentedMp4Muxer
  • إضافة "إعلانات الوسائط التفاعلية":
    • أضِف ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot للسماح بتوفير خانة إعلانية لاستخدامها في الإعلانات أثناء الإيقاف المؤقت.
    • تم إصلاح الخطأ الذي يؤدي إلى ظهور زر التخطّي في الإعلان الثاني مباشرةً عند عرض إعلانات VAST متتالية يمكن تخطّيها (#3165).
  • الجلسة:
    • إصلاح حالات الإغلاق التام المحتملة وأعطال IllegalStateException داخل MediaNotificationManager عند استخدام جلسة مع مشغّل حلقة تكرار في سلسلة الخلفية
    • فرض متطلبات أكثر صرامة بشأن سلاسل المحادثات لطُرق MediaSession تُرسِل الآن طرق Void عمليات التنفيذ تلقائيًا إلى سلسلة المكرّر الحلقي للتطبيق، وتُصدر أدوات الوصول إلى الحالة (getters) صراحةً IllegalStateException عند استدعائها من سلسلة أخرى غير المكرّر الحلقي للتطبيق.
    • إصلاح عُطل دمج المخطط الزمني خارج النطاق (IllegalStateException في MediaUtils.mergePlayerInfo) من خلال تتبُّع اتساق الحالة لكل وحدة تحكّم على مستوى الجلسة
    • أضِف androidx.media3.session.MediaSessionManager لتوفير الدعم للاستعلام عن جلسات الوسائط النشطة وعرض مثيلات SessionToken من Media3.
    • تغيير السلوك التلقائي للدالة MediaSession.Callback.onConnect إذا لم يتم إلغاء تعريف الطريقة لتوفير إذن الوصول للقراءة فقط لوحدات التحكّم غير الموثوق بها
    • إضافة إمكانية إلغاء اسم الحزمة عند إنشاء MediaSession من خلال واجهة برمجة تطبيقات جديدة MediaSession.Builder#setPackageNameOverride يجب أن يكون لدى المتصل إذن بتجاهل اسم حزمة الجلسة.android.permission.OVERRIDE_MEDIA_SESSION_OWNER
    • أضِف MediaSession.Callback.onConnectAsync(). تتيح الطريقة الجديدة معالجة محاولة ربط وحدة التحكّم بشكل غير متزامن. يمكن للتطبيقات عرض Future فوري مع Futures.immediateFuture(ConnectionResult) لتحقيق السلوك السابق. ننصحك بنقل البيانات إلى الطريقة الجديدة لأنّ Callback.onConnect هو أحد العناصر المرشّحة للإيقاف نهائيًا.
    • تم إصلاح المشكلة التي لم يتعرّف فيها تصفّح Bluetooth AVRCP على MediaLibraryService في الإصدارين 36 و37 من واجهة برمجة التطبيقات.
  • UI:
    • إصلاح مشكلة عرض الإطار الأول بحجم غير صحيح عند إعادة إنشاء ContentFrame في منتصف التشغيل (#3238)
    • أضِف الفئة CurrentMediaItemState وrememberCurrentMediaItemState Composable المقابل إلى الوحدة media3-ui-compose. يتم استخدام عنصر الاحتفاظ بالحالة هذا في demo-compose لعرض معلومات وصفية مختلفة حول MediaItem الذي يتم تشغيله حاليًا.
    • أضِف الفئة PlaylistState وrememberPlaylistState Composable المقابل إلى الوحدة media3-ui-compose. يتم استخدام عنصر الاحتفاظ بالحالة هذا في demo-compose لعرض معلومات وصفية مختلفة حول MediaItems التي تم ضبطها في "مشغّل الفيديو".
    • إضافة واجهة برمجة تطبيقات للتقديم السريع/التصوير البطيء إلى PlaybackSpeedState استخدِم هذه الوظيفة في demo-compose لعرض التقديم السريع من خلال الضغط مع الاستمرار.
    • أضِف العنصر القابل للإنشاء MiniController إلى الوحدة media3-ui-compose-material3. ويوفّر عنصرًا مضغوطًا للتحكّم في Player مع عرض العنوان والفنان والعمل الفني ومستوى تقدّم عنصر الوسائط الحالي.
    • أضِف الفئة ErrorState وrememberErrorState Composable المقابل إلى الوحدة media3-ui-compose. أضِف ErrorText Composable إلى media3-ui-compose-material3 واجعله تراكبًا تلقائيًا على Player.
    • نشر عنصر PlayerDefaults مع عناصر قابلة للإنشاء لكل من TopControls وCenterControls وBottomControls وErrorOverlay
    • أضِف FocusRequester إلى Player Composable وفتحات المحتوى الخاصة به.
    • انشر PlayerPool (common-ktx) وrememberPooledPlayer (ui-compose) لتفعيل التحميل المُسبَق MediaItems في بيئات واجهة المستخدم ذات النافذة المنزلقة. اعرض هذه الوظيفة في demo-compose باستخدام ShortFormPlayerScreen جديد.
  • إضافة Ktor:
    • أضِف وحدة إضافة media3-datasource-ktor جديدة توفّر KtorDataSource تستند إلى حزمة HTTP في Ktor.
  • إضافة HLS:
    • إضافة إمكانية استخدام ميزة "توجيه المحتوى" و"استنساخ المسار" في HLS (#1689)
    • أضِف setWithAssetListReset إلى HlsInterstitialsAdsLoader للسماح للتطبيقات بإعادة ضبط الإعلانات البينية لقائمة مواد العرض التي تمت معالجتها بالكامل إلى حالة غير متوفّرة لإعادة عرضها عند الطلب.
  • إضافة DASH:
    • قسِّم مقاطع الترجمة والشرح بتنسيق CEA إلى ملفات TrackGroup مختلفة استنادًا إلى اللغة (#3113).
  • إضافة RTSP:
    • إصلاح حالات توقّف التشغيل أو تعذّره بشكل مؤقت أثناء إعداد تشغيل RTSP بسبب أخطاء في ربط منفذ UDP
  • إضافة البث:
    • أضِف فئة CastParams جديدة للسماح بإعداد ميزة "البث من خلال الاتصال" عن طريق استدعاء Cast.initialize(CastParams).
    • تمت إضافة الخيار الجديد CastParams.getShowSystemOutputSwitcherOnCastIconClick() الذي يؤدي إلى استخدام أداة اختيار جهاز البث في SystemUI بدلاً من أداة اختيار جهاز البث داخل التطبيق عندما تكون متاحة.
  • أدوات الاختبار:
    • وسّع نطاق DataSourceContractTest ليشمل إتاحة طلبات POST مع الرؤوس والنصوص، وأضِف بعض موارد POST إلى HttpDataSourceTestEnv، وأضِف تأكيدات لطريقة HTTP المتوقّعة والرؤوس والنص في WebServerDispatcher.
    • تضييق نطاق التأكيدات في DataSourceContractTest للأطوال التي يتم عرضها من DataSource.open(). يجب أن تشير المراجع التي قد تؤدي إلى ظهور C.LENGTH_UNSET إلى ذلك باستخدام TestResource.Builder.setMayResolveToUnknownLength(boolean).
  • إزالة الرموز المتوقّفة نهائيًا:
    • إزالة androidx.media3.exoplayer.MetadataRetriever استخدِم androidx.media3.inspector.MetadataRetriever بدلاً من ذلك.
    • إزالة androidx.media3.exoplayer.MediaExtractorCompat استخدِم androidx.media3.inspector.MediaExtractorCompat بدلاً من ذلك.
    • إزالة Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATA يمكنك استخدام HeifExtractor لاستخراج البيانات الوصفية للصور الحيّة من ملفات HEIC بدلاً من ذلك.
    • إزالة androidx.media3.extractor.metadata.mp4.MotionPhotoMetadata استخدِم androidx.media3.extractor.metadata.MotionPhotoMetadata بدلاً من ذلك.
    • إزالة androidx.media3.extractor.DummyTrackOutput استخدِم androidx.media3.extractor.DiscardingTrackOutput بدلاً من ذلك.
    • إزالة androidx.media3.extractor.DummyExtractorOutput استخدِم androidx.media3.extractor.NoOpExtractorOutput بدلاً من ذلك.
  • إنشاء
    • تم تعديل تعليمات README.md الخاصة بالاعتماد على Media3 محليًا لاستخدام &quot;عمليات الإنشاء المجمّعة&quot; في Gradle (includeBuild). تمت إزالة النص البرمجي core_settings.gradle، ولم يعُد يتم استخدام السمتَين androidxMediaModulePrefix وandroidxMediaEnableMidiModule.

الإصدار 1.10.0

1.10.1

‫12 مايو 2026

  • المكتبة المشتركة:
    • إصلاح طريقة التعامل مع onAudioSessionIdChanged في SimpleBasePlayer وForwardingSimpleBasePlayer
  • ExoPlayer:
    • تم إصلاح مشكلة حالة التزامن المتعلقة بإنشاء معرّف جلسة الصوت التي قد تؤدي إلى IllegalStateException مع وضع النفق. (#3099).
    • إصلاح الأعطال المحتملة للتطبيقات عند استعادة البيانات بعد حدوث أخطاء في برنامج الترميز مع عملية التسخين المُسبَق لبرنامج العرض
    • تم إصلاح المشكلة التي كانت تؤدي إلى ظهور تشوّهات في الفيديو بسبب توفير بيانات التهيئة عند استخدام برنامج ترميز Dolby Vision المستند إلى AV1 (#3153).
  • اختيار المقطع الصوتي:
    • تعديل منطق اختيار المسار في VideoTrackInfo لحلّ أنواع MIME الاحتياطية ونقل إعدادات HDR المفضّلة وإعدادات ترميز الفيديو المفضّلة إلى إعدادات الجودة المفضّلة (#3135)
  • أدوات الاستخراج:
    • MP3: تجاهل طول بيانات Xing إذا كان أطول من طول البث المعروف (#3117).
    • إصلاح ArrayIndexOutOfBoundsException في Mp4Extractor عندما يتم ضبط FLAG_OMIT_TRACK_SAMPLE_TABLE ولا يحتوي المقطع الصوتي على مربّع stss (نموذج مزامنة).
  • الصوت:
    • إصلاح الخطأ الذي قد يؤدي إلى إعادة توجيه أحداث الصوت بشكل خاطئ في حال إضافة عدة أدوات عرض صوت إلى المشغّل.
  • الفيديو:
    • تعديل منطق إعادة استخدام برنامج الترميز عند تغيير عدد اللقطات في الثانية في واجهة برمجة التطبيقات التي تقل عن 30 لتجنُّب إعادة ضبط برنامج الترميز في الحالات التي لا يكون فيها ذلك مفيدًا (#3120).
    • إيقاف الحلّ البديل للمزامنة الإجبارية في queueSecureInputBuffer للإصدار 31 من واجهة برمجة التطبيقات أو الإصدارات الأحدث، لأنّ الحلّ البديل كان عبارة عن عنق زجاجة اصطناعي فرض تشغيل عملية فك التشفير بشكل تسلسلي، ما منع تشوّه الفيديو بسبب مشكلة في إطار العمل كانت موجودة قبل الإصدار 31 من واجهة برمجة التطبيقات.
  • الصورة:
    • تم إصلاح مشكلة في وضع "التنقل السريع" حيث لا يتم تطبيق تحديثات الصور إلا عندما "يتوقف المستخدم عن التنقل السريع" (#2815).
  • الجلسة:
    • تم إصلاح الخطأ الذي كان يؤدي إلى عدم نقل ForegroundServiceStartNotAllowedException بين حدود سلاسل المحادثات في حال لم تكن سلسلة محادثات التطبيق هي سلسلة المحادثات الرئيسية (#2499).
    • إصلاح الخطأ الذي لا يتوفّر فيه COMMAND_SEEK_TO_MEDIA_ITEM في MediaController عند الاتصال بجلسة على المنصة فقط تتيح الانتقال إلى عناصر أخرى ولكن بدون تعديلات على قائمة التشغيل
    • تم إصلاح المشكلة التي كانت تتسبب في عدم تمكّن MediaController من ضبط عناصر الوسائط في جلسات الوسائط على الإصدارات الأقدم من 0x0A التي لا تسمح بإجراءات PREPARE_FROM.
    • إصلاح الخطأ الذي لم يتم فيه وضع العلامة Controller.isTrusted() على العملية الخاصة على الإصدار 27 من واجهة برمجة التطبيقات أو الإصدارات الأقدم عند الاتصال عبر أدوات التحكّم في المنصة
  • إضافة HLS:
    • تم إصلاح الخطأ الذي يؤدي إلى عرض ArrayIndexOutOfBoundsException أثناء الرجوع إلى البث الاحتياطي إذا كان اختيار المسار مجموعة فرعية من المسارات المتاحة (#3161).
    • تم إصلاح مشكلة عدم نقل مقطع التهيئة عند تعديل قائمة تشغيل الوسائط إذا لم يتم تكرار العلامة #EXT-X-MAP في التعديلات اللاحقة (#3105).
  • إضافة DASH:
    • إصلاح عُطل في SampleQueue عند الانتقال إلى جزء يتم إلغاؤه حاليًا

1.10.0

‫26 مارس 2026

  • المكتبة المشتركة:
    • ترقية Player.mute() وPlayer.unmute() من UnstableApi إلى الإصدار الثابت
    • ترقية Format.pcmEncoding وC.PcmEncoding من UnstableApi إلى الإصدار الثابت
    • أضِف Format.primaryTrackGroupId لتحديد المجموعة الأساسية من مثيلات Format المضمّنة (#294).
  • ExoPlayer:
    • إضافة إمكانات قص إلى AdsMediaSource
    • إضافة إمكانية الجدولة الديناميكية في MediaCodecVideoRenderer لتحسين توافق عمل الجدولة ودورات تنشيط وحدة المعالجة المركزية مع الوقت الذي يمكن فيه معالجة لقطات الفيديو يمكنك تفعيل هذه الميزة باستخدام experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs() في DefaultRenderersFactory.
    • السماح بتحديد DataSource.Factory مخصّص في DefaultPreloadManager.Builder
    • السماح بمحاكاة ExoPlayer بدون Robolectric من خلال نقل بعض الثوابت التلقائية إلى ExoPlayer.Builder لا يُنصح عمومًا بمحاكاة هذه الواجهة المعقّدة، إلا في حال كان الاستخدام بسيطًا أو عرضيًا (#2985).
      • وقد تطلّب ذلك نقل DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MS من ExoPlayer إلى ExoPlayer.Builder (بدون إيقاف نهائي).
    • تم إصلاح الخطأ الذي كان يؤدي إلى نشر ProgressiveMediaSource معلومات قديمة عن المخطط الزمني إلى المشغّل، وإزالة الفترات المدرَجة في قائمة الانتظار بشكل غير متوقع (#3016).
    • تم إصلاح مشكلة عدم طلب ExoPlayer التركيز الصوتي المؤجّل عند طلب التشغيل أثناء المكالمات الهاتفية.
    • تم إصلاح الخطأ الذي قد يتسبّب في إعادة التخزين المؤقت عند الانتقال من المحتوى المسجّل إلى المحتوى المباشر في نهاية المحتوى المسجّل (‎#3052).
    • إتاحة استخدام ملف تعريف Dolby Vision 10 (#2830)
    • تم إصلاح الخطأ الذي كان يتسبّب في عرض إعلان ما قبل التشغيل غير مهيأ ArrayIndexOutOfBoundsException (#3125).
  • CompositionPlayer:
    • إضافة دعم لـ EditedMediaItem.removeVideo
  • المحوّل:
    • يمكن الآن لـ EditedMediaItem.Builder.setFrameRate() ضبط الحد الأقصى لعدد اللقطات في الثانية للفيديو، ما يساعد بشكل خاص عند زيادة سرعة الوسائط باستخدام setSpeed().
  • اختيار المقطع الصوتي:
    • تغيير توقيع DefaultTrackSelector.selectAllTracks ليشمل مصفوفة الإخراج كمعلَمة، مع ملء البيانات مسبقًا بعمليات إلغاء مسار الصوت
    • تم إصلاح المشكلة التي يتم فيها اختيار مقاطع البيانات الوصفية المضمّنة بغض النظر عما إذا كان قد تم اختيار المقطع الأساسي المقابل (#294).
    • تثبيت خيارات TrackSelectionParameters لكل من preferredVideoLanguages وpreferredVideoLabels وpreferredAudioLabels وpreferredTextLabels وselectTextByDefault
  • أدوات الاستخراج:
    • ‫MP4: إتاحة ملفات تتضمّن مربّعات uuid كبيرة قبل المربّعات الأخرى، مثل moov (#3046)
    • ‫MP4: إضافة إمكانية استخدام مقاطع فيديو بتنسيق Versatile Video Coding (VVC) في حاويات MP4
  • أداة الفحص:
    • تغيير قد يؤدي إلى عطل: إزالة FrameExtractor. على المستخدمين الآن الاعتماد على وحدة :media3-inspector-frame الجديدة وتعديل عمليات الاستيراد إلى androidx.media3.inspector.frame.FrameExtractor.
    • إضافة وحدة جديدة لاستخراج ومعالجة إطارات الفيديو التي تم فك ترميزها
  • الصوت:
    • تغيير مكتبة فك الترميز الأساسية لإضافة برنامج فك ترميز IAMF من libiamf إلى iamf_tools
    • يتيح فك ترميز IAMF إخراج الصوت المجسّم إما من خلال أداة فك الترميز (عند استخدام إضافة أداة فك ترميز IAMF) أو من خلال أداة Spatializer في Android.
    • إزالة دعم AC4Profile22 وملفات التعريف القديمة الأخرى بشكل صحيح عند تقييم توافق برنامج الترميز AC-4 في سيناريوهات Automotive (#2609)
    • تحسين منطق إعادة المحاولة لعملية تهيئة AudioOutput في DefaultAudioSink (#2905)
    • محاولة مطابقة تنسيق الإخراج لمكبّرات الصوت (أو أداة Spatializer إذا كان ذلك منطبقًا) عند فك ترميز IAMF، سواء باستخدام إضافة IAMF أو برامج فك ترميز برامج ترميز الوسائط، والتي تتوافق مع الحقول والمنطق الجديد في AudioCapabilities وAudioCapabilitiesReceiver
    • تم إصلاح الخطأ الذي يتسبّب في توقُّف التشغيل عند تشغيل قائمة تشغيل تتضمّن ملفات صوتية متواصلة في وضع النقل المضغوط.
  • النص:
    • ‫VobSub: استخدِم أوامر التحكّم START وSTOP في SPU لاحتساب مدة الإشارة بدلاً من استخدام القيمة التلقائية البالغة 5 ثوانٍ دائمًا (#2935).
  • البيانات الوصفية:
    • زيادة العدد التلقائي لعناصر عرض البيانات الوصفية إلى أربعة لتغطية جميع مسارات البيانات الوصفية المحتملة التي تنشرها صيغ HLS وعناصر العرض (#3043)
  • التأثير:
    • نقل LottieOverlay إلى وحدة :media3-effect-lottie جديدة (تضمّنت أيضًا إعادة تسميتها من androidx.media3.effect.LottieOverlay إلى androidx.media3.effect.lottie.LottieOverlay)
  • تأثير Lottie:
    • إضافة وحدة :media3-effect-lottie جديدة توفّر وظائف لتطبيق تأثيرات Lottie على إطارات الفيديو
  • إضافة "إعلانات الوسائط التفاعلية":
    • يجب تحديث إصدار حزمة IMA SDK إلى 3.39.0 للوصول إلى أحدث واجهة برمجة تطبيقات لمعلومات وسائط الإعلان.
    • تم إصلاح الخطأ الذي لم يكن فيه نوع MIME للإعلان مطابقًا لنوع MIME المقدَّم في حدث LOADED الخاص بـ IMA. يعمل الإصلاح الآن على ربط نوع MIME للإعلان باستخدام معلومات وسائط الإعلان التي توفّرها IMA.
    • أضِف setEnableCustomTabs إلى ImaAdsLoader وImaServerSideAdInsertionMediaSource، ما يتيح للمستخدمين التحكّم في ما إذا كان سيتم فتح عناوين URL الخاصة بالنقر على الإعلانات باستخدام علامات التبويب المخصّصة.
    • أضِف ImaAdTagUriBuilder، وهو صف يوفّر طريقة بديلة لإنشاء adTagUri. تحتوي على واجهة برمجة التطبيقات setPreferredLinearOrientation. هذه واجهة برمجة تطبيقات في مرحلة الاختبار الأوّلي ستتيح لك ضبط اتجاه العرض المفضّل للإعلانات الخطية. إذا أردت الانضمام إلى مجموعة اختبار الإصدار الأوّلي، يُرجى التواصل مع شريك حسابك.
  • الجلسة:
    • إصلاح خطأ يؤدي إلى تعطُّل التطبيق عند استخدام مصفوفات كبيرة في MediaMetadata.artworkData
    • استخدِم النوع int للوسيطة @Player.Command في واجهة ActionFactory (#2933).
    • إنشاء MediaSessionService وMediaLibraryService كـ LifecycleService، ما يتيح ربط العمليات التي تراعي مراحل النشاط بمراحل نشاط الخدمة (#187)
    • توقّف عن إتاحة أوامر تغيير مستوى صوت الجهاز من MediaController وMediaBrowser لعمليات التشغيل المحلية. يجب ألا تغيّر التطبيقات مستوى صوت الجهاز المحلي، ويمكنها استخدام واجهات برمجة التطبيقات AudioManager لهذا الغرض إذا لزم الأمر.
    • رصد مثيلات Intent القديمة التي بدأت الخدمة كخدمة تعمل في المقدّمة يمنع ذلك ظهور الخطأ ForegroundServiceDidNotStartInTimeException في النظام. هذا تغيير غير متوافق في واجهة برمجة تطبيقات غير ثابتة للتطبيقات التي تنفّذ MediaNotification.Provider مخصّصًا، لأنّه تتوفّر طريقة جديدة مطلوبة.
    • إضافة أدوات إنشاء لعناصر PendingIntent لاستخدامها مع التطبيقات المصغّرة على الشاشة الرئيسية (#2933)
    • إضافة طرق ثابتة لإنشاء مثيلات Intent للتطبيقات المصغّرة المستندة إلى Compose على الشاشة الرئيسية (#2933)
    • تم إصلاح الخطأ الذي لم يتم فيه إبلاغ أدوات التحكّم بانتقال عنصر الوسائط عندما انتقل التشغيل من فهرس عنصر وسائط معيّن إلى آخر يتضمّن عنصر الوسائط نفسه لسبب عدم الاستمرارية "AUTO" و"SEEK" (#2997).
    • إصلاح مشكلة تؤدي فيها الحلول البديلة لموضع أزرار واجهة مستخدم النظام إلى التأثير سلبًا في مساحات أخرى من واجهة المستخدم، مثل Android Auto أو الشركات المصنّعة التي لا تحتاج إلى الحلول البديلة (#3041).
    • تم إصلاح المشكلة المتمثّلة في عدم مزامنة إذن الوصول إلى الاشتراكات (#3056).
    • حلّ بديل لخطأ في واجهة مستخدم النظام على الإصدار 29 من واجهة برمجة التطبيقات، حيث يمكن أن يؤدي عمل فني لجلسة وسائط بحجم معيّن إلى تعطيل واجهة مستخدم النظام وإجبار الجهاز على إعادة التشغيل (#3118).
    • إصلاح مشكلة تغيير حجم رمز العمل الفني للإشعارات على الإصدار Android Q (#3084).
  • UI:
    • أضِف PlaybackSpeedControl Composable إلى media3-ui-compose لعرض سرعة التشغيل وتعديلها.
    • أضِف PlaybackSpeedToggleButton Composable إلى media3-ui-compose-material3 للتحكّم في سرعة التشغيل.
    • أضِف ProgressSlider Composable إلى media3-ui-compose-material3 لعرض تقدّم اللاعبين وتنفيذ عمليات البحث باستخدام السحب والنقر (#2288).
    • تجنُّب استخدام مخزن مؤقت كبير خارج الشاشة عند تحريك PlayerControlView
    • أضِف Player Composable إلى media3-ui-compose-material3 الذي يجمع بين ContentFrame وعناصر تحكّم قابلة للتخصيص ومحاذية للأعلى والوسط والأسفل.
    • إخفاء موضع التشغيل من خدمة مخصّصة لتسهيل الاستخدام لمنع تحديث الإشعار المستمر عند ظهور PlayerControlView
  • إضافة HLS:
    • توفير إمكانية استخدام X-PLAYOUT-LIMIT مع الإعلانات البينية في HLS (#2484)
    • تتوافق السمة QUERYPARAM مع #EXT-X-DEFINE (#1854).
    • تحسين تحليل قائمة تشغيل HLS من خلال تخزين أدوات مطابقة التعبير العادي مؤقتًا (#3008)
    • عرض مقطع البيانات الوصفية ID3 (EMSG) في عروض الصوت (#3043)
    • السماح بالرجوع إلى الموقع الجغرافي الاحتياطي عند مواجهة أخطاء في التحميل، إذا كانت هناك مصادر متكررة للبث من مواقع جغرافية مختلفة (#1988)
    • تم إصلاح سلوك X-SNAP للإعلانات البينية بتنسيق HLS من أجل احتساب موضعَي البدء والاستئناف بشكل صحيح (‫#3013).
  • إضافة DASH:
    • تم إصلاح المشكلة التي تتسبّب فيها أوقات بدء المقاطع غير المتوافقة في حدوث تأخيرات أو فقدان عيّنات في بداية التشغيل (#3057).
    • تم إصلاح الخطأ الذي لم يتم فيه ضبط الطوابع الزمنية للبيانات الوصفية EMSG v0 داخل النطاق بشكل صحيح (#3024).
  • إضافة RTSP:
    • تم إصلاح مشكلة في بث H.264 وH.265 تؤدي إلى تحليل غير صحيح لعينات من وحدة الوصول نفسها التي تمتد على حِزم RTP متعددة. وقد أدّى ذلك إلى ظهور تشوّهات مرئية وتلف في الفيديو (#3121).
  • إضافات برنامج الترميز (FFmpeg وVP9 وAV1 وما إلى ذلك):
    • إضافة إمكانية استخدام أداة إدارة واجهة المستخدم MPEG-H إلى إضافة برنامج فك الترميز MPEG-H (#3066)
  • إضافة البث:
    • تمت إضافة طريقة RemoteCastPlayer.Builder#setTrackSelector تتيح تنفيذ عملية اختيار المسار لتشغيل المحتوى على Cast.
  • إزالة الرموز المتوقّفة نهائيًا:
    • إزالة ExperimentalFrameExtractor استخدِم androidx.media3.inspector.frame.FrameExtractor بدلاً من ذلك.
    • إزالة ChannelMixingMatrix.create() استخدِم ChannelMixingMatrix.createForConstantGain() بدلاً من ذلك.
    • إزالة androidx.media3.extractor.metadata.flac.VorbisComment استخدِم androidx.media3.extractor.metadata.vorbis.VorbisComment بدلاً من ذلك.
    • إزالة MediaSource.prepareSource(MediaSourceCaller, TransferListener) يمكنك استخدام MediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId) كبديل.

1.10.0-rc03

‫25 مارس 2026

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

1.10.0-rc02

‫16 مارس 2026

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

1.10.0-rc01

‫10 مارس 2026

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

‫1.10.0-beta01

‫25 فبراير 2026

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

‫1.10.0-alpha01

‫6 فبراير 2026

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

الإصدار 1.9.0

1.9.4

‫16 مايو 2026

يتضمّن الإصدار 1.9.4 التعديلات التالية.

  • التأثير:
    • اضبط GL_DRAW_BUFFER وGL_READ_BUFFER بشكل صريح عند الانتقال من سياق بدون واجهة.

1.9.3

‫16 مارس 2026

يتضمّن الإصدار 1.9.3 التعديلات التالية.

  • الصوت:
    • تم إصلاح الخطأ الذي يتسبّب في توقُّف التشغيل عند تشغيل قائمة تشغيل تتضمّن ملفات صوتية متواصلة في وضع النقل المضغوط.

1.9.2

‫6 فبراير 2026

يتضمّن الإصدار 1.9.2 التعديلات التالية.

  • ExoPlayer:
    • إصلاح الخطأ الذي يؤدي إلى نشر معلومات قديمة في المخطط الزمني ProgressiveMediaSource إلى المشغّل وإزالة الفترات المدرَجة في قائمة الانتظار بشكل غير متوقع (#3016).
  • الجلسة:
    • إصلاح مشكلة تؤدي فيها الحلول البديلة لموضع أزرار واجهة مستخدم النظام إلى التأثير سلبًا في مساحات أخرى من واجهة المستخدم، مثل Android Auto أو الشركات المصنّعة التي لا تحتاج إلى الحلول البديلة (#3041).
  • إضافة البث:
    • تم إصلاح الخطأ الذي تسبَّب في تعذُّر النقل من ميزة "البث" إلى التشغيل على الجهاز المحلي.

1.9.1

‫26 يناير 2026

يتضمّن الإصدار 1.9.1 هذه التعديلات.

  • المكتبة المشتركة:
    • إتاحة سلاسل التاريخ والوقت التي تتضمّن الساعات فقط في إزاحة المنطقة الزمنية (#2929)
  • ExoPlayer:
    • السماح بالجدولة الديناميكية لفاصل زمني doSomeWork فقط بعد بدء تشغيل الصوت لإتاحة مزامنة أكثر سلاسة بين الصوت والفيديو في بداية التشغيل
    • تم إصلاح الخطأ في DefaultLoadErrorHandlingPolicy حيث تمت إعادة محاولة FileNotFoundException وأنواع الاستثناءات المشابهة عدة مرات.
    • تم إصلاح الخطأ في الجدولة الديناميكية حيث تم بشكل خاطئ تقليل الوقت المحسوب لعملية doSomeWork التالية بمقدار الوقت المنقضي من التكرار الحالي لعملية doSomeWork. ومن المفترض أنّ يؤدي ذلك إلى إطالة مدة عدم استخدام وحدة المعالجة المركزية وتوفير الطاقة.
    • تم إصلاح المشكلة المتمثلة في تعذُّر تشغيل بعض ملفات Dolby Vision عند محاولة استخدام برنامج ترميز احتياطي AVC أو HEVC.
    • تم إصلاح الخطأ الذي يؤدي إلى استمرار التحميل بعد انتهاء التشغيل عند إزالة العنصر الذي يتم تشغيله حاليًا من قائمة تشغيل (#2873).
    • تجنَّب حدوث MediaItem حالة عند استخدام ExoPlayer.replaceMediaItem بشكل متكرّر على العنصر نفسه (#2993).
    • منع أخطاء ANR المحتملة الناتجة عن عمليات إيقاف قفل التنشيط الطارئ (#2979).
  • أدوات الاستخراج:
    • ‫MP3: تحليل بيانات LAME ReplayGain (#2840)
  • الصوت:
    • إزالة دعم AC4Profile22 وملفات شخصية قديمة أخرى بشكل صحيح عند تقييم توافق برنامج الترميز AC-4 في سيناريوهات Automotive (#2609)
  • الفيديو:
    • يتم تجاهل برامج ترميز الفيديو على الأجهزة التي تعمل بإصدارات أقل من المستوى 30 لواجهة برمجة التطبيقات عند تغيير عدد اللقطات في الثانية للمحتوى لتجنُّب تشغيل المحتوى بشكل متقطّع (‫#2941).
  • النص:
    • VobSub: تم إصلاح بعض الترجمات الناقصة من خلال التعامل بشكل صحيح مع وحدات SPU التي تحتوي على تسلسل تحكّم واحد فقط، أو التي تتضمّن معلومات مهمة مقسّمة على عدة تسلسلات تحكّم (#2935).
  • إضافة "إعلانات الوسائط التفاعلية":
    • إصلاح الخطأ: تم إصلاح مشكلة عدم تطابق نوع MIME للإعلان مع نوع MIME المقدَّم في حدث LOADED الخاص بـ IMA. يعيّن الإصلاح الآن نوع MIME الخاص بالإعلان باستخدام فهرس مجموعة الإعلانات المتسلسلة وموضع عرض الإعلان.
    • أضِف عملية تحقّق من القيمة الخالية قبل الوصول إلى نتيجة getAdsManager() وAdEvent.getAd().
  • الجلسة:
    • تم إصلاح الخطأ الذي كان يؤدي إلى تعطُّل التطبيق عند إيقاف MediaController مرتبط بجلسة على منصة إذا حدث الإيقاف أثناء تشغيل الإعلان (#2948).
    • إضافة عمليات تحقّق إضافية إلى مثيلات extras Bundle في فئات مختلفة للحماية من مثيلات Bundle غير صالحة يتم إرسالها من عمليات أخرى
    • تم إصلاح مشكلة عدم توفّر أوامر COMMAND_SEEK_NEXT أو COMMAND_SEEK_BACK، ما قد يؤدي إلى حدوث فجوات في إشعار الوسائط في النظام (#2976).
    • نقل عملية تغيير حجم الصورة النقطية لرمز الإشعار من سلسلة التعليمات البرمجية الرئيسية (#2829)
    • تم إصلاح الخطأ الذي لم يتم فيه استخدام المؤلف والكاتب والمؤلف الموسيقي كبديل عند التحويل من تنسيق MediaMetadataCompat وMediaDescriptionCompat القديمَين (#3018).
  • عمليات التنزيل:
    • إصلاح التكرار اللانهائي المحتمل عند معالجة PriorityTooLowException بواسطة SegmentDownloader (بالنسبة إلى DASH وHLS وSmoothStreaming) يجب أن توفّر عمليات الإلغاء المخصّصة SegmentDownloader التي تستخدم طريقة execute المحمية مهمتها مضمّنة في Supplier حتى يمكن إعادة إنشائها (#2931).
  • إضافة HLS:
    • مرِّر مستند JSON الخاص بقائمة مواد العرض الأولية إلى الدالة Listener.onAssetListLoadCompleted. هذا تغيير غير متوافق مع الإصدارات السابقة في واجهة برمجة تطبيقات غير ثابتة يتطلّب من التطبيقات التي تستخدم هذا الاستدعاء إضافة وسيط إضافي من النوع JSONObject (#2950).
  • إضافة RTSP:
    • التعامل بشكل صحيح مع حِزم بروتوكول النقل في الوقت الفعلي (RTP) التي تتضمّن طوابع زمنية تتكرّر (#2930)
  • إضافات برنامج الترميز (FFmpeg وVP9 وAV1 وما إلى ذلك):
    • إصلاح NullPointerException محتمل يمكن أن يحدث عند البحث قبل معالجة إطار الفيديو الأول (#2965)
  • إضافة البث:
    • تم إصلاح الخطأ الذي كان يمنع تعديل RemoteCastPlayer المخطط الزمني بشكل صحيح عند استبدال قائمة التشغيل.

1.9.0

‫17 ديسمبر 2025

  • المكتبة المشتركة:
    • يجب تعديل minSdk إلى 23 بما يتوافق مع مكتبات AndroidX الأخرى.
    • أضِف PlayerTransferState، ما يسهّل نقل حالة التشغيل بين مثيلات Player.
    • أضِف الطريقتَين void mute() وvoid unmute() إلى Player للحفاظ على مستوى صوت Player واستعادته قبل وبعد ضبطه على صفر.
    • تم نشر فئات الأدوات المساعدة WakeLockManager وWifiLockManager وAudioFocusManager وAudioBecomingNoisyManager وStuckPlayerDetector التي كانت تستخدمها ExoPlayer داخليًا من قبل للسماح بإعادة استخدامها من قِبل مشغّلات أخرى (#1893).
    • إصلاح طريقة معالجة ForwardingPlayer أداة معالجة الأحداث عندما يستخدم مشغّل الفيديو الأساسي الذي تم تفويضه المساواة المرجعية للمقارنة بين مثيلات أداة معالجة الأحداث (#2675).
    • أضِف دالة تعليق الإضافة Player.listenTo في مكتبة media3-common-ktx التي تحدّد Player.Events معيّنًا يجب اتّخاذ إجراء بشأنه.
    • تم إصلاح عُطل في BasePlayer.getBufferedPercentage ناتج عن تجاوز سعة عدد صحيح عندما يكون الموضع المخزّن مؤقتًا الذي تم الإبلاغ عنه أكبر بكثير من المدة التي تم الإبلاغ عنها (#2750).
    • إصلاح عملية الرصد التلقائي لنوع مسار TrackGroup من خلال عدم تجاهل نوع MIME المخصّص للعينات والرجوع إلى استخدام نوع المسار الذي قد يكون غير صحيح من نوع MIME للحاوية (#2860).
  • ExoPlayer:
    • إضافة ميزة رصد تعذُّر تشغيل الفيديو تؤدي إلى ظهور StuckPlayerException رسالة خطأ في المشغّل إذا بدا أنّه لا يعمل. يحدث ذلك في الحالات التالية، حيث يمكن ضبط كل مهلة تلقائية في ExoPlayer.Builder إذا لزم الأمر:
      • بعد 10 دقائق من STATE_BUFFERING أثناء محاولة التشغيل بدون أي تقدّم في التخزين المؤقت
      • بعد 10 ثوانٍ من STATE_READY أثناء محاولة التشغيل بدون إحراز أي تقدّم في التشغيل
      • بعد مرور دقيقة واحدة من STATE_READY بعد المدة المحدّدة بدون الوصول إلى نهاية المحتوى
      • بعد 10 دقائق من ظهور سبب منع التشغيل أثناء محاولة التشغيل
    • تفعيل معالجة قفل التنشيط تلقائيًا لحلّ المشاكل المتعلّقة بالتخزين المؤقت أثناء التشغيل في الخلفية وهذا يعادل ضبط قيمة ExoPlayer.Builder.setWakeMode على C.WAKE_MODE_LOCAL.
    • أضِف منطق الاستماع لتعديل معرّف الجهاز الافتراضي تلقائيًا عند إبلاغ Context الذي تم تمريره في الأصل إلى ExoPlayer.Builder بحدوث تغيير.
    • أضِف ExoPlayer.setVirtualDeviceId لتعديل المعرّف يدويًا للجهاز الافتراضي الذي تم الحصول عليه من Context الذي تم تمريره إلى ExoPlayer.Builder.
    • يجب التأكّد من أنّ أدوات العرض لا تستهلك بيانات من عنصر قائمة التشغيل التالي قبل أكثر من 10 ثوانٍ من نهاية العنصر الحالي.
    • أضِف setSeekBackIncrementMs وsetSeekForwardIncrementMs وsetMaxSeekToPreviousPositionMs إلى ExoPlayer لتعديل هذه الإعدادات بعد الإنشاء (#2736).
    • إضافة وظيفة التخزين المؤقت المسبق في DefaultPreloadManager يمكن للتطبيقات الآن عرض DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs) أو DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs) من خلال TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData) للإشارة إلى أنّ عنصر الوسائط يحتاج إلى التخزين المؤقت المسبق.
    • استخدِم وظيفة التخزين المؤقت المُسبق في DefaultPreloadManager في تطبيق العرض التوضيحي الخاص بالفيديوهات القصيرة.
    • إضافة دوال ضبط DefaultLoadControl.Builder لتشغيل المحتوى على الجهاز المحلي وتعديل القيم التلقائية لـ DefaultLoadControl لتعمل بشكل جيد مع مجموعة كبيرة من الملفات المحلية
    • تم إصلاح الخطأ الذي كان يؤدي إلى بقاء المشغّل في حالة STATE_READY أو STATE_BUFFERING عند ضبط قائمة تشغيل فارغة.
    • تحسين واجهات برمجة التطبيقات الخاصة بأداة إدارة التحميل المُسبَق:
      • أضِف addMediaItems(List<MediaItem>, List<T>) وaddMediaSources(List<MediaSource>, List<T>) لإضافة عناصر الوسائط أو مصادر الوسائط بشكل مجمّع، ثم استدعِ invalidate() تلقائيًا.
      • أضِف removeMediaItems((List<MediaItem>) وremoveMediaSources(List<MediaSource>) لإزالة عناصر الوسائط أو مصادر الوسائط بشكل مجمّع، وتأكَّد من أنّ "مدير التحميل المُسبَق" لا يبدأ في التحميل المُسبَق لأي منها أو يواصل التحميل المُسبَق لها بعد إزالتها.
      • السماح لـ DefaultPreloadManager.setCurrentPlayingIndex(int) بإبطال صلاحيته تلقائيًا لم تعُد التطبيقات بحاجة إلى طلب invalidate() بشكل صريح بعد تعديل فهرس المحتوى الذي يتم تشغيله حاليًا.
    • إضافة إمكانية تخطّي إعادة ضبط الإطار الرئيسي عند البحث للأمام ضمن مجموعة الصور نفسها أثناء استخدام وضع البحث السريع
    • أضِف DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) للتطبيقات لضبط قيمة بايتات المخزن المؤقت المستهدَفة لمشغّل بالسمة playerName المحدّدة. يمكن الآن DefaultLoadControl اتّخاذ قرارات لكل لاعب على حدة استنادًا إلى وحدات البايت المخصّصة له ووحدات البايت المستهدَفة في المخزن المؤقت.
    • أضِف SkipInfo إلى AdPlaybackState.AdGroup لنقل معلومات التخطّي لكل إعلان في المجموعة الإعلانية.
    • تم إصلاح الخطأ الذي كان يؤدي إلى حدوث تعطُّل عند الاتصال بـ removeMediaItems(List) أثناء تشغيل إعلان ما بعد التشغيل (‎#2746).
    • تم إصلاح بعض المشاكل المتعلّقة بالتقطّع في تشغيل قوائم التشغيل، حيث كان يتم ضبط اللقطات دائمًا على آخر عيّنة وعرضها عن طريق الخطأ.
    • تفعيل مسار إعادة المحاولة في حال تعذّر على المشغّل إنشاء رقم تعريف لجلسة الصوت (#2382، #2678).
    • إضافة إمكانية التحكّم في إجمالي وحدات البايت المخزّنة مؤقتًا للمصادر في DefaultPreloadManager لتجنُّب زيادة إجمالي وحدات البايت المخزّنة مؤقتًا للتحميل المسبق بشكل عشوائي لاستخدام منطق التحكّم التلقائي، يمكن للتطبيقات ضبط بايتات المخزن المؤقت المستهدَفة للتحميل المُسبَق من خلال DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) للحصول على playerName من PlayerId.Preload.name ("التحميل المُسبَق")، وإدخال DefaultLoadControl الذي تم إنشاؤه من خلال DefaultPreloadManager.Builder.setLoadControl(LoadControl).
    • إضافة cloneAndSet(int, int) إلى ShuffleOrder مع تنفيذ تلقائي (#2834)
    • إلحاق إزاحة استئناف المحتوى عند تخطّي تشغيل الإعلان بعد تعديل البحث أو الانتقال التلقائي (‎#2484)
    • إضافة واجهة برمجة تطبيقات لضبط مَعلمات برامج الترميز ومراقبتها لمقاطع الصوت والفيديو يتم تنفيذ هذه الميزة في أدوات العرض المستندة إلى MediaCodec وتتطلّب الإصدار 29 من واجهة برمجة التطبيقات أو الإصدارات الأحدث.
      • استخدِم ExoPlayer.setAudioCodecParameters() وExoPlayer.setVideoCodecParameters() لتطبيق المَعلمات.
      • استخدِم ExoPlayer.addAudioCodecParametersChangeListener() وExoPlayer.addVideoCodecParametersChangeListener() للاستماع إلى التغييرات. يتطلّب رصد المفاتيح الخاصة بالمورّد الإصدار 31 من واجهة برمجة التطبيقات أو إصدارًا أحدث.
    • تم إصلاح الخطأ IllegalStateException الذي يحدث عند ضبط مصدر وسائط فارغ بعد الانتقال إلى موضع غير صفري ثم إعداد المشغّل باستخدام مصدر وسائط غير فارغ.
    • تم إصلاح الخطأ الذي كان يؤدي إلى ظهور IllegalStateException عند الانتقال إلى عناصر وسائط أخرى أثناء وضع الفحص.
    • إصلاح NullPointerException محتمل في DefaultPlaybackSessionManager (#2885)
    • تفعيل التحسينات في أداء البحث عن الفيديوهات المؤهّلة
    • إعادة تفعيل استخدام فك التشفير غير المتزامن في MediaCodec على الإصدار 36 من واجهة برمجة التطبيقات والإصدارات الأحدث، حيث تم إصلاح مشاكل المهلة في واجهة برمجة التطبيقات هذه (#1641).
    • غيِّر القيمة التلقائية لـ MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs إلى 15 ملي ثانية وفعِّل إمكانية حذف إطارات الفيديو بشكل أكثر فعالية قبل فك الترميز للفيديوهات المؤهّلة.
    • إضافة الحد الأقصى للذاكرة إلى عملية احتساب الذاكرة التلقائية في DefaultLoadControl يجب أن يسري هذا الإجراء فقط إذا تم اختيار عدد كبير جدًا من المقاطع الصوتية (#2860).
    • تم إصلاح الخطأ الذي كان يؤدي إلى الانتقال إلى عنصر الوسائط التالي عند البحث في وضع &quot;التنقل السريع&quot; بالقرب من النهاية أثناء تشغيل قائمة تشغيل أو وضع التكرار.
  • CompositionPlayer:
    • انشر CompositionPlayer ضمن تعليق توضيحي جديد @ExperimentalApi للإشارة إلى أنّه متاح للتجربة، ولكنّه لا يزال قيد التطوير. من المحتمل أن تتغيّر بعض واجهات برمجة التطبيقات بشكل كبير في الإصدارات المستقبلية، وهناك مشاكل وقيود معروفة في بعض حالات الاستخدام (بعضها غير موثّق).
    • إضافة دعم لـ COMMAND_SET_AUDIO_ATTRIBUTES والتعامل مع أولويّة الصوت في CompositionPlayer
    • إضافة إمكانية تغيير السرعة في التسلسلات الثانوية في CompositionPlayer
    • إضافة دعم لـ EditedMediaItem.removeVideo
  • المحوّل:
    • استخدام InAppMp4Muxer كأداة دمج تلقائية
    • أضِف EditedMediaItem.Builder#setSpeed() وأوقِف نهائيًا Effects#createExperimentalSpeedChangingEffects().
    • استبدِل forceAudioTrack وforceVideoTrack بـ trackTypes في EditedMediaItemSequence.
  • اختيار المقطع الصوتي:
    • أضِف TrackSelectionParameters.selectTextByDefault لتفضيل اختيار أي مسار نصي بدون تحديد أي إعدادات مفضّلة أخرى أكثر تحديدًا.
    • أضِف preferredVideoLabels وpreferredAudioLabels وpreferredTextLabels في TrackSelectionParameters لتحديد إعداد مفضّل للمقاطع التي تحمل تصنيفًا معيّنًا، مثل تلك التي تتم قراءتها من علامات NAME في HLS (#1666).
  • أدوات الاستخراج:
    • ‫FLAC: تم تحسين عملية رصد العناوين للحدّ من فرص العثور على عناوين زائفة في بيانات FLAC المرمّزة، ما يؤدي إلى حدوث أخطاء في فك الترميز (#558).
    • MP3: السماح بوجود فجوات بين علامات ID3 (وقبلها) في بداية ملفات MP3 (#811 و#5718)
    • ‫MP3: زيادة حدّ البحث إلى 128 كيلوبايت ليتوافق مع حدّ البحث الحالي عن بايت متزامن (#2713)
    • ‫MP3: تغيير FLAG_ENABLE_INDEX_SEEKING لتفضيل البحث عن المعلومات من عناوين البيانات الوصفية (مثل Xing وVBRI) عند توفّرها، والرجوع إلى البحث المستند إلى الفهرس في حال عدم توفّر أي معلومات أخرى للبحث. يؤدي ذلك إلى تحسين الأداء للملفات التي تتضمّن بيانات وصفية للبحث (#2839).
    • ‫MP3: تغيير Mp3Extractor إلى معدّل نقل بيانات ثابت (CBR) تلقائيًا عند عدم العثور على بيانات وصفية للبحث (مثل Xing وVBRI)، حتى عند ضبط FLAG_ENABLE_INDEX_SEEKING. ويستند ذلك إلى سجلّ مواصفات MP3، حيث كان معدّل نقل البيانات الثابت (CBR) هو المعيار، بينما يتطلّب معدّل نقل البيانات المتغيّر (VBR) عناوين صريحة. يؤدي ذلك إلى تحسين إمكانية البحث الفوري في الملفات التي لا تتضمّن بيانات وصفية، ولكن على حساب الدقة المحتملة للملفات ذات معدل البت المتغيّر التي لا تتضمّن عناوين. يتم الآن استخدام البحث في الفهرس كحلّ احتياطي إذا لم يكن من الممكن البحث في افتراض معدّل البت الثابت (CBR) (مثلاً، في حال بث محتوى غير معروف المدة) (#2848).
    • ‫MP4: يجب التمييز بين أنواع MIME الخاصة بـ audio/mpeg (MP3) وaudio/mpeg-L1 وaudio/mpeg-L2 من خلال إلقاء نظرة خاطفة على قيمة الطبقة الخاصة بالعينة الأولى قبل إصدار تنسيق مسار من أداة الاستخراج (#2683).
    • ‫MP4: تحسين كفاءة البحث عن الملفات الكبيرة جدًا من خلال افتراض أنّ المربّع stbl الذي يزيد حجمه عن 1 ميغابايت يعني أنّ الملف يجب ألا يكون مقسّمًا (#2650).
    • ‫MP4: تمت إضافة إمكانية استخدام البيانات الوصفية ©mvn (اسم الحركة) و©mvi (فهرس الحركة)، وأصبحت هذه البيانات تُرسَل الآن كعناصر TextInformationFrame في Format.metadata مع المعرّفَين MVNM وMVIN على التوالي (#2754).
    • ‫MP4: تجاهل المقاطع التي لا تتضمّن مربّع stsd (بدلاً من تعذُّر تحليل الملف بأكمله).
    • ‫Matroska: إضافة إمكانية رصد DTS-HD (‫6225)
    • تم إصلاح مشكلة في MatroskaExtractor حيث قد يكون البحث غير دقيق للملفات التي تحتوي على مسارات متعددة. أصبحت نقاط الإشارات مرتبطة بشكل صحيح بالمقاطع الصوتية الخاصة بها، ما يؤدي إلى البحث بشكل أكثر دقة.
    • ‫MPEG-TS: إصلاح IllegalArgumentException من ReorderingBufferQueue الناتج عن حِزم PES بدون طابع زمني (#2764)
    • إتاحة استخراج "الصور الحية" بتنسيق HEIC يمكن الآن لـ HeifExtractor تحليل ملفات HEIC التي تحتوي على مقاطع فيديو ومقاطع صوتية مضمّنة.
  • أداة الفحص:
    • تمت إضافة وحدة :media3-inspector جديدة لتكون الصفحة الرئيسية المخصّصة لأدوات فحص الوسائط. تتضمّن هذه الوحدة الآن androidx.media3.inspector.MetadataRetriever جديدًا، سيوفر واجهة برمجة تطبيقات موحّدة لاستخراج البيانات الوصفية والإطارات. تم إيقاف الإصدار الحالي من androidx.media3.exoplayer.MetadataRetriever نهائيًا واستبداله بهذا الإصدار الجديد.
    • تم طرح androidx.media3.inspector.FrameExtractor، وهي واجهة برمجة تطبيقات عامة جديدة لاستخراج اللقطات. توفّر فئة AutoCloseable هذه طريقة لاستخراج اللقطات مع إمكانية استخدام الفيديو بنطاق عالي الديناميكية (HDR) وتأثيرات الفيديو واختيار برنامج ترميز مخصّص. يجب إنشاء هذا الحساب من خلال Builder الخاص به لـ MediaItem محدّد.
    • ‫FrameExtractor: أضِف getThumbnail() لاستخراج إطار صورة مصغّرة تمثيلي من ملف وسائط بدون الحاجة إلى طابع زمني محدّد.
    • أضِف androidx.media3.inspector.MediaExtractorCompat، وهو بديل جاهز للاستخدام بدلاً من android.media.MediaExtractor في النظام الأساسي، ويوفّر طريقة لاستخراج عيّنات وسائط مشفّرة وغير معالَجة من ملف وسائط. تم إيقاف androidx.media3.exoplayer.MediaExtractorCompat الحالي نهائيًا واستبداله بهذا الصف الجديد.
  • الصوت:
    • توعية مثيلات AudioProcessor بشأن البحث السريع
    • السماح بإدخال واجهة AudioOutputProvider الجديدة في DefaultAudioSink.Builder لتوفير مسارات مخصّصة لإخراج الصوت القيمة التلقائية هي AudioTrackAudioOutputProvider.
    • التقديم والتراجع باستخدام المقبض في GainProcessor
    • استخدام إمكانات مستوى وملف تعريف برنامج الترميز AC-4 في تقييم التوافق مع تنسيق المسار (#2580)
    • تجنُّب التأخيرات المحتملة الناتجة عن معالجة عمليات معاودة الاتصال لتغيير التوجيه في بداية التشغيل (#2646)
    • السماح بإعادة استخدام برامج الترميز لتنسيقات EAC3 وEAC3-JOC وAC-4 (#1346)
    • إضافة دعم لعينات PCM العائمة في Sonic
    • إضافة دعم لعينات PCM بمعدل 16 بت في ToFloatPcmAudioProcessor
  • الفيديو:
    • إيقاف إعادة استخدام الترميز لملفات Dolby Vision الشخصية المختلفة
    • إعادة تفعيل الحل البديل لنقاط الأداء التي تم الإبلاغ عنها بشكل خاطئ لبرامج الترميز الآمنة (#2856)
  • النص:
    • إصلاح تحليل مقاطع الترجمة والشرح بتنسيق CEA-6/708 في محتوى Dolby Vision (#2775)
  • الصورة:
    • تم إصلاح مشكلة ScrubbingMode التي تؤدي إلى توقّف المشغّل أثناء التقديم السريع أو الترجيع السريع لمسار الصور المصغّرة بتنسيق DASH (‎#2815).
  • ‫DRM:
    • تغيير نوع القيمة التي تم إرجاعها لطُرق MediaDrmCallback من byte[] إلى نوع MediaDrmCallback.Response جديد، للسماح بإرجاع معلومات إضافية اختيارية هذا تغيير غير متوافق مع الإصدارات السابقة، ولكن يمكن حلّ المشاكل بسهولة من خلال تضمين قيمة الإرجاع السابقة byte[] في new Response قبل الإرجاع.
    • أضِف معلومات طلب المفتاح، مثل عنوان URL ووقت الاستجابة، إلى AnalyticsListener.onDrmKeysLoaded (#1001).
    • نقل بيانات طلب توفير الخدمة من مَعلمة عنوان URL إلى نص POST
  • التأثير:
    • أضِف Presentation.copyWithUnsetSideRoundedTo لتقريب ناتج الجانب غير المضبوط عند إنشاء Presentation بطول ضلع واحد.
  • Muxers:
    • إضافة MediaMuxerCompat، وهو بديل جاهز للاستخدام للإطار MediaMuxer.
    • أضِف MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo() للسماح بإنشاء صور "صور حية".
    • أضِف WebmMuxer للسماح بدمج وسائط OPUS وVORBIS وVP8 وVP9 في تنسيق ملف webm.
  • إضافة "إعلانات الوسائط التفاعلية":
    • إزالة قواعد ProGuard المخصّصة، حتى تتمكّن التطبيقات من استخدام تلك التي تم إصدارها في أرشيف IMA لنظام التشغيل Android بدلاً من ذلك
    • أضِف ImaServerSideAdInsertionUriBuilder.setNetworkCode، وهي واجهة برمجة تطبيقات جديدة لضبط معرِّف شبكة "إدارة إعلانات Google" لكي تتعامل حزمة IMA SDK مع معرّفات الإعلانات على النحو المحدّد في إعدادات "إدارة إعلانات Google". رموز الشبكة اختيارية، ولكن يُنصح باستخدامها في طلبات بث الخدمة الكاملة. للعثور على معرِّف الشبكة، يمكنك الاطّلاع على هذه المقالة.
    • تمت زيادة إصدار IMA إلى 3.37.0، ما يتطلّب تفعيل ميزة إزالة التشويش في المكتبة الأساسية. يجب أن يتم تفعيلها أيضًا من خلال التطبيقات التابعة. اطّلِع على ملاحظات الإعداد في IMA. * توفير خيارات واجهة مستخدم مخصّصة لميزة "إدراج الإعلان الديناميكي" في "مجموعة أدوات IMA" في أداة إنشاء عناوين URI الخاصة بخدمة "إدراج الإعلان من جهة الخادم" تشمل خيارات واجهة المستخدم المخصّصة لإدراج الإعلانات من جهة الخادم إمكانية عرض الإعلانات "القابلة للتخطّي" و"تفاصيل عن الإعلان". تتوفّر هذه الميزة حاليًا لناشرين محدّدين فقط من خلال قائمة مسموح بها. تؤدي هذه التغييرات أيضًا إلى ترقية إصدار "حزمة تطوير البرامج لإعلانات الوسائط التفاعلية" إلى 3.38.0 (ملاحظات الإصدار) للوصول إلى واجهة برمجة التطبيقات الخاصة بخيارات واجهة المستخدم المخصّصة.
    • تم إصلاح المشكلة التي يتم فيها تسجيل خطأ في إعداد المحتوى الذي يظهر بعد الإعلان بشكل خاطئ على أنّه خطأ في تشغيل الإعلان (#2656).
  • الجلسة:
    • إضافة مَعلمة جديدة إلى MediaSession.Callback.onPlaybackResumption لتحديد ما إذا كان الطلب يهدف إلى جمع المعلومات فقط أو إلى بدء التشغيل (#1764)
    • تعديل MediaSession.ControllerInfo.isTrusted لتحديد وحدات التحكّم من التطبيق نفسه على أنّها موثوق بها أيضًا (#2542).
    • أضِف MediaSessionService.triggerNotificationUpdate لتفعيل تعديل الإشعارات يدويًا (#1833).
    • أضِف ProgressListener إلى طرق الأوامر المخصّصة.
    • غيِّر القيمة التلقائية لـ MediaLibrarySession.Builder.setLibraryErrorReplicationMode إلى غير خطيرة.
    • أضِف المَعلمة Context إلى MediaButtonReceiver.onForegroundServiceStartNotAllowedException (#2625).
    • قراءة معرّف عناصر التحكّم بمستوى الصوت من النظام الأساسي PlaybackInfo بدلاً من جلبه عبر binder يضمن ذلك قراءة نوع التشغيل ومعرّف عنصر التحكّم في مستوى الصوت بشكل متزامن ومطابقتهما لبعضهما البعض.
    • تم إصلاح الخطأ الذي كان يؤدي إلى فلترة أحداث المفاتيح ACTION_UP قبل تمريرها إلى دالة معاودة الاتصال لتتم معالجتها بشكل مخصّص. يؤدي ذلك إلى تحقيق التكافؤ مع ما فعله media1 وما تفعله المنصة (#2637).
    • إصلاح الخلل الذي كان يؤدي إلى استدعاء getCurrentTimeline() من خلال PlayerWrapper حتى عندما لا يكون الأمر متاحًا (#2665).
    • تم إصلاح الخطأ الذي كان يتسبب في بقاء رسالة في قائمة انتظار الرسائل الخاصة ببرنامج التشغيل الرئيسي، ما يؤدي إلى حدوث تسرّب في الذاكرة بعد إيقاف الخدمة (#2692).
    • عند الاتصال بتطبيق جلسة قديم باستخدام MediaBrowser، لا يتم إرسال الأوامر المخصّصة إلى الجلسة إلا إذا تم الإعلان عن الإجراء المخصّص كإجراء مخصّص في PlaybackStateCompat للجلسة القديمة. يتم إرسال جميع الإجراءات المخصّصة الأخرى إلى الخدمة.
    • تم تنفيذ onAudioSessionIdChanged لإرسال إشعار إلى أدوات التحكّم في الوسائط عندما يتم ضبط معرّف جلسة صوتية من خلال الجلسة (#244).
    • تم إصلاح الخطأ الذي كان يتسبّب في عدم بدء المشغّل عند وصول حدث مفتاح الوسائط Intent إلى onStartCommand() عند الضغط على KEYCODE_HEADSETHOOK. تم إصلاح هذه المشكلة من خلال معالجة KEYCODE_HEADSETHOOK تمامًا مثل KEYCODE_MEDIA_PLAY_PAUSE (#2816).
    • تم إصلاح الخطأ الذي لم يتم فيه إرسال حجم Surface بين الجلسة ووحدة التحكّم، ما أدّى إلى تعذُّر تطبيق تأثيرات الفيديو في الجلسة التجريبية. إذا كنت تستخدم وحدة تحكّم، قد يكون هذا تغييرًا غير متوافق إذا كان المشغّل لا يمكنه التعامل مع طلب setVideoSurfaceHolder.
    • إصلاح عملية نشر قيم البيانات الوصفية غير String CharSequence، مثل السلاسل ذات النمط span (#2853).
    • أضِف CommandButton.executeAction حتى تتمكّن أدوات التحكّم من تنفيذ الإجراء المطلوب بسهولة أكبر. يجب أيضًا السماح بتحديد مَعلمات لبعض أوامر المشغّل والجلسة لتحديد الإجراء الذي سيتم تنفيذه.
    • أضِف توافقًا مع الإصدارات القديمة لحالات CommandButton باستخدام Player.Command أو SessionCommand غير المخصّص لتحديد الإجراء. ويتم الآن تمثيلها بشكل صحيح في جلسات الوسائط على المنصة، على سبيل المثال، في واجهة مستخدم النظام أو Android Auto.
    • تم إصلاح مشكلة يتم فيها ضغط Bitmap نفسه عدة مرات عند ربط MediaController بجلسة وسائط على المنصة.
  • UI:
    • أضِف الفئة ProgressStateWithTickInterval وrememberProgressStateWithTickInterval Composable المقابل إلى الوحدة media3-ui-compose. يتم استخدام عنصر الاحتفاظ بالحالة هذا في demo-compose لعرض الموضع الحالي والمدة في شكل نص.
    • أضِف MuteButtonState إلى ui-compose الذي يتعامل مع كتم مستوى صوت Player. يُستخدَم عنصر الاحتفاظ بالحالة هذا في demo-compose لعرض زر تبديل كتم الصوت/إلغاء كتم الصوت.
    • أضِف فئات ProgressStateWithTickCount وrememberProgressStateWithTickCount Composable المقابل إلى وحدة media3-ui-compose. يتم استخدام عنصر الاحتفاظ بالحالة هذا في demo-compose لعرض مستوى التقدّم كشريط تقدّم أفقي للقراءة فقط.
    • أضِف ContentFrame Composable إلى media3-ui-compose الذي يجمع بين إدارة PlayerSurface وتغيير حجم نسبة العرض إلى الارتفاع وتغطية المحتوى باستخدام غالق.
    • حلّ مشكلة معروفة في النظام الأساسي لواجهة برمجة التطبيقات 34 تؤدي إلى عرض فيديوهات ممدودة أو مقصوصة عند استخدام SurfaceView داخل AndroidView في Compose، وبالتالي تؤثر في عناصر ContentFrame وPlayerSurface القابلة للإنشاء مع SURFACE_TYPE_SURFACE_VIEW (#1237, #2811).
    • أنشئ وحدة media3-ui-compose-material3 جديدة وأضِف إليها عناصر Composables متوافقة مع Material3 (مثل PlayPauseButton وNextButton وPreviousButton وSeekBackButton وSeekForwardButton وRepeatButton وShuffleButton وMuteButton).
    • أضِف TimeText قابلاً للإنشاء إلى media3-ui-compose-material3 لعرض مستوى تقدّم اللاعب بتنسيق نصي. يمكن ضبطها لعرض الموضع الحالي أو المدة أو الوقت المتبقي.
    • إضافة إمكانية وضع زر مسار الوسائط في PlayerView
    • استخدِم BidiFormatter لعرض علامات الترقيم بشكل صحيح في ترجمة وشرح النصوص المكتوبة من اليمين إلى اليسار (#11214).
  • إضافة HLS:
    • تحليل سمات تخطّي الإعلانات البينية في HLS
    • ربط سمات التحكّم في التخطّي من قائمة تشغيل HLS وقائمة مواد العرض بالمستند AdPlaybackState لإتاحة الوصول للجميع
    • تم إصلاح الخطأ الذي يؤدي إلى حذف وقت بدء قائمة التشغيل عند إزالة العلامة EXT-X-PROGRAM-START-DATE التي تحدّد وقت البدء من قائمة تشغيل (#2760).
    • استخدِم البحث الثنائي للعثور على فهرس المقطع في موضع معيّن في قائمة التشغيل (#2826).
    • أضِف HlsInterstitialsAdsLoader.skipCurrentAd() وskipCurrentAdGroup() والطُرق المقابلة لتخطّي الإعلانات والمجموعات الإعلانية حسب الفهرس.
    • أضِف HlsInterstitialsAdsLoader.Listener.onAdStarted للإبلاغ عن بداية فترة إعلانية (#2859).
    • قبول المسافة كفاصل بين التاريخ والوقت في سلاسل التاريخ والوقت بتنسيق ISO 8601
    • التعامل بشكل صحيح مع جلب الجزء التالي من HlsMediaPlaylist الذي لا يتضمّن مقاطع (#2821)
    • استخدام موضع البدء التلقائي لـ "إعلانات ما قبل التشغيل" في أحداث البث المباشر
  • إضافة DASH:
    • تم إصلاح المشكلة التي كانت تحدث عند تشغيل بثوط DASH باستخدام بيان معرّف موارد منتظم (URI) data:غير هرميUnsupportedOperationException (#2688).
    • أعِد ضبط LiveConfiguration على القيمة التي يوفّرها MediaItem في DashMediaSource عند الإصدار وعندما يعدّل المستخدم عنصر الوسائط (#2606).
    • تجنُّب الأعطال الناتجة عن تحديثات غير صالحة لملف البيان لم يتم الإبلاغ عنها كأخطاء في المشغّل (#2805)
  • إضافة RTSP:
    • التعامل مع خطأ عدم توفّر حِزم RTP عند معالجة وحدات NAL المجزّأة لبرنامجي الترميز H264 وH265 (#2613)
  • إضافات برنامج الترميز (FFmpeg وVP9 وAV1 وما إلى ذلك):
    • إضافة AV1: يستخدم برنامج فك ترميز AV1 الآن مكتبة dav1d عالية الأداء، ما يحل محل عملية التنفيذ السابقة libgav1 لتحسين سرعة فك الترميز.
    • إضافة FFmpeg: تم إصلاح مشكلة كانت تمنع تشغيل بعض ملفات FLAC من خلال التأكّد من تحليل حزمة STREAMINFO بشكل صحيح وتمريرها إلى برنامج الترميز (#2887).
  • إضافة البث:
    • أضِف CastPlayer.Builder، ما يتيح لتطبيق CastPlayer تشغيل المحتوى محليًا وعبر البث. للحفاظ على السلوك القديم CastPlayer الذي يتيح تشغيل المحتوى باستخدام Cast فقط، يمكنك استخدام RemoteCastPlayer. تحتفظ دوال الإنشاء الحالية في CastPlayer بسلوكها القديم، ولكن تم إيقافها نهائيًا لصالح استخدام أدوات الإنشاء CastPlayer أو RemoteCastPlayer بدلاً من ذلك.
    • توقّف عن فرض نوع MIME غير فارغ في DefaultMediaItemConverter.
    • استخدِم MediaItem.mediaMetadata.mediaType للاستدلال على MEDIA_TYPE في Cast لاستخدامه في DefaultCastOptionsProvider#toMediaQueueItem، عندما يكون متاحًا.
    • فعِّل عمليات النقل من الجهاز البعيد إلى الجهاز المحلي في DefaultCastOptionsProvider.
    • إتاحة استخدام ميزة Cast في العرض التوضيحي للجلسة
    • إضافة إمكانية عرض زر مسار الوسائط على واجهة مستخدم قابلة للإنشاء
    • إضافة إمكانية عرض زر مسار الوسائط في قائمة شريط الإجراءات
    • إضافة إمكانية عرض زر مسار الوسائط كواجهة مستخدم للعرض
  • أدوات الاختبار:
    • أضِف الحد الأقصى لفرق الوقت لسلوك التقدّم التلقائي في FakeClock. يتم ضبطها تلقائيًا على ثانية واحدة، ولكن يمكن ضبطها من خلال FakeClock.Builder.
    • أضِف الحدّ الأقصى للفرق الزمني بين الرسائل في RobolectricUtil.runMainLooperUntilrunLooperUntil). القيمة التلقائية هي ثانية واحدة، ولكن يمكن ضبطها من خلال عمليات التحميل الزائد الجديدة لهذه الطرق.
    • نقل CapturingRenderersFactory من test-utils إلى test-utils-robolectric
  • إزالة الرموز المتوقّفة نهائيًا:
    • إزالة الدالة الإنشائية DefaultPreloadManager المتوقّفة نهائيًا استخدِم DefaultPreloadManager.Builder بدلاً من ذلك.
    • تمت إزالة دوال إنشاء EditedMediaItemSequence المتوقّفة نهائيًا. استخدِم EditedMediaItemSequence.Builder بدلاً من ذلك.
    • إزالة BitmapFactoryImageDecoder.BitmapDecoder استخدِم ExternallyLoadedImageDecoder بدلاً من ذلك.
    • إزالة ShadowMediaCodecConfig.forAllSupportedMimeTypes() المتوقّف نهائيًا يمكنك استخدام ShadowMediaCodecConfig.withAllDefaultSupportedCodecs() كبديل.
    • إزالة ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes() المتوقّف نهائيًا استخدِم ShadowMediaCodecConfig.withNoDefaultSupportedCodecs() بدلاً من ذلك.

1.9.0-rc01

‫1 ديسمبر 2025

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

‫1.9.0-beta01

‫20 نوفمبر 2025

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

1.9.0‎-alpha01

‫22 أكتوبر 2025

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

الإصدار 1.8.0

1.8.1

‫21 مايو 2026

يتضمّن الإصدار 1.8.1 التعديلات التالية.

  • التأثير:
    • اضبط GL_DRAW_BUFFER وGL_READ_BUFFER بشكل صريح عند الانتقال من سياق بدون واجهة.

الإصدار 1.8.0

‫30 يوليو 2025

يتضمّن الإصدار 1.8.0 هذه التعديلات.

  • المكتبة المشتركة:
    • إضافة إمكانية استبدال مشغّل الفيديو في ForwardingSimpleBasePlayer
  • ExoPlayer:
    • إضافة دالة getter لوضع الترتيب العشوائي إلى واجهة ExoPlayer(#2522)
    • طرح استثناء بشكل أكثر وضوحًا في حال الوصول إلى DefaultAudioSink من سلاسل تعليمات متعددة إذا حدث ذلك بسبب طلب إلى RendererCapabilities.getFormatSupport خارج المشغّل، تأكَّد من طلب هذه الطريقة في سلسلة التعليمات نفسها التي تستخدمها سلسلة تعليمات التشغيل في ExoPlayer أو استخدِم مثيلاً مختلفًا عن المثيل المستخدَم في التشغيل (#1191).
    • إصلاح الخطأ الذي قد يؤدي إلى تصنيف DefaultTrackSelector لتنسيقات الصوت غير المجسم على أجهزة التلفزيون على أنّها غير متوافقة
    • تأكَّد من عرض آخر إطار بشكل صحيح عند استخدام العلامة DECODE_ONLY في MediaCodec (وهي مفعَّلة تلقائيًا في وضع التقديم السريع).
    • إضافة إمكانية استخدام معرّف الجهاز الافتراضي من Context الذي تم تمريره إلى ExoPlayer.Builder
    • تفعيل الجدولة الديناميكية تلقائيًا في وضع "التنظيف"
    • تجنَّب إعادة تحميل المصدر بلا داعٍ عند الانتقال إلى نهاية العنصر.
    • استخدام MediaCodec.BUFFER_FLAG_DECODE_ONLY تلقائيًا في وضع التقديم السريع والترجيع
    • يتم طرح IllegalStateException عند تشغيل PreloadMediaSource بواسطة ExoPlayer باستخدام سلسلة تشغيل تختلف عن سلسلة التحميل المسبق (#2495).
    • إضافة cloneAndMove إلى ShuffleMode مع تنفيذ تلقائي (#2226)
    • تغيير السلوك التلقائي للدالة Renderer.getMinDurationToProgressUs لعرض قيمة أكبر إذا لم يكن من الضروري استدعاء الدالة render
    • إصلاح الخطأ الذي يؤدي إلى تأخير عرض الإطار الأخير عند الانتقال إلى نهاية الفيديو أثناء الإيقاف المؤقت. في الوقت الحالي، لن يتم تطبيق إصلاح الخطأ إلا في حال تفعيل ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled.
    • أضِف طريقة الدفع ExoPlayer.setScrubbingModeEnabled(boolean). يؤدي ذلك إلى تحسين أداء المشغّل في حالات البحث المتكرّر (على سبيل المثال، عندما يسحب المستخدم شريط التمرير). يمكن تخصيص سلوك وضع التقديم السريع باستخدام setScrubbingModeParameters(..) على ExoPlayer وExoPlayer.Builder.
    • السماح بتخصيص مدى التفاوت في البحث الجزئي في وضع البحث السريع
    • زيادة معدّل تشغيل الترميز في وضع التقديم السريع أو الترجيع
    • تم إصلاح الخطأ الذي قد لا يتم فيه الإبلاغ عن أخطاء الإعداد في محتوى AdsMediaSource (#2337).
    • إصلاح مشكلة تسرّب الذاكرة في MergingMediaSource، على سبيل المثال، عند تحميل الترجمة والشرح بشكل جانبي (#2338)
    • السماح CmcdConfiguration.Factory بإرجاع null لإيقاف تسجيل بيانات CMCD لعناصر وسائط محدّدة (#2386)
    • زيادة حجم ذاكرة التخزين المؤقت التلقائي للصور من 128 كيلوبايت (خطأ في النسخ واللصق من مسارات النص) إلى 26 ميغابايت، وهو حجم كبير بما يكفي لصور دقة HDR فائقة بدقة 50 ميغابكسل (#2417).
    • أضِف PreCacheHelper الذي يتيح للتطبيقات التخزين المؤقت المسبق لملف وسائط واحد مع تحديد موضع البدء والمدة.
    • إضافة إمكانية التحميل المُسبَق من موضع محدّد في DefaultPreloadManager
  • المحوّل:
    • أضِف CodecDbLite التي تتيح تحسينات خاصة بمجموعة الشرائح لإعدادات ترميز الفيديو.
    • أضِف العلامة setEnableCodecDbLite إلى DefaultEncoderFactory لتفعيل تحسين إعدادات CodecDB Lite. ويتم ضبط هذه العلامة تلقائيًا على "خطأ".
    • عند ملء فجوة أولية (تمت إضافتها من خلال 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 أو "صورة داخل صورة"
  • أدوات الاستخراج:
    • تحليل البيانات الوصفية من ملفات MP4 المجزّأة (#2084)
    • ‫JPEG: إتاحة الصور المتحركة التي لا تتضمّن مقطع Exif في البداية (#2552)
    • إضافة إمكانية البحث في ملفات 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 الفيديوهات المنعكسة بشكل صحيح، ولكنها تنعكس بشكل غير صحيح على المحور y (#2012).
    • ‫MP3: استخدِم المدة وحجم البيانات من البيانات الوصفية غير القابلة للبحث في Xing وVBRI وما شابهها من معدّل نقل البيانات المتغيّر عند الرجوع إلى البحث بمعدّل نقل البيانات الثابت بسبب FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) (‎#2194).
  • الصوت:
    • تم إصلاح الخطأ الذي لا يتم فيه استدعاء AnalyticsListener.onAudioPositionAdvancing عند بدء تشغيل الصوت بالقرب من نهاية الوسائط.
    • إضافة دعم لجميع تنسيقات عيّنات PCM الخطية في ChannelMappingAudioProcessor وTrimmingAudioProcessor
    • إضافة إمكانية معالجة الفجوات الصوتية في CompositionPlayer
    • إزالة المكالمة الواردة غير المرغوب فيها إلى BaseAudioProcessor#flush() من BaseAudioProcessor#reset()
    • السماح بالتحويل المستمر منخفض الدقة إلى عالي الدقة أو العكس في DefaultAudioMixer
    • إتاحة ChannelMappingAudioProcessor وTrimmingAudioProcessor وToFloatPcmAudioProcessor للجميع (#2339)
    • استخدِم AudioTrack#getUnderrunCount() في AudioTrackPositionTracker لرصد حالات نقص البيانات في DefaultAudioSink بدلاً من التقدير بأفضل جهد.
    • تحسين عملية تنعيم الطابع الزمني للصوت عند حدوث انحراف غير متوقّع في الموضع من مصدر إخراج الصوت
    • تم إصلاح الخطأ الذي يتسبب في عدم مزامنة الصوت والفيديو خلال أول 10 ثوانٍ بعد استئناف التشغيل من وضع الإيقاف المؤقت عند الاتصال بأجهزة بلوتوث.
    • تم إصلاح الخطأ الذي كان يتسبّب في عدم تسجيل AnalyticsListener.onAudioPositionAdvancing للوقت الذي بدأ فيه الصوت بالتقدّم، بل كان يسجّل وقت القياس الأول.
    • تم إصلاح مشكلة عدم إمكانية استعادة الصوت المتعدد القنوات بعد الرجوع إلى الصوت المجسم على بعض الأجهزة (‫#2258).
  • الفيديو:
    • توسيع نطاق الحلّ البديل لمشكلة فصل الشاشة ليشمل أجهزة "lenovo" و "motorola" (#2059)
    • تحسين عرض إطارات الفيديو بسلاسة عند بدء التشغيل عندما لا تبدأ عيّنات الصوت في الموضع المطلوب بالضبط
    • توسيع نطاق الحلّ البديل لسطح العرض المنفصل ليشمل أجهزة "realme" (#2059)
    • أضِف واجهة برمجة التطبيقات التجريبية ExoPlayer لتضمين العلامة MediaCodec.BUFFER_FLAG_DECODE_ONLY عند وضع مخازن مؤقتة للإدخال مخصّصة لفك الترميز فقط في قائمة الانتظار. سيشير هذا العلم إلى برنامج الترميز ليتخطّى المخازن المؤقتة التي يتم فك ترميزها فقط، ما يؤدي إلى تسريع عملية البحث. فعِّلها باستخدام DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag. * تحسين عمليات التحقّق من أداء برامج ترميز الفيديو. وقد يؤدي ذلك إلى تصنيف بعض المقاطع الصوتية الإضافية على أنّها EXCEEDS_CAPABILITIES.
    • إصلاح أخطاء تشغيل VP9 Widevine على بعض الأجهزة (#2408)
  • النص:
    • إتاحة مسارات VobSub في ملفات MP4 (#2510)
    • إصلاح مشكلة توقّف التشغيل مؤقتًا عندما يتعذّر تحميل جزء من الترجمة والشرح في البداية ثم يتم تحميله بنجاح، يليه عدّة أجزاء فارغة من الترجمة والشرح (#2517)
    • إصلاح 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)
  • البيانات الوصفية:
    • تمت إضافة إمكانية استرداد مدة الوسائط و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).
  • ‫DRM:
    • إضافة حمولة زائدة جديدة من OfflineLicenseHelper.newWidevineInstance تقبل MediaItem.DrmConfiguration حتى يمكن تطبيق عناوين طلب HTTP بشكل صحيح (‎#2169).
  • التأثير:
    • أضِف Presentation.createForShortSide(int) لإنشاء Presentation يضمن تطابق أقصر ضلع دائمًا مع القيمة المحدّدة، بغض النظر عن اتجاه الإدخال.
  • Muxers:
    • إصلاح الخلل الذي كان يؤدي إلى عدم ضبط علامات العيّنات الصحيحة لعيّنات الصوت في ملفات MP4 المجزّأة.
    • تستخدم واجهة برمجة التطبيقات writeSampleData() الآن الفئة BufferInfo الخاصة ببرنامج الترميز بدلاً من MediaCodec.BufferInfo.
    • أضِف Muxer.Factory#supportsWritingNegativeTimestampsInEditList الذي تكون قيمته التلقائية هي false.
  • إضافة "إعلانات الوسائط التفاعلية":
    • تم إصلاح خطأ كان يؤدي إلى إبطال مجموعة إعلانية أخرى عن طريق الخطأ عند حدوث خطأ في تحميل إعلان واحد.
    • تم إصلاح الخطأ الذي كان يؤدي إلى توقّف التشغيل مؤقتًا للمجموعات الإعلانية بعد انتهاء فترة عرض الفيديو عند الطلب. لن يتم بعد الآن وضع المجموعات الإعلانية التي يتجاوز وقت بدئها الفترة الزمنية المحدّدة في قائمة الانتظار ضمن MediaPeriodQueue (#2215).
  • الجلسة:
    • إصلاح الخطأ الذي يتم فيه تجاهل عمليات الربط من وحدات تحكّم Media3 غير المميزة التابعة لجهات خارجية
    • إزالة عملية التحقّق من الأوامر المتاحة عند إرسال أوامر مخصّصة إلى MediaBrowserServiceCompat قديم يتوافق ذلك مع سلوك وحدات التحكّم/المتصفّحات القديمة عند توصيلها بتطبيق قديم.
    • تم إصلاح الخطأ الذي يتسبب في التعامل بشكل غير صحيح مع أول خطأ في التشغيل يواجهه أحد المشغّلين على أنّه استثناء مخصّص ثابت. يمنع ذلك التطبيق من استعادة البيانات.
    • تم إصلاح الخطأ الذي قد يؤدي فيه إجراء بعض التغييرات على وحدة التحكّم التي لا تتعامل معها الجلسة إلى حدوث IllegalStateExceptions.
    • تم إصلاح الخطأ الذي يؤدي إلى ترك ذراع التحكّم في حالة غير صالحة عند تنفيذ إجراءات لا تتم معالجتها من خلال الجلسة.
    • إصلاح التحذير بشأن مخالفة الإطلاق غير الآمن في StrictMode (#2330)
    • تم إصلاح الخطأ الذي كان يتسبّب في ظهور IllegalStateException (#2265) عند استدعاء setSessionExtras من سلسلة المحادثات الرئيسية عند تشغيل المشغّل من سلسلة محادثات تطبيق مختلفة عن سلسلة المحادثات الرئيسية.
    • عدم عرض إشعار تلقائيًا إذا تم إعداد مشغّل باستخدام عناصر وسائط بدون إعدادها أو تشغيلها (#2423https://github.com/androidx/media/issues/2423). يمكن ضبط هذا السلوك من خلال MediaSessionService.setShowNotificationForIdlePlayer.
    • إضافة PlaybackException مخصّص لجميع وحدات التحكّم أو وحدات التحكّم المحدّدة
    • إصلاح الخطأ الذي يؤدي إلى ظهور IllegalArgumentException عند محاولة التقديم أو الترجيع في بث مباشر على MediaController
    • بالنسبة إلى أحداث البث المباشر، أوقِف نشر موضع التشغيل وإمكانية البحث في العنصر الحالي لوحدات التحكّم في الوسائط على المنصة، وذلك لتجنُّب حدوث مشاكل في الموضع في واجهة مستخدم Android Auto (وغيرها من وحدات التحكّم التي تستخدم هذه المعلومات من جلسة الوسائط على المنصة) (#1758).
    • تم إصلاح الخطأ الذي كان يؤدي إلى ظهور NullPointerException عند تمرير قيمة فارغة إلى getLibraryRoot في MediaBrowser مرتبط بـ MediaBrowserServiceCompat قديم.
    • تم إصلاح الخطأ الذي كان يؤدي إلى تعطُّل تطبيق الجلسة القديم عند إرسال إجراءات مخصّصة أو نتيجة بحث أو طلب getItem مع ظهور ClassNotFoundException.
    • تم إصلاح الخطأ الذي كان يؤدي إلى مشاركة MediaItem.LocalConfiguration.uri مع MediaMetadata في جلسات المنصة. لمشاركة معرّف موارد منتظم (URI) عن قصد للسماح لأدوات التحكّم بإعادة طلب الوسائط، اضبط MediaItem.RequestMetadata.mediaUri بدلاً من ذلك.
  • UI:
    • تم إصلاح الخطأ الذي كان يتسبّب في عدم عمل PlayerSurface داخل المكوّنات القابلة لإعادة الاستخدام، مثل LazyColumn، بشكل صحيح (#2493).
    • تم إصلاح خطأ في Compose أدّى إلى حدوث فجوة بين ضبط حالات الزر الأولية ومراقبة التغيير في الحالة (مثل أشكال الرموز أو تفعيلها). يتم الآن رصد أي تغييرات يتم إجراؤها على &quot;اللاعب&quot; خارج فترة المراقبة (#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 ملموسة وتنزيل المحتوى وفقًا لذلك.
  • إضافة Cronet:
    • إضافة معالجة تلقائية لملفات تعريف الارتباط (#5975)
  • إضافة HLS:
    • إصلاح الخطأ الذي يحدث عندما تحاول HlsSampleStreamWrapper البحث داخل المخزن المؤقت في حال عدم توفّر أي أجزاء في المخزن المؤقت #2598
    • تم إصلاح الخطأ الذي يؤدي إلى تغيير اختيار المسار بعد تحميل أجزاء ذات زمن استجابة منخفض، ويمكن أن تتسبب تلميحات التحميل المُسبَق في توقّف التشغيل أو تجميده (#2299).
    • منع عمليات إعادة التحميل المفرطة من خلال الانتظار لنصف المدة المستهدَفة عندما لا يلتزم الخادم بقيمة CAN-BLOCK-RELOAD=YES (#2317).
    • تم إصلاح الخطأ الذي كان يؤدي إلى توقّف التشغيل مؤقتًا عند بدء بث إعلانات بينية قبل إعلان أثناء التشغيل، ومحاولة تحديد قائمة مواد العرض للإعلان غير الصحيح (#2558).
    • إصلاح تحليل قائمة التشغيل لقبول \f (تغذية النموذج) في قيم سمات السلسلة المقتبسة (#2420).
    • إتاحة تعديل الإعلانات البينية التي تحمل رقم التعريف نفسه (‎#2427)
    • تم إصلاح الخطأ الذي لا يتم فيه أحيانًا نشر أخطاء تحميل قائمة التشغيل عند نفاد مقاطع البث المباشر (#2401https://github.com/androidx/media/issues/2401).
    • يجب تجميع عروض الترجمة والشرح حسب علامة NAME، على غرار طريقة تجميع عروض الصوت الحالية (#1666).
    • إتاحة قوائم X-ASSET-LIST وعمليات البث المباشر باستخدام HlsInterstitialsAdsLoader
  • إضافة DASH:
    • إصلاح المشكلة التي يتم فيها دمج مجموعة التكيّف الخاصة بميزة "التشغيل السريع" مع مجموعة التكيّف الرئيسية لتكوين TrackGroup غير صالح (#2148)
    • تم إصلاح الخطأ الذي يؤدي إلى ظهور استثناء عند تقصير مدة فترة DASH عندما تكون خطوة العرض قد قرأت عيّنات تتجاوز المدة الجديدة (#2440).
    • تم إصلاح الخطأ الذي كان يؤدي إلى عدم اتّباع عملية إعادة التوجيه عند استخدام مَعلمات طلب البحث CMCD (#2475).
  • إضافة RTSP:
    • إضافة إمكانية استخدام حزمة تجميع بروتوكول النقل في الوقت الفعلي (RTP) لبرنامج الترميز H265 وفقًا للمعيار RFC 7798#4.4.2 (#2413)
    • تم إصلاح الخطأ RtspClient لاستخدام معرّف الموارد المنتظم الخاص بالموقع الجغرافي كما هو محدّد عند معالجة الردّ HTTP 302 (#2398).
    • تمت إضافة إمكانية تحليل SessionDescriptions التي تحتوي على أسطر تتضمّن أحرف مسافة بيضاء لاحقة (#2357).
  • إضافات برنامج الترميز (FFmpeg وVP9 وAV1 وما إلى ذلك):
    • تم إصلاح الخطأ الذي لا يؤدي فيه DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange أي وظيفة في ما يخص إضافات برنامج ترميز الصوت (#2258).
  • إضافة البث:
    • إضافة دعم setVolume() وgetVolume() (#2279)
    • منع CastPlayer من الانتقال إلى STATE_BUFFERING عندما يكون المخطط الزمني فارغًا.
    • إتاحة استخدام getDeviceVolume() وsetDeviceVolume() وgetDeviceMuted() وsetDeviceMuted() (#2089)
  • أدوات الاختبار:
    • أضِف advance(player).untilPositionAtLeast وuntilMediaItemIndex إلى TestPlayerRunHelper من أجل تقديم اللاعب إلى أن يتم الوصول إلى موضع محدّد. في معظم الحالات، تكون هذه الطرق أكثر موثوقية من طريقتَي untilPosition وuntilStartOfMediaItem الحالية.
    • انقل FakeDownloader إلى الوحدة test-utils-robolectric لإعادة استخدامها في اختبارات أخرى.
    • تمت إزالة 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.8.0-rc02

‫24 يوليو 2025

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

الإصدار ‎1.8.0-rc01

‫16 يوليو 2025

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

الإصدار ‎1.8.0-beta01

‫2 يوليو 2022

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

الإصدار ‎1.8.0-alpha01

‫19 مايو 2025

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

الإصدار 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 للاستماع إلى التحديث الأوّلي إذا لزم الأمر.
    • يجب مراعاة اللغة عند اختيار مقطع فيديو. يتم تلقائيًا اختيار مقطع فيديو "رئيسي" يتطابق مع لغة المقطع الصوتي المحدّد، إذا كان متاحًا. يمكن التعبير عن إعدادات اللغة المفضّلة للفيديو بشكل واضح باستخدام 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 نهائيًا.
    • إضافة دعم لـ float PCM إلى ChannelMappingAudioProcessor وTrimmingAudioProcessor
  • الفيديو:
    • تغيير MediaCodecVideoRenderer.shouldUsePlaceholderSurface إلى protected حتى تتمكّن التطبيقات من تجاهل ذلك وحظر استخدام مساحات العناصر النائبة (#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.listen إلى إضافة Player.Events في مكتبة media3-common-ktx.
    • إزالة التعليقات التوضيحية @DoNotInline من الفئات الداخلية التي تم إنشاؤها يدويًا بدون محاذاة والمصمَّمة لتجنُّب أخطاء التحقّق من الفئة في وقت التشغيل تتجاهل الإصدارات الحديثة من R8 تلقائيًا عمليات الاستدعاء غير المضمّنة مثل هذه لتجنُّب حدوث أخطاء أثناء وقت التشغيل (وبالتالي لم يعُد من الضروري تجاهلها يدويًا). يجب أن يكون جميع مستخدمي Gradle للمكتبة يستخدمون إصدارًا من المكوّن الإضافي لنظام Gradle المتوافق مع Android يتضمّن إصدارًا من R8 يتيح ذلك، بسبب compileSdk = 35. على مستخدمي المكتبة الذين لديهم أنظمة إنشاء غير Gradle التأكّد من أنّ خطوة التصغير/التشويش المكافئة لـ R8 تنفّذ عملية مماثلة تلقائية لإزالة التداخل لتجنُّب حدوث أخطاء في التحقّق من فئة وقت التشغيل. تم إجراء هذا التغيير في مكتبات AndroidX الأخرى.
  • ExoPlayer:
    • يمكن الآن طلب "MediaCodecRenderer.onProcessedStreamChange()" لكل عنصر وسائط. في السابق، لم يكن يتم استدعاؤها عند ظهور الإعلان الأول. استخدِم MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart() لتفعيل هذه الميزة.
    • أضِف PreloadMediaSource.PreloadControl.onPreloadError للسماح بتنفيذ PreloadMediaSource.PreloadControl لإجراءات عند حدوث خطأ.
    • أضِف BasePreloadManager.Listener لنشر أحداث التحميل المُسبَق إلى التطبيقات.
    • السماح بتغيير مهلة برنامج SNTP وإعادة محاولة العناوين البديلة عند انتهاء المهلة (#1540)
    • إزالة الحقل MediaCodecAdapter.Configuration.flags لأنّ قيمته كانت دائمًا صفرًا.
    • السماح للمستخدم باختيار مكبّر الصوت المدمج لتشغيل المحتوى على الإصدار 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 للسماح باستخدامه بدءًا من الإصدار 7 من حزمة S بدلاً من المستوى 34 لواجهة برمجة التطبيقات (#1262)
    • DataSourceContractTest: تأكَّد من أنّ DataSource.getUri() تعرض عنوان URI الذي تم تحويله (كما هو موضّح في المستندات). وفي حال اختلاف ذلك عن معرّف الموارد الموحّد المطلوب، يمكن أن تشير الاختبارات إلى ذلك باستخدام الطريقة الجديدة DataSourceContractTest.TestResource.Builder.setResolvedUri().
    • DataSourceContractTest: تأكَّد من أنّ DataSource.getUri() وgetResponseHeaders() تعرضان القيمة "مفتوح" بعد تعذُّر إجراء طلب إلى open() (بسبب عدم العثور على المورد) وقبل إجراء طلب close() لاحق.
      • تتيح عملية إلغاء DataSourceContractTest.getNotFoundResources() لفئات الاختبار الفرعية توفير موارد متعددة "لم يتم العثور عليها"، كما تتيح توفير أي عناوين متوقّعة أيضًا. يتيح ذلك التمييز بين الخطأ HTTP 404 (مع العناوين) والخطأ "لم يتم العثور على الخادم" (بدون عناوين).
  • الصوت:
    • ضبط البيانات الوصفية لمستوى الصوت وفقًا لمعيار CTA-2075 تلقائيًا على برنامج الترميز إذا كانت متوفّرة في الوسائط
    • ضمان خفض مستوى الصوت بسلاسة عند البحث
    • إصلاح أصوات الطقطقة التي قد تحدث أثناء عمليات البحث
    • إصلاح مشكلة تراكم أخطاء الاقتطاع في خوارزمية Sonic لتغيير سرعة التشغيل/درجة الصوت
    • تم إصلاح الخطأ في SpeedChangingAudioProcessor الذي يتسبب في حذف إطارات الإخراج.
  • الفيديو:
    • يتجنّب MediaCodecVideoRenderer فك ترميز العيّنات التي لا يتم عرضها ولا يتم استخدامها كمرجع من قِبل عيّنات أخرى.
    • في الإصدار 35 من واجهة برمجة التطبيقات والإصدارات الأحدث، يمكن أن تتلقّى MediaCodecAdapter الآن null Surface في configure، كما يمكنها تلقّي طلبات إلى طريقة جديدة detachOutputSurface لإزالة Surface تم ضبطها سابقًا إذا كان برنامج الترميز يتيح ذلك (MediaCodecInfo.detachedSurfaceSupported).
    • استخدِم قيم نسبة عرض البكسل إلى ارتفاعه المقدَّمة في MediaCodecAdapter إذا كانت متوفّرة عند معالجة onOutputFormatChanged (#1371).
    • إضافة حلّ بديل لمشكلة في جهاز Galaxy Tab S7 FE تؤدي إلى وضع علامة "غير متوافق" على بث H264 آمن بمعدل 60 إطارًا في الثانية (#1619)
    • إضافة حلّ بديل لبرامج الترميز التي تتوقف بعد آخر عيّنة بدون عرض إشارة نهاية البث
  • النص:
    • أضِف VoiceSpan مخصّصًا واملأه بفواصل زمنية صوتية بتنسيق WebVTT(#1632).
    • التأكّد من عرض ملفات WebVTT في HLS التي تتضمّن طوابع زمنية كبيرة جدًا للترجمة والشرح (تتجاوز long 64 بت عند تمثيلها كوحدات ميكروثانية وضربها في 90,000 لقاعدة الوقت في MPEG) (#1763)
    • إتاحة ترجمة CEA-608 في محتوى Dolby Vision (#1820)
    • إصلاح مشكلة تعليق التشغيل في بث DASH المتعدد الفترات عند تفعيل الترجمة والشرح بتنسيق CEA-608 (#1863)
  • البيانات الوصفية:
    • عيِّن النوع C.TRACK_TYPE_METADATA للمقاطع الصوتية التي تتضمّن محتوى icy أو vnd.dvb.ait.
  • الصورة:
    • أضِف ExternallyLoadedImageDecoder لتسهيل عملية الدمج مع مكتبات تحميل الصور الخارجية، مثل Glide أو Coil.
  • DataSource:
    • إضافة FileDescriptorDataSource، وهو DataSource جديد يمكن استخدامه للقراءة من FileDescriptor (#3757)
  • التأثير:
    • إضافة حل بديل DefaultVideoFrameProcessor لمشكلة تغيير الحجم الطفيف SurfaceTexture قد يتضمّن SurfaceTexture تغييرًا صغيرًا في الحجم يؤدي إلى قطع إطار 1-texel حول حافة المخزن المؤقت الذي تم اقتصاصه. يتم الآن التعامل مع هذه الحالة بحيث تكون النتيجة أقرب إلى النتيجة المتوقّعة.
    • تسريع 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. اطّلِع على تنفيذ إجراءات تصفّح مخصّصة. * تم إصلاح الخطأ الذي كان يؤدي أحيانًا إلى عدم تمكُّن أداة تحكّم Media3 من السماح لتطبيق جلسة بتشغيل خدمة تعمل في المقدّمة بعد طلب play().
    • يجب حصر CommandButton.Builder.setIconUri على قبول معرّفات الموارد الموحّدة للمحتوى فقط.
    • تمرير إشارات ربط متصفّح Media3 إلى MediaBrowserCompat الأولي عند الربط بـ MediaBrowserCompat قديم يمكن للخدمة تلقّي تلميحات الاتصال التي تم تمريرها كتلميحات جذرية مع المكالمة الأولى إلى onGetRoot().
    • تم إصلاح الخطأ الذي كان يؤدي إلى عدم تلقّي MediaBrowser المرتبط بخدمة متصفّح قديمة للخطأ الذي أرسلته الخدمة بعد اشتراك المتصفّح في parentid.
    • تحسين سلوك التشغيل التفاعلي، حتى لا يطلب متصفّح Media3 المرتبط بـ MediaBrowserService القديم عناصر parentId مرتين عند الاشتراك في عنصر رئيسي
  • UI:
    • تفعيل الحلّ البديل الخاص بالفيديوهات الممدّدة/المقتصة في PlayerView-in-Compose-AndroidView بسبب المشاكل المتعلقة بالانتقالات المشتركة المستندة إلى 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)
  • إضافة البث:
    • إيقاف تنظيف المخطط الزمني بعد إلغاء ربط 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 في تسلسل
    • إتاحة المؤثرات الصوتية على مستوى التركيبة
    • إضافة إمكانية تحويل صور دقة 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) يتضمّن إطارات I فقط (#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:
    • تنفيذ إمكانية استخدام معرّفات الموارد الموحّدة (URI) الخاصة بالموارد الأولية حيث يختلف package عن حزمة التطبيق الحاليandroid.resource://package/id لم يكن هذا السلوك موثّقًا من قبل، ولكنّه طريقة أكثر فعالية للوصول إلى الموارد في حزمة أخرى بدلاً من الوصول إليها بالاسم.
    • تحقَّق من أنّ 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.
    • عدِّل تنفيذ مصفوفة التراكب ليتوافق مع المستندات من خلال تبديل قيمتَي x وy المطبّقتَين في setOverlayFrameAnchor(). في حال استخدام OverlaySettings.Builder.setOverlayFrameAnchor()، اقلب قيمتَي x وy عن طريق ضربهما في -1.
    • تم إصلاح الخطأ الذي يؤدي إلى تعطُّل TimestampWrapper عند استخدامه مع ExoPlayer#setVideoEffects (#821).
    • تغيير مساحة العمل التلقائية لألوان SDR من الألوان الخطية إلى فيديو SDR كهربائي بتنسيق BT 709 يجب توفير خيار ثالث للاحتفاظ بمساحة الألوان الأصلية.
    • السماح بتحديد ترتيب z غير محدّد لـ EditedMediaItemSequences (#1055)
    • الحفاظ على نطاق إضاءة متسق في مختلف أجزاء محتوى HDR (يستخدم نطاق HLG)
    • إضافة دعم لتراكبات دقة HDR فائقة (صورة نقطية) على محتوى نطاق عالي الديناميكية.
    • يسمح هذا الخيار باستخدام تأثيرات SeparableConvolution قبل الإصدار 26 من واجهة برمجة التطبيقات.
    • إزالة OverlaySettings.useHdr غير المستخدَم لأنّ النطاق الديناميكي للتراكب والإطار يجب أن يكونا متطابقَين.
    • إضافة دعم النطاق العالي الديناميكية (HDR) لـ TextOverlay يمكن ضبط مستوى سطوع النص المركّب باستخدام OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • إضافة "إعلانات الوسائط التفاعلية":
    • ترقية واجهة برمجة التطبيقات المطلوبة لتشغيل بث إعلانات DAI في التطبيقات إلى إصدار ثابت
    • أضِف replaceAdTagParameters(Map <String, String>) إلى ImaServerSideAdInsertionMediaSource.AdLoader التي تتيح استبدال مَعلمات علامة الإعلان في وقت التشغيل.
    • تم إصلاح الخطأ الذي لم يتم فيه استدعاء VideoAdPlayer.VideoAdPlayerCallback.onError() عند حدوث خطأ في المشغّل أثناء تشغيل الإعلان (#1334).
    • تمت ترقية إصدار "حزمة تطوير البرامج للإعلانات التفاعلية" إلى 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 مع مقاطع التهيئة.
    • تم إصلاح الخطأ الذي يؤدي إلى عدم إعادة تحميل قوائم التشغيل غير الأساسية أثناء تشغيل البث المباشر (#1240).
    • تم إصلاح الخطأ الذي كان يتسبّب في حدوث ArrayIndexOutOfBoundsException (#1395) عند تفعيل CMCD لأحداث البث المباشر وفق بروتوكول HTTP ‏(HLS).
  • إضافة DASH:
    • تم إصلاح الخطأ الذي كان يتسبّب في ظهور IndexOutOfBoundsException (#1329) عند إعادة إعداد بث مباشر يتضمّن فترات متعددة.
    • إضافة دعم dashif:Laurl لعناوين URL الخاصة بالترخيص (#1345)
  • إضافة البث:
    • تم إصلاح الخطأ الذي كان يحوّل عنوان الألبوم الخاص بـ MediaQueueItem إلى اسم الفنان في عنصر الوسائط Media3 (#1255).
  • أدوات الاختبار:
    • تنفيذ onInit() وonRelease() في FakeRenderer
    • تغيير طرق TestPlayerRunHelper.runUntil()/playUntil() لتعطيل الأخطاء غير الخطيرة (مثل تلك التي يتم الإبلاغ عنها إلى AnalyticsListener.onVideoCodecError()). استخدِم سلسلة طرق TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() الجديدة لإيقاف هذا السلوك.
  • التطبيق التجريبي:
    • استخدِم DefaultPreloadManager في التطبيق التجريبي القصير.
    • السماح بضبط وضع التكرار باستخدام وسيطات Intent من سطر الأوامر (#1266).
    • استخدِم HttpEngineDataSource كـ HttpDataSource عندما يكون ذلك متاحًا على الجهاز.
  • إزالة الرموز المتوقّفة نهائيًا:
    • إزالة CronetDataSourceFactory يمكنك استخدام CronetDataSource.Factory كبديل.
    • أزِل بعض أدوات إنشاء DataSpec. يمكنك استخدام DataSpec.Builder كبديل.
    • تمت إزالة الطريقة setContentTypePredicate(Predicate) من DefaultHttpDataSource وOkHttpDataSource وCronetDataSource. يُرجى استخدام الطريقة المكافئة على كل XXXDataSource.Factory بدلاً من ذلك.
    • أزِل الدالتَين الإنشائيتَين OkHttpDataSource وOkHttpDataSourceFactory. يمكنك استخدام OkHttpDataSource.Factory كبديل.
    • إزالة PlayerMessage.setHandler(Handler) يمكنك استخدام setLooper(Looper) كبديل.
    • إزالة الحقل "Timeline.Window.isLive" استخدِم طريقة isLive() بدلاً من ذلك.
    • إزالة أدوات إنشاء DefaultHttpDataSource استخدِم DefaultHttpDataSource.Factory بدلاً من ذلك.
    • إزالة DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS استخدِم DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS بدلاً من ذلك.
    • إزالة MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean) يمكنك استخدام MediaCodecInfo.canReuseCodec(Format, Format) كبديل.
    • إزالة الطريقتَين DrmSessionManager.DUMMY وgetDummyDrmSessionManager() يمكنك استخدام DrmSessionManager.DRM_UNSUPPORTED كبديل.
    • إزالة AnalyticsListener.onAudioInputFormatChanged(EventTime, Format) وAnalyticsListener.onVideoInputFormatChanged(EventTime, Format) وAudioRendererEventListener.onAudioInputFormatChanged(Format) وVideoRendererEventListener.onVideoInputFormatChanged(Format) استخدِم بدلاً من ذلك عمليات التحميل الزائد التي تقبل DecoderReuseEvaluation.
    • إزالة RendererSupport.FormatSupport IntDef والثوابت FORMAT_HANDLED وFORMAT_EXCEEDS_CAPABILITIES وFORMAT_UNSUPPORTED_DRM وFORMAT_UNSUPPORTED_SUBTYPE وFORMAT_UNSUPPORTED_TYPE استخدِم IntDef والثوابت المكافئة في androidx.media3.common.C بدلاً من ذلك (مثل C.FORMAT_HANDLED).
    • إزالة واجهة Bundleable ويشمل ذلك إزالة جميع الحقول الثابتة Bundleable.Creator<Foo> CREATOR. على المتصلين استخدام الطريقتَين Bundle toBundle() وstatic Foo fromBundle(Bundle) مع كل نوع بدلاً من ذلك.

الإصدار 1.4.0-rc01

‫10 يوليو 2024

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

الإصدار 1.4.0-beta01

‫26 يونيو 2024

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

الإصدار 1.4.0-alpha02

‫7 يونيو 2024

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

الإصدار 1.4.0-alpha01

‫17 أبريل 2024

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

الإصدار 1.3.0

الإصدار 1.3.1

‫11 أبريل 2024

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

  • المكتبة المشتركة:
    • أضِف Format.labels للسماح بالتصنيفات البديلة أو المتوافقة مع اللغة المحلية.
  • ExoPlayer:
    • تم إصلاح مشكلة عدم احتفاظ PreloadMediaPeriod بعمليات البث عند إعادة التحميل المسبق.
    • طبِّق TrackSelectionResult الصحيح على فترة التشغيل عند إعادة اختيار المقطع الصوتي.
    • يجب بدء أدوات العرض التي تم تفعيلها مبكرًا فقط بعد تقديم فترة التشغيل عند الانتقال بين عناصر الوسائط (#1017).
    • إضافة نوع القيمة التي تم إرجاعها الناقص إلى قاعدة 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 هذه التعديلات.

  • المكتبة المشتركة:
    • توفير إمكانية استخدام معرّفات الموارد الموحّدة 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.
      • إضافة IMA:
    • تم إصلاح مشكلة تعذُّر تشغيل إعلانات DASH وHLS التي لا تتضمّن امتداد الملف المناسب.
  • الجلسة:
    • إيقاف ميزة رصد النقر المزدوج في تطبيقات التلفزيون (#962)
    • تم إصلاح المشكلة المتمثّلة في عدم نقل MediaItem.RequestMetadata التي تحتوي على إضافات غير فارغة فقط بين وحدات التحكّم في الوسائط والجلسات.
    • أضِف المنشئ إلى MediaLibrarySession.Builder لا يقبل سوى Context بدلاً من MediaLibraryService.
  • إضافة HLS:
    • تقليل HlsMediaPeriod إلى مستوى الظهور الخاص بالحزمة يجب عدم الاعتماد على هذا النوع مباشرةً من خارج حزمة HLS.
    • حلّ المشكلة: البحث عن بداية مقطع بشكل أكثر فعالية(#1031)
  • إضافات برامج الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
    • برنامج فك ترميز MIDI: تجاهل رسائل أحداث SysEx (#710).
  • أدوات الاختبار:
    • لا توقِف التشغيل مؤقتًا في TestPlayerRunHelper.playUntilPosition. يحافظ الاختبار على حالة التشغيل، ولكنّه يعلّق مستوى التقدّم إلى أن يتمكّن الاختبار من إضافة تأكيدات وإجراءات أخرى.
  • التطبيق التجريبي:
    • أضِف وحدة عرض توضيحية للمحتوى القصير من أجل عرض حالة استخدام PreloadMediaSource مع المحتوى القصير.

الإصدار 1.3.0-rc01

‫22 فبراير 2024

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

الإصدار 1.3.0-beta01

‫7 فبراير 2024

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

الإصدار 1.3.0-alpha01

‫15 يناير 2024

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

الإصدار 1.2.0

الإصدار 1.2.1

‫9 يناير 2024

  • ExoPlayer:
    • تم إصلاح المشكلة التي كانت تتسبّب في استمرار تعديل الإزاحة إلى 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:
    • تم إصلاح المشكلة المتمثلة في عدم ظهور زرَّي التقديم السريع والترجيع السريع عند استخدامهما مع التصميم المتعدد الأبعاد في BottomSheetDialogFragment (#511).
    • تم إصلاح مشكلة عدم محاذاة الأرقام في زر التقديم السريع ضمن PlayerControlView (#547).
  • إضافة DASH:
    • يجب تحليل "f800" على أنّه عدد القنوات 5 لبرنامج Dolby في ملف بيان DASH (#688).
  • إضافات برامج الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
    • ‫MIDI: تم إصلاح المشكلة التي تؤدي إلى تخطّي أحداث تغيير البرنامج عند البحث للأمام (#704).
    • انتقِل إلى FFmpeg 6.0 وعدِّل NDK المتوافق إلى r26b (#707, #867).
  • إضافة البث:
    • تنظيف عملية إنشاء Timeline لتجنُّب تعطُّل التطبيق عند تعذُّر تحميل الوسائط على جهاز البث (#708).

الإصدار 1.2.0

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

  • المكتبة المشتركة:
    • أضِف مَعلمة @Nullable Throwable إلى الطرق في واجهة Log.Logger. لم تعُد المَعلمة message في هذه الطرق تتضمّن أي معلومات حول Throwable التي تم تمريرها إلى طرق Log.{d,i,w,e}()، لذا يجب أن تضيف عمليات التنفيذ هذه المعلومات يدويًا إذا لزم الأمر (ربما باستخدام Logger.appendThrowableString(String, Throwable)).
    • تم إصلاح مشكلة عدم التوافق مع Kotlin التي لا يتم فيها رصد مَعلمات النوع العام التي تقبل القيم الخالية وأنواع عناصر المصفوفة التي تقبل القيم الخالية على أنّها تقبل القيم الخالية. تشمل الأمثلة مَعلمتَي الطريقتَين TrackSelectorResult وSimpleDecoder (#6792).
    • تغيير السلوك التلقائي لواجهة المستخدم وإشعارات في Util.shouldShowPlayButton لعرض زر "تشغيل" أثناء إيقاف التشغيل مؤقتًا (مثلاً بسبب فقدان مؤقت لأولويّة الصوت) يمكن الحفاظ على السلوك القديم باستخدام PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) أو MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • يمكنك الترقية من androidx.annotation:annotation-experimental إلى 1.3.1 لحلّ المشكلة الموضّحة في https://issuetracker.google.com/251172715.
    • انتقِل إلى ExoPlayer.setAudioAttributes في واجهة Player.
  • ExoPlayer:
    • تم إصلاح مشاكل البحث في بث AC4 بسبب عدم تحديد عيّنات فك الترميز فقط بشكل صحيح (#11000).
    • إضافة إمكانية إيقاف التشغيل على مصادر إخراج الصوت غير المناسبة (مثل مكبّر الصوت المدمج في أجهزة Wear OS) عند تفعيل هذه الميزة من خلال ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput سيتم تعديل سبب إيقاف التشغيل إلى Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT إذا تمت محاولة التشغيل عندما لا تتوفّر أي مخارج صوتية مناسبة، أو إذا تم فصل جميع المخارج المناسبة أثناء التشغيل. ستتم إزالة سبب الحظر عند توصيل جهاز إخراج مناسب.
    • أضِف MediaSource.canUpdateMediaItem وMediaSource.updateMediaItem لقبول تعديلات MediaItem بعد الإنشاء من خلال Player.replaceMediaItem(s).
    • السماح بتعديلات MediaItem لجميع فئات MediaSource التي توفّرها المكتبة من خلال Player.replaceMediaItem(s) (#33, #9978).
    • تمّت إعادة تسمية MimeTypes.TEXT_EXOPLAYER_CUES إلى MimeTypes.APPLICATION_MEDIA3_CUES.
    • أضِف PngExtractor الذي يرسل ملف PNG كاملاً ويقرأه في TrackOutput كعينة واحدة.
    • تحسين طريقة SequenceableLoader.continueLoading(long) في الواجهة SequenceableLoader لتصبح SequenceableLoader.continueLoading(LoadingInfo loadingInfo) يحتوي LoadingInfo على مَعلمات إضافية، بما في ذلك playbackSpeed وlastRebufferRealtimeMs، بالإضافة إلى playbackPositionUs الحالية.
    • تحسين طريقة ChunkSource.getNextChunk(long, long, List, ChunkHolder) في الواجهة ChunkSource لتصبح ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
    • إضافة حقول إضافية إلى تسجيل بيانات 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 الكلاسيكي إلى 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.
  • إضافة "إعلانات الوسائط التفاعلية":
    • تم إصلاح الخطأ الذي يتسبّب في ظهور استثناء (#571) عند تشغيل بث مباشر بتنسيق DASH يتضمّن عدة فترات وليس العنصر الأول في قائمة التشغيل.
    • إصدار StreamManager قبل طلب AdsLoader.destroy()
    • رفع إصدار "حزمة تطوير البرامج لإعلانات الوسائط التفاعلية" إلى 3.31.0
  • الجلسة:
    • اضبط سلوك الخدمة التي تعمل في المقدّمة للإشعارات على FOREGROUND_SERVICE_IMMEDIATE في DefaultMediaNotificationProvider (#167).
    • استخدِم فقط android.media.session.MediaSession.setMediaButtonBroadcastReceiver() المستوى 31 لواجهة برمجة التطبيقات أو أعلى لتجنُّب المشاكل المتعلقة بواجهة برمجة التطبيقات المتوقّفة نهائيًا على أجهزة Samsung (#167).
    • استخدِم أداة التحكّم في إشعارات الوسائط كخادم وكيل لضبط الأوامر المتاحة والتنسيق المخصّص المستخدَم لتعبئة الإشعار وجلسة النظام الأساسي.
    • تحويل أحداث أزرار الوسائط التي يتلقّاها MediaSessionService.onStartCommand() في Media3 بدلاً من توجيهها إلى جلسة النظام الأساسي ثم إلى Media3 بهذه الطريقة، يكون عنصر التحكّم في المكالمات هو نفسه عنصر التحكّم في إشعارات الوسائط دائمًا، ويمكن للتطبيقات التعرّف بسهولة على المكالمات الواردة من الإشعار بالطريقة نفسها على جميع مستويات واجهة برمجة التطبيقات المتوافقة.
    • تم إصلاح الخطأ الذي كان يتسبّب في عدم تقدُّم MediaController.getCurrentPosition() عند الاتصال بجهاز MediaSessionCompat قديم.
    • أضِف MediaLibrarySession.getSubscribedControllers(mediaId) لتسهيل الأمر.
    • تجاوز MediaLibrarySession.Callback.onSubscribe() لتأكيد توفّر رقم تعريف العنصر الرئيسي الذي يشترك فيه عنصر التحكّم. في حال نجاح العملية، يتم قبول الاشتراك ويتم استدعاء notifyChildrenChanged() على الفور لإبلاغ المتصفّح (#561).
    • أضِف وحدة العرض التوضيحي للجلسة في نظام التشغيل Automotive وفعِّل العرض التوضيحي للجلسة في Android Auto.
    • لا تضبط قائمة انتظار جلسة إطار العمل عندما لا يتوفّر COMMAND_GET_TIMELINE لوحدة التحكّم في إشعار الوسائط. عندما يكون Android Auto هو أداة التحكّم في العميل التي تقرأ من جلسة إطار العمل، يؤدي ذلك إلى عدم عرض الزر queue في واجهة مستخدم Android Auto (#339).
    • استخدِم DataSourceBitmapLoader تلقائيًا بدلاً من SimpleBitmapLoader (#271, #327).
    • أضِف MediaSession.Callback.onMediaButtonEvent(Intent) الذي يسمح للتطبيقات بتجاوز معالجة أحداث زر الوسائط التلقائية.
  • 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

  • المكتبة المشتركة:
    • إضافة سبب إيقاف مسار الصوت غير المناسب وتشغيله عند الاستعداد تغيير سبب الإيقاف المؤقت لفترة طويلة جدًا (#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>) من خلال إضافة مَعلمة مخطط زمني تحتوي على الفترات التي يتم فيها استخدام معرّفات UID كمفاتيح في الخريطة. هذا الإجراء مطلوب لتجنُّب مشاكل التزامن مع أحداث البث المباشر المتعددة الفترات.
    • إيقاف EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) وBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs) يمكن بدلاً من ذلك استدعاء صيغة الطرق بدون mediaTimeOffsetUs. يُرجى العِلم أنّه حتى بالنسبة إلى المتغيرات المتوقّفة نهائيًا، لم يعُد يتم إضافة الإزاحة إلى startTimeUs وendTimeUs لعناصر MediaLoadData التي يتم إرسالها بواسطة أداة الإرسال.
    • أعِد تسمية ExoTrackSelection.blacklist إلى excludeTrack وisBlacklisted إلى isTrackExcluded.
    • إصلاح السلوك غير المتسق بين ExoPlayer.setMediaItem(s) وaddMediaItem(s) عند استدعائهما في قائمة تشغيل فارغة
  • المحوّل:
    • إزالة Transformer.Builder.setMediaSourceFactory(MediaSource.Factory) استخدِم ExoPlayerAssetLoader.Factory(MediaSource.Factory) وTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory) بدلاً من ذلك.
    • إزالة Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
    • تم إصلاح الخطأ الذي كان يؤدي إلى توقُّف عملية التحويل (ما يؤدي إلى انتهاء مهلة برنامج دمج الصوت والفيديو) إذا تم إرسال إشارة إلى نهاية بث الفيديو في الوقت الذي كان فيه إطار إدخال بانتظار المعالجة.
    • يمكنك طلب برامج الترميز من خلال MediaCodecList بدلاً من استخدام أدوات findDecoder/EncoderForFormat، وذلك لتوسيع نطاق التوافق.
    • إزالة إعدادات إطارات B في DefaultEncoderFactory لأنّها لا تعمل على بعض الأجهزة
  • اختيار المقطع الصوتي:
    • أضِف DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange الذي يكون غير مفعَّل تلقائيًا. عند تفعيل هذا الخيار، سيؤدي النقر على DefaultTrackSelector إلى بدء عملية اختيار مقطع صوتي جديد عند تغيير إمكانات العارض.
  • أدوات الاستخراج:
    • ‫Ogg: تم إصلاح الخطأ الذي يحدث عند البحث في الملفات ذات المدة الطويلة (#391).
    • FMP4: تم إصلاح المشكلة التي تؤدي إلى تهيئة TimestampAdjuster لإزاحة طابع زمني غير صحيح باستخدام وقت عيّنة البيانات الوصفية من عنصر emsg (#356).
  • الصوت:
    • تم إصلاح الخطأ الذي يؤدي إلى تعذُّر تشغيل بعض الفيديوهات عند تفعيل ميزة "النفق" وتفعيل 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 والتي لا يُتوقّع استدعاؤها من خارج حزمة DRM:
      • 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).
    • استخدِم عنوان URI الأساسي لتحديد المسار النسبي من جلسة 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() وطرق setter بدلاً منها.
    • إزالة 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 في عمليات التشغيل المباشر (تقنية مرور الإشارة).
  • النص:
    • إصلاح المشكلة التي تحدث عند تمرير فهرس غير صالح (سالب) إلى 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 لتوفير وسائل لتعديل/ضبط 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)
    • يجب ألا يزيد عدد عمليات الإزالة المتوازية للتنزيل عن 1 لتجنُّب إنشاء عدد كبير جدًا من سلاسل التنفيذ (#10458).
  • الفيديو:
    • جرِّب برنامج ترميز بديل لتقنية Dolby Vision إذا كانت الشاشة لا تتوافق معها. (#9794).
  • الصوت:
    • استخدِم SingleThreadExecutor لإيقاف AudioTrack مثيلاً لتجنُّب أخطاء OutOfMemory عند إيقاف عدة مشغّلات في الوقت نفسه (#10057).
    • تضيف هذه السمة AudioOffloadListener.onExperimentalOffloadedPlayback لحالة تخفيف الحِمل في AudioTrack. (#134).
    • اجعل AudioTrackBufferSizeProvider واجهة عامة.
    • أضِف ExoPlayer.setPreferredAudioDevice لضبط جهاز إخراج الصوت المفضّل (#135).
    • تمّت إعادة تسمية androidx.media3.exoplayer.audio.AudioProcessor إلى androidx.media3.common.audio.AudioProcessor.
    • ربط الصوت بـ 8 قنوات و12 قناة بأقنعة القنوات 7.1 و7.1.4 على التوالي في جميع إصدارات Android (#10701)
  • البيانات الوصفية:
    • يمكن الآن ضبط MetadataRenderer لعرض البيانات الوصفية فور توفّرها. أنشئ مثيلاً باستخدام MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean) لتحديد ما إذا كان عارض البيانات سيُخرج البيانات الوصفية مبكرًا أو متزامنًا مع موضع المشغّل.
  • ‫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)
    • احتساب مدة النافذة بشكل صحيح للبث المباشر الذي يتضمّن إعلانات يتم إدراجها من جهة الخادم، مثل "إعلانات الوسائط التفاعلية" (IMA) الديناميكية (DAI) (#10764)
  • إضافة FFmpeg:
    • إضافة العلامات المطلوبة حديثًا لربط مكتبات FFmpeg بالإصدار 23.1.7779620 من NDK والإصدارات الأحدث (#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 أي تغييرات في خصائص Spatializer وستؤدي إلى اختيار مقطع صوتي جديد عند حدوث هذه التغييرات. يتم استبعاد الأجهزة التي تستخدم television وضع واجهة المستخدم من هذه القيود، وسيتم تفضيل التنسيق الذي يتضمّن أكبر عدد من القنوات. لتفعيل هذه الميزة، يجب إنشاء مثيل DefaultTrackSelector باستخدام Context.
  • الفيديو:
    • تمّت إعادة تسمية DummySurface إلى PlaceholderSurface.
    • إضافة دعم لترميز AV1 في MediaCodecVideoRenderer.getCodecMaxInputSize
  • الصوت:
    • استخدام LG AC3 audio decoder advertising non-standard نوع MIME
    • غيِّر نوع القيمة التي تم إرجاعها الخاص بـ AudioAttributes.getAudioAttributesV21() من android.media.AudioAttributes إلى فئة برنامج تضمين AudioAttributesV21 جديدة، وذلك لتجنُّب بطء عملية التحقّق من وقت تشغيل Android ‏(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:
    • حلّ مشكلة عدم إرسال الأحداث إلى OnClickListeners التي تم ضبطها على 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)
    • Throw checked exception when parsing RTSP timing (#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 في &quot;استوديو Android&quot; (#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 SSAI

الإصدار ‎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. يمكن دائمًا تمييز TrackGroup عن طريق ضبط id في المنشئ TrackGroup. يحلّ هذا الإصدار مشكلة تعذُّر تشغيل المحتوى بعد إيقاف التطبيق مؤقتًا في الخلفية مع تفعيل ميزة "تجاوز المسار النشط" (#9718).
    • تعديل المنطق في AdaptiveTrackSelection للسماح بزيادة الجودة في حال توفّر معدل نقل بيانات كافٍ على الشبكة حتى إذا كان التشغيل قريبًا جدًا من حد البث المباشر (#9784)
  • الفيديو:
    • إصلاح منطق الرجوع إلى برنامج فك الترميز الاحتياطي في Dolby Vision لاستخدام برنامج فك ترميز متوافق مع H264/H265 عند الحاجة
  • الصوت:
    • إصلاح منطق الرجوع إلى أداة فك الترميز الاحتياطية في Dolby Atmos (E-AC3-JOC) لاستخدام أداة فك ترميز E-AC3 متوافقة عند الحاجة
    • تغيير واجهات برمجة التطبيقات AudioCapabilities لتتطلّب تمرير AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES بشكل صريح بدلاً من null
    • السماح بتخصيص عملية احتساب حجم ذاكرة التخزين المؤقت AudioTrack من خلال إدخال AudioTrackBufferSizeProvider إلى DefaultAudioSink (#8891)
    • أعِد محاولة إنشاء AudioTrack إذا كان حجم ذاكرة التخزين المؤقت المطلوب أكبر من 1 ميغابايت. (#9712).
  • أدوات الاستخراج:
    • ‫WAV: إضافة دعم لعمليات بث RF64 (#9543)
    • تم إصلاح مشكلة التحليل غير الصحيح لوحدات H.265 SPS NAL (#9719).
    • تحليل تعليقات Vorbis (بما في ذلك METADATA_BLOCK_PICTURE) في ملفات Ogg Opus وOgg Vorbis
  • النص:
    • أضِف حقل MediaItem.SubtitleConfiguration.id يتم نشره إلى الحقل Format.id في مقطع الترجمة والشرح الذي تم إنشاؤه من الإعداد (#9673).
    • إضافة دعم أساسي لترجمة WebVTT في حاويات Matroska (#9886)
    • تمنع هذه السمة Cea708Decoder من قراءة أكثر من الحجم المحدّد لمربّع خدمة.
  • ‫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، مثل إدراج الإعلانات من خلال حزمة تطوير البرامج للإعلانات التفاعلية من Google ‏(IMA SDK).

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

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