Media3

مكتبات الدعم لحالات استخدام الوسائط
آخر تحديث الإصدار المستقر إصدار محتمل الإصدار التجريبي الإصدار الأولي
‫21 أكتوبر 2026 1.11.1 - - 1.12.0-alpha01

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

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

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

Groovy

dependencies {
    def media3_version = "1.11.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.11.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.12.0

الإصدار ‎1.12.0-alpha01

‫21 أكتوبر 2026

يتضمّن الإصدار 1.12.0-alpha01 التعديلات التالية.

  • المكتبة المشتركة:
    • إضافة C.COLOR_SPACE_DISPLAY_P3 وإتاحة استخدام الفضاء اللوني Display P3 في عمليات ربط الألوان وفقًا لمعيار ISO في MediaFormatUtil وColorInfo
    • تمت إضافة سجلّ مركزي لـ Flags لإدارة علامات الميزات التجريبية والطرح على مراحل (Flags.setCanaryModeEnabled). وتم نقل العديد من طرق @ExperimentalApi الحالية لاستخدام واجهة برمجة التطبيقات الجديدة للعلامات.
    • أضِف MediaMetadata.playlistId وMediaMetadata.Builder.setPlaylistId(String) وMediaMetadata.categories وMediaMetadata.Builder.setCategories(List<String>).
    • استبدِل androidx.media3.common.util.NonNullApi بـ JSpecify org.jspecify.annotations.NullMarked.
  • ‫ExoPlayer:
    • تم إصلاح مشكلة توقُّف تشغيل DASH المتعدّد الفترات عند تعذُّر تحميل الجزء الأول من الفترة التالية (#3396).
    • الإبلاغ عن wasCanceled = true في AnalyticsListener.onLoadError وMediaSourceEventListener.onLoadError عند استنفاد محاولات إعادة التحميل
    • إتاحة تسجيل نُسخ متعددة من VideoFrameMetadataListener باستخدام ExoPlayer.addVideoFrameMetadataListener وExoPlayer.removeVideoFrameMetadataListener، وإيقاف نهائي لـ ExoPlayer.setVideoFrameMetadataListener وExoPlayer.clearVideoFrameMetadataListener
    • يمكنك إضافة إمكانية عرض الإعلانات في المحتوى المتعدّد الفترات (مثل DASH) من خلال تقسيم AdPlaybackState وإزاحته لكل فترة.
    • تم إصلاح حالة السباق في PreCacheHelper حيث يمكن أن يؤدي إلغاء طلب إعداد جارٍ إلى بدء عمليات التنزيل في الخلفية.
    • يجب حصر setLoadOnlySelectedTracks(true) على ProgressiveMediaSource وDefaultMediaSourceFactory لفلترة مسارات الفيديو والصور غير المحدّدة فقط. يتم دائمًا تحميل المقاطع الصوتية والنصية للسماح بالتبديل السلس بين المقاطع بدون إعادة التخزين المؤقت.
    • تفعيل "setLoadOnlySelectedTracks(true)" تلقائيًا على ProgressiveMediaSource وDefaultMediaSourceFactory يؤدي ذلك إلى توفير الذاكرة والسماح بإجراء عمليات احتساب تخصيص المخزن المؤقت في DefaultLoadControl بشكل أكثر دقة في حال عدم اختيار جميع المقاطع الصوتية. يُرجى العِلم أنّ هذا قد يؤدي إلى تخزين مؤقت إضافي في حال تفعيل مسارات فيديو أو صور غير محدّدة حديثًا في منتصف التشغيل.
    • تم إصلاح مشكلة احتمال عرض Player.getCurrentPosition() لقيم قديمة (يتم تحديثها بضع مرات فقط في الثانية) عند تفعيل الجدولة الديناميكية (#3286).
    • تم إصلاح مشكلة تؤدي إلى التعامل بشكل غير صحيح مع الانخفاض أو إعادة الضبط غير المتوقّعَين في موضع رأس تشغيل AudioTrack على أنّهما تجاوز سعة عدد صحيح، ما يؤدي إلى توقّف التشغيل مؤقتًا أثناء التخزين المؤقت (#3407).
    • إزالة الميزة التجريبية "DefaultMediaCodecAdapterFactory.setAsyncCryptoSynchronizationEnabled(boolean)"
    • تجنُّب إعادة تفعيل العارض بشكل غير ضروري وتجنُّب حدوث خلل عند العودة من الإعلانات البينية أو الإعلانات إلى المحتوى الذي تم اقتصاصه في النهاية (#3371).
    • تم إصلاح مشكلة حيث يمكن أن يؤدي خطأ في العارض في عنصر قائمة تشغيل قادم إلى مقاطعة التشغيل الحالي قبل الأوان عند تفعيل ميزة "Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION".
    • تم إصلاح NullPointerException قد يحدث إذا تم نقل أدوات العرض من خلال ExoPlayer إلى فترة وسائط غير جاهزة عند تفعيل Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION.
    • تم إصلاح مشكلة تخطّي إطارات الفيديو أو إسقاطها بشكل غير متوقّع أثناء الجدولة الديناميكية عند تفعيل Flags.FLAG_VIDEO_RENDERER_DURATION_TO_PROGRESS.
    • تم إصلاح ArrayIndexOutOfBoundsException في مستمعي الإحصاءات عند إيقاف التشغيل أثناء عرض إعلان على بث مباشر (#3423).
    • تم إصلاح مشكلة تؤدي إلى نشر PreloadMediaSource لحدث خلال التحميل المُسبق بشكل غير متوقّع عندما لا يتم استدعاء preload() مطلقًا (‎#3408).
    • تم إصلاح مشكلة تجاهُل Format.subsampleOffsetUs لمقاطع البيانات الوصفية، ما يؤدي إلى ظهور طوابع زمنية غير صحيحة للتشغيل في أوامر الربط SCTE-35 التي تم فك ترميزها (#3413).
    • تم إصلاح مشكلة تسرُّب الذاكرة في PreloadMediaSource وDefaultPreloadManager عند استدعاء preload() عدة مرات على المصدر نفسه (#3445).
    • تم إصلاح مشكلة NullPointerException عند إصدار AdsMediaSource أثناء انتظار إعادة تحميل المخطط الزمني للمحتوى (#3442).
    • تم إصلاح مشكلة حيث يمكن أن ينتقل تشغيل الوسائط التدريجية إلى الموضع الخطأ عندما يتعذّر التحميل بعد البحث (أو عند بدء التشغيل في موضع غير صفري) وتتم إعادة المحاولة (#3440).
    • إضافة حل بديل لمشكلة تجمُّد وحدة فك ترميز H.264 في جهاز Xiaomi TV Stick 4K (MiTV-AYFR0) عند تغيير درجة الدقة بسلاسة (#3457)
    • تم إصلاح NullPointerException في SteeringManifestTracker عند إيقاف أداة التتبّع قبل تنفيذ دالة الاستدعاء الخاصة باكتمال التحميل أو الخطأ (#3443).
    • إتاحة تشغيل البيانات الوصفية المحدّدة زمنيًا لـ HAGC (ST 2094-50) من مسارات البيانات الوصفية المجمّعة في ملفات mebx بتنسيق MP4
    • تم إصلاح مشكلة تخطّي فترات الوسائط التي يتم إعدادها ببطء في قائمة تشغيل.
  • ‫CompositionPlayer:
    • إتاحة ضبط عدد اللقطات في الثانية لتجميع إطارات الفيديو باستخدام Composition.Builder.setVideoFrameAggregationParameters لسير عمل التشغيل
    • تم إصلاح مشكلة فقدان الإطارات في التركيبات المتعددة التسلسلات الناتجة عن عدم تطابق التقريب أو التكميم في الطابع الزمني، وذلك من خلال اختيار الإطار الذي يحمل الطابع الزمني الأقرب أثناء تجميع الإطارات. يتم تفعيل هذه الميزة من واجهة برمجة التطبيقات 29 فقط، لأنّها تتطلّب الاحتفاظ بإطار إضافي واحد قيد المعالجة لكل تسلسل فيديو.
  • Transformer:
    • يمكنك ضبط عدد اللقطات في الثانية لتجميع إطارات الفيديو باستخدام Composition.Builder.setVideoFrameAggregationParameters لسير عمل التصدير.
    • تم إصلاح مشكلة فقدان الإطارات في التركيبات المتعددة التسلسلات الناتجة عن عدم تطابق التقريب أو التكميم في الطابع الزمني، وذلك من خلال اختيار الإطار الذي يحمل الطابع الزمني الأقرب أثناء تجميع الإطارات. يتم تفعيل هذه الميزة من واجهة برمجة التطبيقات 29 فقط، لأنّها تتطلّب الاحتفاظ بإطار إضافي واحد قيد المعالجة لكل تسلسل فيديو.
    • يجب احترام Transformer#setAudioMimeType(AUDIO_RAW) عند استخدام AudioProcessors. قبل هذا الإصلاح، كان طلب MimeTypes.AUDIO_RAW وتطبيق AudioProcessor يؤديان إلى إخراج مضغوط.
  • اختيار المقطع الصوتي:
    • تم إصلاح مشكلة تفضيل مقطع SDR بشكل غير صحيح على مقطع Dolby Vision متوافق على بعض الأجهزة (‎#3135).
  • أدوات الاستخراج:
    • ‫Mp4Extractor: تم إصلاح مشكلة تحليل المربّع dOps لملفات Opus بتنسيق MP4 حيث لم يتم تحويل PreSkip وInputSampleRate وOutputGain من الترتيب الأكثر أهمية إلى الترتيب الأقل أهمية، ما يؤدي إلى تجاهل أول 299 ملي ثانية تقريبًا من الصوت في حال عدم توفّر قائمة تعديل (#3431).
    • يُرجى إزالة Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES وMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265 وFragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES وFragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265 لأنّ تحليل تبعية العيّنات ضمن مجموعة الصور (GOP) لبرنامجَي الترميز H.264 وH.265 مفعَّل تلقائيًا.
    • ‫Mp4Extractor: تم إصلاح مشكلة تحليل البيانات الوصفية للموقع الجغرافي من مربّعات xyz التي تحتوي على إحداثيات الارتفاع لتعبئة Mp4LocationData.
    • تمت إضافة ExtractorUtil.getFramesPerEncodedSample لاحتساب عدد إطارات الصوت لكل عيّنة لتنسيقات الصوت المرمَّزة (#3367).
    • إضافة FLAG_READ_XMP_METADATA إلى Mp4Extractor لاستخراج البيانات الوصفية لـ XMP من مربّعات UUID ذات المستوى الأعلى
    • تم إصلاح مشكلة تلف الصوت بتنسيق AC-3 وDTS وLPCM عند تشغيل محتوى MPEG-PS بنمط DVD، وذلك من خلال إزالة عنوان البث الفرعي private_stream_1 من كل حزمة PES في PsExtractor قبل تمرير الحمولة إلى قارئ الصوت (#3327).
    • تم إصلاح الخطأ في FragmentedMp4Extractor عندما يرمّز مربّع tfdt من الإصدار 1 قيمة سالبة لـ baseMediaDecodeTime (#3412).
    • ‫MPEG-TS: تمت إضافة ميزة تحليل رسائل SEI لترتيب حزم الإطارات H.264 وH.265 لتعبئة Format.stereoMode (#3419).
    • تحليل بيانات إعدادات الملف التعريفي 20 لـ Dolby Vision ورفض ملفات Dolby Vision غير المتوافقة بدلاً من تشغيلها كملفات HEVC عادية بألوان غير صحيحة (#3427)
    • ‫MP3: تم التراجع عن تعديل البيانات الوصفية الخاصة بالتأخير والحشو في برنامج ترميز LAME/Xing لأنّه غير متوافق مع العديد من برامج فك ترميز MediaCodec MP3 (#3425).
    • ‫Matroska: تم إصلاح NullPointerException عند تحليل عناصر ChapterAtom المتداخلة (#3438).
    • Ogg: تم إصلاح خلل يتسبب في دمج حزمة حجمها من مضاعفات 255 بايت وتنتهي عند حدود الصفحة مع الحزمة التالية.
    • ‫MP4: تحليل mebx من مسارات البيانات الوصفية المحدّدة زمنيًا في Mp4Extractor وFragmentedMp4Extractor يتم عرض المقاطع الصوتية التي تحمل مفتاح it35 على شكل MimeTypes.APPLICATION_ITUT_T35 (ما يتيح تشغيل HAGC). يتم تجاهل مسارات mebx الأخرى ما لم يتم ضبط FLAG_EMIT_RAW_MEBX_DATA، وفي هذه الحالة يتم إصدار جميع مسارات mebx كـ MimeTypes.APPLICATION_MEBX أولية.
    • Ogg: تمت إضافة ميزة استخراج بيانات الحشو النهائي لملفات Opus من أجل تشغيل المحتوى بدون فواصل (#2576)، وتم إصلاح الطوابع الزمنية للعيّنات بعد الانتقال إلى صفحة تبدأ بحزمة مستمرة.
    • ‫Ogg: تم إصلاح أخطاء فك الترميز وتخطّي الطوابع الزمنية لمدة ثانية واحدة تقريبًا في أحداث البث المباشر المتسلسلة بتنسيق Ogg Opus من خلال تجاهل حِزم عناوين التعليقات ورقم تعريف Opus في منتصف البث.
  • المفتّش:
    • إتاحة استرداد بيانات XMP الوصفية من ملفات MP4 باستخدام MetadataRetriever
    • إتاحة استخراج مسارات البيانات الوصفية المحدّدة زمنيًا في mebx في MediaExtractorCompat بتنسيق MimeTypes.APPLICATION_MEBX
  • إطار الفحص:
    • تم إصلاح مشكلة اقتصاص ألوان BT.2020 ذات النطاق الواسع في الصورة الأساسية ذات النطاق العادي الديناميكية عند استخراج لقطات Ultra HDR باستخدام FrameExtractor. يتم الآن ضغط الألوان الخارجة عن النطاق بشكل بسيط في نطاق sRGB بدلاً من تثبيتها.
  • الصوت:
    • تمت إضافة حل بديل للأجهزة التي تستدعي android.media.AudioDeviceCallback في سلسلة التعليمات الخاطئة (#3386).
    • تم إصلاح المشاكل المحتملة المتعلّقة بتوقُّف التشغيل بعد الانتقال بين المقاطع الصوتية عند استخدام ميزة "تفريغ البيانات المضغوطة".
    • تم حلّ مشكلة في أجهزة Amazon Fire TV حيث يمكن أن يتوقف صوت AC-3 أثناء الانتقال بين الفترات (#3448).
    • إتاحة إزالة المساحة المتروكة في نهاية البث لبرنامج الترميز لتشغيل ملفات Ogg وWebM/Matroska Opus بدون فواصل (#2576)
    • تم إصلاح مشكلة تأخُّر التفريغ الديناميكي بدون فواصل وتعديلات المساحة المتروكة أثناء الانتقال بين المقاطع الصوتية، بحيث يتم تطبيقها على المقطع الصوتي التالي بدلاً من المقطع الصوتي الذي يتم تشغيله.
    • اقتصاص المساحة المتروكة في نهاية برنامج الترميز في أحداث البث الفردية والبث النهائي في قائمة تشغيل، بالإضافة إلى الانتقالات السلسة في منتصف قائمة التشغيل (#2576)
    • تجنَّب النُسخ غير الضرورية من مخزن الصوت المؤقت في TrimmingAudioProcessor بعد اكتمال عملية اقتطاع تأخير برنامج الترميز في بداية البث وعدم الحاجة إلى اقتطاع أي حشو في نهاية البث.
  • الفيديو:
    • تم إصلاح مشكلة الإبلاغ عن إطارات الفيديو المتأخرة التي تتضمّن طوابع زمنية متطابقة للإصدار، بحيث يتم الإبلاغ عنها على أنّها تم إسقاطها بدلاً من تخطّيها.
  • النص:
    • أضِف MediaItem.SubtitleConfiguration.timeOffsetUs لتغيير الطوابع الزمنية للترجمات التي تم تحميلها من مصدر خارجي بالنسبة إلى الوسائط. يمكن تغيير الإزاحة أثناء التشغيل باستخدام Player.replaceMediaItem(int, MediaItem) بدون مقاطعة التشغيل (#1976).
    • ‫SubRip: تمت إضافة إمكانية إدخال CharsetDetector في DefaultSubtitleParserFactory لرصد ترميز الأحرف لترجمات SubRip المستقلة بدون علامة ترتيب البايت (#2247).
  • التأثير:
    • تنفيذ SoundSeparationAudioProcessor لفصل مصدر الصوت باستخدام وحدة StudioSound GMSCore
  • أدوات دمج الوسائط:
    • تم إصلاح كتابة مربّع dOps لبرنامج Opus في Mp4Muxer وFragmentedMp4Muxer حيث تمت كتابة PreSkip وInputSampleRate وOutputGain بالترتيب الصغير بدلاً من الترتيب الكبير (#3431).
    • إتاحة كتابة ارتفاع نظام تحديد المواقع العالمي (GPS) في Mp4LocationData باستخدام Mp4Muxer
    • تمّت إضافة Muxer.Factory.create(ParcelFileDescriptor) للسماح بتعدد الإرسال مباشرةً إلى ParcelFileDescriptor.
    • كتابة مربّع tfdt (وقت فك ترميز الوسائط الأساسي لمقطع المسار) تلقائيًا في مربّعات traf لملفات MP4 المجزّأة لتوفير طوابع زمنية لفك ترميز الوسائط
    • إتاحة كتابة مربّعات حاوية E-AC-3 وE-AC-3 JOC ‏ (Dolby Atmos) dec3 في Mp4Muxer
    • إتاحة تنسيق WebM في MediaMuxerCompat
    • كتابة مربّع mfra (الوصول العشوائي إلى أجزاء الفيلم) في نهاية ملفات MP4 المجزّأة للسماح بالبحث في FragmentedMp4Extractor باستخدام FLAG_READ_MFRA_FOR_SEEK_MAP
    • تم إصلاح عطل في Mp4Writer وFragmentedMp4Writer عند كتابة عيّنة EOS قبل كتابة أي عيّنات أخرى.
    • تم إصلاح مشكلة توافق الحاوية عند دمج محتوى Dolby في ملفات MP4 أو ملفات MP4 مجزّأة من خلال الإعلان عن العلامة التجارية المتوافقة مع dby1 في عنوان الحاوية (#3369).
    • إتاحة المقاطع الصوتية بتنسيق PCM العائم 32 بت في Mp4Muxer وFragmentedMp4Muxer (#3389)
    • رفض ملفات Dolby Vision غير المتوافقة في Mp4Muxer وFragmentedMp4Muxer عند إضافة المقاطع الصوتية
    • إتاحة المقاطع الصوتية بتنسيق PCM الصحيح 24 بت و32 بت في Mp4Muxer وFragmentedMp4Muxer
  • إضافة IMA:
    • يجب إعادة توجيه أحداث إيقاف المشغّل مؤقتًا واستئنافه إلى حزمة تطوير البرامج للإعلانات التفاعلية (IMA SDK) في ImaServerSideAdInsertionMediaSource.
  • الجلسة:
    • أضِف MediaConstants.EXTRAS_KEY_PLAYLIST_ID وMediaConstants.EXTRAS_KEY_PLAYLIST_TITLE وMediaConstants.EXTRAS_KEY_PLAYLIST_ARTWORK_URI وMediaConstants.EXTRAS_KEY_CATEGORIES لتعبئة البيانات الوصفية لقائمة التشغيل والعناصر من البيانات الوصفية والأوصاف القديمة، وMediaConstants.EXTRAS_KEY_SUGGESTED_TYPE وMediaConstants.EXTRAS_KEY_TTL_SECONDS لاقتراح LibraryParams.extras.
    • تم إصلاح عطل في "SecurityException" عند إنشاء أو إصدار MediaSession على الأجهزة التي تفرض حدودًا صارمة على PendingIntent.
    • تم إصلاح مشكلة ظهور الخطأ null في MediaSession.getControllerForCurrentRequest() أثناء طلبات التشغيل على Android 12 (المستويان 31 و32 من واجهة برمجة التطبيقات) عندما لم يكن MediaSessionService في المقدّمة بعد.
    • تم إصلاح عطل في "IllegalArgumentException" عند اتصال "MediaController" بجلسة قديمة تُبلغ عن مستوى صوت أقصى سالب.
    • تم إصلاح مشكلة تؤدي إلى إرسال رد اتصال onPrepareFrom* غير متوافق بدلاً من onPlayFrom*، أو إرسال onPlay() بدون إعادة إعداد ملف الوسائط المطلوب، وذلك عند استدعاء MediaController.setMediaItem أو setMediaItems متبوعًا بـ play() في MediaSessionCompat قديم متوقف مؤقتًا.
    • تم إصلاح NullPointerException في الإصدار القديم من MediaBrowser عند تلقّي ردّ على أمر مخصّص (#3432).
    • تم إصلاح عطل في "IllegalArgumentException" عند تلقّي بيانات وصفية قديمة تتضمّن مفاتيح مكرّرة في Bundle الأساسي.
    • دمج المكالمات الصادرة من MediaControllerCompat.TransportControls التي يتم إجراؤها ضمن تكرار Looper نفسه عند التحكّم في MediaSessionCompat قديم (على سبيل المثال، يؤدي الاتصال بـ setMediaItem وprepare وplay معًا الآن إلى إرسال معاودة اتصال واحدة من onPlayFrom*).
  • واجهة المستخدم:
    • تم إصلاح موضع علامات الترقيم في الترجمة من اليمين إلى اليسار والحفاظ على نطاق الامتداد عند تفعيل التفاف النص ثنائي الاتجاه (#3454، #3455).
    • أضِف فئتَي TrackSelectionState وTrackSelectionParametersState ودوال remember الخاصة بحالة الدالة المركّبة المقابلة لهما إلى وحدة media3-ui-compose.
    • قدِّم PresentationState.videoAspectRatio واجعل Modifier.resizeWithContentScale يتناول aspectRatio: Float? بدلاً من sourceSizeDp: Size?.
    • أضِف فئة CuesState والدالة المركّبة rememberCuesState إلى وحدة media3-ui-compose للاستماع إلى الإشارات الحالية للمشغّل.
    • أضِف دعم وضع التمرير السريع إلى ProgressSlider إذا كان يستند إلى ExoPlayer أو CompositionPlayer.
    • أضِف دعم showArtwork إلى PresentationState واستخدِمه لتحديد وقت عرض الدالة المركّبة الاختيارية artwork المقدَّمة في ContentFrame وPlayer. أضِف دالة مركّبة Artwork لاستخدامها كقيمة تلقائية لخانة artwork.
    • أضِف حقولاً جديدة إلى PlayPauseButtonState (showBuffering وshowRetry وshowReplay) واستخدِمها في PlayPauseButton لعرض المزيد من الرموز ومؤشر التخزين المؤقت.
    • أضِف فئة PlaybackState للسماح بمراقبة حالة التشغيل المخصّصة، وقدِّم BufferingIndicator كمكوّن مستقل عن الأزرار.
    • تم إصلاح مشكلة ظهور علامات الإعلانات في PlayerView وPlayerControlView عند حدود الفترات الزمنية للعناصر النائبة للإعلانات المباشرة التي تظهر بعد انتهاء الفيديو في أحداث البث المباشر المتعددة الفترات.
    • لم تعُد خانات الدوال المركّبة Player وContentFrame وPlayerDefaults وMiniController تتلقّى المشغّل أو مستوى ظهور عناصر التحكّم كمَعلمات. يمكنك تسجيلها من نطاق الاستدعاء بدلاً من ذلك (على سبيل المثال، topControls هو الآن @Composable BoxScope.() -> Unit). هذا تغيير قد يؤدي إلى عطل في واجهة برمجة تطبيقات غير مستقرة.
    • أضِف المَعلمة alignment إلى ContentFrame وPlayer وModifier.resizeWithContentScale لتحديد موضع المحتوى الذي تم تغيير حجمه داخل الحاوية، واقتصاص محتوى ContentFrame وفقًا لحدوده، لكي لا يظهر الفيديو الذي تم تغيير حجمه باستخدام ContentScale.Crop خارج حدوده.
    • إضافة واجهة مستخدم تتيح البث المباشر إلى ProgressSlider وProgressStateWithTickCount وProgressStateWithTickInterval من خلال عرض isLive وliveOffsetMs إضافة دالة LiveButton مركّبة إلى media3-ui-compose-material3 (#2213).
  • إضافة Ktor:
    • تم إصلاح مشكلة حيث يمكن أن يتعامل KtorDataSource مع حالات فشل الاتصال في منتصف البث على أنها نهاية الإدخال بدلاً من طرح HttpDataSourceException (#3460).
  • إضافة HLS:
    • تحليل VIDEO-RANGE (PQ وHLG) على EXT-X-STREAM-INF وEXT-X-I-FRAME-STREAM-INF إلى Format.colorInfo (#3441)
    • تم إصلاح NullPointerException عند تحليل مقاطع الإعداد MPEG-TS EXT-X-MAP التي تحتوي على عيّنات وسائط PES (#3456).
    • تم إصلاح مشكلة تراجُع الأداء حيث كانت السمتان Format.id وFormat.metadata null لمقاطع HLS المعروضة (#3402).
    • يتم اقتصاص إعلانات قائمة مواد العرض إلى X-PLAYOUT-LIMIT وتخطّي الإعلانات التي تتجاوز الحدّ الأقصى بالكامل، وضبط قيمة الإزاحة التلقائية لاستئناف المحتوى على 0 عندما يحذف الإعلان البيني X-RESUME-OFFSET وتكون مدته غير معروفة حتى إذا تم ضبط X-PLAYOUT-LIMIT.
    • تم إصلاح مشكلة كانت تؤدي إلى أن يؤدي حلّ "إعلان بيني" من النوع X-ASSET-LIST إلى استبدال مساهمات إزاحة استئناف المحتوى للإعلانات البينية الأخرى في المجموعة الإعلانية نفسها.
  • إضافة DASH:
    • إتاحة تحليل أحداث "إدراج MPD بديل" (urn:mpeg:dash:event:alternativeMPD:insert:2025) و"استبدال" (urn:mpeg:dash:event:alternativeMPD:replace:2025) في DashManifestParser وعرضها كمثيلات AlternativeMpdEvent في Period.alternativeMpdEvents هذا تغيير قد يؤدي إلى عطل في التطبيقات التي تستخدم الفئة الفرعية DashManifestParser: DashManifestParser.buildPeriod الآن تتطلب مَعلمة List<AlternativeMpdEvent> إضافية وتمت إزالة التحميل الزائد السابق. يجب أن تلغي التطبيقات التي تلغي DashManifestParser.parseEventStream(XmlPullParser) DashManifestParser.parseEventStream(XmlPullParser, String) بدلاً من ذلك، لأنّ الأولى تم إيقافها نهائيًا وستصبح خاصة في إصدار مستقبلي.
    • تحليل معلومات ألوان CICP (ColourPrimaries وTransferCharacteristics وMatrixCoefficients وVideoFullRangeFlag) من واصفات EssentialProperty وSupplementalProperty إلى Format.colorInfo (#3426)
    • إتاحة القوائم المفصولة بمسافات بيضاء لقيم @id في سمات @value للواصف (http://dashif.org/guidelines/trickmode) في وضع الخدعة (#3315)
    • إتاحة تحليل <ProducerReferenceTime> في DashManifestParser، وعرضه في AdaptationSet.producerReferenceTimes، واستخدامه لتعبئة Timeline.Window.presentationStartTimeMs وTimeline.Window.windowStartTimeMs لبث الفيديو عند الطلب.
    • إضافة ميزة "توجيه المحتوى" في DASH (#1689)
    • تم إصلاح NullPointerException قد يحدث عند تحليل بيان DASH مع سمة غير متوفّرة في عنصر <UTCTiming> (#3436).
  • إضافة RTSP:
    • تم إصلاح عطل في IllegalStateException كان يحدث عند معالجة استجابات الشبكة المتأخرة بعد إغلاق عميل RTSP.
    • تم إصلاح مشكلة تؤدي فيها عملية التقديم السريع إلى تفعيل آلية الرجوع إلى بروتوكول TCP بشكل غير صحيح.
    • تم إصلاح عطل في IllegalStateException يمكن أن يحدث عند معالجة استجابات الشبكة المتأخرة بعد إعادة ضبط عميل RTSP للحالة أثناء إعادة اختيار المسار أو إنهاء الجلسة أو إعادة توجيه عنوان URI.
    • تم إصلاح مشكلة حيث يؤدي البحث مرة أخرى قبل إعادة تشغيل الفيديو إلى تعطُّل IllegalStateException.
    • تم إصلاح المشكلة التي كانت تؤدي إلى انقطاع الصوت وتجمُّد تشغيل الفيديو عند تقديم الفيديو أو ترجيعه أثناء انتظار تنفيذ عملية تقديم أو ترجيع سابقة.
    • تم إصلاح مشكلة عدم وضع علامة على وحدات الوصول إلى الإطارات الرئيسية H.264 وH.265 التي تنتهي بحزمة تجميع أو حزمة غير IDR كإطارات رئيسية، ما يؤدي إلى بقاء التشغيل عالقًا في التخزين المؤقت (#3434).
  • إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وغيرها):
    • إضافة Opus: تم إصلاح عطل JNI عند فك ترميز بيانات Opus غير الصالحة.
    • إضافة Opus: تم إصلاح مشكلة تجاهل حشو الإلغاء عندما يقع التخطّي المسبق وحشو الإلغاء في الحزمة نفسها (#2576).
  • إضافة Cast:
    • تم تقديم SessionAvailabilityListener.SessionUnavailableReason لتمثيل سبب عدم توفّر الجلسة، وتوفير طريقة مثقلة لـ SessionAvailabilityListener.onCastSessionUnavailable لعرضه.
    • تم إصلاح مشكلة استئناف التشغيل بشكل غير متوقّع على الجهاز بعد إيقاف جلسة بث.
    • تسجيل خطأ عند تعذُّر تنفيذ عمليات RemoteMediaClient (مثل التشغيل أو الإيقاف المؤقت أو تغيير السرعة أو وضع التكرار أو مستوى الصوت أو كتم الصوت أو اختيار المقطع الصوتي) في RemoteCastPlayer (#3373)
    • تم إصلاح ArrayIndexOutOfBoundsException في RemoteCastPlayer عندما تتغيّر قائمة انتظار جهاز الاستقبال في Cast أو تتقلّص أثناء انتظار عملية البحث (#3372).
    • تم إصلاح مشكلة في جهاز استقبال البث التلقائي حيث كان المخطط الزمني يعرض فقط ملفات الوسائط المحيطة مباشرةً بالملف النشط بدلاً من قائمة التشغيل بأكملها (#3129).
    • تعديل المخطط الزمني وموضع التشغيل فورًا عند تعديل قائمة التشغيل (setMediaItems أو addMediaItems أو moveMediaItems أو removeMediaItems) أو تقديم المحتوى أو ترجيعه في RemoteCastPlayer، ووضع عمليات قائمة التشغيل المتتالية في قائمة انتظار ليتم تنفيذها بشكل موثوق بالترتيب (#2639، #3272).
    • تم إصلاح مشكلة تعذُّر تحميل ملفات الوسائط على جهاز استقبال البث عند طلب addMediaItems في قائمة انتظار فارغة في RemoteCastPlayer (#2402).
    • تم إصلاح مشكلة في RemoteCastPlayer حيث كان الوصول إلى نهاية قائمة انتظار جهاز استقبال البث يؤدي إلى محو المخطط الزمني بدلاً من الاحتفاظ بقائمة التشغيل.
    • تم إصلاح مشكلة عدم نقل أو تطبيق playWhenReady وrepeatMode وplaybackParameters عند ضبطها على RemoteCastPlayer قبل تحميل ملفات الوسائط (على سبيل المثال، أثناء نقل التشغيل من الجهاز المحلي إلى الجهاز البعيد في CastPlayer) (#889).
  • التطبيق التجريبي:
    • إضافة إمكانية تشغيل ملفات الوسائط المحمية بموجب "إدارة الحقوق الرقمية" (DRM) ونموذج إضافي لبث HLS إلى كتالوج التطبيق التجريبي للجلسة
    • اضبط RemoteCastPlayer باستخدام CastTrackSelector في تطبيق العرض التوضيحي للجلسة لتفعيل اختيار الترجمة والمقطع الصوتي أثناء البث.
  • إزالة الرموز المتوقفة نهائيًا:
    • إزالة DashUtil.buildDataSpec(Representation, RangedUri, int) وDashUtil.buildDataSpec(Representation, String, RangedUri, int) يمكنك استخدام DashUtil.buildDataSpec(Representation, BaseUrl, RangedUri, int, Map<String, String>) كبديل.
  • الإصدار:
    • زيادة Gradle minSdk إلى 24

الإصدار 1.11.0

1.11.1

‫10 سبتمبر 2026

  • ‫ExoPlayer:
    • يمكنك نقل العلامة لتفعيل/إيقاف البيانات الوصفية لـ HAGC للوسائط التدريجية من MediaSource.Factory إلى ExtractorsFactory. تمت إزالة طريقة setExperimentalEnableHagcPlayback السابقة واستبدالها بـ ExtractorsFactory.setParseHagcMetadata. يؤدي هذا أيضًا إلى حلّ مشكلة عدم عمل الإيقاف لحاويات Matroska/WebM.
    • تم إصلاح مشكلة توقُّف التشغيل التي تحدث عند الإحماء المسبق لأداة عرض ثانوية غير انتقالية.
    • تم إصلاح مشكلة الإحماء المُسبق حيث يجب إعادة Surface إلى أداة العرض الأساسية عندما تؤدي عملية البحث إلى إعادة ضبط كلتا أداتي العرض وإيقافهما.
    • تم إصلاح ArrayIndexOutOfBoundsException عندما يؤدي إعادة تحميل المخطط الزمني المباشر إلى نقل الموضع التلقائي بعد إعلان تم إدراجه من جهة الخادم ويتم تشغيله حاليًا (‎#3348).
    • تم إصلاح مشكلة في وضع التقديم أو الترجيع السريع حيث يمكن عرض إطارات الفيديو القديمة لفترة وجيزة عند البحث مع تفعيل ScrubbingModeParameters.allowSkippingMediaCodecFlush.
  • أدوات الاستخراج:
    • Matroska: تم إصلاح مشكلة عدم ظهور المخطط الزمني القابل للبحث عند وضع المسارات بعد المجموعات (#3377).
  • الصوت:
    • تم إصلاح عملية احتساب حجم ذاكرة التخزين المؤقت في SilenceSkippingAudioProcessor بحيث لا يتم تقليل الحد الأدنى لمدة كتم الصوت بشكل غير صحيح من خلال حجم الإطار (#3271).
    • تم إصلاح طريقة معالجة PCM بتنسيق 8 بت في PcmAudioUtil للتعامل مع العيّنات على أنّها غير موقَّعة كما هو محدّد في Android (#3271).
    • تم إصلاح مشكلة في تخفيف الحِمل حيث يمكن أن يتوقف التشغيل أثناء إعلان ما قبل التشغيل أو الانتقالات السلسة بسبب أحجام ذاكرة التخزين المؤقت المحدودة للأجهزة.
    • تم إصلاح خطأ في DefaultAudioSink حيث لا ينخفض عدد الإصدارات عندما لا يكون مؤشر ترابط التشغيل نشطًا (#3338).
  • الجلسة:
    • تم إصلاح الخطأ NullPointerException الذي يحدث عند إصدار MediaController قيد المعالجة من دالة رد اتصال Player.Listener (#3375).
    • تم إصلاح مشكلة توقُّف سلسلة التعليمات الرئيسية عن العمل عندما يتصل MediaBrowser قديم بخدمة تعرض نتيجة غير متزامنة من onGetLibraryRoot() أو onConnectAsync() (#3393).
  • إضافة HLS:
    • تم إصلاح عملية احتساب إزاحة استئناف المحتوى عندما لا تكون الشريحة المستهدَفة للانطباق مضمَّنة في قائمة التشغيل بعد (#3322).
    • تم إصلاح مشكلة إعادة محاولة تحميل HlsMediaChunk بالكامل عند تلقّي EOFException من أداة الاستخراج (#3350).
  • إضافة DASH:
    • تم إصلاح عملية حساب الطابع الزمني غير الصحيحة للعيّنات في مسارات الصور باستخدام presentationTimeOffset (#3334).
  • إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وغيرها):
    • Opus: تم إصلاح تلف الذاكرة عند بدء تشغيل عدة نُسخ من OpusDecoder في الوقت نفسه.
    • ‫MPEG-H: تم إصلاح مشكلة تسرُّب الذاكرة واقتطاع الأحرف غير ASCII والعطل الداخلي المحتمل في نظام التشغيل في حالات انخفاض الذاكرة عند إرسال الأوامر إلى MpeghUiManager (#3365).

الإصدار 1.11.0

‫5 أغسطس 2026

  • المكتبة المشتركة:
    • أضِف Format.channelMask لتمثيل قناع القناة الصوتية بشكل صريح، وUtil.getAudioTrackChannelConfig(Format) جديدًا لحلّ المشكلة بأمان.
    • ترقية Kotlin من الإصدار 2.0.20 إلى الإصدار 2.2.0
  • ‫ExoPlayer:
    • تم إصلاح خطأ في التزامن يعتمد على التوقيت ويمكن أن يؤدي إلى حدوث IllegalStateException أو IndexOutOfBoundsException في ExoPlayer.
    • تخفيف عمليات التحقّق من عدد المجموعات الإعلانية في AdsMediaSource للسماح بانخفاض عدد المجموعات الإعلانية عند معالجة مجموعة إعلانية بالكامل (hasUnplayedAds() هو false)، ما يتيح تغيير حجم المجموعات الإعلانية الديناميكية أثناء عمليات إعادة الضبط
    • أضِف 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 من خلال الرجوع إلى حدود حجم وحدات البايت في المخزن المؤقت إذا كانت ذاكرة الـ heap المتاحة تبدو ضيقة.
    • محاذاة معالجة الصور الثابتة عندما لا يتم ضبط 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).
    • إضافة Format.selectionPriority يمثّل الخيار المفضَّل النسبي لـ Format في اختيار المقطع الصوتي (#3236)
    • تم إصلاح مشكلة محتملة في وضع التقديم أو الترجيع السريع حيث يمكن أن يتوقف التقديم أو الترجيع السريع عند الانتقال إلى "نهاية البث".
  • ‫CompositionPlayer:
    • تم إصلاح مشكلة عدم إصدار نُسخ TrackSelector.
  • Transformer:
    • تم إصلاح مشكلة قد تؤدي إلى الإبلاغ عن 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 من خلال دمج أحداث البث الفرعية Core وExtension في عيّنة واحدة، ما يؤدي إلى حلّ مشاكل التشغيل التي كانت تحدث سابقًا عند إخراج الاثنين كعيّنتَين منفصلتَين (#3147).
    • ‫MP4: منع التكرار اللانهائي وعمليات القراءة خارج الحدود عند تحليل عناصر علامات البيانات الوصفية الفارغة ilst (#3191).
    • ‫MPEG-TS: التأكّد من عرض آخر لقطة في أحداث البث التي يكون فيها طول آخر حزمة PES معروفًا (‎#3206)
    • ‫MP3: تم إصلاح مشكلة الإبلاغ عن معدل نقل البيانات للملفات التي تحتوي على عنوان Xing وVBRI.
    • ‫Matroska: معالجة المقاطع الصوتية المحدّدة في المجموعة الأخيرة (#3250)
    • ‫Matroska: تمت إضافة إمكانية استخدام ALAC (#3268).
    • ‫MP4: السماح بمربّعات sgpd ذات طول متغيّر في ملفات MP4 المجزّأة (#3243).
    • ‫AVI: تم إصلاح مشكلة كانت تؤدي إلى فقدان الصوت وOutOfMemoryError عند تشغيل ملفات لا تتضمّن علامات الإطارات الرئيسية في المقاطع الصوتية.
    • ‫MP3: استخدام مُدد تشغيل متواصل من عناوين Xing/Info (#3183).
    • ‫MP3: تم تعديل البيانات الوصفية الخاصة بتأخير برنامج الترميز LAME/Xing والحشو لتتطابق مع عملية الاقتطاع من PCM التي تم فك ترميزها (#3200).
  • الصوت:
    • إضافة فترة سماح تبلغ 100 ملي ثانية في أدوات عرض الصوت في ExoPlayer عند الانتقال من الحالة "جاهز" إلى الحالة "غير جاهز"، وذلك لإزالة الارتداد المؤقت لعمليات النقص وتجنُّب حالات التخزين المؤقت غير المتوقعة أثناء التشغيل النشط (#3210).
    • تغيير منطق حجم المخزن المؤقت التلقائي لـ PCM في DefaultAudioTrackBufferSizeProvider لاستخدام مخزن مؤقت ثابت يبلغ 500 مللي ثانية لجعله أقل اعتمادًا على الجهاز
    • يجب تعديل MediaCodecAudioRenderer لاستخراج قناع القناة المكانية من برنامج فك الترميز في المنصة، ما يسمح لـ DefaultAudioSink باستخدام هذا القناع الصريح بدلاً من استنتاج قناع من عدد القنوات.
    • تحويل مَعلمات "AudioSink.configure" إلى فئة بيانات يجب نقل عمليات الإلغاء المخصّصة لـ ForwardingAudioSink.configure إلى توقيع الطريقة الجديد.
    • تمت إضافة إمكانية الحفاظ على طبقة الصوت عند تمديد الوقت في بث صوتي باستخدام EditedMediaItem.Builder#setSpeed(SpeedParameters).
    • تحسين ToFloatPcmAudioProcessor لإتاحة تحويل ملفات PCM ذات 8 بت، وملفات PCM ذات 16 بت بنظام الترتيب الأكثر أهمية، وملفات PCM ذات 64 بت بنظام الفاصلة العائمة إلى ملفات PCM ذات 32 بت بنظام الفاصلة العائمة (#3090).
    • تغيير القيمة المعروضة لـ "DecoderAudioRenderer.getChannelMapping" إلى ImmutableIntArray.
    • تم إصلاح الخطأ الذي يتسبّب في توقُّف التشغيل عند تشغيل قائمة تشغيل صوتية بلا فواصل في وضع التفريغ المضغوط.
    • إعادة توجيه Timeline والمعرّف الفريد للفترة إلى AudioSink.configure وAudioProcessor.StreamMetadata لتوفير سياق قائمة التشغيل لمعالِجات الصوت (#418)
    • ضبط السمة AudioProcessor.StreamMetadata.positionOffsetUs بشكل صحيح للسماح بمعالجة الصوت المستندة إلى الوقت (#418).
    • إضافة إمكانية استخدام تنسيق PCM بنظام "الترتيب الأهم أولاً" (Big Endian) وبنظام الفاصلة العائمة 32 بت و64 بت
    • تمت إزالة مسار الرجوع من EAC3-JOC إلى EAC3 للتشغيل على أجهزة Google Pixel لأنّ برامج فك ترميز EAC3 العادية لا يمكنها فك ترميز أحداث بث EAC3-JOC (#3257).
  • الفيديو:
    • تم إصلاح منطق الانضمام إلى الفيديو لاحتساب المخازن المؤقتة التي تم إسقاطها أثناء الانضمام على أنّها تم تخطيها بدلاً من إسقاطها.
    • تم إصلاح قرار العرض الفوري عند ضبط سطح جديد لتجنُّب إسقاط اللقطات على الأجهزة التي لا تتيح استخدام الأسطح النائبة.
    • تم إصلاح تقدير عدد اللقطات في الثانية في MediaCodecVideoRenderer ليكون أكثر دقة من خلال احتساب اللقطات التي تم إسقاطها أو تخطّيها.
    • السماح بضبط الحدّ الأدنى المستخدَم لجدولة الإطارات مبكرًا القيمة التلقائية هي 50 ملي ثانية، ولكن يمكن تخصيص القيمة من خلال MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold().
    • تم إصلاح خطأ في VideoFrameReleaseHelper حيث يمكن أن تؤدي تغييرات العرض إلى تشغيل عمليات استدعاء Choreographer مكررة وعمليات تنشيط مفرطة لوحدة المعالجة المركزية في سلسلة التعليمات الرئيسية.
  • النص:
    • ‫TTML: العودة إلى displayAlign من style للمناطق (#2559).
    • ‫TTML: اكتساب وقت بدء الإشارة من أصل عناصر <p> (#3246).
  • البيانات الوصفية:
    • أضِف حقل MediaMetadata.discSubtitle وحلِّله من بيانات ID3v2.4 TSST وVorbis DISCSUBTITLE.
    • تحليل رقم القرص وعدد الأقراص من إطار ID3 TPOS
  • التأثير:
    • محو حالة إعادة الرسم في FinalShaderProgramWrapper عند المسح لمنع تجميد المشغّل عند البحث
  • أدوات دمج الوسائط:
    • إضافة إمكانية استخدام مراجع المسارات (مربّع tref) في Mp4Muxer من خلال واجهة برمجة تطبيقات addTrackReference جديدة يتيح ذلك إنشاء علاقات بين المسارات، مثل ربط مسار بيانات وصفية بمسار الفيديو الذي يصفه.
    • أضِف OggMuxer للسماح بدمج مصادر بيانات الوسائط OPUS أو VORBIS في تنسيق الملف ogg.
    • أضِف WavMuxer لإنشاء ملف WAV (يتيح استخدام PCM للأعداد الصحيحة والأعداد العشرية).
    • أضِف setAttemptStreamableOutputEnabled إلى InAppMp4Muxer.Factory للسماح بكتابة ملفات أصغر حجمًا غير قابلة للبث بدون مساحة محجوزة.
    • إتاحة استخدام تنسيق IAMF الصوتي في Mp4Muxer وFragmentedMp4Muxer
  • إضافة IMA:
    • أضِف ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot للسماح بتوفير خانة إعلانية لاستخدامها في "الإعلانات أثناء إيقاف الفيديو مؤقتًا".
    • تم إصلاح الخطأ الذي يؤدي إلى ظهور زر التخطّي على الفور في الإعلان الثاني عند عرض إعلانات VAST متتالية قابلة للتخطّي (#3165).
  • الجلسة:
    • تم إصلاح حالات التوقّف التام المحتملة وأعطال IllegalStateException داخل MediaNotificationManager عند استخدام جلسة مع حلقة تكرار مشغّل سلسلة محادثات في الخلفية.
    • فرض متطلبات أكثر صرامة على سلاسل المحادثات لطُرق MediaSession Void methods now automatically post execution to the application looper thread, and state accessors (getters) explicitly throw an IllegalStateException if called from a thread other than the application looper.
    • تم إصلاح عطل في دمج المخطط الزمني خارج الحدود (IllegalStateException في MediaUtils.mergePlayerInfo) من خلال تتبُّع اتساق الحالة لكل وحدة تحكّم في جانب الجلسة.
    • أضِف androidx.media3.session.MediaSessionManager لإتاحة إمكانية الاستعلام عن جلسات الوسائط النشطة وعرض مثيلات Media3 SessionToken.
    • تغيير الإعداد التلقائي لـ 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.
    • تم إصلاح مشكلة تصغير حجم العمل الفني مرّتين في MediaSession عندما يكون حجم الصورة قريبًا من الحدّ الأقصى المسموح به في المنصة، ما يحلّ مشكلة عدم وضوح الإشعارات (#3134).
    • تم إصلاح عطل ForegroundServiceStartNotAllowedException في MediaNotificationManager عندما يحاول ردّ الاتصال غير المتزامن لتحميل الصورة النقطية للعمل الفني بدء خدمة تعمل في المقدّمة بينما يكون التطبيق في الخلفية (#3270).
    • تم إصلاح مشكلة عدم توفّر معرّفات UID الأصلية لـ Timeline في عناصر PositionInfo التي تم تلقّيها من قِبل MediaController. تترجم الجلسة الآن هذه المعرّفات الفريدة وتنشرها بشكل موثوق أثناء تحديثات الحالة.
    • تم إصلاح عطل من خلال رصد ForegroundServiceStartNotAllowedException في MediaSessionService.stopSelfSafely() (#3310).
    • تم إصلاح مشكلة استدعاء onMediaItemTransition() غير المتوقّع في MediaController عند البحث داخل ملف الوسائط نفسه (#3248).
  • واجهة المستخدم:
    • تم إصلاح مشكلة عرض الإطار الأول بالحجم غير الصحيح عند إعادة إنشاء ContentFrame في منتصف التشغيل (#3238).
    • أضِف فئة CurrentMediaItemState والدالة المركّبة rememberCurrentMediaItemState المقابلة لها إلى وحدة media3-ui-compose. يُستخدَم عنصر الاحتفاظ بالحالة هذا في demo-compose لعرض معلومات متنوعة حول البيانات الوصفية لـ "MediaItem" الذي يتم تشغيله حاليًا.
    • أضِف فئة PlaylistState والدالة المركّبة rememberPlaylistState المقابلة لها إلى وحدة media3-ui-compose. يُستخدَم عنصر الاحتفاظ بالحالة هذا في demo-compose لعرض معلومات مختلفة عن البيانات الوصفية حول MediaItems التي تم ضبطها على المشغّل.
    • إضافة واجهة برمجة تطبيقات للتقديم السريع/التصوير البطيء إلى PlaybackSpeedState استخدِم هذه الوظيفة في "demo-compose" لعرض ميزة التقديم السريع من خلال الضغط مع الاستمرار.
    • أضِف الدالة المركّبة MiniController إلى الوحدة media3-ui-compose-material3. توفّر هذه الميزة طريقة سهلة للتحكّم في Player أثناء عرض العنوان والفنان والعمل الفني ومستوى تقدّم ملف الوسائط الحالي.
    • أضِف فئة ErrorState والدالة المركّبة rememberErrorState المقابلة لها إلى وحدة media3-ui-compose. أضِف دالة ErrorText المركّبة إلى media3-ui-compose-material3 واجعلها تراكبًا تلقائيًا على Player.
    • نشر عنصر PlayerDefaults باستخدام دوال مركّبة لـ TopControls وCenterControls وBottomControls وErrorOverlay
    • أضِف FocusRequester إلى الدالة المركّبة Player ومساحات المحتوى الخاصة بها.
    • نشر PlayerPool (common-ktx) وrememberPooledPlayer (ui-compose) لإتاحة التحميل المُسبق لـ MediaItems في بيئات واجهة المستخدم التي تستخدم النوافذ المنزلقة يمكنك عرض هذه الوظيفة في "demo-compose" باستخدام "ShortFormPlayerScreen" جديد.
    • تم إصلاح خلل في كتم صوت الغالق في PlayerView وCompose PresentationState كان يؤدي إلى تعطُّل المخططات الزمنية التي لا تتيح البحث عن معرّف UID للفترة (#3264).
  • عمليات التنزيل:
    • تم حلّ مشكلة متغيّرات HLS في قائمة تشغيل الوسائط عند جلبها للتنزيل (#3258).
  • إضافة Ktor:
    • يمكنك إضافة وحدة جديدة لإضافة media3-datasource-ktor توفّر KtorDataSource مستندًا إلى حزمة HTTP في Ktor.
    • تم إصلاح مشكلة تحميل KtorDataSource لنص استجابة HTTP بالكامل في الذاكرة عند فتح اتصال (#3305).
  • إضافة HLS:
    • تمت إضافة ميزتَي "توجيه المحتوى" (Content Steering) و"استنساخ المسار" (Pathway Cloning) في بروتوكول HLS (#1689).
    • أضِف setWithAssetListReset إلى HlsInterstitialsAdsLoader للسماح للتطبيقات بإعادة ضبط الإعلانات البينية لقائمة مواد العرض التي تمت معالجتها بالكامل إلى حالة غير متاحة لإعادة الحل عند الطلب.
    • تحليل سمة SCORE في EXT-X-STREAM-INF وEXT-X-I-FRAME-STREAM-INF وتعبئتها في Format.selectionPriority (#3236)
    • تم إصلاح خلل يتسبب في استمرار عمليات إعادة تحميل قائمة تشغيل HLS المجدوَلة حتى إذا لم تعد قائمة التشغيل أساسية أو نشطة (#3254).
    • تم إصلاح عملية احتساب إزاحة استئناف المحتوى عند حلّ قوائم مواد العرض البينية (‎#3322).
    • تم إصلاح مشكلة الانقطاع غير المتوقّع في الطابع الزمني للمقطع الصوتي عند استئناف تشغيل البث المباشر بزمن انتقال منخفض بعد تعذُّر طلب قائمة التشغيل (#3311).
    • تم إصلاح خطأ في HlsMediaPeriod.getStreamKeys() حيث يتم اعتبار مقطع ID3 في العروض الصوتية كترجمة (#3333).
  • إضافة DASH:
    • فصل مقاطع الترجمة والشرح بتنسيق CEA إلى TrackGroup مختلفة استنادًا إلى اللغة (#3113)
    • إضافة إمكانية تحليل عناصر Location متعددة من البيان (MPD) وتنفيذ عملية الرجوع إلى الموقع الجغرافي في DashMediaSource عند تعذُّر تحميل البيان
    • تم إصلاح العطل (IndexOutOfBoundsException) الذي يحدث عند فتح ملفات البيان التي تحتوي على عنصر <SegmentTimeline/> فارغ (#3326).
  • إضافة RTSP:
    • تم إصلاح مشكلة توقُّف التشغيل المؤقت أو تعذُّر التشغيل أثناء الإعداد لتشغيل RTSP بسبب أخطاء في ربط منفذ UDP.
  • إضافة Cast:
    • أضِف فئة CastParams جديدة للسماح بضبط إعدادات Cast من خلال استدعاء Cast.initialize(CastParams).
    • إضافة خيار CastParams.getShowSystemOutputSwitcherOnCastIconClick() الجديد الذي يؤدي إلى استخدام "أداة تبديل الإخراج" في SystemUI بدلاً من "أداة اختيار جهاز البث" داخل التطبيق عند توفّرها
    • تمت إضافة MediaRouteButtonState وrememberMediaRouteButtonState لإتاحة رصد حالة ظهور منتقي مسار الوسائط، وتمت إضافة المَعلمة state إلى MediaRouteButton (#3172).
    • تم إصلاح الخطأ الذي قد يتسبّب في توقّف RemoteCastPlayer نهائيًا في حالة إخفاء المسار بعد اختيار مسار، ما يؤدي إلى تجاهل التعديلات اللاحقة على المسار من جهاز استقبال البث (#3237).
    • تم إصلاح الخطأ الذي يؤدي إلى ظهور NullPointerException في DefaultMediaItemConverter عند محاولة الانضمام إلى جلسة بث بدأت من مُرسِل لا يستخدم Media3.
    • منع CastPlayer من نقل MediaItems غير القابلة للتشغيل عند تغيير المشغّل النشط (#3199)
    • تم إصلاح الخطأ الذي كان يؤدي إلى وضع أحداث البث المباشر غير المضبوطة (liveConfiguration == UNSET) في قائمة الانتظار على أنّها STREAM_TYPE_BUFFERED (#3318).
  • أدوات الاختبار:
    • يجب توسيع نطاق DataSourceContractTest ليشمل إتاحة طلبات POST مع العناوين والنصوص، وإضافة بعض موارد POST إلى HttpDataSourceTestEnv، وإضافة تأكيدات لطريقة HTTP والعناوين والنص المتوقّع في WebServerDispatcher.
    • يجب تشديد التأكيدات في DataSourceContractTest للأطوال التي يتم عرضها من DataSource.open(). يجب أن تشير الموارد التي قد تؤدي إلى C.LENGTH_UNSET إلى ذلك باستخدام TestResource.Builder.setMayResolveToUnknownLength(boolean).
    • أضِف "setPlaybackLooper" إلى "TestExoPlayerBuilder".
  • إزالة الرموز المتوقفة نهائيًا:
    • إزالة 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 كبديل.
    • إزالة androidx.media3.common.C.generateAudioSessionIdV21 يمكنك استخدام androidx.media3.common.util.Util.generateAudioSessionId كبديل.
  • إنشاء
    • تم تعديل تعليمات README.md للاعتماد على Media3 محليًا لاستخدام إصدارات Gradle المركّبة (includeBuild). تمت إزالة النص البرمجي core_settings.gradle، ولم يعُد يتم استخدام السمتَين androidxMediaModulePrefix وandroidxMediaEnableMidiModule.

1.11.0-rc01

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

1.11.0-beta01

‫7 يوليو 2026

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

1.11.0-alpha01

‫24 يونيو 2026

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

الإصدار 1.10.0

1.10.1

‫12 مايو 2026

  • المكتبة المشتركة:
    • تم إصلاح طريقة معالجة onAudioSessionIdChanged في SimpleBasePlayer وForwardingSimpleBasePlayer.
  • ‫ExoPlayer:
    • تم إصلاح حالة السباق المتعلّقة بإنشاء معرّف جلسة الصوت التي قد تؤدي إلى حدوث IllegalStateException في وضع النفق. (#3099).
    • تم إصلاح الأعطال المحتملة في التطبيق عند الاسترداد من أخطاء وحدة فك الترميز من خلال الإحماء المُسبق لأداة العرض.
    • تم إصلاح مشكلة ظهور عيوب في الفيديو بسبب توفير بيانات الإعداد عند استخدام برنامج ترميز Dolby Vision المستند إلى AV1 (#3153).
  • اختيار المقطع الصوتي:
    • تم تعديل منطق اختيار المقاطع الصوتية في VideoTrackInfo لحلّ مشكلة أنواع MIME الاحتياطية ونقل الإعدادات المفضّلة لدرجات الترميز والنطاق العالي الديناميكية إلى الإعدادات المفضّلة للجودة (#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" من ضبط ملفات الوسائط في جلسات الوسائط على المنصة التي لا تسمح بإجراءات "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 Mocking this complex interface is not generally encouraged - only when the usage is minimal/simple/incidental (#2985).
      • تطلّب ذلك نقل DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MS من ExoPlayer إلى ExoPlayer.Builder (بدون إيقاف نهائي).
    • تم إصلاح خلل يؤدي إلى نشر ProgressiveMediaSource معلومات قديمة عن المخطط الزمني للمشغّل، وإزالة الفترات المُدرَجة في قائمة المحتوى التالي بشكل غير متوقّع (#3016).
    • تم إصلاح مشكلة عدم طلب ExoPlayer التركيز على الصوت المتأخر عند طلب التشغيل أثناء المكالمات الهاتفية.
    • تم إصلاح الخطأ الذي قد يؤدي فيه الانتقال من المحتوى المسجّل إلى المحتوى المباشر إلى إعادة التخزين المؤقت في نهاية المحتوى المسجّل (#3052).
    • تمت إضافة إمكانية استخدام Dolby Vision Profile 10 (#2830).
    • تم إصلاح خطأ كان يؤدي إلى ظهور خطأ ArrayIndexOutOfBoundsException عند عرض إعلان ما قبل التشغيل غير مهيأ (#3125).
  • ‫CompositionPlayer:
    • إضافة دعم لـ EditedMediaItem.removeVideo
  • Transformer:
    • يمكن الآن لـ "EditedMediaItem.Builder.setFrameRate()" ضبط الحد الأقصى لعدد اللقطات في الثانية للفيديو، وهو أمر مفيد بشكل خاص عند زيادة سرعة الوسائط باستخدام "setSpeed()".
  • اختيار المقطع الصوتي:
    • يجب تغيير توقيع DefaultTrackSelector.selectAllTracks لتضمين مصفوفة الإخراج كمَعلمة، مع تعبئتها تلقائيًا بعمليات إلغاء المسار.
    • تم إصلاح مشكلة اختيار المقاطع الصوتية المضمّنة في البيانات الوصفية بغض النظر عمّا إذا تم اختيار المقطع الصوتي الأساسي المقابل (#294).
    • تثبيت خيارات TrackSelectionParameters لـ preferredVideoLanguages وpreferredVideoLabels وpreferredAudioLabels وpreferredTextLabels وselectTextByDefault
  • أدوات الاستخراج:
    • ‫MP4: تمت إضافة إمكانية تشغيل الملفات التي تحتوي على مربّعات uuid كبيرة قبل المربّعات الأخرى، مثل moov (#3046).
    • ‫MP4: تمت إضافة إمكانية استخدام مقاطع ترميز الفيديو المتعدد الاستخدامات (VVC) في حاويات MP4.
  • المفتّش:
    • تغيير قد يؤدي إلى عطل: إزالة FrameExtractor. على المستخدمين الآن الاعتماد على وحدة :media3-inspector-frame الجديدة وتعديل عمليات الاستيراد إلى androidx.media3.inspector.frame.FrameExtractor.
    • نقدّم وحدة جديدة لاستخراج إطارات الفيديو التي تم فك ترميزها ومعالجتها.
  • الصوت:
    • تغيير مكتبة فك الترميز الأساسية لإضافة أداة فك ترميز IAMF من libiamf إلى iamf_tools
    • تتيح ميزة فك ترميز IAMF إخراج الصوت بكلتا الأذنين إما من خلال أداة فك الترميز (عند استخدام إضافة أداة فك ترميز IAMF) أو من خلال ميزة "الصوت المكاني" في Android.
    • تمت إزالة إمكانية تشغيل ملفات AC4Profile22 والملفات القديمة الأخرى بشكل صحيح عند تقييم إمكانية تشغيل برامج فك ترميز AC-4 في سيناريوهات Automotive (#2609).
    • تحسين منطق إعادة المحاولة لتهيئة AudioOutput في DefaultAudioSink (#2905).
    • محاولة مطابقة تنسيق الإخراج لمكبّرات الصوت (أو ميزة "المُجسِّم" إن وُجدت) عند فك ترميز 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:
    • يُرجى تحديث إصدار حزمة تطوير البرامج للإعلانات التفاعلية (IMA SDK) إلى 3.39.0 للوصول إلى أحدث إصدار من واجهة برمجة التطبيقات Ad media info API.
    • تم إصلاح خطأ حيث لم يتطابق نوع MIME للإعلان مع نوع MIME المقدَّم في حدث IMA LOADED. يعمل الإصلاح الآن على ربط نوع 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).
    • تم إصلاح خلل يتعلّق بعدم إبلاغ وحدات التحكّم بعملية الانتقال بين ملفات الوسائط عندما ينتقل التشغيل من فهرس ملف وسائط معيّن إلى فهرس آخر يتضمّن ملف الوسائط نفسه لسبب الانقطاع "تلقائي" و"تقديم/ترجيع" (#2997).
    • تم إصلاح مشكلة تؤثر فيها طريقة حلّ مشكلة موضع زر واجهة مستخدم النظام سلبًا على مساحات عرض أخرى لواجهة المستخدم، مثل Android Auto أو الشركات المصنّعة التي لا تحتاج إلى طريقة الحلّ هذه (‎#3041).
    • تم إصلاح مشكلة عدم مزامنة إمكانية الوصول إلى الاشتراكات (#3056).
    • تم إصلاح خطأ في واجهة مستخدم النظام في واجهة برمجة التطبيقات 29 حيث يمكن أن يؤدي عمل فني لجلسة الوسائط بحجم معيّن إلى تعطُّل واجهة مستخدم النظام وفرض إعادة تشغيل الجهاز (#3118).
    • تم إصلاح مشكلة تغيير حجم رمز العمل الفني للإشعارات على Android Q (#3084).
  • واجهة المستخدم:
    • أضِف دالة PlaybackSpeedControl المركّبة إلى media3-ui-compose لعرض سرعة التشغيل وتعديلها.
    • أضِف دالة PlaybackSpeedToggleButton مركّبة إلى media3-ui-compose-material3 للتحكّم في سرعة التشغيل.
    • تمت إضافة دالة ProgressSlider مركّبة إلى media3-ui-compose-material3 لعرض مستوى تقدّم المشغّل وتنفيذ عمليات البحث باستخدام السحب والنقر (#2288).
    • تجنَّب استخدام مخزن مؤقت كبير خارج الشاشة في PlayerControlView المتحركة.
    • أضِف دالة Player مركّبة إلى 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)
  • إضافة Cast:
    • تمت إضافة طريقة 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).
  • إضافة Cast:
    • تم إصلاح الخطأ الذي تسبَّب في تعطُّل عملية النقل من Cast إلى التشغيل على الجهاز.

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: تحليل بيانات ReplayGain في LAME (#2840)
  • الصوت:
    • تمت إزالة إمكانية تشغيل ملفات AC4Profile22 والملفات القديمة الأخرى بشكل صحيح عند تقييم إمكانية تشغيل برامج فك ترميز AC-4 في سيناريوهات Automotive (#2609).
  • الفيديو:
    • تم تجاهُل برامج ترميز الفيديو على الأجهزة التي تعمل بإصدارات أقدم من المستوى 30 من واجهة برمجة التطبيقات عند تغيير عدد اللقطات في الثانية للمحتوى لتجنُّب تقطُّع التشغيل (#2941).
  • النص:
    • ‫VobSub: تم إصلاح بعض الترجمات المفقودة من خلال التعامل بشكل صحيح مع وحدات SPU التي تحتوي على تسلسل تحكّم واحد فقط، أو تحتوي على معلومات مهمة مقسمة على عدة تسلسلات تحكّم (#2935).
  • إضافة IMA:
    • إصلاح خطأ: تم إصلاح مشكلة عدم تطابق نوع MIME للإعلان مع نوع MIME المقدَّم في حدث IMA LOADED. يحدّد الإصلاح الآن نوع 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).
  • إضافة Cast:
    • تم إصلاح الخلل الذي يمنع تحديث المخطط الزمني لـ RemoteCastPlayer بشكل صحيح عند استبدال قائمة التشغيل.

1.9.0

‫17 ديسمبر 2025

  • المكتبة المشتركة:
    • تحديث minSdk إلى 23 بما يتوافق مع مكتبات AndroidX الأخرى
    • أضِف PlayerTransferState، ما يسهّل نقل حالة التشغيل بين نُسخ Player.
    • أضِف الطريقتَين void mute() وvoid unmute() إلى المشغّل لحفظ مستوى الصوت في المشغّل واستعادته قبل ضبطه على الصفر وبعده.
    • نشر فئات الأدوات المساعدة 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).
    • تم إصلاح الخطأ الذي كان يتسبب في الانتقال إلى ملف الوسائط التالي عند البحث في وضع التمرير السريع بالقرب من نهاية الملف، وذلك في حال تشغيل قائمة تشغيل أو وضع التكرار.
  • ‫CompositionPlayer:
    • يمكنك نشر CompositionPlayer ضمن تعليق توضيحي جديد لـ @ExperimentalApi للإشارة إلى أنّه متاح للتجربة، ولكنّه لا يزال قيد التطوير. من المرجّح أن تتغيّر بعض واجهات برمجة التطبيقات بشكل كبير في الإصدارات المستقبلية، وهناك مشاكل وقيود معروفة في بعض حالات الاستخدام (بعضها غير موثَّق).
    • إضافة دعم لـ COMMAND_SET_AUDIO_ATTRIBUTES ومعالجة التركيز الصوتي في CompositionPlayer
    • إضافة إمكانية تغيير السرعة في التسلسلات الثانوية في CompositionPlayer
    • إضافة دعم لـ EditedMediaItem.removeVideo
  • Transformer:
    • استخدام InAppMp4Muxer كأداة دمج تلقائية
    • أضِف EditedMediaItem.Builder#setSpeed() وأوقِف نهائيًا Effects#createExperimentalSpeedChangingEffects().
    • استبدِل forceAudioTrack وforceVideoTrack بـ trackTypes في EditedMediaItemSequence.
  • اختيار المقطع الصوتي:
    • أضِف TrackSelectionParameters.selectTextByDefault لتفضيل اختيار أي مقطع صوتي نصي بدون تحديد تفضيلات أخرى أكثر تحديدًا.
    • تمت إضافة preferredVideoLabels وpreferredAudioLabels وpreferredTextLabels في TrackSelectionParameters لتحديد تفضيل للمقاطع الصوتية التي تحمل تصنيفًا معيّنًا، مثل تلك التي تتم قراءتها من علامات HLS NAME (#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 عناوين صريحة. يؤدي ذلك إلى تحسين إمكانية البحث الفوري عن الملفات التي لا تحتوي على بيانات وصفية على حساب الدقة المحتملة لملفات VBR التي لا تحتوي على عناوين. يتم الآن استخدام البحث في الفهرس كحل احتياطي إذا كان افتراض معدل نقل البيانات الثابت غير قابل للبحث (على سبيل المثال، لعمليات البث ذات الطول غير المعروف) (#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).
  • إدارة الحقوق الرقمية:
    • يجب تغيير نوع القيمة التي تم إرجاعها من طرق MediaDrmCallback من byte[] إلى نوع MediaDrmCallback.Response جديد، للسماح بإرجاع معلومات اختيارية إضافية. هذا تغيير قد يؤدي إلى عطل في المصدر، ولكن يمكن حلّ الأعطال بسهولة من خلال تضمين القيمة المعروضة السابقة لـ byte[] في new Response قبل عرضها.
    • إضافة معلومات الطلب الرئيسية، مثل عنوان URL ووقت الاستجابة، إلى AnalyticsListener.onDrmKeysLoaded (#1001).
    • انقل بيانات طلب إدارة الحسابات من مَعلمة عنوان URL إلى نص POST.
  • التأثير:
    • أضِف Presentation.copyWithUnsetSideRoundedTo لتقريب جانب الناتج غير المحدّد عند إنشاء Presentation بطول جانب واحد.
  • أدوات دمج الوسائط:
    • إضافة MediaMuxerCompat، وهو بديل مباشر لإطار العمل MediaMuxer.
    • يُرجى إضافة MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo() للسماح بإنشاء "صور حيّة".
    • أضِف WebmMuxer للسماح بدمج مصادر الوسائط OPUS وVORBIS وVP8 وVP9 في تنسيق ملف webm.
  • إضافة IMA:
    • تمت إزالة قواعد proguard المخصّصة، حتى تتمكّن التطبيقات من استخدام القواعد التي تم إصدارها في أرشيف IMA لنظام التشغيل Android بدلاً من ذلك.
    • إضافة ImaServerSideAdInsertionUriBuilder.setNetworkCode، وهي واجهة برمجة تطبيقات جديدة لضبط رمز شبكة "إدارة إعلانات Google" لحزمة IMA SDK من أجل معالجة معرّفات الإعلانات على النحو المحدّد في إعدادات "إدارة إعلانات Google" رموز الشبكة اختيارية، ولكن يُنصح بها لطلبات البث الكاملة. للعثور على رمز الشبكة، يُرجى الاطّلاع على هذه المقالة.
    • يجب ترقية تبعية IMA إلى الإصدار 3.37.0 الذي يتطلّب تفعيل إزالة التجميل اللغوي للمكتبة الأساسية. ويجب أيضًا تفعيل هذا الخيار من خلال التطبيقات التابعة. يمكنك الاطّلاع على ملاحظات الإعداد الخاصة بـ IMA. * إتاحة خيارات واجهة المستخدم المخصّصة لـ IMA DAI في أداة إنشاء معرّفات الموارد المنتظمة (URI) لـ SSAI تشمل خيارات واجهة المستخدم المخصّصة لإدراج الإعلانات من جهة الخادم إتاحة عرض "إعلانات قابلة للتخطّي" و"تفاصيل عن الإعلان". تتوفّر هذه الميزة حاليًا لناشرين محدّدين مدرَجين في قائمة مسموح بها. يؤدي هذا التغيير أيضًا إلى ترقية إصدار حزمة IMA SDK إلى 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).
    • تم إصلاح خلل منع KEYCODE_HEADSETHOOK من تشغيل المشغّل عند وصول حدث مفتاح الوسائط Intent في onStartCommand(). تم إصلاح هذه المشكلة من خلال معالجة KEYCODE_HEADSETHOOK تمامًا مثل KEYCODE_MEDIA_PLAY_PAUSE (#2816).
    • تم إصلاح خطأ يتعلّق بعدم إرسال حجم Surface بين الجلسة ووحدة التحكّم، ما يؤدي إلى تعذُّر تطبيق تأثيرات الفيديو في الجلسة التجريبية. إذا كنت تستخدم وحدة تحكّم، قد يؤدي هذا التغيير إلى عطل إذا لم يتمكّن المشغّل من معالجة طلب setVideoSurfaceHolder.
    • تم إصلاح مشكلة انتشار قيم البيانات الوصفية غير التابعة لـ String CharSequence، مثل السلاسل ذات النمط span (#2853).
    • أضِف CommandButton.executeAction لتسهيل تنفيذ الإجراء المطلوب على وحدات التحكّم. وتسمح أيضًا بتحديد مَعلمات لبعض أوامر المشغّل والجلسة لتحديد الإجراء الذي سيتم تنفيذه.
    • يمكنك إضافة التوافق مع الأنظمة القديمة لمثيلات CommandButton باستخدام Player.Command أو SessionCommand غير مخصّص لتحديد الإجراء الخاص بها. يتم الآن تمثيل هذه الإجراءات بشكل صحيح في جلسات الوسائط على المنصة، على سبيل المثال في واجهة مستخدم النظام أو Android Auto.
    • تم إصلاح مشكلة ضغط Bitmap نفسه عدة مرات عند ربط MediaController بجلسة وسائط على المنصة.
  • واجهة المستخدم:
    • أضِف فئة ProgressStateWithTickInterval والدالة المركّبة rememberProgressStateWithTickInterval المقابلة لها إلى وحدة media3-ui-compose. يُستخدَم عنصر الاحتفاظ بالحالة هذا في demo-compose لعرض الموضع الحالي والمدة في شكل نص.
    • أضِف MuteButtonState إلى ui-compose التي تتعامل مع كتم صوت Player. يُستخدَم عنصر الاحتفاظ بالحالة هذا في demo-compose لعرض زر الإيقاف/التفعيل لكتم الصوت أو إعادته.
    • أضِف فئات ProgressStateWithTickCount والدالة المركّبة rememberProgressStateWithTickCount المقابلة إلى وحدة media3-ui-compose. يُستخدَم عنصر الاحتفاظ بالحالة هذا في demo-compose لعرض مستوى التقدّم كشريط تقدّم أفقي للقراءة فقط.
    • يمكنك إضافة دالة مركّبة ContentFrame إلى media3-ui-compose التي تجمع بين إدارة PlayerSurface وتغيير حجم نسبة العرض إلى الارتفاع والتغطية باستخدام غالق.
    • تم حلّ مشكلة معروفة في واجهة برمجة التطبيقات 34 للمنصة تؤدي إلى تمديد الفيديوهات أو اقتصاصها عند استخدام SurfaceView داخل AndroidView في Compose، وبالتالي تؤثر في الدوال المركّبة ContentFrame وPlayerSurface مع SURFACE_TYPE_SURFACE_VIEW (#1237، #2811).
    • أنشئ وحدة media3-ui-compose-material3 جديدة وأضِف إليها دوال مركّبة مستندة إلى 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:
    • تم إصلاح الخطأ UnsupportedOperationException عند تشغيل أحداث بث DASH باستخدام بيان معرّف موارد منتظم (URI) غير هرمي من النوع data: (#2688).
    • إعادة ضبط LiveConfiguration على القيمة التي يوفّرها MediaItem لـ DashMediaSource عند إصداره وعندما يعدّل المستخدم ملف الوسائط (#2606)
    • تجنُّب الأعطال الناتجة عن تحديثات البيان غير الصالحة التي لم يتم الإبلاغ عنها كأخطاء في المشغّل (#2805).
  • إضافة RTSP:
    • تمت معالجة خطأ حِزم RTP المفقودة عند معالجة وحدات NAL المجزّأة لبرنامجَي الترميز H264 وH265 (#2613).
  • إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وغيرها):
    • إضافة AV1: يستخدم برنامج فك ترميز AV1 الآن مكتبة dav1d العالية الأداء، ليحلّ محلّ تنفيذ libgav1 السابق من أجل تحسين سرعة فك الترميز.
    • إضافة FFmpeg: تم إصلاح مشكلة كانت تمنع تشغيل بعض ملفات FLAC من خلال التأكّد من تحليل مجموعة STREAMINFO بشكل صحيح وتمريرها إلى برنامج فك الترميز (#2887).
  • إضافة Cast:
    • أضِف CastPlayer.Builder، ما يتيح لـ CastPlayer تشغيل المحتوى على الجهاز وعلى جهاز Cast. للاحتفاظ بسلوك CastPlayer القديم المتمثّل في إتاحة تشغيل Cast فقط، يمكنك استخدام RemoteCastPlayer. تحتفظ دوال الإنشاء CastPlayer الحالية بسلوكها القديم، ولكن تم إيقافها نهائيًا لصالح استخدام أدوات الإنشاء CastPlayer أو RemoteCastPlayer بدلاً منها.
    • إيقاف فرض نوع MIME غير فارغ في DefaultMediaItemConverter
    • استخدِم MediaItem.mediaMetadata.mediaType لاستنتاج MEDIA_TYPE في Cast لاستخدامه في DefaultCastOptionsProvider#toMediaQueueItem، عندما يكون متاحًا.
    • تفعيل عمليات النقل من جهاز التحكّم عن بُعد إلى الجهاز المحلي في "DefaultCastOptionsProvider"
    • أضِف ميزة Cast في العرض التوضيحي للجلسة.
    • إضافة ميزة عرض زر مسار الوسائط على واجهة مستخدم مركّبة
    • أضِف ميزة عرض زر مسار الوسائط في قائمة شريط الإجراءات.
    • إضافة ميزة عرض زر مسار الوسائط كواجهة مستخدم للعرض
  • أدوات الاختبار:
    • أضِف الحد الأقصى للفرق الزمني لسلوك الانتقال التلقائي في "FakeClock". ويتم ضبطها تلقائيًا على ثانية واحدة، ولكن يمكن ضبطها من خلال FakeClock.Builder.
    • إضافة الحد الأقصى للفرق الزمني بين الرسائل لـ RobolectricUtil.runMainLooperUntil (وrunLooperUntil). يتم ضبطه تلقائيًا على ثانية واحدة، ولكن يمكن ضبطه من خلال التحميل الزائد الجديد لهذه الطرق.
    • نقل "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).
    • More clearly throw an exception if DefaultAudioSink is accessed from multiple threads. إذا حدث ذلك بسبب استدعاء 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 ميغابايت، وهو حجم كبير بما يكفي لصور Ultra HDR بدقة 50 ميغابكسل (#2417).
    • إضافة PreCacheHelper الذي يسمح للتطبيقات بالتخزين المؤقت المسبق لملف وسائط واحد مع تحديد موضع البدء والمدة
    • إضافة إمكانية التحميل المُسبق من موضع محدّد في DefaultPreloadManager.
  • Transformer:
    • إضافة CodecDbLite التي تتيح تحسينات خاصة بشريحة التعريف لإعدادات ترميز الفيديو
    • يُرجى إضافة علامة setEnableCodecDbLite إلى DefaultEncoderFactory لتفعيل تحسين إعدادات CodecDB Lite. يتم ضبط هذه العلامة تلقائيًا على false.
    • يتطلب ملء الفجوة الأولية (التي تمت إضافتها عبر 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)
    • تم إصلاح مشكلة تحليل وحدات H.265 SEI لتخطّي أنواع SEI غير المعروفة بالكامل (#2456).
    • يجب تعديل WavExtractor لاستخدام بيانات SubFormat الخاصة بإضافة العنوان لتنسيق الصوت عند تحليل ملف من النوع WAVE_FORMAT_EXTENSIBLE.
    • ‫MP4: تمت إضافة إمكانية استخدام مربّعات ipcm وfpcm التي تحدّد المقاطع الصوتية بتنسيق PCM الأولي (لا يمكن استخدام تنسيق PCM بنقطة عائمة 64 بت).
    • ‫MP4: معالجة جزء التدوير في مصفوفات التحويل tkhd التي تدوّر الفيديو وتعكسه. يضمن ذلك عرض الفيديوهات المنعكسة التي تم التقاطها بالكاميرا الأمامية لجهاز iPhone بشكل صحيح، ولكن بشكل غير صحيح في المحور ص (#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-order للإشارات عند عرض أكثر من إشارة على الشاشة في الوقت نفسه (#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).
  • إدارة الحقوق الرقمية:
    • إضافة تحميل زائد جديد من OfflineLicenseHelper.newWidevineInstance يقبل MediaItem.DrmConfiguration بحيث يمكن تطبيق عناوين طلبات HTTP بشكل صحيح (#2169).
  • التأثير:
    • أضِف Presentation.createForShortSide(int) لإنشاء Presentation يضمن تطابق الجانب الأقصر دائمًا مع القيمة المحدّدة، بغض النظر عن اتجاه الإدخال.
  • أدوات دمج الوسائط:
    • تم إصلاح خلل في عدم ضبط علامات العيّنات الصحيحة لعيّنات الصوت في ملفات MP4 المجزّأة.
    • تستخدم واجهة برمجة التطبيقات writeSampleData() الآن فئة BufferInfo الخاصة بالمُضاعِف بدلاً من MediaCodec.BufferInfo.
    • أضِف Muxer.Factory#supportsWritingNegativeTimestampsInEditList الذي يتم ضبطه تلقائيًا على "خطأ".
  • إضافة IMA:
    • تم إصلاح خطأ حيث قد يؤدي خطأ في تحميل إعلان واحد إلى إبطال مجموعة إعلانية أخرى عن طريق الخطأ.
    • تم إصلاح خلل كان يؤدي إلى توقّف تشغيل المجموعات الإعلانية بعد انتهاء نافذة الفيديو عند الطلب. لم يعُد يتم إدراج المجموعات الإعلانية التي يبدأ وقتها بعد انتهاء الفترة الزمنية في قائمة الانتظار في MediaPeriodQueue (#2215).
  • الجلسة:
    • تم إصلاح الخطأ الذي يؤدي إلى تجاهل الاتصالات من وحدات التحكّم Media3 التابعة لجهات خارجية وغير المميّزة.
    • إزالة التحقّق من الأوامر المتاحة عند إرسال أوامر مخصّصة إلى جهاز MediaBrowserServiceCompat قديم يتوافق هذا مع سلوك وحدات التحكّم أو المتصفّحات القديمة عند الاتصال بتطبيق قديم.
    • تم إصلاح خلل يؤدي إلى التعامل مع خطأ التشغيل الأول للمشغّل بشكل غير صحيح على أنّه استثناء مخصّص مستمر. يمنع هذا التطبيق من الاسترداد.
    • تم إصلاح الخطأ الذي قد يؤدي فيه عدم معالجة الجلسة لبعض التغييرات في وحدة التحكّم إلى حدوث IllegalStateExceptions.
    • تم إصلاح الخطأ الذي قد يؤدي إلى ترك وحدة التحكّم في حالة غير صالحة بسبب إجراءات وحدة التحكّم التي لا تتم معالجتها من خلال الجلسة.
    • تم إصلاح تحذير انتهاك التشغيل غير الآمن في StrictMode (#2330).
    • تم إصلاح خلل كان يؤدي إلى حدوث خطأ IllegalStateException عند استدعاء setSessionExtras من سلسلة التعليمات الرئيسية أثناء تشغيل المشغّل من سلسلة تعليمات تطبيق مختلفة عن سلسلة التعليمات الرئيسية (‎#2265).
    • تم حلّ مشكلة عرض إشعار تلقائيًا إذا تم إعداد مشغّل بملفات وسائط بدون تحضيرها أو تشغيلها (‎#2423https://github.com/androidx/media/issues/2423). يمكن ضبط هذا السلوك من خلال MediaSessionService.setShowNotificationForIdlePlayer.
    • أضِف PlaybackException مخصّصة لجميع وحدات التحكّم أو لوحدات تحكّم محدّدة.
    • تم إصلاح الخطأ الذي يؤدي إلى حدوث IllegalArgumentException عند البحث في بث مباشر على MediaController.
    • بالنسبة إلى أحداث البث المباشر، تم إيقاف نشر موضع التشغيل وإمكانية البحث في العنصر الحالي لوحدات التحكّم في الوسائط على النظام الأساسي، وذلك لتجنُّب ظهور عناصر الموضع في واجهة مستخدم Android Auto (ووحدات التحكّم الأخرى التي تستخدم هذه المعلومات من جلسة الوسائط على النظام الأساسي) (#1758).
    • تم إصلاح خطأ حيث يؤدي تمرير قيمة فارغة إلى getLibraryRoot من MediaBrowser متصل بـ MediaBrowserServiceCompat قديم إلى ظهور NullPointerException.
    • تم إصلاح خطأ كان يؤدي إلى تعطُّل تطبيق الجلسة القديم مع ظهور رسالة ClassNotFoundException عند إرسال إجراءات مخصّصة أو نتيجة بحث أو طلب getItem.
    • تم إصلاح خطأ تسبّب في مشاركة MediaItem.LocalConfiguration.uri مع MediaMetadata في جلسات المنصة. لمشاركة معرّف موارد منتظم (URI) عن قصد للسماح لوحدات التحكّم بإعادة طلب الوسائط، اضبط MediaItem.RequestMetadata.mediaUri بدلاً من ذلك.
  • واجهة المستخدم:
    • تم إصلاح خطأ يتعلّق بعدم عمل PlayerSurface بشكل صحيح داخل المكوّنات القابلة لإعادة الاستخدام، مثل LazyColumn (#2493).
    • تم إصلاح خلل في Compose كان يؤدي إلى حدوث فجوة بين ضبط حالات الأزرار الأولية وملاحظة التغيير في الحالة (مثل أشكال الرموز أو تفعيلها). يتم الآن رصد أي تغييرات يتم إجراؤها على المشغّل خارج فترة المراقبة (#2313).
    • أضِف عناصر الاحتفاظ بالحالة والدوال المركّبة إلى وحدة media3-ui-compose لكل من SeekBackButtonState وSeekForwardButtonState.
    • إضافة ميزة التقديم السريع في ExoPlayer إلى PlayerControlView عند تفعيل هذه الميزة، يتم ضبط المشغّل على وضع التقديم أو الترجيع عندما يبدأ المستخدم بسحب شريط التقديم أو الترجيع، ويتم إرسال طلب player.seekTo لكل حركة، ثم يتم الخروج من وضع التقديم أو الترجيع عند رفع الإصبع عن الشاشة. يمكن تفعيل هذا الدمج باستخدام time_bar_scrubbing_enabled = true في XML أو طريقة setTimeBarScrubbingEnabled(boolean) من Java/Kotlin.
    • يجب أن تقبل الدالة PlayerSurface وسيطة Player يمكن أن تكون فارغة.
  • عمليات التنزيل:
    • إضافة ميزة التنزيل الجزئي لعمليات البث التدريجي يمكن للتطبيقات إعداد بث تدريجي باستخدام DownloadHelper، وطلب DownloadRequest من المساعد مع تحديد مواضع البداية والنهاية للوسائط المستندة إلى الوقت التي يجب أن يشملها التنزيل. يحمل DownloadRequest الذي تم إرجاعه نطاق البايت الذي تم حلّه، والذي يمكن من خلاله إنشاء ProgressiveDownloader وتنزيل المحتوى وفقًا لذلك.
    • أضِف DownloadHelper.Factory التي يتم استبدال إجراءات DownloadHelper.forMediaItem() الثابتة بها.
    • إضافة Factory لعمليات تنفيذ SegmentDownloader
    • إتاحة التنزيل الجزئي لعمليات البث التكيُّفي يمكن للتطبيقات إعداد بث تكيُّفي باستخدام DownloadHelper، وطلب DownloadRequest من المساعد مع تحديد مواضع بدء الوسائط وانتهائها المستندة إلى الوقت والتي يجب أن يشملها التنزيل. يحمل DownloadRequest الذي تم إرجاعه النطاق الزمني الذي تم حله، والذي يمكن من خلاله إنشاء SegmentDownloader ملموس وتنزيل المحتوى وفقًا لذلك.
  • إضافة 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 لاستخدام معرّف الموارد المنتظم (URI) للموقع الجغرافي كما هو مقدَّم عند معالجة استجابة HTTP 302 (#2398).
    • إضافة إمكانية تحليل SessionDescriptions التي تحتوي على أسطر تتضمّن أحرف مسافات بيضاء لاحقة (#2357)
  • إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وغيرها):
    • تم إصلاح الخطأ الذي يتسبب في عدم تأثير DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange في إضافات برامج فك ترميز الصوت (#2258).
  • إضافة Cast:
    • إضافة إمكانية استخدام 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 يوليو 2025

استخدِم الإصدار الثابت 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).
    • تم إصلاح مشكلة ظهور خطأ IllegalStateException في ProgressiveMediaPeriod عند محاولة PreloadMediaSource استدعاء getBufferedDurationUs() قبل إعداده (#2315).
    • تم إصلاح مشكلة إرسال CmcdData في طلبات البيان لـ DASH وHLS وSmoothStreaming (#2253).
    • تأكَّد من إمكانية استخدام AdPlaybackState.withAdDurationsUs(long[][]) بعد إزالة المجموعات الإعلانية. لا يزال على المستخدم إدخال مصفوفة من المُدد للمجموعات الإعلانية التي تمت إزالتها، والتي يمكن أن تكون فارغة أو فارغة القيمة (#2267).
  • أدوات الاستخراج:
    • ‫MP4: تحليل alternate_group من المربّع tkhd وعرضه كإدخال Mp4AlternateGroupData في Format.metadata لكل مقطع صوتي (#2242).
  • الصوت:
    • تم إصلاح مشكلة في التفريغ حيث قد يتوقف الموضع عند تشغيل قائمة تشغيل لمحتوى قصير (#1920).
  • الجلسة:
    • تقليل مهلة التجميع لعمليات معاودة الاتصال في النظام الأساسي MediaSession من 500 إلى 100 مللي ثانية وإضافة دالة setter تجريبية للسماح للتطبيقات بضبط هذه القيمة
    • تم إصلاح مشكلة ظهور الإشعارات مرة أخرى بعد أن أغلقها المستخدم (#2302).
    • تم إصلاح خلل حيث عرضت الجلسة مخططًا زمنيًا لعنصر واحد عندما يكون المشغّل المغلّف فارغًا في الواقع. حدث ذلك عندما لا يتوفّر COMMAND_GET_TIMELINE في المشغّل المغلَّف، بينما يتوفّر COMMAND_GET_CURRENT_MEDIA_ITEM ويكون المشغّل المغلَّف فارغًا (#2320).
    • تم إصلاح خطأ يتجاهل تلقائيًا استدعاء MediaSessionService.setMediaNotificationProvider بعد تفاعلات أخرى مع الخدمة مثل setForegroundServiceTimeoutMs (#2305).
  • واجهة المستخدم:
    • فعِّل PlayerSurface للعمل مع ExoPlayer.setVideoEffects وCompositionPlayer.
    • إصلاح الخطأ الذي يمنع إعادة إنشاء "PlayerSurface" باستخدام "Player" جديد
  • إضافة HLS:
    • تم إصلاح مشكلة عدم ضبط مدة المقطع في CmcdData لوسائط HLS، ما يؤدي إلى تعذُّر التأكيد عند معالجة أجزاء الوسائط المشفّرة (#2312).
  • إضافة RTSP:
    • تمت إضافة إمكانية استخدام معرّف الموارد المنتظم (URI) مع نظام RTSPT كطريقة لضبط جلسة RTSP لاستخدام بروتوكول TCP (#1484).
  • إضافة Cast:
    • تمت إضافة إمكانية استخدام البيانات الوصفية لقوائم التشغيل (#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).
  • Transformer:
    • إضافة إمكانية تحويل تنسيق الفيديو إلى تنسيقات بديلة متوافقة مع الأنظمة القديمة
    • إضافة إمكانية تحويل الترميز وإعادة تجميع تنسيق Dolby Vision (الملف الشخصي 8)
    • يجب تعديل مَعلمات VideoFrameProcessor.registerInputStream وVideoFrameProcessor.Listener.onInputStreamRegistered لاستخدام Format.
    • إنشاء بيانات وصفية ثابتة بتقنية النطاق العالي الديناميكية (HDR) عند استخدام DefaultEncoderFactory
    • تفعيل إتاحة بيانات تشخيص نظام Android الأساسي باستخدام MediaMetricsManager. تعيد واجهة Transformer توجيه أحداث التعديل وبيانات الأداء إلى المنصة، ما يساعد في توفير معلومات حول أداء النظام ومعلومات تصحيح الأخطاء على الجهاز. وقد تجمع Google هذه البيانات أيضًا إذا كان خيار مشاركة بيانات الاستخدام وبيانات التشخيص مفعَّلاً من قِبل مستخدم الجهاز. يمكن للتطبيقات إيقاف المساهمة في بيانات تشخيص المنصة لـ Transformer باستخدام Transformer.Builder.setUsePlatformDiagnostics(false).
    • تقسيم InAppMuxer إلى InAppMp4Muxer وInAppFragmentedMp4Muxer يمكنك استخدام InAppMp4Muxer لإنشاء ملف MP4 غير مجزّأ، بينما يُستخدم InAppFragmentedMp4Muxer لإنشاء ملف MP4 مجزّأ.
    • نقل واجهة Muxer من media3-muxer إلى media3-transformer
    • أضِف MediaProjectionAssetLoader، الذي يوفّر وسائط من MediaProjection لتسجيل الشاشة، وأضِف ميزة تسجيل الشاشة إلى تطبيق Transformer التجريبي.
    • إضافة #getInputFormat() إلى واجهة Codec
    • نقل مسؤولية تحرير GlObjectsProvider إلى المتصل في DefaultVideoFrameProcessor وDefaultVideoCompositor عندما يكون ذلك ممكنًا.
  • أدوات الاستخراج:
    • ‫AVI: تم إصلاح طريقة معالجة الملفات التي تتضمّن صوتًا مضغوطًا بمعدل نقل بيانات ثابت، حيث يخزّن عنوان البث عدد وحدات البايت بدلاً من عدد الأجزاء.
    • تم إصلاح طريقة معالجة وحدات NAL التي يتم التعبير عن أطوالها بوحدات بايت واحدة أو اثنتين (بدلاً من 4).
    • تم إصلاح ArrayIndexOutOfBoundsException في قوائم تعديل MP4 عندما تبدأ قائمة التعديل بإطار غير متزامن بدون إطار متزامن سابق (#2062).
    • تم إصلاح مشكلة توقُّف بثّ TS على بعض الأجهزة (#2069).
    • ‫FLAC: تمت إضافة إمكانية تشغيل ملفات FLAC بمعدّل 32 بت. في السابق، كان يتعذّر تشغيل هذه الفيديوهات باستخدام IllegalStateException: Playback stuck buffering and not loading (#2197).
  • الصوت:
    • تم إصلاح onAudioPositionAdvancing ليتم استدعاؤها عند استئناف التشغيل (في السابق، كان يتم استدعاؤها عند إيقاف التشغيل مؤقتًا).
    • لا تتجاوز SonicAudioProcessor عندما يتم ضبط SpeedChangingAudioProcessor باستخدام المَعلمات التلقائية.
    • تم إصلاح مشكلة التدفق السفلي في Sonic#getOutputSize() التي قد تؤدي إلى توقّف DefaultAudioSink.
    • يجب إصلاح MediaCodecAudioRenderer.getDurationToProgressUs() وDecoderAudioRenderer.getDurationToProgressUs() لكي تتم إعادة ضبط المدد المحدّدة بشكل صحيح عند تقديم الفيديو أو ترجيعه.
    • اجعل androidx.media3.common.audio.SonicAudioProcessor نهائيًا.
    • إضافة إمكانية استخدام تنسيق PCM العائم في ChannelMappingAudioProcessor وTrimmingAudioProcessor
  • الفيديو:
    • تغيير MediaCodecVideoRenderer.shouldUsePlaceholderSurface إلى محمي حتى تتمكن التطبيقات من تجاوز حظر استخدام أسطح العناصر النائبة (#1905).
    • إضافة تحليل تجريبي لاعتمادية عيّنات AV1 في ExoPlayer لتسريع عملية البحث يمكنك تفعيلها باستخدام واجهة برمجة التطبيقات الجديدة DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies.
    • إضافة واجهة برمجة تطبيقات تجريبية ExoPlayer لإسقاط مخازن الإدخال المتأخرة لبرنامج فك الترميز MediaCodecVideoRenderer التي لا يتم الاعتماد عليها. يمكنك تفعيلها باستخدام DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs. * تم إصلاح مشكلة كانت تؤدي إلى أن يصبح المشغّل الذي لا يتضمّن سطحًا جاهزًا على الفور ويفك ترميز أي إطارات في انتظار المراجعة ببطء شديد (#1973).
    • استبعاد أجهزة Xiaomi وOPPO من وضع السطح المنفصل لتجنُّب وميض الشاشة (‎#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).
  • إدارة الحقوق الرقمية:
    • تم إصلاح الخطأ MediaCodec$CryptoException: Operation not supported in this configuration عند تشغيل محتوى ClearKey على الأجهزة التي تستخدم واجهة برمجة تطبيقات أقل من 27 (#1732).
  • التأثير:
    • تم نقل وظائف OverlaySettings إلى StaticOverlaySettings. يمكن إنشاء فئة فرعية من OverlaySettings للسماح بإعدادات تراكب ديناميكية.
  • أدوات دمج الوسائط:
    • تم نقل 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() بدلاً من ذلك.
    • يجب إبقاء الإشعار مرئيًا عندما يتوقف التشغيل أو يتعذّر إكماله بسبب خطأ. لا تتم إزالة الإشعار إلا إذا تم محو قائمة التشغيل أو إغلاق المشغّل.
    • تحسين معالجة إجراءات ACTION_PLAY وACTION_PAUSE في MediaSession على نظام Android الأساسي لضبط أحدهما فقط وفقًا للأوامر المتاحة وقبول ضبط أحدهما فقط
    • إضافة Context كمَعلمة إلى MediaButtonReceiver.shouldStartForegroundService (#1887).
    • تم إصلاح الخلل الذي كان يؤدي إلى تجاهل التغييرات من تعديل في انتظار المراجعة عند استدعاء طريقة Player على MediaController متصل بجلسة قديمة.
    • السماح لـ "MediaSession.setSessionActivity(PendingIntent)" بقبول القيمة null (#2109)
    • تم إصلاح الخطأ الذي يتسبب في بقاء إشعار قديم مرئيًا عند محو قائمة التشغيل (#2211).
  • واجهة المستخدم:
    • أضِف عناصر الاحتفاظ بالحالة والدوال المركّبة إلى وحدة media3-ui-compose لكل من PlayerSurface وPresentationState وPlayPauseButtonState وNextButtonState وPreviousButtonState وRepeatButtonState وShuffleButtonState وPlaybackSpeedState.
  • عمليات التنزيل:
    • تم إصلاح خطأ في CacheWriter يترك مصادر البيانات مفتوحة ومناطق ذاكرة التخزين المؤقت مقفلة في حال عرض مصدر البيانات Exception غير IOException (#9760).
  • إضافة HLS:
    • أضِف الإصدار الأول من HlsInterstitialsAdsLoader. يقرأ برنامج تحميل الإعلانات "الإعلانات البينية" في قائمة تشغيل وسائط HLS ويربطها بـ AdPlaybackState الذي يتم تمريره إلى AdsMediaSource. يتيح هذا الإصدار الأولي فقط بث الفيديو عند الطلب (VOD) بتنسيق HLS مع سمات X-ASSET-URI.
    • أضِف HlsInterstitialsAdsLoader.AdsMediaSourceFactory. يمكن للتطبيقات استخدامها لإنشاء مثيلات AdsMediaSource تستخدم HlsInterstitialsAdsLoader بطريقة مريحة وآمنة.
    • تحليل علامة SUPPLEMENTAL-CODECS من قائمة تشغيل HLS لرصد تنسيقات Dolby Vision (#1785)
    • تم تخفيف شرط البحث عن مواضع المزامنة في بث HLS (#2209).
  • إضافة DASH:
    • إضافة إمكانية تشغيل تنسيق AC-4 Level-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.
  • إضافة Cast:
    • تمت ترقية تبعية play-services-cast-framework إلى الإصدار 21.5.0 لإصلاح عطل في FLAG_MUTABLE في التطبيقات التي تستهدف المستوى 34 من واجهة برمجة التطبيقات أو الإصدارات الأحدث على الأجهزة التي تم تثبيت "خدمات Google Play" عليها ولكن تم إيقافها (‎#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 تم إنشاؤها على أساس مكتبة Common.
    • أضِف دالة الإضافة المعلّقة Player.listen لتشغيل دالة coroutine للاستماع إلى Player.Events في مكتبة media3-common-ktx.
    • إزالة تعليقات @DoNotInline التوضيحية من الفئات الداخلية غير المضمّنة يدويًا والمصمّمة لتجنُّب أخطاء التحقّق من الفئات أثناء التشغيل تتجنّب الإصدارات الحديثة من R8 الآن تلقائيًا المكالمات غير المباشرة مثل هذه لتجنّب أخطاء وقت التشغيل (وبالتالي لم تعُد هناك حاجة إلى إجراء المكالمات غير المباشرة يدويًا). يجب أن يكون جميع مستخدمي Gradle للمكتبة يستخدمون حاليًا إصدارًا من &quot;المكوّن الإضافي لنظام Gradle المتوافق مع Android&quot; يستخدم إصدارًا من R8 ينفّذ ذلك، بسبب compileSdk = 35. على مستخدمي المكتبة الذين يستخدمون أنظمة إنشاء غير Gradle التأكّد من أنّ خطوة التصغير/التعتيم المكافئة لـ R8 تنفّذ عملية تلقائية مماثلة لـ out-of-lining لتجنُّب حدوث أخطاء في التحقّق من الفئات أثناء التشغيل. وقد تم تطبيق هذا التغيير بالفعل في مكتبات AndroidX الأخرى.
  • ‫ExoPlayer:
    • يمكن الآن استدعاء MediaCodecRenderer.onProcessedStreamChange() لكل ملف وسائط. في السابق، لم يتم استدعاؤها للمرة الأولى. استخدِم MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart() لتفعيل هذه الميزة.
    • أضِف PreloadMediaSource.PreloadControl.onPreloadError للسماح بتنفيذ PreloadMediaSource.PreloadControl لاتخاذ إجراءات عند حدوث خطأ.
    • أضِف BasePreloadManager.Listener لنشر أحداث التحميل المُسبق في التطبيقات.
    • السماح بتغيير مهلة عميل SNTP وإعادة محاولة العناوين البديلة عند انتهاء المهلة (#1540)
    • يجب إزالة MediaCodecAdapter.Configuration.flags لأنّ قيمة الحقل كانت دائمًا صفرًا.
    • السماح للمستخدم باختيار مكبّر الصوت المدمج لتشغيل الوسائط على Wear OS API 35 والإصدارات الأحدث (إذا كان الجهاز يتيح ذلك).
    • تأجيل طلب الحظر إلى Context.getSystemService(Context.AUDIO_SERVICE) حتى يتم تفعيل معالجة التركيز على الصوت يضمن ذلك عدم إجراء المكالمة المحظورة في حال عدم تفعيل معالجة التركيز على الصوت (#1616).
    • السماح بالتشغيل بغض النظر عن مدة التخزين المؤقت في حال تعذّر التحميل (#1571)
    • أضِف AnalyticsListener.onRendererReadyChanged() للإشارة إلى الوقت الذي تسمح فيه أدوات العرض الفردية بأن يكون التشغيل جاهزًا.
    • تم إصلاح مشكلة الإبلاغ عن MediaCodec.CryptoException أحيانًا على أنّه "خطأ غير متوقّع أثناء التشغيل" عند تشغيل MediaCodec في الوضع غير المتزامن (الإعداد التلقائي في واجهة برمجة التطبيقات 31 والإصدارات الأحدث).
    • يمكنك تمرير bufferedDurationUs بدلاً من bufferedPositionUs باستخدام PreloadMediaSource.PreloadControl.onContinueLoadingRequested(). يؤدي ذلك أيضًا إلى تغيير DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS إلى DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS، وتحتاج التطبيقات بعد ذلك إلى تمرير قيمة تمثّل مدة معيّنة من موضع البدء التلقائي الذي يجب تحميل مصدر الوسائط المقابل له مسبقًا باستخدام 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).
  • Transformer:
    • إضافة SurfaceAssetLoader، الذي يتيح وضع بيانات الفيديو في قائمة انتظار لإرسالها إلى Transformer من خلال Surface
    • يُبلغ ImageAssetLoader عن إدخال غير متوافق من خلال AssetLoader.onError بدلاً من عرض IllegalStateException.
    • يجب ضبط مدة عرض الصورة باستخدام MediaItem.Builder.setImageDurationMs لتصدير الصورة.
    • إضافة إمكانية تصدير الفواصل في تسلسلات EditedMediaItems الصوتية
  • اختيار المقطع الصوتي:
    • DefaultTrackSelector: يفضّل الصوت المستند إلى العناصر على الصوت المستند إلى القنوات عندما تكون العوامل الأخرى متساوية.
  • أدوات الاستخراج:
    • السماح لـ Mp4Extractor وFragmentedMp4Extractor بتحديد عيّنات H264 التي لا تُستخدم كمرجع في العيّنات اللاحقة
    • إضافة خيار لتفعيل البحث المستند إلى الفهرس في AmrExtractor
    • اعتبار ملفات MP3 التي تحتوي على أكثر من 128 كيلوبايت بين الإطارات الصالحة على أنها مقتطعة (بدلاً من غير صالحة). هذا يعني أنّ الملفات التي تحتوي على بيانات غير MP3 في النهاية، بدون أي بيانات وصفية أخرى تشير إلى طول وحدات بايت MP3، ستتوقف الآن عن التشغيل في نهاية بيانات MP3 بدلاً من تعذّر تشغيلها مع ظهور ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
    • تم إصلاح طريقة معالجة عيّنات الإعلانات ما قبل التشغيل لمواضع بدء الوسائط التي لا تتضمّن إطارات رئيسية عند معالجة قوائم التعديل في ملفات MP4 (#1659).
    • تم تحسين عملية احتساب عدد اللقطات في الثانية من خلال استخدام مدة الوسائط من المربّع mdhd في Mp4Extractor وFragmentedMp4Extractor (#1531).
    • تم إصلاح مشكلة تغيير حجم media_time بشكل غير صحيح في قوائم تعديل MP4. في حين أنّه تمّ ضبط حجم segment_duration بشكل صحيح باستخدام المقياس الزمني للفيلم، تمّ الآن ضبط حجم media_time بشكل صحيح باستخدام المقياس الزمني للمقطع الصوتي، كما هو محدّد في معيار تنسيق MP4 (#1792).
    • تمت معالجة الإطارات غير المرتبة في حساب endIndices لملفات MP4 التي تحتوي على قائمة تعديل (#1797).
    • تم إصلاح مشكلة تحليل مدة الوسائط في المربّع mdhd لملفات MP4 من أجل معالجة قيم -1 (#1819).
    • إضافة إمكانية تحديد المربّع h263 في ملفات MP4 لفيديو H.263 (#1821).
    • إضافة إمكانية تشغيل تنسيق ملف الوسائط الأساسي ISO من المستوى 4 لبرنامج الترميز AC-4 (#1265)
  • DataSource:
    • تحديث HttpEngineDataSource للسماح بالاستخدام بدءًا من الإصدار S extension 7 بدلاً من المستوى 34 لواجهة برمجة التطبيقات (#1262).
    • DataSourceContractTest: التأكّد من أنّ DataSource.getUri() يعرض عنوان URI الذي تم حلّه (كما هو موضّح). في حال اختلاف عنوان URI هذا عن عنوان URI المطلوب، يمكن أن تشير الاختبارات إلى ذلك باستخدام طريقة DataSourceContractTest.TestResource.Builder.setResolvedUri() الجديدة.
    • ‫DataSourceContractTest: التأكّد من أنّ DataSource.getUri() وgetResponseHeaders() يعرضان القيمة "مفتوح" بعد تعذُّر طلب open() (بسبب عدم العثور على المورد) وقبل طلب close() اللاحق
      • Overriding DataSourceContractTest.getNotFoundResources() allows test sub-classes to provide multiple 'not found' resources, and to provide any expected headers too. يتيح ذلك التمييز بين الخطأ 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 عملية تصغير بسيطة تؤدي إلى اقتصاص حدّ بمقدار تكسل واحد حول حافة المخزن المؤقت الذي تم اقتصاصه. يتم التعامل مع هذا الآن بحيث يكون الناتج أقرب إلى المتوقع.
    • تسريع DefaultVideoFrameProcessor.queueInputBitmap() نتيجةً لذلك، يتم تصدير الصور إلى فيديوهات باستخدام Transformer بشكل أسرع.
  • إضافة IMA:
    • تم إصلاح خلل قد يؤدي إلى حدوث خطأ 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 مرتين عند الاشتراك في عنصر رئيسي
  • واجهة المستخدم:
    • يمكنك تفعيل الحلّ البديل للفيديو الممدّد/المقتصّ في 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)
  • إضافة Cast:
    • يتم إيقاف تنظيف المخطط الزمني بعد قطع اتصال CastSession، ما يتيح لتطبيق المُرسِل استئناف التشغيل على الجهاز بعد قطع الاتصال.
    • تعبئة DeviceInfo في CastPlayer عند توفير Context يتيح ذلك ربط MediaSession بـ RoutingSession، وهو أمر ضروري لدمج &quot;أداة التبديل بين أجهزة التشغيل&quot; (‎#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).
  • إدارة الحقوق الرقمية:
    • إصلاح الخطأ android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE على الأجهزة التي تعمل بواجهة برمجة التطبيقات 31 والإصدارات الأحدث عند تشغيل محتوى L1 Widevine يحدث هذا الخطأ بسبب عدم اكتمال تنفيذ طريقة إطار العمل MediaDrm.requiresSecureDecoder (#1603).
  • التأثير:
    • أضِف طريقة release() إلى GlObjectsProvider.
  • الجلسة:
    • تحويل النقر مرّتين على KEYCODE_HEADSETHOOK إلى إجراء "تقديم إلى التالي"، كما هو موضّح (#1493).
    • التعامل مع KEYCODE_HEADSETHOOK كأمر "تشغيل" في MediaButtonReceiver عند تحديد ما إذا كان سيتم تجاهله لتجنُّب ForegroundServiceDidNotStartInTimeException (#1581).
  • إضافة RTSP:
    • تخطّي أوصاف الوسائط غير الصالحة في تحليل SDP (#1087).

الإصدار 1.4.0

‫25 يوليو 2024

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

  • المكتبة المشتركة:
    • إعادة توجيه طلبات البحث المفترَض أنّها لا تؤدي إلى أي إجراء إلى الطريقتَين المحميتَين BasePlayer.seekTo() وSimpleBasePlayer.handleSeek() بدلاً من تجاهلها إذا كنت تستخدم هذه الطرق في مشغّل مخصّص، قد تحتاج إلى معالجة هذه الطلبات الإضافية باستخدام mediaItemIndex == C.INDEX_UNSET.
    • تمت إزالة تبعية التجميع في ميزة "إزالة التجميل اللغوي" المحسّنة في Java 8 (#1312).
    • يُرجى التأكّد من تجاهل المدة التي تم تمريرها إلى MediaItem.Builder.setImageDurationMs() لـ MediaItem غير صورة (كما هو موثّق).
    • أضِف Format.customData لتخزين المعلومات المخصّصة التي يوفّرها التطبيق حول مثيلات Format.
  • ‫ExoPlayer:
    • أضِف BasePreloadManager الذي ينسّق التحميل المُسبق لمصادر متعددة استنادًا إلى الأولويات التي يحدّدها rankingData. يمكنك تخصيص هذه الفئة من خلال توسيعها. أضِف DefaultPreloadManager التي تستخدم PreloadMediaSource لتحميل عيّنات الوسائط من المصادر مسبقًا في الذاكرة، وتستخدم عددًا صحيحًا rankingData يشير إلى فهرس عنصر في واجهة المستخدم.
    • يمكنك إضافة PlayerId إلى معظم طرق LoadControl لتفعيل عمليات تنفيذ LoadControl من أجل إتاحة اللعب المتعدد.
    • إزالة Buffer.isDecodeOnly() وC.BUFFER_FLAG_DECODE_ONLY ليست هناك حاجة إلى ضبط هذه العلامة لأنّ أدوات العرض وأدوات فك الترميز ستقرّر تخطّي المخازن المؤقتة استنادًا إلى الطابع الزمني. يجب أن تتحقّق عمليات تنفيذ Renderer المخصّصة مما إذا كانت المدة الفاصلة لا تقل عن BaseRenderer.getLastResetPositionUs() لتحديد ما إذا كان يجب عرض عيّنة. يمكن لعمليات تنفيذ 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 will signal ExoPlayer when receiving these callbacks and if ExoPlayer is set with experimentalSetDynamicSchedulingEnabled(), then ExoPlayer will schedule its work loop as renderers can make progress.
    • استخدِم فئة البيانات لطُرق LoadControl بدلاً من المَعلمات الفردية.
    • أضِف ExoPlayer.isReleased() للتحقّق مما إذا تم استدعاء Exoplayer.release().
    • أضِف ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() لضبط الحد الأقصى للموضع الذي يبحث فيه seekToPrevious() عن العنصر السابق (#1425).
    • تم إصلاح بعض حالات عدم الاتساق في التركيز على الصوت، مثل عدم الإبلاغ عن فقدان التركيز الكامل أو المؤقت أثناء إيقاف المشغّل مؤقتًا (#1436).
    • تم إصلاح مشكلة IndexOutOfBoundsException المحتملة الناتجة عن إبلاغ أدوات الاستخراج عن مقاطع إضافية بعد خطوة الإعداد الأولية (#1476).
    • Effects في ExoPlayer.setVideoEffect() سيتلقّى الطوابع الزمنية مع إزالة إزاحة المعالج (#1098).
    • تم إصلاح IllegalArgumentException محتمل عند معالجة خطأ في المشغّل حدث أثناء القراءة مسبقًا في عنصر آخر في قائمة التشغيل (#1483).
  • Transformer:
    • أضِف audioConversionProcess وvideoConversionProcess إلى ExportResult للإشارة إلى كيفية إنشاء المقطع الصوتي المعني في ملف الإخراج.
    • تخفيف عمليات التحقّق من مستوى H.264 لتحسين الاقتصاص
    • تمت إضافة إمكانية التبديل بين وسائط الإدخال بنطاق عادي (SDR) ونطاق عالي (HDR) في تسلسل.
    • إضافة إمكانية استخدام المؤثرات الصوتية على مستوى التركيبة
    • إضافة إمكانية تحويل صور Ultra HDR إلى فيديوهات HDR
    • تم إصلاح مشكلة عدم إخراج DefaultAudioMixer للعدد الصحيح من وحدات البايت بعد إعادة ضبطه وإعادة استخدامه.
    • تم حلّ مشكلة في برنامج فك الترميز حيث كان عدد القنوات الصوتية يقتصر على الاستيريو عند معالجة إدخال PCM.
    • عند اختيار المقاطع الصوتية في ExoPlayerAssetLoader، يتم تجاهل القيود المفروضة على عدد القنوات الصوتية لأنّها تنطبق فقط على التشغيل.
    • استبدِل واجهة androidx.media3.transformer.Muxer بـ androidx.media3.muxer.Muxer وأزِل androidx.media3.transformer.Muxer.
    • تم إصلاح مشكلة تحميل صور HEIC من مخطّطات معرّفات الموارد المنتظمة (URI) للمحتوى. (#1373).
    • اضبط مدة المقطع الصوتي في "AudioGraphInput" لتحسين مزامنة الصوت والصورة.
    • إزالة حقل ExportResult.processedInputs إذا كنت تستخدم هذا الحقل لتفاصيل برامج الترميز، استخدِم DefaultDecoderFactory.listener بدلاً منه. في حال حدوث استثناء في برنامج الترميز، ستتوفّر تفاصيل برنامج الترميز في ExportException.codecInfo.
  • أدوات الاستخراج:
    • ‫MPEG-TS: إعادة تطبيق التغيير الذي يضمن عرض آخر إطار من خلال تمرير آخر وحدة وصول في البث إلى قائمة انتظار العيّنات (#7909) تم دمج إصلاحات لحلّ المشاكل التي ظهرت في مصادر بيانات HLS التي تتضمّن إطارات I فقط(#1150) ومصادر بيانات HLS التي تتضمّن H.262 (#1126).
    • ‫MP3: تفضيل حجم البيانات من إطار Info على الحجم الذي يتم الإبلاغ عنه من خلال البث الأساسي (مثل حجم الملف أو عنوان HTTP Content-Length). يساعد ذلك في استبعاد بيانات المقطع الدعائي غير القابلة للتشغيل (مثل صورة الألبوم) من عمليات احتساب البحث عن معدل نقل البيانات الثابت، ما يجعل عمليات البحث أكثر دقة (#1376).
    • ‫MP3: استخدام عدد اللقطات والبيانات الأخرى في لقطة Info (إذا كانت متوفّرة) لاحتساب متوسط معدل نقل البيانات للبحث عن معدل نقل البيانات الثابت، بدلاً من الاستقراء من معدل نقل البيانات للقطة بعد لقطة Info، والذي قد يكون صغيرًا بشكل مصطنع، مثل لقطة PCUT (#1376)
    • تم إصلاح مشكلة استخراج تنسيق الصوت PCM في حاويات AVI.
  • الصوت:
    • تم إصلاح سمات ترميز DTS:X Profile 2 لتشغيل الصوت المحيطي (#1299).
    • بالنسبة إلى التشغيل الذي تم إلغاء تحميله، يجب إعادة ضبط حقل التتبُّع لاكتمال البث في DefaultAudioSink قبل استدعاء AudioTrack.stop() لكي يحدّد AudioTrack.StreamEventCallback#onPresentationEnded بشكل صحيح وقت تشغيل جميع البيانات في انتظار المراجعة.
    • تم إصلاح خطأ في SilenceSkippingAudioProcessor حيث يمكن أن تؤدي عمليات الانتقال بين تنسيقات الصوت المختلفة (على سبيل المثال، من استيريو إلى أحادي) إلى حدوث استثناء في المعالج (#1352).
    • يمكنك تنفيذ MediaCodecAudioRenderer.getDurationToProgressUs() لكي يجدول ExoPlayer حلقة العمل الرئيسية ديناميكيًا عندما يتمكّن MediaCodecAudioRenderer من إحراز تقدّم.
  • الفيديو:
    • تم إصلاح مشكلة وصول Listener.onRenderedFirstFrame() مبكرًا جدًا عند التبديل بين الأسطح في منتصف التشغيل.
    • تم إصلاح منطق الرجوع إلى أداة فك الترميز في Dolby Vision لاستخدام أداة فك ترميز AV1 متوافقة إذا لزم الأمر (#1389).
    • تم إصلاح استثناء برنامج الترميز الذي قد ينتج عن تفعيل عارض الفيديو في منتصف التشغيل.
  • النص:
    • تم إصلاح مشكلة تخطّي الترجمة التي تبدأ قبل موضع البحث. ظهرت هذه المشكلة في الإصدار 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) للموارد الأوّلية في android.resource://package/id حيث يختلف package عن حزمة التطبيق الحالي. لم يتم توثيق هذه الطريقة سابقًا، ولكنّها طريقة أكثر فعالية للوصول إلى الموارد في حزمة أخرى بدلاً من استخدام الاسم.
    • يجب التحقّق من أنّ قيمة url ليست فارغة في دوال الإنشاء DataSpec. تمت إضافة تعليق توضيحي لهذه المَعلمة من قبل لتكون غير فارغة.
    • السماح لـ ByteArrayDataSource بتحويل معرّف موارد منتظم (URI) إلى مصفوفة بايت أثناء open()، بدلاً من أن يكون غير قابل للتغيير في البرنامج عند الإنشاء (#1405).
  • إدارة الحقوق الرقمية:
    • السماح بضبط 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 من الألوان الخطية إلى فيديو BT 709 SDR الكهربائي. يجب أيضًا توفير خيار ثالث للاحتفاظ بمساحة الألوان الأصلية.
    • السماح بتحديد ترتيب z غير المحدّد لـ EditedMediaItemSequences (#1055).
    • الحفاظ على نطاق إضاءة متّسق في مختلف أجزاء محتوى HDR (يستخدم نطاق HLG)
    • إضافة إمكانية استخدام تراكبات Ultra HDR (صورة نقطية) على محتوى HDR
    • السماح باستخدام تأثيرات SeparableConvolution قبل الإصدار 26 من واجهة برمجة التطبيقات
    • يجب إزالة OverlaySettings.useHdr غير المستخدَم لأنّ النطاق الديناميكي للتراكب والإطار يجب أن يتطابقا.
    • أضِف ميزة النطاق العالي الديناميكية (HDR) إلى TextOverlay. يمكن تعديل سطوع النص المركّب باستخدام OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • إضافة IMA:
    • ترقية واجهة برمجة التطبيقات المطلوبة للتطبيقات لتشغيل مصادر إعلانات "إدراج الإعلانات ديناميكيًا" إلى الإصدار الثابت
    • أضِف replaceAdTagParameters(Map <String, String>) إلى ImaServerSideAdInsertionMediaSource.AdLoader الذي يسمح باستبدال مَعلمات علامة الإعلان في وقت التشغيل.
    • تم إصلاح الخطأ الذي كان يؤدي إلى عدم استدعاء VideoAdPlayer.VideoAdPlayerCallback.onError() عند حدوث خطأ في المشغّل أثناء تشغيل الإعلان (#1334).
    • تمت ترقية إصدار حزمة تطوير البرامج للإعلانات التفاعلية (IMA SDK) إلى 3.33.0 لإصلاح NullPointerException عند استخدام معرّفات الموارد المنتظمة (URI) لعلامات الإعلانات data:// (#700).
  • الجلسة:
    • Change default of CommandButton.enabled to true and ensure the value can stay false for controllers even if the associated command is available.
    • إضافة ثوابت الرموز لـ CommandButton التي يجب استخدامها بدلاً من موارد الرموز المخصّصة
    • يمكنك إضافة MediaSessionService.isPlaybackOngoing() للسماح للتطبيقات بالاستعلام عما إذا كانت الخدمة بحاجة إلى الإيقاف في onTaskRemoved() (#1219).
    • أضِف MediaSessionService.pauseAllPlayersAndStopSelf() الذي يسمح بسهولة بإيقاف تشغيل جميع الجلسات مؤقتًا واستدعاء stopSelf() لإنهاء مراحل نشاط MediaSessionService.
    • يمكنك إلغاء MediaSessionService.onTaskRemoved(Intent) لتوفير تنفيذ تلقائي آمن يحافظ على تشغيل الخدمة في المقدّمة إذا كانت عملية التشغيل مستمرة أو يوقف الخدمة في الحالات الأخرى.
    • إخفاء شريط التقدّم في إشعار الوسائط لأحداث البث المباشر من خلال عدم ضبط المدة في البيانات الوصفية لجلسة المنصة (#1256)
    • يجب محاذاة تحويل MediaMetadata إلى MediaDescriptionCompat لاستخدام الترتيب والمنطق المفضَّلَين نفسهما عند اختيار خصائص البيانات الوصفية كما في media1.
    • إضافة MediaSession.sendError() تتيح إرسال الأخطاء غير الخطيرة إلى وحدة التحكّم في Media3 عند استخدام وحدة التحكّم في الإشعارات (يُرجى الاطّلاع على MediaSession.getMediaNotificationControllerInfo())، يتم استخدام الخطأ المخصّص لتعديل PlaybackState جلسة المنصة إلى حالة خطأ مع معلومات الخطأ المحدّدة (#543).
    • يمكنك إضافة MediaSession.Callback.onPlayerInteractionFinished() لإعلام الجلسات عند انتهاء سلسلة من تفاعلات اللاعب من وحدة تحكّم محدّدة.
    • أضِف SessionError واستخدِمه في SessionResult وLibraryResult بدلاً من رمز الخطأ لتقديم مزيد من المعلومات عن الخطأ وكيفية حلّه إن أمكن.
    • نشر رمز تطبيق اختبار وحدة التحكّم في media3 الذي يمكن استخدامه لاختبار التفاعلات مع التطبيقات التي تنشر جلسة وسائط
    • نشر الإضافات التي تم تمريرها إلى MediaSession[Builder].setSessionExtras() في media3 إلى PlaybackStateCompat.getExtras() في وحدة التحكّم في media1
    • ربط الأخطاء الفادحة وغير الفادحة بجلسة المنصة والعكس يتم ربط PlaybackException بحالة خطأ فادح في PlaybackStateCompat. يتم ربط SessionError الذي تم إرساله إلى وحدة التحكّم في إشعارات الوسائط باستخدام MediaSession.sendError(ControllerInfo, SessionError) بخطأ غير فادح في PlaybackStateCompat، ما يعني أنّه تم ضبط رمز الخطأ ورسالته، ولكن تظل حالة جلسة المنصة مختلفة عن STATE_ERROR.
    • السماح بضبط نشاط الجلسة لكل وحدة تحكّم لتجاوز نشاط الجلسة العام يمكن تحديد نشاط الجلسة لوحدة التحكّم عند الاتصال من خلال إنشاء ConnectionResult باستخدام AcceptedResultBuilder.setSessionActivivty(PendingIntent). بعد الربط، يمكن تعديل نشاط الجلسة باستخدام MediaSession.setSessionActivity(ControllerInfo, PendingIntent).
    • تحسين تكرار الأخطاء في الطلبات إلى MediaLibrarySession.Callback يمكن الآن ضبط تكرار الأخطاء باستخدام MediaLibrarySession.Builder.setLibraryErrorReplicationMode() لاختيار نوع الخطأ أو إيقاف تكرار الأخطاء المفعَّل تلقائيًا.
  • واجهة المستخدم:
    • إضافة ميزة عرض الصور إلى PlayerView عند الاتصال بـ ExoPlayer (#1144).
    • تمت إضافة إمكانية تخصيص رموز مختلفة في PlayerControlView من خلال سمات xml للسماح باستخدام عناصر قابلة للرسم مختلفة لكل مثيل PlayerView، بدلاً من عمليات الإلغاء العامة (#1200).
    • تم حلّ مشكلة في النظام الأساسي تؤدي إلى تمديد الفيديو أو اقتصاصه عند استخدام SurfaceView داخل AndroidView في 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 عند تفعيل CMCD لأحداث البث المباشر عبر HLS (#1395).
  • إضافة DASH:
    • تم إصلاح الخطأ الذي يتسبّب في ظهور الخطأ IndexOutOfBoundsException عند إعادة إعداد بث مباشر متعدد الفترات (#1329).
    • إضافة إمكانية استخدام عناوين URL لترخيص dashif:Laurl (#1345)
  • إضافة Cast:
    • تم إصلاح الخطأ الذي كان يحوّل عنوان الألبوم في MediaQueueItem إلى الفنان في ملف الوسائط Media3 (#1255).
  • أدوات الاختبار:
    • نفِّذ الترميزَين onInit() وonRelease() في FakeRenderer.
    • تغيير طرق TestPlayerRunHelper.runUntil()/playUntil() لتتعطّل عند حدوث أخطاء غير خطيرة (مثل تلك التي يتم الإبلاغ عنها إلى AnalyticsListener.onVideoCodecError()). يمكنك استخدام سلسلة الطرق الجديدة TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() لإيقاف هذا السلوك.
  • التطبيق التجريبي:
    • استخدِم DefaultPreloadManager في التطبيق التجريبي القصير.
    • السماح بضبط وضع التكرار باستخدام وسيطات Intent من سطر الأوامر (#1266).
    • استخدام HttpEngineDataSource كـ HttpDataSource عندما يكون ذلك متاحًا على الجهاز
  • إزالة الرموز المتوقفة نهائيًا:
    • إزالة CronetDataSourceFactory يمكنك استخدام CronetDataSource.Factory كبديل.
    • يُرجى إزالة بعض منشئي DataSpec. يمكنك استخدام DataSpec.Builder كبديل.
    • تمّت إزالة الدالة setContentTypePredicate(Predicate) من DefaultHttpDataSource وOkHttpDataSource وCronetDataSource. استخدِم الطريقة المكافئة على كل XXXDataSource.Factory بدلاً من ذلك.
    • تمّت إزالة الدوال الإنشائية OkHttpDataSource وOkHttpDataSourceFactory. يمكنك استخدام OkHttpDataSource.Factory كبديل.
    • إزالة PlayerMessage.setHandler(Handler) يمكنك استخدام setLooper(Looper) كبديل.
    • إزالة حقل Timeline.Window.isLive استخدِم الإجراء isLive() بدلاً من ذلك.
    • إزالة دالتَي الإنشاء (DefaultHttpDataSource) يمكنك استخدام DefaultHttpDataSource.Factory كبديل.
    • إزالة DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS يمكنك استخدام DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS كبديل.
    • إزالة MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean) يمكنك استخدام MediaCodecInfo.canReuseCodec(Format, Format) كبديل.
    • إزالة الدالتين DrmSessionManager.DUMMY وgetDummyDrmSessionManager() يمكنك استخدام DrmSessionManager.DRM_UNSUPPORTED كبديل.
    • إزالة AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)، AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)، AudioRendererEventListener.onAudioInputFormatChanged(Format)، VideoRendererEventListener.onVideoInputFormatChanged(Format). استخدِم التحميلات الزائدة التي تستخدم DecoderReuseEvaluation بدلاً من ذلك.
    • إزالة RendererSupport.FormatSupport IntDef والثوابت FORMAT_HANDLED وFORMAT_EXCEEDS_CAPABILITIES وFORMAT_UNSUPPORTED_DRM وFORMAT_UNSUPPORTED_SUBTYPE وFORMAT_UNSUPPORTED_TYPE يُرجى استخدام التعليق التوضيحي IntDef المكافئ والثوابت في androidx.media3.common.C بدلاً من ذلك (مثل C.FORMAT_HANDLED).
    • إزالة واجهة Bundleable ويشمل ذلك إزالة جميع حقول الثوابت في Bundleable.Creator<Foo> CREATOR. يجب أن يستخدم المتصلون الطريقتين Bundle toBundle() وstatic Foo fromBundle(Bundle) على كل نوع بدلاً من ذلك.

الإصدار 1.4.0-rc01

‫10 يوليو 2024

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

الإصدار ‎1.4.0-beta01

‫26 يونيو 2024

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

الإصدار 1.4.0-alpha02

‫7 يونيو 2024

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

الإصدار 1.4.0-alpha01

‫17 أبريل 2024

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

الإصدار 1.3.0

الإصدار 1.3.1

‫11 أبريل 2024

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

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

الإصدار 1.3.0

‫6 آذار (مارس) 2024

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

  • المكتبة المشتركة:
    • يجب تنفيذ الدعم لمعرّفات الموارد المنتظمة (URI) للموارد الأوّلية في android.resource://package/[type/]name حيث يختلف package عن حزمة التطبيق الحالي. تم توثيق هذه الميزة دائمًا على أنّها تعمل، ولكن لم يتم تنفيذها بشكل صحيح حتى الآن.
    • Normalize MIME types set by app code or read from media to be fully lower-case.
    • حدِّد الإعلانات باستخدام MediaItem كامل بدلاً من Uri واحد في AdPlaybackState.
    • زيادة minSdk إلى 19 (Android KitKat). يتوافق هذا مع جميع مكتبات AndroidX الأخرى، وهو مطلوب لترقية أحدث إصدارات تبعيات AndroidX.
    • تعبئة كل من artworkUri وartworkData في MediaMetadata.Builder.populate(MediaMetadata) عندما يكون أحدهما على الأقل غير فارغ (#964).
  • ‫ExoPlayer:
    • إضافة PreloadMediaSource وPreloadMediaPeriod للسماح للتطبيقات بتحميل مصدر وسائط المحتوى مسبقًا في موضع بدء محدّد قبل التشغيل PreloadMediaSource takes care of preparing the content media source to receive the Timeline, preparing and caching the period at the given start position, selecting tracks and loading media data for the period. تتحكّم التطبيقات في مستوى تقدّم التحميل المُسبق من خلال تنفيذ PreloadMediaSource.PreloadControl وضبط المصدر الذي تم تحميله مُسبقًا على المشغّل لتشغيله.
    • أضِف ExoPlayer.setImageOutput الذي يسمح للتطبيقات بضبط ImageRenderer.ImageOutput.
    • يوفّر DefaultRenderersFactory الآن ImageRenderer للمشغّل تلقائيًا مع قيمة فارغة لكل من ImageOutput وImageDecoder.Factory.DEFAULT.
    • إصدار حدث Player.Listener.onPositionDiscontinuity عند تخطّي الصمت (#765)
    • تمت إضافة دعم تجريبي لتحليل الترجمة أثناء الاستخراج. يمكنك تفعيل هذه الميزة باستخدام MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • إتاحة مصادر الوسائط التكيُّفية باستخدام PreloadMediaSource
    • يمكنك تنفيذ HttpEngineDataSource، وهو HttpDataSource باستخدام واجهة برمجة التطبيقات HttpEngine.
    • منع إنشاء فئة فرعية من CompositeSequenceableLoader تمت إتاحة توسيع هذا المكوّن سابقًا، ولكن لم يتم إنشاء فئة فرعية له ضمن المكتبة. يمكن إجراء عمليات التخصيص من خلال تضمين مثيل باستخدام نمط المُزخرف و تنفيذ CompositeSequenceableLoaderFactory مخصّص.
    • تم إصلاح المشكلة التي تؤدي إلى محو البيانات الوصفية من هذا العنصر عند تكرار الوقت نفسه (#1007).
    • تمّت إعادة تسمية الدالتين experimentalSetSubtitleParserFactory في BundledChunkExtractor.Factory وDefaultHlsExtractorFactory إلى setSubtitleParserFactory وعدم السماح بتمرير null. استخدِم طرق experimentalParseSubtitlesDuringExtraction(boolean) الجديدة للتحكّم في سلوك التحليل.
    • إضافة دعم لتخصيص SubtitleParser.Factory المستخدَم أثناء الاستخراج ويمكن إجراء ذلك باستخدام MediaSource.Factory.setSubtitleParserFactory().
    • أضِف بادئة المصدر إلى جميع حقول Format.id التي تم إنشاؤها من MergingMediaSource. يساعد ذلك في تحديد المصدر الذي أنتج Format (#883).
    • تم إصلاح التعبير النمطي المستخدَم للتحقّق من صحة أسماء مفاتيح بيانات عملاء الوسائط الشائعة (CMCD) المخصّصة من خلال تعديله للتحقّق من الواصلة فقط (#1028).
    • تم إيقاف الترميز المزدوج لمَعلمات طلب البحث في CMCD (#1075).
  • Transformer:
    • إضافة ميزة تسوية فيديوهات الحركة البطيئة بتنسيق H.265/HEVC SEF
    • زيادة سرعة إعادة تجميع البيانات، خاصةً في تعديلات "إزالة الفيديو"
    • إضافة واجهة برمجة تطبيقات لضمان بدء ملف الإخراج على إطار فيديو يمكن أن يؤدي ذلك إلى جعل ناتج عمليات القطع أكثر توافقًا مع عمليات تنفيذ المشغّل التي لا تعرض إطار الفيديو الأول حتى الطابع الزمني للعرض (#829).
    • تمت إضافة إمكانية تحسين عمليات قطع ملفات MP4 التي تتضمّن مادة عرض واحدة.
    • أضِف دعمًا لضمان أن يتضمّن إطار الفيديو الطابع الزمني الأول في ملف الإخراج. تم إصلاح مشكلة ملفات الإخراج التي تبدأ بإطار أسود على المشغّلات المستندة إلى iOS (#829).
  • اختيار المقطع الصوتي:
    • أضِف DefaultTrackSelector.selectImageTrack لتفعيل اختيار المسار الصوتي للصورة.
    • أضِف TrackSelectionParameters.isPrioritizeImageOverVideoEnabled لتحديد ما إذا كان سيتم اختيار مقطع صورة في حال توفّر كل من مقطع صورة ومقطع فيديو. القيمة التلقائية هي false، ما يعني أنّ اختيار مقطع فيديو له الأولوية.
  • أدوات الاستخراج:
    • إضافة تحليل AV1C إضافي إلى أداة استخراج MP4 لاسترداد قيم ColorInfo.colorSpace وColorInfo.colorTransfer وColorInfo.colorRange (#692)
    • ‫MP3: استخدام البحث بمعدل نقل بيانات ثابت (CBR) للملفات التي تحتوي على عنوان Info (ما يعادل CBR لعنوان Xing) في السابق، كنا نستخدم جدول البحث من عنوان Info، ولكن يؤدي ذلك إلى التقديم/الترجيع بدقة أقل مما لو تجاهلناه وافترضنا أن الملف هو CBR.
    • ‫MPEG2-TS: تمت إضافة إمكانية استخدام DTS وDTS-LBR وDTS:X Profile2 (#275).
    • استخراج أنواع الصوت من واصفات TS وربطها بعلامات الأدوار، ما يتيح للمستخدمين اختيار المقاطع الصوتية بشكل أفضل (#973)
  • الصوت:
    • تحسين خوارزمية تخطّي الصمت من خلال زيادة مستوى الصوت بسلاسة، والاحتفاظ بالحد الأدنى من الصمت، وتوفير فترات صمت أكثر طبيعية (#7423)
    • الإبلاغ عن الصمت الذي تم تخطّيه بشكل أكثر حتمية (#1035).
  • الفيديو:
    • غيِّر دالة الإنشاء MediaCodecVideoRenderer التي تأخذ وسيطة VideoFrameProcessor.Factory واستبدِلها بدالة إنشاء تأخذ وسيطة VideoSinkProvider. يمكن للتطبيقات التي تريد إدخال VideoFrameProcessor.Factory مخصّص إنشاء مثيل CompositingVideoSinkProvider يستخدم VideoFrameProcessor.Factory المخصّص وتمرير مزوّد مخزن الفيديو إلى MediaCodecVideoRenderer.
  • النص:
    • تم إصلاح تسلسل إشارات الصور النقطية لحلّ الخطأ Tried to marshall a Parcel that contained Binder objects عند استخدام DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836).
    • ‫CEA-708: تجاهُل قيمة rowLock تنص مواصفات CEA-708-E S-2023 على أنّه يجب افتراض أنّ rowLock وcolumnLock صحيحان، بغض النظر عن القيم الموجودة في البث (لم يتم تنفيذ دعم columnLock، لذلك يُفترض دائمًا أنّه خطأ).
  • الصورة:
    • تمت إضافة ميزة الصور المصغّرة بتنسيق DASH. يتم اقتصاص صور الشبكة وتوفير صور مصغّرة فردية لـ "ImageOutput" بالقرب من أوقات عرضها.
  • إدارة الحقوق الرقمية:
    • تشغيل عيّنات غير مشفّرة من "المحتوى الرئيسي الواضح" في محتوى إدارة الحقوق الرقمية (DRM) فورًا وبشكل تلقائي، حتى إذا لم تكن مفاتيح العيّنات المشفّرة اللاحقة جاهزة بعد. قد يؤدي ذلك إلى توقُّف التشغيل في منتصفه إذا لم تكن المفاتيح جاهزة بعد عندما يصل موضع التشغيل إلى العيّنات المشفّرة (ولكن في السابق لم يكن التشغيل ليبدأ على الإطلاق عند هذه النقطة). يمكن إيقاف هذا السلوك باستخدام MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey أو DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.
      • إضافة 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).
  • Transformer:
    • تم حلّ مشكلة كانت تؤدي إلى توقّف برنامج الترميز عن العمل أثناء عملية الضبط بسبب ضبط معدّل تشغيل مرتفع.
  • أدوات الاستخراج:
    • وضع علامة على مسارات HEVC الثانوية (غير القابلة للتشغيل) في صور JPEG المتحركة على أنّها ROLE_FLAG_ALTERNATE لمنع اختيارها تلقائيًا للتشغيل بسبب دقتها العالية.
    • تم إصلاح مشكلة رصد الإطارات الرئيسية الخاطئة في أحداث البث المباشر بتنسيق TS H264 (#864).
    • تم إصلاح تقدير مدة أحداث البث المباشر بتنسيق TS التي تزيد مدتها عن 47,721 ثانية (#855).
  • الصوت:
    • تم إصلاح طريقة معالجة EOS لـ SilenceSkippingAudioProcessor عند استدعائها عدة مرات (#712).
  • الفيديو:
    • تمت إضافة حل بديل لمشكلة في أجهزة Galaxy Tab S7 FE و"Chromecast مع Google TV" وLenovo M10 FHD Plus تؤدي إلى وضع علامة "غير متوافق" على أحداث البث المباشر بترميز AVC وبمعدل 60 لقطة في الثانية (#693).
  • البيانات الوصفية:
    • تم إصلاح الخطأ الذي كان يؤدي إلى ملء MediaMetadata من تعليقات Vorbis فقط باستخدام مفاتيح بأحرف لاتينية كبيرة (#876).
    • يتم رصد OutOfMemoryError عند تحليل إطارات ID3 الكبيرة جدًا، ما يعني أنّه يمكن مواصلة التشغيل بدون معلومات العلامة بدلاً من تعذُّر التشغيل تمامًا.
  • إدارة الحقوق الرقمية:
    • تم تمديد الحل البديل لعنوان URL لترخيص ClearKey https://default.url الزائف إلى المستوى 33 من واجهة برمجة التطبيقات والإصدارات الأحدث (في السابق، كان الحل البديل ينطبق فقط على المستوى 33 من واجهة برمجة التطبيقات) (#837).
    • تم إصلاح ERROR_DRM_SESSION_NOT_OPENED عند التبديل من المحتوى المشفّر إلى المحتوى الواضح بدون إرفاق سطح بالمشغّل. حدث الخطأ بسبب استخدام وحدة فك ترميز آمنة بشكل غير صحيح لتشغيل المحتوى غير المشفّر.
  • الجلسة:
    • وضع المفاتيح والقيم المخصّصة في MediaMetadataCompat إلى MediaMetadata.extras وMediaMetadata.extras إلى MediaMetadataCompat (#756، #802).
    • تم إصلاح مشكلة البث notifyChildrenChanged لوحدات التحكّم القديمة (#644).
    • تم إصلاح خلل كان يؤدي إلى تعطُّل بعض الأجهزة عند ضبط وقت سلبي لموقّت setWhen غير مفعَّل للإشعار (#903).
    • تم إصلاح IllegalStateException عندما لا يكتمل اتصال وحدة التحكّم في إشعارات الوسائط عند طلب أول تحديث للإشعار (#917).
  • واجهة المستخدم:
    • تم إصلاح المشكلة المتمثّلة في عدم ظهور زرَّي التقديم والترجيع عند استخدامهما مع التصميم المتعدد الأبعاد في BottomSheetDialogFragment (#511).
    • تم إصلاح مشكلة عدم محاذاة الأرقام في زر التقديم السريع في PlayerControlView (#547).
  • إضافة DASH:
    • تحليل "f800" كعدد قنوات يبلغ 5 لـ Dolby في بيان DASH (#688).
  • إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وMIDI وغيرها):
    • ‫MIDI: تم إصلاح مشكلة تخطّي أحداث "تغيير البرنامج" عند التقديم السريع (‫#704).
    • تم نقل البيانات إلى FFmpeg 6.0 وتحديث حزمة NDK المتوافقة إلى r26b (#707، #867).
  • إضافة Cast:
    • تمت تنقية عملية إنشاء Timeline لعدم تعطُّل التطبيق عند تعذُّر تحميل الوسائط على جهاز البث (#708).

الإصدار 1.2.0

‫15 نوفمبر 2023

  • المكتبة المشتركة:
    • أضِف مَعلمة @Nullable Throwable إلى الطرق في واجهة Log.Logger. لم تعُد مَعلمة message لهذه الطرق تحتوي على أي معلومات حول Throwable التي تم تمريرها إلى طرق Log.{d,i,w,e}()، لذا ستحتاج عمليات التنفيذ إلى إلحاق هذه المعلومات يدويًا إذا رغبت في ذلك (ربما باستخدام Logger.appendThrowableString(String, Throwable)).
    • تم إصلاح مشكلة توافق Kotlin حيث لا يتم رصد مَعلمات الأنواع العامة التي تقبل القيم الفارغة وأنواع عناصر الصفائف التي تقبل القيم الفارغة على أنّها تقبل القيم الفارغة. ومن الأمثلة على ذلك مَعلمتا الطريقة TrackSelectorResult وSimpleDecoder (#6792).
    • تغيير واجهة المستخدم التلقائية وسلوك الإشعارات في Util.shouldShowPlayButton لعرض زر "تشغيل" أثناء إيقاف التشغيل مؤقتًا (على سبيل المثال، بسبب فقدان أولوية الصوت المؤقتة) يمكن الحفاظ على السلوك القديم باستخدام PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) أو MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • يُرجى ترقية الإصدار androidx.annotation:annotation-experimental إلى الإصدار 1.3.1 لحلّ المشكلة https://issuetracker.google.com/251172715.
    • انقل ExoPlayer.setAudioAttributes إلى واجهة Player.
  • ‫ExoPlayer:
    • تم إصلاح مشاكل البحث في مصادر بيانات AC4 الناتجة عن عدم تحديد عيّنات فك الترميز فقط بشكل صحيح (‎#11000).
    • إضافة ميزة منع التشغيل على أجهزة إخراج الصوت غير المناسبة (مثل مكبّر الصوت المدمج في أجهزة Wear OS) عند تفعيل هذه الميزة من خلال ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput سيتم تعديل سبب منع التشغيل إلى Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT في حال محاولة التشغيل بدون توفّر أي أجهزة إخراج صوت مناسبة، أو في حال فصل جميع أجهزة الإخراج المناسبة أثناء التشغيل. ستتم إزالة سبب الإيقاف عند توصيل جهاز إخراج مناسب.
    • أضِف MediaSource.canUpdateMediaItem وMediaSource.updateMediaItem لقبول تعديلات MediaItem بعد الإنشاء من خلال Player.replaceMediaItem(s).
    • السماح بتحديثات MediaItem لجميع فئات MediaSource التي توفّرها المكتبة من خلال Player.replaceMediaItem(s) (#33، #9978)
    • تمّت إعادة تسمية MimeTypes.TEXT_EXOPLAYER_CUES إلى MimeTypes.APPLICATION_MEDIA3_CUES.
    • أضِف PngExtractor يرسل ملف PNG كاملاً ويقرأه في TrackOutput كعيّنة واحدة.
    • تحسين طريقة SequenceableLoader.continueLoading(long) في واجهة SequenceableLoader إلى SequenceableLoader.continueLoading(LoadingInfo loadingInfo) يحتوي LoadingInfo على مَعلمات إضافية، بما في ذلك playbackSpeed وlastRebufferRealtimeMs بالإضافة إلى playbackPositionUs الحالي.
    • حسِّن طريقة ChunkSource.getNextChunk(long, long, List, ChunkHolder) في واجهة ChunkSource إلى ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • إضافة حقول أخرى إلى سجلّ Common Media Client Data (CMCD): نقص في ذاكرة التخزين المؤقت (bs) والموعد النهائي (dl) وسرعة التشغيل (pr) وبدء التشغيل (su) (#8699)
    • إضافة عمق البت لـ luma وchroma إلى ColorInfo (#491).
    • إضافة حقول أخرى إلى سجلّات بيانات عميل الوسائط الشائعة (CMCD): طلب العنصر التالي (nor) وطلب النطاق التالي (nrr) (‎#8699)
    • تمت إضافة وظيفة لنقل بيانات Common Media Client Data (CMCD) باستخدام معلمات طلب البحث (#553).
    • حلّ المشاكل في "ConcurrentModificationException" في ExperimentalBandwidthMeter (#612)
    • أضِف المَعلمة MediaPeriodId إلى CompositeMediaSource.getMediaTimeForChildMediaTime.
    • إتاحة استخدام ClippingMediaSource (والمصادر الأخرى التي تتضمّن فترات زمنية/فروق زمنية) في ConcatenatingMediaSource2 (#11226)
    • يجب تغيير BaseRenderer.onStreamChanged() لتلقّي وسيطة MediaPeriodId أيضًا.
  • Transformer:
    • تحليل بيانات تدوير 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 بتنسيق big-endian ‏24/32 بت في MP4 وMatroska، وتحليل ترميز PCM لـ lpcm في MP4
    • إضافة إمكانية استخراج صوت Vorbis بتنسيق MP4
    • أضِف AudioSink.getFormatOffloadSupport(Format) لاسترداد مستوى دعم التفريغ الذي يمكن أن يوفّره المخرج للتنسيق من خلال DefaultAudioOffloadSupportProvider. وتعرض السمة الجديدة AudioOffloadSupport التي تحتوي على isFormatSupported وisGaplessSupported وisSpeedChangeSupported.
    • أضِف AudioSink.setOffloadMode() الذي يتم من خلاله ضبط إعدادات التفريغ على مصدر الصوت. القيمة التلقائية هي AudioSink.OFFLOAD_MODE_DISABLED.
    • يمكن تفعيل ميزة "إزالة التطبيقات غير المستخدَمة" من خلال setAudioOffloadPreference في TrackSelectionParameters. إذا كان الإعداد المفضّل هو التفعيل، وكان الجهاز يتيح إلغاء التحميل للتنسيق، وكان اختيار المقطع الصوتي هو مقطع صوتي واحد، سيتم تفعيل إلغاء تحميل الصوت.
    • إذا تم ضبط audioOffloadModePreference على AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED، سيختار DefaultTrackSelector مقطعًا صوتيًا فقط، وذلك في حال كان تنسيق المقطع متوافقًا مع ميزة التفريغ. إذا لم يكن هناك مقطع صوتي متوافق مع ميزة التفريغ، لن يتم اختيار أي مقطع.
    • Disabling gapless support for offload when pre-API level 33 due to playback position issue after track transition.
    • تمّت إزالة المَعلمة 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 عند التحقّق من إمكانات E-AC3-JOC (#677).
  • الفيديو:
    • السماح لـ "MediaCodecVideoRenderer" باستخدام VideoFrameProcessor.Factory مخصّص
    • تم إصلاح الخطأ الذي كان يمنع عرض الإطار الأول إذا كان البث الصوتي يبدأ بطوابع زمنية سالبة (#291).
  • النص:
    • إزالة ExoplayerCuesDecoder تتم الآن معالجة المقاطع النصية التي تحتوي على sampleMimeType = application/x-media3-cues مباشرةً من خلال TextRenderer بدون الحاجة إلى مثيل SubtitleDecoder.
  • البيانات الوصفية:
    • لن يتم استدعاء MetadataDecoder.decode بعد الآن لعيّنات "فك الترميز فقط" لأنّ عملية التنفيذ يجب أن تعرض قيمة فارغة على أي حال.
  • التأثير:
    • إضافة VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) إدخال صورة نقطية في قائمة الانتظار حسب الطابع الزمني
    • غيِّر VideoFrameProcessor.registerInputStream() إلى غير مانع. يجب أن تنفّذ التطبيقات VideoFrameProcessor.Listener#onInputStreamRegistered().
    • تم تغيير مَعلمتَي frameRate وdurationUs في VideoFrameProcessor.queueInputBitmap إلى TimestampIterator.
  • إضافة IMA:
    • تم إصلاح خطأ حيث يمكن أن يؤدي بث مباشر متعدد الفترات بتقنية DASH ليس العنصر الأول في قائمة التشغيل إلى حدوث استثناء (#571).
    • يجب تحرير StreamManager قبل استدعاء AdsLoader.destroy()
    • تمت ترقية إصدار حزمة تطوير البرامج للإعلانات التفاعلية (IMA SDK) إلى 3.31.0.
  • الجلسة:
    • ضبط سلوك خدمة الإشعارات التي تعمل في المقدّمة على FOREGROUND_SERVICE_IMMEDIATE في DefaultMediaNotificationProvider (#167).
    • يُرجى استخدام android.media.session.MediaSession.setMediaButtonBroadcastReceiver() فقط مع الإصدارات الأحدث من واجهة برمجة التطبيقات 31 لتجنُّب المشاكل المتعلّقة بواجهة برمجة التطبيقات المتوقّفة نهائيًا على أجهزة Samsung (#167).
    • استخدِم وحدة التحكّم في إشعارات الوسائط كخادم وكيل لضبط الأوامر المتاحة والتنسيق المخصّص المستخدَم لتعبئة الإشعار وجلسة المنصة.
    • تحويل أحداث أزرار الوسائط التي يتلقّاها MediaSessionService.onStartCommand() ضمن Media3 بدلاً من توجيهها إلى جلسة المنصة ثم إعادتها إلى Media3 وبذلك، يكون المتحكّم في المكالمات هو دائمًا المتحكّم في إشعارات الوسائط، ويمكن للتطبيقات التعرّف بسهولة على المكالمات الواردة من الإشعار بالطريقة نفسها على جميع مستويات واجهة برمجة التطبيقات المتوافقة.
    • تم إصلاح الخطأ الذي يتسبب في عدم تقدّم MediaController.getCurrentPosition() عند الاتصال بجهاز MediaSessionCompat قديم.
    • أضِف MediaLibrarySession.getSubscribedControllers(mediaId) لراحتك.
    • يمكنك إلغاء MediaLibrarySession.Callback.onSubscribe() لتأكيد توفّر رقم تعريف العنصر الرئيسي الذي يشترك فيه وحدة التحكّم. في حال نجاح العملية، يتم قبول الاشتراك ويتم استدعاء notifyChildrenChanged() على الفور لإبلاغ المتصفّح (#561).
    • أضِف وحدة تجريبية للجلسات في نظام التشغيل Automotive OS وفعِّل الجلسة التجريبية في Android Auto.
    • لا تضبط قائمة انتظار جلسة إطار العمل عندما لا يكون COMMAND_GET_TIMELINE متاحًا لوحدة التحكّم في إشعارات الوسائط. عند استخدام Android Auto كوحدة تحكّم في العميل تقرأ من جلسة إطار العمل، يؤدي ذلك إلى عدم عرض الزر queue في واجهة مستخدم Android Auto (#339).
    • استخدام DataSourceBitmapLoader تلقائيًا بدلاً من SimpleBitmapLoader (#271، #327).
    • إضافة MediaSession.Callback.onMediaButtonEvent(Intent) للسماح للتطبيقات بتجاوز المعالجة التلقائية لأحداث زر الوسائط
  • واجهة المستخدم:
    • أضِف تنفيذ 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 المخصّصة في العنوان العام لاستجابة Options (#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 view.
  • إزالة الرموز المتوقفة نهائيًا:
    • إزالة 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" و"عنوان التعليق" إلى بداية سلسلة البيانات لتشغيل ملفات Opus التي تم إلغاء تحميلها وفقًا لمعيار RFC 7845.
  • الفيديو:
    • ‫H.265/HEVC: تم إصلاح مشكلة تحليل معلومات الصورة المرجعية القصيرة والطويلة المدى في SPS.
  • النص:
    • ‫CEA-608: تغيير منطق اقتطاع الإشارات ليأخذ في الاعتبار النص المرئي فقط في السابق، كان يتم تضمين المسافة البادئة وعلامة الجدولة عند تحديد طول الإشارة بـ 32 حرفًا (وهو ما كان صحيحًا من الناحية الفنية وفقًا للمواصفات) (#11019).
  • إضافة IMA:
    • تمت ترقية إصدار حزمة تطوير البرامج (SDK) للإعلانات التفاعلية إلى 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() لتفعيل تسجيل المفاتيح المخصّصة.
    • تمت إضافة إجراء إضافي إلى بيان العرض التوضيحي الرئيسي لتسهيل بدء تطبيق العرض التوضيحي باستخدام ملف *.exolist.json مخصّص (#439).
    • أضِف ExoPlayer.setVideoEffects() لاستخدام Effect أثناء تشغيل الفيديو.
    • عدِّل SampleQueue لتخزين sourceId كـ long بدلاً من int. يؤدي ذلك إلى تغيير توقيعات الطرق العامة SampleQueue.sourceId وSampleQueue.peekSourceId.
    • أضِف مَعلمات إلى الطريقتَين shouldStartPlayback وonTracksSelected في LoadControl تتيح ربط هاتَين الطريقتَين بـ MediaPeriod ذات الصلة.
    • يمكنك تغيير توقيع ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) من خلال إضافة مَعلمة مخطط زمني تحتوي على الفترات مع أرقام التعريف الفريدة المستخدَمة كمفاتيح في الخريطة. هذا الإجراء مطلوب لتجنُّب مشاكل التزامن في أحداث البث المباشر المتعددة الفترات.
    • إيقاف EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) وBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs) نهائيًا يمكن بدلاً من ذلك استدعاء صيغة الطرق بدون mediaTimeOffsetUs. يُرجى العِلم أنّه حتى بالنسبة إلى الصيغ التي تم إيقافها نهائيًا، لم يعُد يتمّ إلحاق الإزاحة بـ startTimeUs وendTimeUs لكائنات MediaLoadData التي يرسلها المُرسِل.
    • أعِد تسمية ExoTrackSelection.blacklist إلى excludeTrack وisBlacklisted إلى isTrackExcluded.
    • تم إصلاح السلوك غير المتسق بين ExoPlayer.setMediaItem(s) وaddMediaItem(s) عند استدعائهما في قائمة تشغيل فارغة.
  • Transformer:
    • إزالة Transformer.Builder.setMediaSourceFactory(MediaSource.Factory) يُرجى استخدام ExoPlayerAssetLoader.Factory(MediaSource.Factory) وTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory) بدلاً من ذلك.
    • إزالة Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
    • تم إصلاح خطأ يتسبّب في توقُّف عملية التحويل (ما يؤدي إلى انتهاء مهلة المُضاعِف) إذا تم الإشارة إلى نهاية بث الفيديو في اللحظة التي كان فيها إطار الإدخال في انتظار المعالجة.
    • يمكنك الاستعلام عن برامج الترميز من خلال MediaCodecList بدلاً من استخدام أدوات findDecoder/EncoderForFormat المساعدة لتوسيع نطاق الدعم.
    • يجب إزالة إعدادات الإطار B في "DefaultEncoderFactory" لأنّها لا تعمل على بعض الأجهزة.
  • اختيار المقطع الصوتي:
    • أضِف DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange الذي يكون غير مفعَّل تلقائيًا. عند تفعيل هذا الخيار، سيؤدي DefaultTrackSelector إلى اختيار مقطع صوتي جديد عند تغيير إمكانات العارض.
  • أدوات الاستخراج:
    • ‫Ogg: تم إصلاح الخطأ الذي يحدث عند البحث في الملفات ذات المدة الطويلة (#391).
    • ‫FMP4: تم إصلاح مشكلة حيث يبدأ TimestampAdjuster إزاحة طابع زمني خاطئ مع وقت عيّنة البيانات الوصفية من emsg atom (#356).
  • الصوت:
    • تم إصلاح الخطأ الذي يتسبب في تعذُّر تشغيل بعض الفيديوهات عند تفعيل ميزة "النفق" وتفعيل AudioProcessors، على سبيل المثال، عند اقتصاص الفيديوهات بدون فواصل (#10847).
    • تغليف إطارات Opus في حزم Ogg في عمليات التشغيل المباشر (تفريغ).
    • استقراء الموقع الجغرافي الحالي أثناء وضع السكون مع جدولة التفريغ
    • أضِف Renderer.release() وAudioSink.release() لإصدار الموارد في نهاية مراحل نشاط المشغّل.
    • الاستماع إلى تغييرات إمكانات الصوت في DefaultAudioSink أضِف مَعلمة مطلوبة context في دالة الإنشاء DefaultAudioSink، والتي سيتم من خلالها تسجيل DefaultAudioSink كمستمع إلى AudioCapabilitiesReceiver وتحديث سمة audioCapabilities عند إعلامه بتغيير في الإمكانات.
    • نشر تغييرات إمكانات الصوت من خلال حدث جديد onAudioCapabilitiesChanged في واجهة AudioSink.Listener، وواجهة جديدة RendererCapabilities.Listener تؤدي إلى تشغيل أحداث onRendererCapabilitiesChanged.
    • إضافة ChannelMixingAudioProcessor لتطبيق التعديل/الدمج على القنوات الصوتية
    • أضِف قيمة عدد صحيح جديدة DISCARD_REASON_AUDIO_BYPASS_POSSIBLE إلى DecoderDiscardReasons لتجاهُل وحدة فك ترميز الصوت عندما يكون وضع التجاوز متاحًا بعد تغيير إمكانات الصوت.
    • إضافة ميزة تشغيل المحتوى مباشرةً لـ DTS Express وDTS:X (#335)
  • الفيديو:
    • يمكنك جعل MediaCodecVideoRenderer يبلّغ عن VideoSize بعرض وارتفاع 0 عند إيقاف العارض. يتم استدعاء Player.Listener.onVideoSizeChanged وفقًا لذلك عند تغيير Player.getVideoSize(). من خلال هذا التغيير، يصبح حجم فيديو ExoPlayer باستخدام MediaCodecVideoRenderer بعرض وارتفاع 0 عندما لا يتيح Player.getCurrentTracks الفيديو، أو عندما لا يتم تحديد حجم مقطع الفيديو المتوافق بعد.
  • إدارة الحقوق الرقمية:
    • تقليل مستوى ظهور العديد من الطرق الداخلية فقط في DefaultDrmSession التي لا يُتوقع استدعاؤها من خارج حزمة إدارة الحقوق الرقمية:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • المُجمِّع:
    • إضافة مكتبة مجمِّع جديدة يمكن استخدامها لإنشاء ملف حاوية MP4
  • إضافة IMA:
    • تفعيل أحداث البث المباشر المتعددة الفترات بتنسيق DASH لـ "إدراج الإعلان الديناميكي" يُرجى العِلم أنّ الإصدار الحالي لا يتيح بعد البحث في أحداث البث المباشر (#10912).
    • تم إصلاح خلل يؤدي إلى إدراج مجموعة إعلانية جديدة في أحداث البث المباشر بسبب اختلاف طفيف في موضع المحتوى المحسوب في المخططات الزمنية المتتالية.
  • الجلسة:
    • أضِف طريقة المساعد MediaSession.getControllerForCurrentRequest للحصول على معلومات حول وحدة التحكّم التي تستدعي حاليًا طريقة Player.
    • أضِف androidx.media3.session.MediaButtonReceiver للسماح للتطبيقات باستئناف التشغيل من خلال أحداث أزرار الوسائط التي يتم إرسالها، على سبيل المثال، من خلال سماعة رأس بلوتوث (#167).
    • إضافة عملية تنفيذ تلقائية إلى MediaSession.Callback.onAddMediaItems للسماح بتمرير MediaItems المطلوب إلى Player إذا كان لديه LocalConfiguration (مثل معرّف الموارد المنتظم) (#282).
    • إضافة زرَّي الأمر "تقديم إلى السابق" و "تقديم إلى التالي" في العرض المصغّر لإشعارات الوسائط تلقائيًا على نظام التشغيل Android 12 والإصدارات الأقدم (#410)
    • إضافة عملية تنفيذ تلقائية إلى MediaSession.Callback.onAddMediaItems للسماح بتمرير MediaItems المطلوب إلى Player إذا كان لديه LocalConfiguration (مثل معرّف الموارد المنتظم) (#282).
    • إضافة زرَّي الأمر "تقديم إلى السابق" و "تقديم إلى التالي" في العرض المصغّر لإشعارات الوسائط تلقائيًا على نظام التشغيل Android 12 والإصدارات الأقدم (#410)
  • واجهة المستخدم:
    • أضِف طريقتَي Util‏ shouldShowPlayButton وhandlePlayPauseButtonAction لكتابة عناصر مخصّصة في واجهة المستخدم مع زر تشغيل/إيقاف مؤقت.
  • إضافة RTSP:
    • بالنسبة إلى MPEG4-LATM، يتم استخدام قيمة profile-level-id التلقائية إذا لم تكن متوفّرة في رسالة SDP الخاصة بالاستجابة Describe Response (#302).
    • استخدام معرّف الموارد المنتظم (URI) الأساسي لحلّ المسار النسبي من جلسة RTSP إذا كان متوفّرًا في عنوان الاستجابة DESCRIBE (#11160)
  • إضافة DASH:
    • تمّت إزالة إزاحة وقت الوسائط من MediaLoadData.startTimeMs وMediaLoadData.endTimeMs لتدفقات DASH المتعددة الفترات.
    • تم إصلاح خطأ يتعلّق بإعادة إعداد مصدر وسائط Dash مباشر متعدّد الفترات ينتج عنه IndexOutOfBoundsException (#10838).
  • إضافة HLS:
    • أضِف HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) لضبط مهلة لمؤشر ترابط التحميل لانتظار TimestampAdjuster حتى تتم تهيئته. إذا لم تكتمل عملية الإعداد قبل انتهاء المهلة، يتم عرض PlaybackException لتجنُّب توقُّف التشغيل بشكل لا نهائي. يتم ضبط المهلة على صفر تلقائيًا (#323).
  • أدوات الاختبار:
    • يجب التحقّق من عدم حساسية حالة الأحرف في مخطّط URI في DataSourceContractTest.
  • إزالة الرموز المتوقفة نهائيًا:
    • يجب إزالة دوال الإنشاء DefaultAudioSink واستخدام DefaultAudioSink.Builder بدلاً منها.
    • يجب إزالة HlsMasterPlaylist واستخدام HlsMultivariantPlaylist بدلاً من ذلك.
    • إزالة Player.stop(boolean) استخدِم Player.stop() وPlayer.clearMediaItems() (إذا كانت قيمة reset هي true) بدلاً من ذلك.
    • إزالة دالتَي إنشاء SimpleCache متوقفتَين نهائيًا، واستخدام دالة إنشاء غير متوقفة نهائيًا تأخذ DatabaseProvider بدلاً من ذلك لتحسين الأداء
    • يجب إزالة الدالة الإنشائية DefaultBandwidthMeter واستخدام DefaultBandwidthMeter.Builder بدلاً منها.
    • يجب إزالة دوال الإنشاء DefaultDrmSessionManager واستخدام DefaultDrmSessionManager.Builder بدلاً منها.
    • يجب إزالة دالتَي الإنشاء HttpDataSource.InvalidResponseCodeException اللتين تم إيقافهما نهائيًا، واستخدام دالة إنشاء غير متوقفة نهائيًا تقبل حقولاً إضافية(cause وresponseBody) لتحسين تسجيل الأخطاء.
    • يُرجى إزالة DownloadHelper.forProgressive وDownloadHelper.forHls وDownloadHelper.forDash وDownloadHelper.forSmoothStreaming واستخدام DownloadHelper.forMediaItem بدلاً منها.
    • يجب إزالة دالة الإنشاء DownloadService التي تم إيقافها نهائيًا، واستخدام دالة إنشاء غير متوقفة نهائيًا تتضمّن خيار توفير مَعلمة channelDescriptionResourceId.
    • إزالة ثوابت السلسلة التي تم إيقافها نهائيًا لمجموعات الأحرف (ASCII_NAME وUTF8_NAME وISO88591_NAME وUTF16_NAME وUTF16LE_NAME)، واستخدام مجموعات أحرف Kotlin من حزمة kotlin.text أو java.nio.charset.StandardCharsets أو com.google.common.base.Charsets بدلاً من ذلك
    • يجب إزالة الدالة الإنشائية WorkManagerScheduler التي تم إيقافها نهائيًا، واستخدام دالة إنشائية غير متوقفة نهائيًا تتضمّن خيار توفير مَعلمة Context بدلاً من ذلك.
    • إزالة الطرق المتوقفة نهائيًا createVideoSampleFormat وcreateAudioSampleFormat وcreateContainerFormat وcreateSampleFormat، والتي تم استخدامها لإنشاء مثيل للفئة Format بدلاً من ذلك، استخدِم Format.Builder لإنشاء مثيلات من Format.
    • إزالة الطرق المتوقفة نهائيًا copyWithMaxInputSize وcopyWithSubsampleOffsetUs وcopyWithLabel وcopyWithManifestFormatInfo وcopyWithGaplessInfo وcopyWithFrameRate وcopyWithDrmInitData وcopyWithMetadata وcopyWithBitrate وcopyWithVideoSize، واستخدام Format.buildUpon() وطرق 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).
  • أدوات الاستخراج:
    • تم إصلاح مشكلة تحليل H.265 SPS في ملفات MPEG-TS من خلال إعادة استخدام منطق التحليل المستخدَم حاليًا من قِبل أدوات استخراج RTSP وMP4 (#303).
  • النص:
    • ‫SSA: تمت إضافة إمكانية استخدام ملفات UTF-16 إذا كانت تبدأ بعلامة ترتيب البايت (#319).
  • الجلسة:
    • حلّ مشكلة عدم تعديل "MediaController" لأوامره المتاحة عند الاتصال بجهاز "MediaSessionCompat" قديم يعدّل إجراءاته
    • تم إصلاح الخطأ الذي كان يمنع MediaLibraryService من عرض قيمة فارغة لطلب من واجهة مستخدم النظام إلى Callback.onGetLibraryRoot باستخدام params.isRecent == true في المستوى 30 لواجهة برمجة التطبيقات (#355).
    • تم إصلاح تسرّب الذاكرة في MediaSessionService أو MediaLibraryService (#346).
    • تم إصلاح الخطأ الذي قد يؤدي فيه تعديل Timeline والموضع معًا في MediaSession إلى ظهور IllegalStateException في MediaController.

الإصدار 1.0.1

‫18 أبريل 2023

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

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

  • المكتبة الأساسية:
    • تمت إعادة ضبط تجاوز البث المباشر المستهدَف عند التقديم أو الترجيع إلى الموضع التلقائي (#11051).
    • تم إصلاح الخطأ الذي قد يؤدي فيه وجود عيّنات فارغة من أحداث البث في الوسائط إلى توقُّف التشغيل.
  • الجلسة:
    • تم إصلاح خلل يؤدي إلى حدوث استثناء في MediaController عند نشر عناصر متعددة متطابقة في قائمة الانتظار من خلال MediaSessionCompat قديم (#290).
    • إضافة إعادة التوجيه المفقودة من MediaSession.broadcastCustomCommand إلى MediaControllerCompat.Callback.onSessionEvent القديم (#293)
    • تم إصلاح الخلل الذي يؤدي إلى عدم تحديث الطلبات المتاحة عند طلب MediaSession.setPlayer.
    • تم إصلاح المشكلة المتمثلة في تجاهل مثيلات TrackSelectionOverride المرسَلة من MediaController إذا كانت تشير إلى مجموعة تحتوي على Format.metadata (#296).
    • حلّ المشكلة التي تتطلب توفّر Player.COMMAND_GET_CURRENT_MEDIA_ITEM للوصول إلى البيانات الوصفية من خلال MediaSessionCompat القديم
    • تم إصلاح المشكلة التي تؤدي فيها مثيلات MediaSession في سلسلة محادثات في الخلفية إلى حدوث أعطال عند استخدامها في MediaSessionService (#318).
    • تم إصلاح مشكلة إعلان المكتبة عن جهاز استقبال زر الوسائط بدون أن يكون التطبيق قد قصد ذلك (#314).
  • DASH:
    • تم إصلاح طريقة معالجة المخططات الزمنية الفارغة للأجزاء (#11014).
  • RTSP:
    • إعادة المحاولة باستخدام بروتوكول TCP في حال تعذّر إعداد بروتوكول RTSP باستخدام بروتوكول UDP مع ظهور الخطأ 461 UnsupportedTransport في بروتوكول RTSP (#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:
    • تم رصد IllegalArgumentException الذي تم طرحه في تحليل رسائل استجابة وصف RTSP غير الصالحة (#10971).
  • الجلسة:
    • تم إصلاح خطأ يتعلّق بعدم تعديل زر التشغيل/الإيقاف المؤقت في الإشعارات وفقًا لحالة المشغّل (#192).
  • إضافة IMA:
    • تم إصلاح خطأ كان يمنع بدء أحداث البث المباشر التي تتضمّن إعلانات ديناميكية (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، كما هو مسموح به في الإصدار 2.4 من ID3
    • أضِف MediaMetadata.mediaType للإشارة إلى نوع المحتوى أو نوع المجلد الذي تصفه البيانات الوصفية.
    • أضِف "MediaMetadata.isBrowsable" كبديل لـ "MediaMetadata.folderType". سيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
  • DASH:
    • إضافة تحليل كامل لمجموعات تكييف الصور، بما في ذلك عدد المربّعات (#3752)
  • واجهة المستخدم:
    • إصلاح PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) المتوقّف نهائيًا لضمان تمرير تغييرات مستوى العرض إلى المستمع المسجَّل (#229)
    • تم إصلاح ترتيب عناصر التحكّم في المشغّل في وسط الشاشة في PlayerView عند استخدام تنسيق من اليمين إلى اليسار (RTL) (#227).
  • الجلسة:
    • أضِف فئة SimpleBasePlayer المجرّدة للمساعدة في تنفيذ واجهة Player لمشغّلات الوسائط المخصّصة.
    • إضافة طريقة مساعِدة لتحويل الرمز المميّز لجلسة النظام الأساسي إلى Media3 SessionToken (#171)
    • استخدِم onMediaMetadataChanged لتشغيل تحديثات جلسة الوسائط على المنصة (#219).
    • إضافة جلسة الوسائط كوسيطة لـ getMediaButtons() في DefaultMediaNotificationProvider واستخدام قوائم غير قابلة للتغيير للإيضاح (#216)
    • تمت إضافة مستمع معاودة الاتصال onSetMediaItems لتوفير وسائل لتعديل/ضبط قائمة MediaItem والفهرس والموضع الأولي حسب الجلسة قبل الضبط على المشغّل (#156).
    • تجنُّب رصد النقر مرّتين لأحداث أزرار الوسائط غير المتصلة بالبلوتوث (#233)
    • تحسين أداء QueueTimeline في حال كانت حالة الجلسة القديمة غير واضحة (#241)
  • البيانات الوصفية:
    • تحليل قيم متعددة مفصولة بقيمة فارغة من إطارات ID3، كما هو مسموح به في الإصدار 2.4 من ID3
    • أضِف MediaMetadata.mediaType للإشارة إلى نوع المحتوى أو نوع المجلد الذي تصفه البيانات الوصفية.
    • أضِف "MediaMetadata.isBrowsable" كبديل لـ "MediaMetadata.folderType". سيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
  • إضافة Cast:
    • تمت ترقية إصدار حزمة تطوير البرامج (SDK) لتطبيق Cast إلى 21.2.0.
  • إضافة IMA:
    • يجب إزالة مستمع المشغّل في ImaServerSideAdInsertionMediaSource من سلسلة محادثات التطبيق لتجنُّب مشاكل سلاسل المحادثات.
    • أضِف السمة focusSkipButtonWhenAvailable إلى ImaServerSideAdInsertionMediaSource.AdsLoader.Builder لطلب التركيز على زر التخطّي على أجهزة التلفزيون واضبطها على "صحيح" تلقائيًا.
    • أضِف طريقة focusSkipButton() إلى ImaServerSideAdInsertionMediaSource.AdsLoader لطلب التركيز على زر التخطّي برمجيًا.
    • تمت ترقية إصدار حزمة تطوير البرامج للإعلانات التفاعلية (IMA SDK) إلى 3.29.0.
  • التطبيق التجريبي:
    • طلب إذن إرسال الإشعارات لإشعارات التنزيل في وقت التشغيل (#10884).

الإصدار ‎1.0.0-beta03

‫22 نوفمبر 2022

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

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

  • المكتبة الأساسية:
    • تمت إضافة ExoPlayer.isTunnelingEnabled للتحقّق مما إذا كان النفق مفعَّلاً للمقاطع الصوتية المحدّدة حاليًا (#2518).
    • تمت إضافة WrappingMediaSource لتبسيط عملية التفاف MediaSource واحد (#7279).
    • يتم تجاهل المخزن المؤقت الخلفي قبل توقّف التشغيل بسبب عدم توفّر مساحة كافية في الذاكرة.
    • إغلاق مجموعة "doSomeWork" في ميزة "التتبُّع" عند تفعيل ميزة "إلغاء التحميل"
    • تم إصلاح مشكلة تتبُّع الجلسات عند إجراء عمليات بحث سريعة في PlaybackStatsListener (#180).
    • إرسال دالة ردّ الاتصال onMediaItemTransition المفقودة عند استدعاء seekToNext أو seekToPrevious في قائمة تشغيل تتضمّن عنصرًا واحدًا (#10667).
    • أضِف Player.getSurfaceSize التي تعرض حجم السطح الذي يتم عرض الفيديو عليه.
    • تم إصلاح الخطأ الذي يؤدي إلى حدوث IllegalStateException عند إزالة المستمعين أثناء إصدار المشغّل (‎#10758).
  • الإصدار:
    • فرض الحد الأدنى من compileSdkVersion لتجنُّب أخطاء التجميع (#10684).
    • تجنَّب نشر كتلة عند تضمينها في إصدار Gradle آخر.
  • اختيار المقطع الصوتي:
    • يُفضَّل استخدام مقاطع أخرى بدلاً من Dolby Vision إذا كانت الشاشة لا تتيحها. (#8944).
  • عمليات التنزيل:
    • تم إصلاح حلقة لانهائية محتملة في ProgressiveDownloader ناتجة عن التنزيل والتشغيل المتزامنين باستخدام PriorityTaskManager نفسه (#10570).
    • إظهار إشعار التنزيل على الفور (#183)
    • تم حصر عمليات الإزالة المتزامنة لعمليات التنزيل في عملية واحدة لتجنُّب إنشاء سلاسل محادثات مفرطة (#10458).
  • الفيديو:
    • جرِّب وحدة فك ترميز بديلة لتقنية Dolby Vision إذا كانت الشاشة لا تتيحها. (#9794).
  • الصوت:
    • استخدام SingleThreadExecutor لإصدار مثيلات AudioTrack لتجنُّب أخطاء OutOfMemory عند إصدار عدة مشغّلات في الوقت نفسه (‎#10057)
    • تضيف AudioOffloadListener.onExperimentalOffloadedPlayback لحالة تفريغ AudioTrack. (#134).
    • اجعل AudioTrackBufferSizeProvider واجهة عامة.
    • أضِف ExoPlayer.setPreferredAudioDevice لضبط جهاز إخراج الصوت المفضّل (#135).
    • تمّت إعادة تسمية androidx.media3.exoplayer.audio.AudioProcessor إلى androidx.media3.common.audio.AudioProcessor.
    • تم ربط الصوت المكوّن من 8 قنوات و12 قناة بأقنعة القنوات 7.1 و7.1.4 على التوالي في جميع إصدارات Android (#10701).
  • البيانات الوصفية:
    • يمكن الآن ضبط MetadataRenderer لعرض البيانات الوصفية فور توفّرها. يمكنك إنشاء مثيل باستخدام MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean) لتحديد ما إذا كان العارض سيُخرج البيانات الوصفية مبكرًا أو بشكل متزامن مع موضع المشغّل.
  • إدارة الحقوق الرقمية:
    • حلّ مشكلة في تنفيذ ClearKey في Android 13 الذي يعرض عنوان URL غير فارغ ولكنه غير صالح للترخيص.
    • تم إصلاح الخطأ setMediaDrmSession failed: session not opened عند التبديل بين أنظمة إدارة الحقوق الرقمية في قائمة تشغيل (مثل Widevine إلى ClearKey).
  • النص:
    • ‫CEA-608: التأكّد من معالجة أوامر تبديل الخدمة في الحقل 2 بشكل صحيح (‎#10666)
  • DASH:
    • تحليل EventStream.presentationTimeOffset من ملفات البيان (#10460)
  • واجهة المستخدم:
    • استخدام عمليات الإلغاء الحالية للمشغّل كإعدادات مسبقة في TrackSelectionDialogBuilder (#10429).
  • الجلسة:
    • التأكّد من تنفيذ الأوامر دائمًا بالترتيب الصحيح حتى إذا كان بعضها يتطلّب حلّاً غير متزامن (#85)
    • أضِف DefaultMediaNotificationProvider.Builder لإنشاء DefaultMediaNotificationProvider نسخة. يمكن لأداة الإنشاء ضبط معرّف الإشعار ومعرّف قناة الإشعارات واسم قناة الإشعارات التي يستخدمها مقدّم الخدمة. أضِف أيضًا طريقة DefaultMediaNotificationProvider.setSmallIcon(int) لضبط الرمز الصغير للإشعارات. (#104).
    • التأكّد من عدم تجاهل الأوامر المُرسَلة قبل MediaController.release() (#99).
    • يمكن لـ "SimpleBitmapLoader" تحميل صورة نقطية من معرّفات الموارد المنتظمة (URI) لـ "file://" (#108).
    • تم إصلاح التأكيد الذي يمنع MediaController من البحث في إعلان خلال فترة زمنية (#122).
    • عند انتهاء التشغيل، يتم إيقاف MediaSessionService من المقدّمة ويظهر إشعار لإعادة تشغيل آخر ملف وسائط تم تشغيله (#112).
    • لا تبدأ خدمة تعمل في المقدّمة باستخدام intent مؤجّلة للإيقاف المؤقت (#167).
    • إخفاء "الشارة" المرتبطة بالإشعار الذي تم إنشاؤه بواسطة DefaultNotificationProvider يدويًا على واجهة برمجة التطبيقات 26 وواجهة برمجة التطبيقات 27 (يتم إخفاء الشارة تلقائيًا على واجهة برمجة التطبيقات 28 والإصدارات الأحدث) (#131).
    • تم إصلاح الخطأ الذي يتسبب في حدوث IllegalStateExceptions عند إجراء اتصال ثانٍ من MediaSession قديم إلى Media3 MediaController (#49).
  • RTSP:
    • إضافة معالجة حِزم البيانات المجزّأة بتنسيق H263 (#119)
    • إضافة إمكانية استخدام MP4A-LATM (#162)
  • وكالة التسويق عبر المؤثرين:
    • تمت إضافة مهلة لتحميل معلومات الإعلان من أجل معالجة الحالات التي تتوقف فيها حزمة IMA SDK عن تحميل الإعلان (‎#10510).
    • منع تخطّي "الإعلانات أثناء التشغيل" عند تقديم المحتوى إلى نهايته (#10685)
    • احتساب مدة النافذة بشكل صحيح لأحداث البث المباشر التي تتضمّن إعلانات مدرَجة من جهة الخادم، مثل IMA DAI (#10764)
  • إضافة FFmpeg:
    • تمت إضافة العلامات المطلوبة حديثًا لربط مكتبات FFmpeg مع NDK 23.1.7779620 والإصدارات الأحدث (#9933).
  • إضافة AV1:
    • تحديث إصدار CMake لتجنُّب حالات عدم التوافق مع أحدث إصدارات &quot;استوديو Android&quot; (‎#9933)
  • إضافة Cast:
    • يجب تنفيذ getDeviceInfo() لتتمكّن من تحديد CastPlayer عند التحكّم في التشغيل باستخدام MediaController (#142).
  • Transformer:
    • أضِف موقّت مراقبة لبرنامج الدمج من أجل رصد الحالات التي يكون فيها إنشاء عيّنة من الناتج بطيئًا جدًا.
  • إزالة الرموز المتوقفة نهائيًا:
    • إزالة 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)
  • واجهة المستخدم:
    • تأكَّد من أنّ ميزة 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 ستفترض عمليات التشغيل هذه شبكة 4G.
    • يمنع هذا الخيار تمرير null إلى MediaSource.Factory.setDrmSessionManagerProvider و MediaSource.Factory.setLoadErrorHandlingPolicy. يمكن تمرير مثيلات DefaultDrmSessionManagerProvider وDefaultLoadErrorHandlingPolicy بشكل صريح إذا لزم الأمر.
    • أضِف MediaItem.RequestMetadata لتمثيل البيانات الوصفية اللازمة لتشغيل الوسائط عندما لا يكون LocalConfiguration الدقيق معروفًا. يُرجى أيضًا إزالة MediaMetadata.mediaUrl لأنّ هذه السمة أصبحت مضمَّنة في RequestMetadata.
    • أضِف Player.Command.COMMAND_SET_MEDIA_ITEM لتمكين اللاعبين من السماح بضبط عنصر واحد.
  • اختيار المقطع الصوتي:
    • دمج فئة "TrackSelectionOverrides" في "TrackSelectionParameters"، وترقية "TrackSelectionOverride" إلى فئة من المستوى الأعلى
    • أعِد تسمية TracksInfo إلى Tracks وTracksInfo.TrackGroupInfo إلى Tracks.Group. تمت أيضًا إعادة تسمية Player.getCurrentTracksInfo وPlayer.Listener.onTracksInfoChanged إلى Player.getCurrentTracks وPlayer.Listener.onTracksChanged. ويشمل ذلك "إلغاء إيقاف نهائي" لاسم الطريقة Player.Listener.onTracksChanged، ولكن مع أنواع مَعلمات مختلفة.
    • يجب تغيير DefaultTrackSelector.buildUponParameters وDefaultTrackSelector.Parameters.buildUpon لعرض DefaultTrackSelector.Parameters.Builder بدلاً من DefaultTrackSelector.ParametersBuilder التي تم إيقافها نهائيًا.
    • أضِف DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities الذي يتم تفعيله تلقائيًا. عند تفعيل هذا الخيار، سيفضّل DefaultTrackSelector المقاطع الصوتية التي لا يتجاوز عدد قنواتها إمكانات إخراج الجهاز. على الأجهزة المحمولة، يفضّل DefaultTrackSelector تنسيقات الصوت الاستيريو/الأحادي على تنسيقات الصوت المتعدد القنوات، ما لم يكن التنسيق المتعدد القنوات مكانيًا (الإصدار 12L من Android والإصدارات الأحدث) أو تنسيق صوت محيطي من Dolby. بالإضافة إلى ذلك، على الأجهزة التي تتيح ميزة "تجسيم الصوت"، سيراقب DefaultTrackSelector التغييرات في خصائص Spatializer ويشغّل اختيار مقطع صوتي جديد بناءً على هذه التغييرات. يتم استبعاد الأجهزة التي تتضمّن television وضع واجهة المستخدم من هذه القيود، وسيتم تفضيل التنسيق الذي يتضمّن أكبر عدد من القنوات. لتفعيل هذه الميزة، يجب إنشاء مثيل DefaultTrackSelector باستخدام Context.
  • الفيديو:
    • تمّت إعادة تسمية DummySurface إلى PlaceholderSurface.
    • أضِف دعم AV1 إلى MediaCodecVideoRenderer.getCodecMaxInputSize.
  • الصوت:
    • استخدام برنامج فك ترميز الصوت LG AC3 الذي يعلن عن نوع MIME غير عادي
    • يجب تغيير نوع القيمة التي تم إرجاعها من AudioAttributes.getAudioAttributesV21() من android.media.AudioAttributes إلى فئة تضمين AudioAttributesV21 جديدة، لمنع بطء عملية التحقّق من وقت تشغيل Android على واجهة برمجة التطبيقات < 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)
  • واجهة المستخدم:
    • تم إصلاح مشكلة تسليم الأحداث إلى 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 بشكل صريح إذا لزم الأمر.
  • البث السلس:
    • يمنع هذا الخيار تمرير null إلى SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. يمكن تمرير مثيلات DefaultCompositeSequenceableLoaderFactory بشكل صريح إذا لزم الأمر.
  • RTSP:
    • إضافة قارئ RTP لـ H263 (#63)
    • إضافة قارئ RTP لـ MPEG4 (#35)
    • إضافة قارئ RTP لـ HEVC (#36)
    • إضافة قارئ RTP لملفات AMR في الوقت الحالي، لا تتوفّر سوى أحادية القناة وغير المتداخلة تدعم التدفقات. لا تتوفّر حمولة AMR RTP المركّبة. (#46)
    • تمت إضافة قارئ RTP لـ VP8 (#47).
    • إضافة قارئ RTP لملفات WAV (#56)
    • تم إصلاح عنوان المصادقة الأساسية لبروتوكول RTSP. (#9544).
    • تم إيقاف التحقّق من حقول SDP الإلزامية لأنّ ExoPlayer لا يحتاج إليها (#10049).
    • تم طرح استثناء محدّد عند تحليل توقيت RTSP (#10165).
    • تمت إضافة قارئ RTP لبرنامج الترميز VP9 (#47).
    • تمت إضافة قارئ RTP لـ OPUS (#53).
  • مصادر البيانات:
    • تمّت إعادة تسمية DummyDataSource إلى PlaceholderDataSource.
    • الحل البديل لمعالجة المقاطعة في OkHttp
  • الجلسة:
    • استبدِل MediaSession.MediaItemFiller بـ MediaSession.Callback.onAddMediaItems للسماح بالحل غير المتزامن للطلبات.
    • توفير طرق setMediaItems(s) عند اتصال MediaController بجلسة وسائط قديمة
    • إزالة MediaController.setMediaUri وMediaSession.Callback.onSetMediaUri يمكن تحقيق الوظيفة نفسها باستخدام MediaController.setMediaItem وMediaSession.Callback.onAddMediaItems.
    • إعادة توجيه المكالمات عبر ميزة الاتصال السابقة في "MediaController" لتشغيل الوسائط على "MediaSession.Callback.onAddMediaItems" بدلاً من "onSetMediaUri"
    • أضِف MediaNotification.Provider وDefaultMediaNotificationProvider لتخصيص الإشعار.
    • أضِف BitmapLoader وSimpleBitmapLoader لتنزيل صور الأعمال الفنية.
    • أضِف MediaSession.setCustomLayout() لتوفير التوافق مع الأنظمة القديمة مع الجلسة القديمة.
    • أضِف MediaSession.setSessionExtras() لتوفير ميزات مماثلة لتلك المتوفّرة في الجلسة القديمة.
    • أعِد تسمية MediaSession.MediaSessionCallback إلى MediaSession.Callback، وMediaLibrarySession.MediaLibrarySessionCallback إلى MediaLibrarySession.Callback و MediaSession.Builder.setSessionCallback إلى setCallback.
    • تم إصلاح استثناء المؤشر الفارغ (NPE) في MediaControllerImplLegacy (#59).
    • تعديل معلومات موضع الجلسة عند تغيير المخطط الزمني(#51)
    • تم إصلاح NPE في MediaControllerImplBase بعد إصدار وحدة التحكّم (#74).
  • تشغيل الإعلانات / IMA:
    • خفض معدّل استطلاع الإعلانات من كل 100 ملي ثانية إلى كل 200 ملي ثانية، ليتماشى مع توصيات مجلس تقييم وسائل الإعلام (MRC).
  • إضافة FFmpeg:
    • يجب تحديث إصدار CMake إلى 3.21.0+ لتجنُّب حدوث خطأ في CMake يؤدي إلى تعذُّر مزامنة Gradle في AndroidStudio (#9933).
  • إزالة الرموز المتوقفة نهائيًا:
    • إزالة Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray) يمكنك استخدام Player.Listener.onTracksChanged(Tracks) كبديل.
    • إزالة Player.getCurrentTrackGroups وPlayer.getCurrentTrackSelections يمكنك استخدام Player.getCurrentTracks كبديل. يمكنك أيضًا مواصلة استخدام ExoPlayer.getCurrentTrackGroups وExoPlayer.getCurrentTrackSelections، على الرغم من أنّ هاتين الطريقتين لا تزالان متوقفتين نهائيًا.
    • تمّت إزالة الثوابت DownloadHelper DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT و DEFAULT_TRACK_SELECTOR_PARAMETERS. يُرجى استخدام getDefaultTrackSelectorParameters(Context) بدلاً من ذلك إن أمكن، وDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT في الحالات الأخرى.
    • إزالة الدالة الإنشائية DefaultTrackSelector(ExoTrackSelection.Factory) يمكنك استخدام DefaultTrackSelector(Context, ExoTrackSelection.Factory) كبديل.
    • إزالة Transformer.Builder.setContext يجب تمرير Context إلى الدالة الإنشائية Transformer.Builder بدلاً من ذلك.

الإصدار ‎1.0.0-alpha03

‫14 مارس 2022

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

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

  • الصوت:
    • تم إصلاح خطأ في التحقّق من إمكانات الصوت في Dolby Atmos‏ (E-AC3-JOC) في HLS.
  • أدوات الاستخراج:
    • ‫FMP4: تم إصلاح مشكلة احتمال إخراج البيانات الوصفية لعيّنة emsg بترتيب خاطئ في أحداث البث التي تحتوي على كل من v0 وv1 emsg atoms (#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.

  • المكتبة الأساسية:
    • يجب إضافة الطريقة المحمية DefaultRenderersFactory.getCodecAdapterFactory() لتتمكّن الفئات الفرعية من DefaultRenderersFactory التي تلغي buildVideoRenderers() أو buildAudioRenderers() من الوصول إلى مصنع محوّل برنامج الترميز وتمريره إلى مثيلات MediaCodecRenderer التي تنشئها.
    • نشر حقول عناوين ICY‏ name وgenre إلى MediaMetadata.station وMediaMetadata.genre على التوالي حتى تصل إلى التطبيق عبر Player.Listener.onMediaMetadataChanged() (#9677).
    • أزِل المفاتيح الفارغة من DefaultHttpDataSource#getResponseHeaders.
    • يتم إيقاف العملية مؤقتًا وإعادة المحاولة في حال تعذُّر إنشاء مثيل MediaCodec. يؤدي ذلك إلى حلّ مشكلة تحدث على بعض الأجهزة عند تبديل سطح من برنامج ترميز آمن إلى برنامج ترميز آخر (‎#8696).
    • أضِف MediaCodecAdapter.getMetrics() للسماح للمستخدمين بالحصول على بيانات المقاييس من MediaCodec. (#9766).
    • تم إصلاح مشكلة حلّ تبعيات Maven (#8353).
    • إيقاف التعديل التلقائي للسرعة في أحداث البث المباشر التي لا تتضمّن ميزات وقت الاستجابة المنخفض أو إعدادًا يتيح للمستخدم ضبط السرعة (‎#9329)
    • تمّت إعادة تسمية DecoderCounters#inputBufferCount إلى queuedInputBufferCount.
    • جعل SimpleExoPlayer.renderers خاصة يمكن الوصول إلى أدوات العرض من خلال ExoPlayer.getRenderer.
    • تم تعديل بعض قيم AnalyticsListener.EventFlags الثابتة لتتطابق مع القيم في Player.EventFlags.
    • تقسيم AnalyticsCollector إلى واجهة وتنفيذ تلقائي للسماح بإزالته من خلال R8 إذا لم يكن التطبيق بحاجة إليه
  • اختيار المقطع الصوتي:
    • إتاحة علامات دور الفيديو المفضَّلة في اختيار المقطع الصوتي (#9402)
    • تعديل منطق اختيار مقاطع الفيديو ليأخذ في الاعتبار أنواع MIME المفضّلة وعلامات الأدوار عند اختيار مقاطع فيديو متعددة للتكيّف (#9519)
    • تعديل منطق اختيار مقاطع الفيديو والمسارات الصوتية لاختيار التنسيقات فقط للاختيارات التكيُّفية التي تتضمّن المستوى نفسه من وحدة فك الترميز والدعم على الأجهزة (#9565).
    • تعديل منطق اختيار مقطع الفيديو لتفضيل برامج الترميز الأكثر كفاءة إذا كانت برامج فك الترميز الأساسية المسرَّعة على الجهاز تتيح استخدام برامج ترميز متعددة (#4835)
    • تفضيل إعدادات المحتوى الصوتي المفضّلة (على سبيل المثال، المقطع الصوتي "التلقائي" أو مقطع صوتي يتطابق مع لغة الإعدادات المحلية للنظام) على قيود اختيار المقطع الصوتي الفنية (على سبيل المثال، نوع MIME المفضّل أو الحد الأقصى لعدد القنوات)
    • تم إصلاح مشكلة اختيار المسار حيث لم يؤدِّ إلغاء مجموعة مسارات واحدة إلى إيقاف مجموعات المسارات الأخرى من النوع نفسه (#9675).
    • تم إصلاح مشكلة في اختيار المقاطع الصوتية، حيث لا يتم تطبيق مزيج من عمليات إلغاء المقاطع الصوتية غير الفارغة والفارغة بشكل صحيح (#9649).
    • حظر تكرار TrackGroup في TrackGroupArray يمكن دائمًا تمييز TrackGroups من خلال ضبط id في دالة الإنشاء TrackGroup. يؤدي ذلك إلى إصلاح عطل يحدث عند استئناف التشغيل بعد تشغيل التطبيق في الخلفية مع إلغاء المسار النشط (#9718).
    • تم تعديل المنطق في AdaptiveTrackSelection للسماح بزيادة الجودة عند توفّر معدل نقل بيانات كافٍ في الشبكة حتى إذا كان التشغيل قريبًا جدًا من البث المباشر (#9784).
  • الفيديو:
    • تم إصلاح منطق الرجوع إلى برنامج فك الترميز في Dolby Vision لاستخدام برنامج فك ترميز H264/H265 متوافق إذا لزم الأمر.
  • الصوت:
    • تم إصلاح منطق الرجوع إلى أداة فك الترميز في Dolby Atmos ‏ (E-AC3-JOC) لاستخدام أداة فك ترميز E-AC3 متوافقة إذا لزم الأمر.
    • تغيير واجهات برمجة التطبيقات AudioCapabilities لطلب تمرير AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES بشكل صريح بدلاً من null
    • السماح بتخصيص عملية احتساب حجم ذاكرة التخزين المؤقت في AudioTrack من خلال إدخال AudioTrackBufferSizeProvider في DefaultAudioSink (#8891).
    • يُرجى إعادة محاولة إنشاء AudioTrack إذا كان حجم ذاكرة التخزين المؤقت المطلوب أكبر من 1 ميغابايت. (#9712).
  • أدوات الاستخراج:
    • ‫WAV: تمت إضافة إمكانية تشغيل أحداث بث RF64 (#9543).
    • تم إصلاح مشكلة التحليل غير الصحيح لوحدات H.265 SPS NAL (#9719).
    • تحليل تعليقات Vorbis (بما في ذلك METADATA_BLOCK_PICTURE) في ملفات Ogg Opus وOgg Vorbis
  • النص:
    • إضافة حقل MediaItem.SubtitleConfiguration.id يتم نشره في حقل Format.id لمقطع الترجمة الذي تم إنشاؤه من الإعدادات (#9673)
    • تمت إضافة دعم أساسي لترجمات WebVTT في حاويات Matroska (#9886).
    • منع Cea708Decoder من قراءة أكثر من الحجم المُعلَن عنه لكتلة الخدمة
  • إدارة الحقوق الرقمية:
    • ستتم إزالة playbackLooper من DrmSessionManager.(pre)acquireSession. عندما يستخدم أحد التطبيقات DrmSessionManager في MediaSource مخصّص، يجب تمرير playbackLooper إلى DrmSessionManager.setPlayer بدلاً من ذلك.
  • تشغيل الإعلانات / IMA:
    • إضافة إمكانية استخدام إدراج الإعلان الديناميكي (DAI) في IMA (#8213)
    • إضافة طريقة إلى AdPlaybackState للسماح بإعادة ضبط مجموعة إعلانية لكي يتم تشغيلها مرة أخرى (#9615)
    • فرض سرعة تشغيل تبلغ 1.0 أثناء تشغيل الإعلان (#9018).
    • تم إصلاح مشكلة تؤدي إلى إعادة ضبط التشغيل فورًا في حال تعذّر تحميل مجموعة إعلانية (#9929).
  • واجهة المستخدم:
    • تم إصلاح لون الأرقام في زرَّي الترجيع والتقديم السريع في StyledPlayerView عند استخدام مظاهر معيّنة (#9765).
    • ترجمة سلاسل سرعة التشغيل بشكل صحيح (#9811)
  • DASH:
    • إضافة السمات الأساسية والتكميلية التي تم تحليلها إلى Representation (#9579).
    • إتاحة دور المسار forced-subtitle (#9727).
    • إيقاف تفسير دور المقطع الصوتي "main" على أنّه "C.SELECTION_FLAG_DEFAULT"
    • تم إصلاح منطق استبعاد الجزء الأساسي من عنوان URL لملفات البيان التي لا تعلن عن مساحة اسم DVB (#9856).
    • إتاحة عناوين URL النسبية لـ MPD.Location (#9939)
  • HLS:
    • تمت تعبئة Format.label بشكل صحيح لعمليات بث HLS الصوتية فقط (#9608).
    • استخدِم الإعداد بدون أجزاء بشكل تلقائي لتحسين وقت بدء التشغيل. إذا كانت النُسخ تحتوي على مسارات ترجمة وشرح مدمجة غير مُدرَجة في قائمة التشغيل الرئيسية، يجب إضافتها إلى قائمة التشغيل الرئيسية لتكون متاحة للتشغيل، أو إيقاف ميزة "الإعداد بدون تقسيم" باستخدام HlsMediaSource.Factory.setAllowChunklessPreparation(false).
    • إتاحة البحث الدقيق في الإطارات الرئيسية في HLS (#2882)
  • RTSP:
    • توفير واجهة برمجة تطبيقات للعميل لتجاوز SocketFactory المستخدَم لأي اتصال بالخادم (#9606)
    • تفضيل طريقة مصادقة DIGEST على BASIC في حال توفّر كليهما (#9800)
    • تمت معالجة مشكلة عدم توفّر توقيت المقطع الصوتي في بروتوكول RTSP (#9775).
    • تجاهُل قيم عنوان RTP-Info غير الصالحة (#9619)
  • Transformer:
    • زيادة الحد الأدنى المطلوب لإصدار واجهة برمجة التطبيقات إلى 21
    • يُستخدَم TransformationException الآن لوصف الأخطاء التي تحدث أثناء عملية التحويل.
    • أضِف TransformationRequest لتحديد خيارات التحويل.
    • السماح بتسجيل عدة مستمعين
    • تم إصلاح مشكلة توقُّف Transformer عن العمل عند قراءة مخرجات برنامج الترميز جزئيًا.
    • إصلاح استثناء NPE المحتمل في Transformer.getProgress عند إصدار استثناءات المُضاعِف
    • أضِف تطبيقًا تجريبيًا لتطبيق عمليات التحويل.
  • إضافة MediaSession:
    • تلقائيًا، يمحو "MediaSessionConnector" الآن قائمة التشغيل عند الإيقاف. يمكن للتطبيقات التي تريد الاحتفاظ بقائمة التشغيل استدعاء setClearMediaItemsOnStop(false) على الموصِّل.
  • إضافة Cast:
    • تم إصلاح خلل كان يمنع CastPlayer من استدعاء onIsPlayingChanged بشكل صحيح (#9792).
    • إتاحة البيانات الوصفية الصوتية، بما في ذلك الأعمال الفنية، باستخدام DefaultMediaItemConverter (#9663).
  • إضافة FFmpeg:
    • تم جعل build_ffmpeg.sh يعتمد على أدوات bin في LLVM بدلاً من أدوات GNU (#9933).
  • التوافق مع Android 12:
    • يجب ترقية إضافة Cast لتعتمد على com.google.android.gms:play-services-cast-framework:20.1.0. الإصدارات السابقة من play-services-cast-framework غير متوافقة مع التطبيقات التي تستهدف Android 12، وستتعطّل مع ظهور IllegalArgumentException عند إنشاء PendingIntent (#9528).
  • إزالة الرموز المتوقفة نهائيًا:
    • إزالة Player.EventListener يمكنك استخدام Player.Listener كبديل.
    • إزالة MediaSourceFactory#setDrmSessionManager وMediaSourceFactory#setDrmHttpDataSourceFactory وMediaSourceFactory#setDrmUserAgent يمكنك استخدام MediaSourceFactory#setDrmSessionManagerProvider كبديل.
    • إزالة MediaSourceFactory#setStreamKeys يمكنك استخدام MediaItem.Builder#setStreamKeys كبديل.
    • إزالة MediaSourceFactory#createMediaSource(Uri) يمكنك استخدام MediaSourceFactory#createMediaSource(MediaItem) كبديل.
    • إزالة setTag من DashMediaSource وHlsMediaSource وSsMediaSource يمكنك استخدام MediaItem.Builder#setTag كبديل.
    • إزالة DashMediaSource#setLivePresentationDelayMs(long, boolean) استخدِم MediaItem.Builder#setLiveConfiguration و MediaItem.LiveConfiguration.Builder#setTargetOffsetMs لتجاوز البيان، أو DashMediaSource#setFallbackTargetLiveOffsetMs لتقديم قيمة احتياطية.
    • إزالة (Simple)ExoPlayer.setThrowsWhenUsingWrongThread لم يعُد من الممكن إيقاف إجراءات التنفيذ على مستوى سلسلة المحادثات.
    • إزالة ActionFile وActionFileUpgradeUtil استخدِم ExoPlayer 2.16.1 أو إصدارًا أقدم لاستخدام ActionFileUpgradeUtil لدمج ملفات الإجراءات القديمة في DefaultDownloadIndex.
    • إزالة ProgressiveMediaSource#setExtractorsFactory استخدِم الدالة الإنشائية ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory) بدلاً من ذلك.
    • إزالة ProgressiveMediaSource.Factory#setTag وProgressiveMediaSource.Factory#setCustomCacheKey يُرجى استخدام MediaItem.Builder#setTag وMediaItem.Builder#setCustomCacheKey بدلاً من ذلك.
    • تمّت إزالة الدالتين الإنشائيتين DefaultRenderersFactory(Context, @ExtensionRendererMode int) وDefaultRenderersFactory(Context, @ExtensionRendererMode int, long). استخدِم الدالة الإنشائية DefaultRenderersFactory(Context) وDefaultRenderersFactory#setExtensionRendererMode وDefaultRenderersFactory#setAllowedVideoJoiningTimeMs بدلاً من ذلك.
    • أزِل جميع دوال الإنشاء العامة من النوع CronetDataSource. يمكنك استخدام CronetDataSource.Factory كبديل.
  • تغيير IntDefs التالية إلى @Target(TYPE_USE) فقط قد يؤدي ذلك إلى تعطُّل عملية تجميع الاستخدامات في لغة Kotlin، ويمكن حلّ هذه المشكلة من خلال نقل التعليق التوضيحي لإضافة تعليق توضيحي إلى النوع (Int).
    • @AacAudioObjectType
    • @Ac3Util.SyncFrameInfo.StreamType
    • @AdLoadException.Type
    • @AdtsExtractor.Flags
    • @AmrExtractor.Flags
    • @AspectRatioFrameLayout.ResizeMode
    • @AudioFocusManager.PlayerCommand
    • @AudioSink.SinkFormatSupport
    • @BinarySearchSeeker.TimestampSearchResult.Type
    • @BufferReplacementMode
    • @C.BufferFlags
    • @C.ColorRange
    • @C.ColorSpace
    • @C.ColorTransfer
    • @C.CryptoMode
    • @C.Encoding
    • @C.PcmEncoding
    • @C.Projection
    • @C.SelectionReason
    • @C.StereoMode
    • @C.VideoOutputMode
    • @CacheDataSource.Flags
    • @CaptionStyleCompat.EdgeType
    • @DataSpec.Flags
    • @DataSpec.HttpMethods
    • @DecoderDiscardReasons
    • @DecoderReuseResult
    • @DefaultAudioSink.OutputMode
    • @DefaultDrmSessionManager.Mode
    • @DefaultTrackSelector.SelectionEligibility
    • @DefaultTsPayloadReaderFactory.Flags
    • @EGLSurfaceTexture.SecureMode
    • @EbmlProcessor.ElementType
    • @ExoMediaDrm.KeyRequest.RequestType
    • @ExtensionRendererMode
    • @Extractor.ReadResult
    • @FileTypes.Type
    • ‫@FlacExtractor.Flags (في حزمة com.google.android.exoplayer2.ext.flac)
    • ‫@FlacExtractor.Flags (في حزمة com.google.android.exoplayer2.extractor.flac)
    • @FragmentedMp4Extractor.Flags
    • @HlsMediaPlaylist.PlaylistType
    • @HttpDataSourceException.Type
    • @IllegalClippingException.Reason
    • @IllegalMergeException.Reason
    • @LoadErrorHandlingPolicy.FallbackType
    • @MatroskaExtractor.Flags
    • @Mp3Extractor.Flags
    • @Mp4Extractor.Flags
    • @NotificationUtil.Importance
    • @PlaybackException.FieldNumber
    • @PlayerNotificationManager.Priority
    • @PlayerNotificationManager.Visibility
    • @PlayerView.ShowBuffering
    • @Renderer.State
    • @RendererCapabilities.AdaptiveSupport
    • @RendererCapabilities.Capabilities
    • @RendererCapabilities.DecoderSupport
    • @RendererCapabilities.FormatSupport
    • @RendererCapabilities.HardwareAccelerationSupport
    • @RendererCapabilities.TunnelingSupport
    • @SampleStream.ReadDataResult
    • @SampleStream.ReadFlags
    • @StyledPlayerView.ShowBuffering
    • @SubtitleView.ViewType
    • @TextAnnotation.Position
    • @TextEmphasisSpan.MarkFill
    • @TextEmphasisSpan.MarkShape
    • @Track.Transformation
    • @TrackOutput.SampleDataPart
    • @Transformer.ProgressState
    • @TsExtractor.Mode
    • @TsPayloadReader.Flags
    • @WebvttCssStyle.FontSizeUnit

الإصدار ‎1.0.0-alpha01

‫27 أكتوبر 2021

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

الميزات الجديدة

‫Media3 هي الوجهة الجديدة لمكتبات دعم الوسائط، بما في ذلك ExoPlayer. يحتوي الإصدار الأولي الأول على عمليات تنفيذ مبكرة وعملية للمكتبات لتنفيذ حالات استخدام الوسائط، بما في ذلك:

  • ‫ExoPlayer هو مشغّل وسائط على مستوى التطبيق لنظام التشغيل Android، وهو سهل التخصيص والتوسيع.
  • وظائف جلسة الوسائط لعرض عمليات التشغيل والتحكّم فيها تستخدم وحدة الجلسة الجديدة هذه واجهة Player نفسها التي تستخدمها ExoPlayer.
  • مكوّنات واجهة المستخدم لإنشاء واجهات مستخدم لتشغيل الوسائط
  • الوحدات التي تدمج الوظائف في مكتبات أخرى لاستخدامها مع ExoPlayer، مثل إدراج الإعلانات من خلال حزمة تطوير البرامج للإعلانات التفاعلية (IMA SDK)

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

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