الوسائط 3

مكتبات الدعم لحالات استخدام الوسائط
التعديل الأخير الإصدار المستقر إصدار مرشح الإصدار التجريبي إصدار ألفا
12 نيسان (أبريل) 2024 1.3.1 - - 1.4.0-alpha01

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

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

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

رائع

dependencies {
    def media3_version = "1.3.1"

    // For media playback using ExoPlayer
    implementation "androidx.media3:media3-exoplayer:$media3_version"

    // For DASH playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
    // For HLS playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
    // For SmoothStreaming playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version"
    // For RTSP playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation "androidx.media3:media3-exoplayer-midi:$media3_version"
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-ima:$media3_version"

    // For loading data using the Cronet network stack
    implementation "androidx.media3:media3-datasource-cronet:$media3_version"
    // For loading data using the OkHttp network stack
    implementation "androidx.media3:media3-datasource-okhttp:$media3_version"
    // For loading data using librtmp
    implementation "androidx.media3:media3-datasource-rtmp:$media3_version"

    // For building media playback UIs
    implementation "androidx.media3:media3-ui:$media3_version"
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation "androidx.media3:media3-ui-leanback:$media3_version"

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

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

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

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

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

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

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

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

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

Kotlin

dependencies {
    val media3_version = "1.3.1"

    // For media playback using ExoPlayer
    implementation("androidx.media3:media3-exoplayer:$media3_version")

    // For DASH playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-dash:$media3_version")
    // For HLS playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-hls:$media3_version")
    // For SmoothStreaming playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version")
    // For RTSP playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version")
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation("androidx.media3:media3-exoplayer-midi:$media3_version")
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-ima:$media3_version")

    // For loading data using the Cronet network stack
    implementation("androidx.media3:media3-datasource-cronet:$media3_version")
    // For loading data using the OkHttp network stack
    implementation("androidx.media3:media3-datasource-okhttp:$media3_version")
    // For loading data using librtmp
    implementation("androidx.media3:media3-datasource-rtmp:$media3_version")

    // For building media playback UIs
    implementation("androidx.media3:media3-ui:$media3_version")
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation("androidx.media3:media3-ui-leanback:$media3_version")

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

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

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

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

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

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

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

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

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

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

ملاحظات

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

الإصدار 1.4.0

الإصدار 1.4.0-alpha01

17 نيسان (أبريل) 2024

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

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

الإصدار 1.3.0

الإصدار 1.3.1

11 نيسان (أبريل) 2024

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

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

الإصدار 1.3.0

‫6 مارس 2024

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

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

الإصدار 1.3.0-rc01

22 شباط (فبراير) 2024

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

الإصدار 1.3.0-beta01

7 شباط (فبراير) 2024

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

الإصدار 1.3.0-alpha01

15 كانون الثاني (يناير) 2024

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

الإصدار 1.2.0

الإصدار 1.2.1

9 كانون الثاني (يناير) 2024

  • ExoPlayer:
    • يجب حل المشكلة التي تؤدي فيها عمليات التقديم اليدوي إلى خارج نطاق LiveConfiguration.min/maxOffset مع مواصلة ضبط الإزاحة على min/maxOffset.
    • حلّ مشكلة عدم صحة تنسيقات قنوات OPUS وVORBIS في القنوات الثلاث و5 و6 و7 و8 قنوات (#8396)
    • يجب حلّ المشكلة التي تمنع اختيارات المقاطع الصوتية من بدء بث مباشر من موضعه التلقائي (#9347) بشكل غير صحيح.
    • يمكنك إصلاح المشكلة التي كانت تؤدي فيها الحالات الجديدة لـ CmcdData.Factory إلى تلقّي قيم سلبية لـ bufferedDurationUs من مصادر المقاطع، ما أدى إلى ظهور الخطأ IllegalArgumentException (#888).
  • المحوِّل:
    • التغلب على مشكلة متعلقة ببرنامج الترميز في وقت التهيئة بسبب ضبط معدل تشغيل مرتفع.
  • أدوات استخراج البيانات:
    • يمكنك وضع علامة ROLE_FLAG_ALTERNATE على مسارات HEVC الثانوية (غير القابلة للتشغيل) في الصور الحيّة بتنسيق JPEG كي لا يتم اختيارها لتشغيلها تلقائيًا بسبب ارتفاع درجة دقتها.
    • إصلاح الأخطاء في رصد الإطارات الرئيسية لمجموعات بث TS H264 (#864)
    • إصلاح تقدير مدة أحداث بث TS التي تزيد مدتها عن 47721 ثانية (#855)
  • الصوت:
    • يمكنك إصلاح معالجة EOS لـ SilenceSkippingAudioProcessor عند طلبها عدة مرات (#712).
  • الفيديو:
    • يمكنك إضافة حل لمشكلة الجهاز في أجهزة Galaxy Tab S7 FE وChromecast مع Google TV وLenovo M10 FHD Plus، والتي تؤدي إلى وضع علامة على عمليات بث AVC بسرعة 60 لقطة في الثانية (#693).
  • البيانات الوصفية:
    • إصلاح الخطأ الذي كانت تتم فيه تعبئة MediaMetadata فقط من تعليقات Vorbis التي تستخدم مفاتيح الأحرف الكبيرة (#876)
    • يمكنك اكتشاف OutOfMemoryError عند تحليل إطارات ID3 كبيرة جدًا، ما يعني إمكانية استمرار التشغيل بدون معلومات العلامة بدلاً من تعذُّر التشغيل تمامًا.
  • إدارة الحقوق الرقمية:
    • يمكنك توسيع الحل البديل لعنوان URL كاذب لترخيص GreenKey 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).
  • واجهة المستخدم:
    • حل المشكلة التي تؤدي إلى عدم ظهور زرَّي التقديم والترجيع عند استخدامهما مع Material Design في BottomSheetDialogFragment (#511).
    • إصلاح المشكلة التي كانت تؤدي فيها الأرقام في زر التقديم السريع في PlayerControlView إلى المحاذاة بشكل غير صحيح (#547).
  • إضافة DASH:
    • تحليل "f800" كعدد القنوات من 5 إلى Dolby في بيان DASH (#688).
  • إضافات برامج فك الترميز (FFmpeg وVP9 وAV1 وMIDI وغير ذلك):
    • MIDI: إصلاح المشكلة التي تؤدي فيها التقديم/الترجيع إلى تخطّي أحداث "تغيير البرنامج" (#704)
    • عليك نقل البيانات إلى FFmpeg 6.0 وتحديث NDK المتوافق إلى r26b (#707 أو #867).
  • إضافة البث:
    • يمكنك تصحيح إنشاء Timeline لعدم تعطُّل التطبيق عند تعذُّر تحميل الوسائط على جهاز البث (#708).

الإصدار 1.2.0

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

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

الإصدار 1.2.0-rc01

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

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

الإصدار 1.2.0-beta01

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

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

الإصدار 1.2.0-alpha02

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

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

الإصدار 1.2.0-alpha01

17 آب (أغسطس) 2023

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

الإصدار 1.1.0

الإصدار 1.1.1

16 آب (أغسطس) 2023

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

الإصدار 1.1.0

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

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

الإصدار 1.1.0-rc01

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

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

الإصدار 1.1.0-beta01

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

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

الإصدار 1.1.0-alpha01

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

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

الإصدار 1.0.0

الإصدار 1.0.2

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

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

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

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

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

الإصدار 1.0.1

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

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

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

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

الإصدار 1.0.0

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

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

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

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

الإصدار 1.0.0-rc02

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

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

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

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

الإصدار 1.0.0-rc01

16 شباط (فبراير) 2023

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

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

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

الإصدار 1.0.0-beta03

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

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

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

  • المكتبة الأساسية:
    • أضف ExoPlayer.isTunnelingEnabled للتحقق مما إذا كان الاتصال النفقي مفعَّلاً للمسارات المحددة حاليًا (#2518).
    • أضف WrappingMediaSource لتبسيط التفاف MediaSource واحد (#7279).
    • تجاهل المخزن المؤقت العكسي قبل أن يتعطل التشغيل بسبب عدم كفاية الذاكرة المتاحة.
    • يمكنك إغلاق كتلة التتبُّع "doSomeWork" عند تفعيل عملية الإزاحة.
    • إصلاح مشكلة تتبع الجلسات من خلال عمليات التقديم السريع في PlaybackStatsListener (#180).
    • يجب إرسال معاودة الاتصال بـ "onMediaItemTransition" عند الاتصال بالرقم seekToNext أو "seekToPrevious" في قائمة تشغيل تتضمّن عنصرًا واحدًا (#10667).
    • أضِف علامة Player.getSurfaceSize التي تعرض حجم السطح الذي يُعرَض الفيديو عليه.
    • إصلاح الخطأ حيث يمكن أن تؤدي إزالة أدوات المستمعين أثناء إصدار المشغّل إلى عرض IllegalStateException (#10758)
  • الإصدار:
    • فرض الحد الأدنى من compileSdkVersion لتجنب أخطاء التحويل البرمجي (#10684).
    • تجنَّب نشر الحظر عند تضمينه في إصدار آخر من Grale.
  • اختيار المقطع الصوتي:
    • تفضيل المسارات الأخرى على تقنية Dolby Vision إذا كانت الشاشة لا تتيح ذلك (#8944).
  • عمليات التنزيل:
    • إصلاح التكرار اللانهائي المحتمل في ProgressiveDownloader الناتج عن التنزيل والتشغيل المتزامنين باستخدام PriorityTaskManager نفسه (#10570).
    • إظهار إشعار التنزيل فورًا (#183).
    • يمكنك قصر عمليات إزالة عمليات التنزيل المتوازية على 1 لتجنُّب الإفراط في إنشاء سلاسل المحادثات (#10458).
  • الفيديو:
    • جرِّب برنامج فك ترميز بديل لـ Dolby Vision إذا كانت الشاشة لا تتيحه. (#9794).
  • الصوت:
    • استخدِم SingleThreadExecutor لإصدار AudioTrack مثيلات لتجنُّب حدوث أخطاء بسبب نفاد الذاكرة عند إصدار عدة مشغّلات في وقت واحد (#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) لتحديد ما إذا كان العارض سينتج البيانات الوصفية في وقت مبكر أو متزامنًا مع موضع المشغّل.
  • إدارة الحقوق الرقمية:
    • التغلب على خطأ في تنفيذ أداة ClickKey على 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 يمكنه تحميل الصورة النقطية من file:// URIs (#108).
    • إصلاح التأكيد الذي يمنع MediaController من البحث عن الإعلان خلال فترة معيّنة (#122)
    • عند انتهاء التشغيل، يتم إيقاف MediaSessionService من المقدمة ويظهر إشعار بإعادة تشغيل آخر عنصر وسائط تم تشغيله (#112).
    • عدم بدء خدمة تعمل في المقدّمة بهدف إيقاف مؤقت مؤقتًا (#167)
    • إخفاء "الشارة" يدويًا المرتبطة بالإشعار الذي تم إنشاؤه من خلال DefaultNotificationProvider على واجهة برمجة التطبيقات 26 و27 لواجهة برمجة التطبيقات (يتم إخفاء الشارة تلقائيًا على الإصدار 28 من واجهة برمجة التطبيقات والإصدارات الأحدث) (#131).
    • إصلاح الخطأ الذي يؤدي إلى تسبب اتصال الصنف الثاني من MediaSession قديم إلى Media3 MediaController في عدم تحديد نوع الخطأ legalStateExceptions (#49)
  • بروتوكول RTSP:
    • إضافة معالجة الحزمة المجزأة باستخدام H263 (#119)
    • إضافة دعم MP4A-LATM (#162).
  • إعلانات الوسائط التفاعلية:
    • أضف مهلة لتحميل معلومات الإعلان لمعالجة الحالات التي تتعثر فيها أداة تطوير البرامج لإعلانات الوسائط التفاعلية في تحميل أحد الإعلانات (#10510).
    • منع تخطّي الإعلانات أثناء التشغيل عند الانتقال إلى نهاية المحتوى (#10685)
    • احسب مدة المهلة بشكل صحيح لأحداث البث المباشر التي تتضمن إعلانات مُدرَجة من جهة الخادم، على سبيل المثال، إعلان IMA DAI (#10764).
  • إضافة FFmpeg:
    • أضِف العلامات المطلوبة حديثًا لربط مكتبات FFmpeg مع NDK 23.1.7779620 أو الإصدارات الأحدث (#9933).
  • إضافة AV1:
    • يجب تحديث إصدار CMake لتجنّب حالات عدم التوافق مع أحدث إصدارات Android Studio (#9933).
  • إضافة البث:
    • نفِّذ getDeviceInfo() لتتمكَّن من تحديد CastPlayer عند التحكّم في التشغيل باستخدام MediaController (#142).
  • المحوِّل:
    • أضِف موقّت مراقب النظام لرصد الوقت الذي يكون فيه إنشاء نموذج ناتج بطيء جدًا.
  • أزِل الرموز المتوقّفة نهائيًا:
    • إزالة Transformer.Builder.setOutputMimeType(String) لقد تمت إزالة هذه الميزة. سيكون نوع MIME دائمًا MP4 عند استخدام أداة المزج التلقائية.

الإصدار 1.0.0-beta02

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

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

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

  • المكتبة الأساسية:
    • عليك التأكّد من أنّ تغيير ShuffleOrder باستخدام ExoPlayer.setShuffleOrder يؤدي إلى طلب الإجراء Player.Listener#onTimelineChanged باستخدام reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • بالنسبة إلى الوسائط المتتالية، يجب تضمين المقاطع الصوتية المحددة فقط في موضع التخزين المؤقت (#10361).
    • السماح بتسجيل مخصص لجميع مُخرجات سجلات ExoPlayer (#9752).
    • إصلاح تنفيذ setDataSourceFactory في DefaultMediaSourceFactory، والذي كان لا يعمل في بعض الحالات (#116).
  • أدوات استخراج البيانات:
    • إصلاح تحليل مجموعات الصور المرجعية القصيرة المدى لـ H265 (#10316).
    • إصلاح تحليل معدلات نقل البيانات من مربعات esds (#10381).
  • DASH:
    • تحليل عنوان URL لترخيص ClickKey من البيانات (#10246).
  • واجهة المستخدم:
    • تأكَّد من أنّ ميزة TalkBack تعلن عن خيار السرعة النشِطة حاليًا في قائمة عناصر التحكّم في التشغيل (#10298).
  • بروتوكول RTSP:
    • إضافة معالجة الحزمة المجزأة VP8 (#110).
  • إضافة Leanback:
    • يمكنك الاستماع إلى تغييرات playWhenReady في LeanbackAdapter (10420).
  • طاقم العمل:
    • استخدِم MediaItem الذي تم ضبطه على طرق قائمة التشغيل كـ Window.mediaItem في CastTimeline (#25, #8212).
    • دعم Player.getMetadata() وListener.onMediaMetadataChanged() مع CastPlayer (#25).

الإصدار 1.0.0-beta01

16 حزيران (يونيو) 2022

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

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

  • المكتبة الأساسية:
    • فعِّل بيانات تشخيص نظام Android الأساسي من خلال MediaMetricsManager. سيعيد ExoPlayer توجيه أحداث التشغيل وبيانات الأداء إلى المنصة، ما يساعد في توفير أداء النظام ومعلومات تصحيح الأخطاء على الجهاز. ويمكن أن تجمع Google هذه البيانات أيضًا في حال تفعيل مشاركة بيانات الاستخدام والتشخيص من قِبل مستخدم الجهاز. يمكن للتطبيقات إيقاف إمكانية المساهمة في بيانات تشخيص النظام الأساسي لمنصة ExoPlayer من خلال ExoPlayer.Builder.setUsePlatformDiagnostics(false).
    • إصلاح الخطأ الذي يؤدي إلى إعادة ضبط المقاطع الصوتية بشكل متكرّر عند استخدام MergingMediaSource، مثل تثبيت الترجمة من مصدر غير معروف وتغيير العنوان الفرعي في منتصف التشغيل (#10248).
    • يمكنك إيقاف رصد نوع شبكة 5G-NSA على واجهة برمجة التطبيقات 29 و30. وستفترض عمليات التشغيل هذه توفّر شبكة من الجيل الرابع.
    • عدم السماح بمرور null إلى MediaSource.Factory.setDrmSessionManagerProvider و MediaSource.Factory.setLoadErrorHandlingPolicy. ويمكن تمرير مثيلات DefaultDrmSessionManagerProvider وDefaultLoadErrorHandlingPolicy بشكل صريح إذا لزم الأمر.
    • أضِف MediaItem.RequestMetadata لتمثيل البيانات الوصفية اللازمة لتشغيل الوسائط عندما يكون عنصر LocalConfiguration غير معروف. إزالة MediaMetadata.mediaUrl أيضًا لأنّها مضمّنة الآن في RequestMetadata.
    • أضِف Player.Command.COMMAND_SET_MEDIA_ITEM للسماح للّاعبين بالسماح بإعداد عنصر واحد.
  • اختيار المقطع الصوتي:
    • تنظيم صف TrackSelectionOverrides ضمن TrackSelectionParameters، وترقية TrackSelectionOverride إلى صف عالي المستوى
    • إعادة تسمية TracksInfo إلى Tracks وTracksInfo.TrackGroupInfo إلى Tracks.Group. Player.getCurrentTracksInfo وPlayer.Listener.onTracksInfoChanged أيضًا إلى Player.getCurrentTracks وPlayer.Listener.onTracksChanged. ويشتمل ذلك على "إلغاء الإيقاف النهائي" لاسم طريقة Player.Listener.onTracksChanged، ولكن مع أنواع معلمات مختلفة.
    • غيِّر DefaultTrackSelector.buildUponParameters وDefaultTrackSelector.Parameters.buildUpon لعرض DefaultTrackSelector.Parameters.Builder بدلاً من DefaultTrackSelector.ParametersBuilder المتوقّفة.
    • يمكنك إضافة DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities المفعَّلة تلقائيًا. عند تفعيل هذه الميزة، سيفضّل DefaultTrackSelector المقاطع الصوتية التي لا يتجاوز عدد قنواتها إمكانات إخراج الجهاز. على الأجهزة المحمولة باليد، يفضّل "DefaultTrackSelector" الاستيريو/الأحادي على تنسيقات الصوت المتعدّدة القنوات، إلا إذا كان التنسيق متعدد القنوات محدّدًا مكانيًا (الإصدار 12L من نظام التشغيل Android والإصدارات الأحدث) أو هو تنسيق صوت محيطي بتقنية Dolby. بالإضافة إلى ذلك، على الأجهزة التي تتيح تحديد مكانية الصوت، سيراقب DefaultTrackSelector التغييرات التي تطرأ على خصائص المكانات المكانية وسيتم من خلالها اختيار مقطع صوتي جديد من خلال هذه الخصائص. يتم استبعاد الأجهزة التي تتضمّن television وضع واجهة المستخدم من هذه القيود، ويفضّل استخدام التنسيق الأعلى عدد القنوات. لتفعيل هذه الميزة، يجب إنشاء مثيل DefaultTrackSelector باستخدام Context.
  • الفيديو:
    • إعادة تسمية "DummySurface" إلى "PlaceholderSurface".
    • إضافة دعم AV1 إلى MediaCodecVideoRenderer.getCodecMaxInputSize.
  • الصوت:
    • استخدام برنامج فك ترميز الصوت من LG AC3 للإعلان عن نوع MIME غير عادي
    • يجب تغيير نوع إرجاع AudioAttributes.getAudioAttributesV21() من android.media.AudioAttributes إلى فئة برنامج تضمين AudioAttributesV21 جديدة لمنع عملية التحقق البطيئة ART على واجهة برمجة التطبيقات < 21.
    • اطلب البحث في النظام الأساسي (واجهة برمجة التطبيقات 29+ ) أو افترض أنّ عدد قنوات ترميز الصوت للتمرير الصوتي عند عدم ضبط تنسيق عدد القنوات الصوتية، ما يحدث عند إعداد HLS بدون مقاطع (10204).
    • اضبط AudioTrack باستخدام قناع القناة AudioFormat.CHANNEL_OUT_7POINT1POINT4 إذا كان برنامج فك الترميز يُخرج صوت PCM بـ 12 قناة (#10322.
  • إدارة الحقوق الرقمية
    • تأكَّد دائمًا من تحديث جلسة إدارة الحقوق الرقمية بشكل صحيح عند التقديم/الترجيع فورًا بعد تغيير التنسيق (10274).
  • النص:
    • غيِّر Player.getCurrentCues() لعرض CueGroup بدلاً من List<Cue>.
    • SSA: إتاحة إعداد النمط OutlineColour عند استخدام BorderStyle == 3 (أي أنّ OutlineColour يضبط خلفية الإشارة) (#8435).
    • CEA-708: تحليل البيانات في مجموعات خدمات متعدّدة وتجاهل الأجزاء غير المرتبطة برقم الخدمة المحدّد حاليًا
    • يمكنك إزالة السمة RawCcExtractor التي كانت تُستخدم فقط للتعامل مع تنسيق الترجمة الداخلية في Google.
  • أدوات استخراج البيانات:
    • إضافة دعم لـ AVI (#2092).
    • Matroska: تحليل DiscardPadding لمسارات Opus.
    • MP4: تحليل معدلات نقل البيانات من مربّعات esds
    • Ogg: السماح بتكرار Opus ID وعناوين التعليقات (#10038).
  • واجهة المستخدم:
    • إصلاح تسليم الأحداث إلى OnClickListener التي تم ضبطها في PlayerView في حال كانت useController=false (#9605). يجب أيضًا إصلاح تسليم الأحداث إلى OnLongClickListener لجميع إعدادات الملفات الشخصية.
    • إصلاح المعالجة غير الصحيحة لسلسلة من أحداث اللمس التي تخرج من حدود PlayerView قبل ACTION_UP كنقرة (#9861).
    • أصلح مشكلة إمكانية الوصول PlayerView التي قد يؤدي النقر عليها إلى تبديل التشغيل بدلاً من إخفاء عناصر التحكم (#8627).
    • أعِد كتابة TrackSelectionView وTrackSelectionDialogBuilder للعمل باستخدام واجهة Player بدلاً من ExoPlayer. ويسمح ذلك باستخدام طرق العرض مع عمليات تنفيذ Player الأخرى، ويزيل الاعتماد من وحدة واجهة المستخدم إلى وحدة ExoPlayer. هذا تغيير مقطع.
    • عدم إظهار مسارات النصوص المفروضة في أداة اختيار المسارات PlayerView، والإبقاء على تحديد مسار نص مفروض مناسب في حال تحديد "بدون" (#9432)
  • DASH:
    • تحليل عدد القنوات من عناصر AudioChannelConfiguration لبروتوكول DTS يؤدي هذا إلى إعادة تفعيل عبور الصوت لمجموعات البث DTS(#10159).
    • عدم السماح بمرور null إلى DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. ويمكن تمرير مثيلات DefaultCompositeSequenceableLoaderFactory بشكل صريح إذا لزم الأمر.
  • بروتوكول HLS:
    • يمكنك الرجوع إلى طريقة تحضير المقاطع الصوتية إذا كانت السمة CODECS لقائمة التشغيل لا تتضمن برنامج ترميز الصوت (#10065).
    • عدم السماح بمرور null إلى HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory وHlsMediaSource.Factory.setPlaylistParserFactory وHlsMediaSource.Factory.setPlaylistTrackerFactory ويمكن تمرير مثيلات DefaultCompositeSequenceableLoaderFactory أو DefaultHlsPlaylistParserFactory أو مرجع إلى DefaultHlsPlaylistTracker.FACTORY بشكل صريح إذا كان ذلك مطلوبًا.
  • البث السلس:
    • عدم السماح بمرور null إلى SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. ويمكن تمرير مثيلات DefaultCompositeSequenceableLoaderFactory صراحةً إذا لزم الأمر.
  • بروتوكول RTSP:
    • إضافة قارئ بروتوكول RTP لنظام H263 (#63)
    • إضافة قارئ بروتوكول RTP لنظام MPEG4 (#35)
    • أضِف قارئ RTP لـ HEVC (#36).
    • إضافة قارئ RTP في AMR في الوقت الحالي، لا يُسمَح حاليًا سوى بمشاهدة فيديوهات AMR ذات القنوات الأحادية وغير المتداخلة. لا يمكن استخدام حمولة البيانات المركبة من AMR RTP. (#46)
    • إضافة قارئ بروتوكول RTP لنظام VP8 (#47).
    • أضِف قارئ RTP لـ WAV (#56).
    • إصلاح عنوان تفويض RTSP الأساسي (#9544).
    • توقَّف عن التحقّق من حقول بروتوكول وصف الجلسة (SDP) الإلزامية لأنّ ExoPlayer لا تحتاج إليها (#10049).
    • عرض الاستثناء المحدد عند تحليل توقيت RTSP (#10165).
    • أضِف قارئ RTP لـ VP9 (#47).
    • أضِف قارئ RTP في OPUS (#53).
  • مصادر البيانات:
    • إعادة تسمية "DummyDataSource" إلى "PlaceholderDataSource".
    • حل مشكلة معالجة مقاطعة OkHttp.
  • الجلسة:
    • استبدِل MediaSession.MediaItemFiller بـ MediaSession.Callback.onAddMediaItems للسماح بحلّ الطلبات غير المتزامنة.
    • إتاحة طُرق setMediaItems(s) عند ربط MediaController بجلسة وسائط قديمة
    • إزالة MediaController.setMediaUri وMediaSession.Callback.onSetMediaUri يمكن تحقيق الوظيفة نفسها باستخدام MediaController.setMediaItem وMediaSession.Callback.onAddMediaItems.
    • يمكنك إعادة توجيه مكالمات MediaController القديمة لتشغيل الوسائط إلى MediaSession.Callback.onAddMediaItems بدلاً من onSetMediaUri.
    • أضِف MediaNotification.Provider وDefaultMediaNotificationProvider لتخصيص الإشعار.
    • أضِف BitmapLoader وSimpleBitmapLoader لتنزيل صور الأعمال الفنية.
    • أضِف MediaSession.setCustomLayout() لتوفير التوافق مع الأنظمة القديمة مع الجلسة القديمة.
    • أضِف MediaSession.setSessionExtras() لتوفير التكافؤ في الميزات مع الجلسة القديمة.
    • إعادة تسمية MediaSession.MediaSessionCallback إلى MediaSession.Callback، وMediaLibrarySession.MediaLibrarySessionCallback إلى MediaLibrarySession.Callback، وMediaSession.Builder.setSessionCallback إلى setCallback.
    • إصلاح NPE في MediaControllerImplLegacy (#59).
    • تعديل معلومات موضع الجلسة بشأن تغيير المخطط الزمني(#51).
    • إصلاح NPE في MediaControllerImplBase بعد إصدار وحدة التحكّم (#74).
  • تشغيل الإعلان / إعلانات الوسائط التفاعلية:
    • خفض معدّل استطلاع الإعلانات من كل 100 ملي ثانية إلى كل 200 ملي ثانية، للتوافق مع اقتراحات مجلس تقييم الوسائط (MRC)
  • إضافة FFmpeg:
    • يجب تحديث إصدار CMake إلى 3.21.0+ لتجنُّب خطأ CMake الذي يؤدي إلى تعذُّر مزامنة Gradle في AndroidStudio (#9933).
  • أزِل الرموز المتوقّفة نهائيًا:
    • إزالة Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray) استخدِم Player.Listener.onTracksChanged(Tracks) بدلاً من ذلك.
    • إزالة Player.getCurrentTrackGroups وPlayer.getCurrentTrackSelections استخدِم Player.getCurrentTracks بدلاً من ذلك. يمكنك أيضًا مواصلة استخدام ExoPlayer.getCurrentTrackGroups وExoPlayer.getCurrentTrackSelections، ولكن سيتم إيقاف هاتَين الطريقتَين.
    • أزِل الثوابتَين DownloadHelper DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT وDEFAULT_TRACK_SELECTOR_PARAMETERS. استخدِم getDefaultTrackSelectorParameters(Context) بدلاً من ذلك عند الإمكان، واستخدِم DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT بدلاً من ذلك.
    • إزالة الدالة الإنشائية DefaultTrackSelector(ExoTrackSelection.Factory) يمكنك استخدام DefaultTrackSelector(Context, ExoTrackSelection.Factory) كبديل.
    • إزالة Transformer.Builder.setContext يجب تمرير Context إلى الدالة الإنشائية Transformer.Builder بدلاً من ذلك.

الإصدار 1.0.0-alpha03

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

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

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

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

الإصدار 1.0.0-alpha02

2 مارس 2022

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

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

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

الإصدار 1.0.0-alpha01

27 تشرين الأول (أكتوبر) 2021

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

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

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

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

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

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