الوسائط 3

مكتبات الدعم لحالات استخدام الوسائط.
آخر تعديل الإصدار المستقر إصدار مرشح الإصدار التجريبي الإصدار الأولي
15 تشرين الثاني (نوفمبر) 2023 1.2.0 - - -

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

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

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

رائع

dependencies {
    def media3_version = "1.2.0"

    // 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 RTSP playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-rtsp:$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"

    // 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 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.2.0"

    // 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 RTSP playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-rtsp:$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")

    // 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 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.2.0

الإصدار 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).
    • أضِف حقولاً إضافية إلى تسجيل Common Media Client Data (CMCD): طلب العنصر التالي (nor) وطلب النطاق التالي (nrr) (#8699).
    • يمكنك إضافة وظيفة لنقل بيانات Common Media Client Data (CMCD) باستخدام مَعلمات طلب البحث (#553).
    • إصلاح ConcurrentModificationException في ExperimentalBandwidthMeter (#612).
    • إضافة مَعلمة MediaPeriodId إلى CompositeMediaSource.getMediaTimeForChildMediaTime
    • إتاحة ClippingMediaSource (ومصادر أخرى مع إزاحة وقت الفترة/الفترة) في ConcatenatingMediaSource2 (#11226)
    • غيِّر BaseRenderer.onStreamChanged() لتلقّي وسيطة MediaPeriodId أيضًا.
  • المحوِّل:
    • تحليل بيانات تدوير EXIF لإدخالات الصور.
    • أزِل نوع التعليق التوضيحي TransformationRequest.HdrMode والثوابت المرتبطة به. استخدِم Composition.HdrMode والثوابت المرتبطة بها بدلاً من ذلك
    • بسِّط OverlaySettings لإصلاح مشاكل عرض الإعلانات بالتناوب.
    • تم تغيير المعلمتَين frameRate وdurationUs من SampleConsumer.queueInputBitmap إلى TimestampIterator.
  • اختيار المقطع الصوتي:
    • أضِف DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness بشكل صريح للسماح بالتعديل غير السلس أو عدم السماح به. وسيظل الإعداد التلقائي على سلوكه الحالي وهو true.
  • أدوات استخراج البيانات:
    • MPEG-TS: تأكد من عرض الإطار الأخير بتمرير آخر وحدة وصول لمجموعة البث إلى نموذج قائمة الانتظار (#7909).
    • يجب إصلاح الخطأ الإملائي عند تحديد rotationDegrees. تم تغيير projectionPosePitch إلى projectionPoseRoll (#461).
    • إزالة افتراض أنّه يمكن فحص مثيلات Extractor مباشرةً باستخدام instanceof إذا أردت الوصول في وقت التشغيل إلى تفاصيل تنفيذ Extractor، يجب الاتصال أولاً بـ Extractor.getUnderlyingInstance.
    • إضافة BmpExtractor
    • إضافة WebpExtractor
    • إضافة HeifExtractor
    • يمكنك إضافة دعم QuickTime الكلاسيكي إلى Mp4Extractor.
  • الصوت:
    • دعم تنسيق PCM الكبير بتنسيق 24/32 بت بتنسيق MP4 وMatroska، وتحليل ترميز PCM بتنسيق lpcm بتنسيق MP4
    • إضافة دعم لاستخراج صوت Vorbis بتنسيق MP4
    • أضِف السمة AudioSink.getFormatOffloadSupport(Format) التي تسترد مستوى دعم الحمولة الذي يمكن أن توفره الحوض للتنسيق من خلال السمة DefaultAudioOffloadSupportProvider. وتعرض السمة AudioOffloadSupport الجديدة التي تحتوي على isFormatSupported وisGaplessSupported وisSpeedChangeSupported.
    • أضِف AudioSink.setOffloadMode() الذي يتم من خلاله ضبط إعدادات إلغاء التحميل في حوض الصوت. الإعداد التلقائي هو AudioSink.OFFLOAD_MODE_DISABLED.
    • يمكن تفعيل ميزة تفريغ الشحن من خلال "setAudioOffloadPreference" في TrackSelectionParameters. إذا كان الإعداد المفضّل المحدَّد هو التفعيل، وكان الجهاز يتيح إزالة حمولة التنسيق، وكان اختيار المقطع الصوتي هو مقطع صوتي واحد، سيتم تفعيل نقل الصوت.
    • وفي حال ضبط السمة audioOffloadModePreference على AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED، لن يختار DefaultTrackSelector سوى مقطع صوتي، وفقط إذا كان تنسيق ذلك المقطع الصوتي متاحًا في عملية نقل البيانات. إذا لم يكن هناك أي مقطع صوتي متوافق مع عملية الإزالة، لن يتم اختيار أي مسار.
    • إيقاف دعم التشغيل بلا فواصل للإزالة عند استخدام المستوى 33 من واجهة برمجة التطبيقات قبل استخدام المستوى 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() أعلى من API 31 لتجنّب المشاكل المتعلّقة بواجهة برمجة التطبيقات التي تم إيقافها نهائيًا على أجهزة Samsung (#167).
    • يمكنك استخدام وحدة التحكم في إشعارات الوسائط كخادم وكيل لتعيين الأوامر المتاحة والتنسيق المخصص المستخدم لتعبئة الإشعار وجلسة النظام الأساسي.
    • تحويل أحداث زر الوسائط التي يتلقّاها "MediaSessionService.onStartCommand()" ضمن Media3 بدلاً من توجيهها إلى جلسة عمل النظام الأساسي والعودة إلى Media3. وبذلك، تكون وحدة تحكّم المتصل هي دائمًا وحدة التحكّم في إشعارات الوسائط، ويمكن للتطبيقات التعرّف بسهولة على المكالمات الواردة من الإشعارات بالطريقة نفسها على جميع مستويات واجهة برمجة التطبيقات المتوافقة.
    • إصلاح الخطأ الذي لا يتقدّم في أداء "MediaController.getCurrentPosition()" عند الاتصال بجهاز MediaSessionCompat قديم
    • أضِف MediaLibrarySession.getSubscribedControllers(mediaId) للتيسير عليك.
    • تجاهَل MediaLibrarySession.Callback.onSubscribe() للتأكيد على مدى توفّر المعرّف الرئيسي الذي تشترك به وحدة التحكّم. وفي حال نجح ذلك، يتم قبول الاشتراك وتتم استدعاء notifyChildrenChanged() على الفور لإعلام المتصفح (#561).
    • أضِف وحدة للعرض التوضيحي للجلسة لنظام التشغيل Automotive وفعِّل العرض التوضيحي للجلسة في تطبيق Android Auto.
    • لا تضبط قائمة الانتظار لجلسة إطار العمل عندما لا يكون COMMAND_GET_TIMELINE متاحًا لوحدة التحكّم في إشعارات الوسائط. عند استخدام Android Auto بوصفه مدير وحدة التحكّم في العميل الذي يقرأ من جلسة إطار العمل، يؤدي ذلك إلى عدم ظهور الزر queue في واجهة مستخدم Android Auto (#339).
    • استخدام DataSourceBitmapLoader بشكل تلقائي بدلاً من SimpleBitmapLoader (#271، #327).
    • أضِف السمة MediaSession.Callback.onMediaButtonEvent(Intent) التي تسمح للتطبيقات بإلغاء المعالجة التلقائية لأحداث زر الوسائط.
  • واجهة المستخدم:
    • يجب إضافة آلية تنفيذ Player.Listener للأجهزة التي تعمل بنظام التشغيل Wear OS والتي يتم من خلالها إيقاف إمكانية التشغيل بسبب Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT من خلال إطلاق مربّع حوار النظام للسماح للمستخدم بتوصيل مصدر مخرج صوت مناسب (مثل سماعات الرأس التي تعمل بالبلوتوث). يستأنف المستمع التشغيل تلقائيًا إذا تم توصيل جهاز مناسب خلال مهلة قابلة للضبط (القيمة التلقائية هي 5 دقائق).
  • عمليات التنزيل:
    • يُرجى تعريف نوع خدمة "مزامنة البيانات" التي تعمل في المقدّمة في DownloadService للتوافق مع الإصدار 14 من نظام التشغيل Android. عند استخدام هذه الخدمة، يحتاج التطبيق أيضًا إلى إضافة dataSync باسم foregroundServiceType في ملف البيان وإضافة إذن FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • إضافة HLS:
    • يُرجى إعادة تحميل قائمة التشغيل المباشرة وفق بروتوكول HLS بفاصل زمني تم احتسابه من وقت بدء آخر عملية تحميل بدلاً من آخر وقت اكتمل فيه التحميل (#663).
  • إضافة DASH:
    • السماح بأرقام متعددة لمعرّف DASH نفسه في عنوان URL لنموذج الشريحة.
    • إضافة دعم تجريبي لتحليل الترجمة أثناء استخراجها يوفّر ذلك دعمًا أفضل لدمج الترجمة المتداخلة، بما في ذلك حل مشكلة الوميض عند الانتقال بين مقاطع الترجمة. يمكنك تفعيل هذا باستخدام DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • إضافة RTSP:
    • يجب إصلاح حالة سباق قد تؤدي إلى IndexOutOfBoundsException عند الرجوع إلى بروتوكول 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 ID وصفحات عنوان التعليق إلى مصدر البيانات Bitstream لتشغيل 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.
    • إتاحة تضمين بيانات برامج الوسائط الشائعة (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 تساوي 0 عند إيقاف العارض. ويتم استدعاء Player.Listener.onVideoSizeChanged وفقًا لذلك عند تغيير Player.getVideoSize(). مع هذا التغيير، سيصبح عرض وارتفاع حجم فيديو ExoPlayer بـ MediaCodecVideoRenderer صفر عندما لا يتوافق Player.getCurrentTracks مع الفيديو، أو لم يتم بعد تحديد حجم مسار الفيديو المتوافق.
  • إدارة الحقوق الرقمية:
    • تقليل مستوى ظهور عدة طرق للاستخدام الداخلي فقط على DefaultDrmSession والتي لا يُتوقّع أن يتم طلبها من خارج حزمة DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • الشخص:
    • أضِف مكتبة muxer جديدة يمكن استخدامها لإنشاء ملف حاوية MP4.
  • إضافة إعلانات الوسائط التفاعلية:
    • تفعيل أحداث البث المباشر بتنسيق DASH المباشرة وبعدة فترات لـ DAI يُرجى العلم أنّ طريقة التنفيذ الحالية لا تتيح بعد تقديم الفيديو أو طلبه في أحداث البث المباشر (#10912).
    • إصلاح الخطأ المتمثل في إدراج مجموعة إعلانية جديدة في أحداث البث المباشر لأنّ موضع المحتوى الذي تم احتسابه في المخططات الزمنية المتتالية يختلف قليلاً
  • الجلسة:
    • أضِف طريقة المساعد MediaSession.getControllerForCurrentRequest للحصول على معلومات حول وحدة التحكُّم التي تطلب حاليًا طريقةPlayer.
    • ويمكنك إضافة androidx.media3.session.MediaButtonReceiver لتفعيل التطبيقات من إمكانية استئناف التشغيل من خلال أحداث أزرار الوسائط المُرسَلة من خلال سماعة رأس بلوتوث مثلاً (#167).
    • أضِف التنفيذ التلقائي إلى MediaSession.Callback.onAddMediaItems للسماح بتمرير MediaItems المطلوبة إلى Player في حال استخدام LocalConfiguration (على سبيل المثال، معرّف الموارد المنتظم (URI)) (#282).
    • يمكنك إضافة زرَّي الأوامر "تقديم إلى السابق" و "البحث إلى التالي" في عرض إشعارات الوسائط المكثّف بشكل تلقائي في نظام التشغيل Android 12 والإصدارات الأقدم (#410).
    • أضِف التنفيذ التلقائي إلى MediaSession.Callback.onAddMediaItems للسماح بتمرير MediaItems المطلوبة إلى Player في حال استخدام LocalConfiguration (على سبيل المثال، معرّف الموارد المنتظم (URI)) (#282).
    • يمكنك إضافة زرَّي الأوامر "تقديم إلى السابق" و "البحث إلى التالي" في عرض إشعارات الوسائط المكثّف بشكل تلقائي في نظام التشغيل Android 12 والإصدارات الأقدم (#410).
  • واجهة المستخدم:
    • أضِف طريقة الاستخدام shouldShowPlayButton وhandlePlayPauseButtonAction لكتابة عناصر مخصّصة لواجهة المستخدم بالنقر على زر التشغيل/الإيقاف المؤقت.
  • إضافة RTSP:
    • بالنسبة إلى تنسيق MPEG4-LATM ، استخدِم قيمة معرّف مستوى الملف الشخصي التلقائية في حال عدم توفّرها في رسالة وصف استجابة SDP (#302).
    • استخدام معرف الموارد المنتظم (URI) الأساسي لدقة المسار النسبي من جلسة بروتوكول RTSP إذا كان متوفرًا في عنوان الاستجابة DESCRIBE (#11160).
  • إضافة DASH:
    • إزالة معادلة وقت الوسائط من MediaLoadData.startTimeMs وMediaLoadData.endTimeMs لأحداث بث DASH المتعددة الفترات.
    • إصلاح الخطأ الذي أدّى إلى إعادة تحضير مصدر وسائط مباشر متعدد الفترات إلى إنشاء رمز IndexOutOfBoundsException (#10838).
  • إضافة HLS:
    • أضِف HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) لضبط مهلة لسلسلة محادثات التحميل لانتظار إعداد TimestampAdjuster. وفي حال لم تكتمل عملية الإعداد قبل انتهاء المهلة، يتم طرح علامة PlaybackException لتجنُّب التوقّف اللانهائي في التشغيل. يتم ضبط المهلة على صفر تلقائيًا (#323).
  • أدوات الاختبار:
    • تحقَّق من حساسية حالة مخطط معرّف الموارد المنتظم (URI) في DataSourceContractTest.
  • أزِل الرموز التي تم إيقافها نهائيًا:
    • عليك إزالة دوال DefaultAudioSink واستخدام DefaultAudioSink.Builder بدلاً من ذلك.
    • يمكنك إزالة HlsMasterPlaylist واستخدام HlsMultivariantPlaylist بدلاً من ذلك.
    • إزالة Player.stop(boolean) ويمكنك استخدام Player.stop() وPlayer.clearMediaItems() (إذا كانت قيمة reset هي true) بدلاً منها.
    • عليك إزالة دالتَي إنشاء SimpleCache متوقّفة نهائيًا، واستخدام دالة إنشاء غير متوقّفة تستخدم دالة DatabaseProvider بدلاً من ذلك لتحقيق أداء أفضل.
    • عليك إزالة دالة إنشاء DefaultBandwidthMeter، واستخدِم DefaultBandwidthMeter.Builder بدلاً منها.
    • عليك إزالة دوال DefaultDrmSessionManager واستخدام DefaultDrmSessionManager.Builder بدلاً من ذلك.
    • أزِل دالتَي إنشاء HttpDataSource.InvalidResponseCodeException تم إيقافهما نهائيًا، واستخدِم دالة إنشاء غير معقّدة تقبل حقول إضافية(cause، responseBody) لتحسين عملية تسجيل الأخطاء.
    • يمكنك إزالة DownloadHelper.forProgressive وDownloadHelper.forHls وDownloadHelper.forDash وDownloadHelper.forSmoothStreaming واستخدام DownloadHelper.forMediaItem بدلاً من ذلك.
    • أزِل دالة إنشاء DownloadService المتوقّفة نهائيًا، واستخدِم دالة إنشاء غير متوقّفة تتضمّن خيار توفير معلَمة channelDescriptionResourceId.
    • يُرجى إزالة ثوابت السلسلة المتوقّفة نهائيًا لمجموعات الأحرف (ASCII_NAME وUTF8_NAME وISO88591_NAME وUTF16_NAME وUTF16LE_NAME)، أو استخدام مجموعات أحرف Kotlin من حزمة kotlin.text أو java.nio.charset.StandardCharsets أو com.google.common.base.Charsets بدلاً من ذلك.
    • أزِل دالة إنشاء WorkManagerScheduler المتوقّفة نهائيًا، واستخدِم دالة إنشاء غير متوقّفة تتضمّن خيار توفير معلَمة Context بدلاً من ذلك.
    • عليك إزالة الطرق التي تم إيقافها نهائيًا createVideoSampleFormat وcreateAudioSampleFormat وcreateContainerFormat وcreateSampleFormat، والتي تم استخدامها لإنشاء مثيل للفئة Format. وبدلاً من ذلك، يمكنك استخدام Format.Builder لإنشاء نُسخ من Format.
    • عليك إزالة الطرق التي تم إيقافها نهائيًا copyWithMaxInputSize وcopyWithSubsampleOffsetUs وcopyWithLabel وcopyWithManifestFormatInfo وcopyWithGaplessInfo وcopyWithFrameRate وcopyWithDrmInitData وcopyWithMetadata وcopyWithBitrate وcopyWithVideoSize، واستخدام Format.buildUpon() وطريقة الضبط بدلاً من ذلك.
    • عليك إزالة ExoPlayer.retry() المتوقّفة نهائيًا، واستخدام prepare() بدلاً منها.
    • عليك إزالة الدالة الإنشائية DefaultTrackSelector ذات الوسيطات الصفرية المتوقفة نهائيًا، واستخدام DefaultTrackSelector(Context) بدلاً منها.
    • عليك إزالة دالة إنشاء OfflineLicenseHelper المتوقّفة نهائيًا، واستخدِم OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher) بدلاً منها.
    • أزِل الدالة الإنشائية DownloadManager المتوقّفة نهائيًا، واستخدِم الدالة الإنشائية التي تستخدم Executor بدلاً من ذلك.
    • عليك إزالة دوال Cue المتوقّفة نهائيًا، واستخدام Cue.Builder بدلاً منها.
    • عليك إزالة دالة إنشاء OfflineLicenseHelper المتوقّفة نهائيًا، واستخدِم OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher) بدلاً منها.
    • أزِل أربع طرق متوقفة نهائيًا من AnalyticsListener:
      • onDecoderEnabled، استخدِم onAudioEnabled و/أو onVideoEnabled بدلاً من ذلك.
      • onDecoderInitialized، استخدِم onAudioDecoderInitialized و/أو onVideoDecoderInitialized بدلاً من ذلك.
      • onDecoderInputFormatChanged، يمكنك استخدام onAudioInputFormatChanged و/أو onVideoInputFormatChanged بدلاً من ذلك.
      • onDecoderDisabled، استخدِم onAudioDisabled و/أو onVideoDisabled بدلاً من ذلك.
    • عليك إزالة السمة Player.Listener.onSeekProcessed وسمة AnalyticsListener.onSeekProcessed المتوقّفة نهائيًا، واستخدام السمة onPositionDiscontinuity مع السمة DISCONTINUITY_REASON_SEEK بدلاً منها.
    • يمكنك إزالة ExoPlayer.setHandleWakeLock(boolean) أو استخدام setWakeMode(int) بدلاً من ذلك.
    • أزِل DefaultLoadControl.Builder.createDefaultLoadControl() المتوقّفة نهائيًا، واستخدِم build() بدلاً من ذلك.
    • يمكنك إزالة السمة MediaItem.PlaybackProperties المتوقّفة نهائيًا واستخدام السمة MediaItem.LocalConfiguration بدلاً منها. الحقل المتوقّف نهائيًا MediaItem.playbackProperties أصبح الآن من النوع MediaItem.LocalConfiguration.

الإصدار 1.1.0-rc01

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

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

الإصدار 1.1.0-beta01

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

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

الإصدار 1.1.0-alpha01

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

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

الإصدار 1.0.0

الإصدار 1.0.2

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

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

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

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

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

الإصدار 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 SpamTransport (#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:
    • يمكنك احصاء الخطأ EXISTArgumentException الذي يتم طرحه في تحليل 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) عند تحليل ذرات trak.
    • يمكنك تخطي النماذج بشكل صحيح عند التقديم مباشرةً إلى إطار المزامنة في fMP4 (#10941).
  • الصوت:
    • استخدم معدل نقل البيانات بتنسيق الصوت المضغوط لحساب الحد الأدنى لحجم المخزن المؤقت لـ AudioTrack في عمليات التشغيل المباشر (العبور).
  • النص:
    • يجب حل مشكلة TextRenderer في تمرير فهرس (سلبي) غير صالح إلى Subtitle.getEventTime إذا لم يتضمّن ملف الترجمة أي إشارات.
    • SubRip: يمكنك إضافة دعم لملفات UTF-16 إذا كانت تبدأ بعلامة ترتيب بايت.
  • بيانات التعريف:
    • تحليل قيم متعددة مفصولة بدون إطارات من إطارات ID3، على النحو المسموح به في الإصدار 2.4 من ID3.
    • أضف MediaMetadata.mediaType للإشارة إلى نوع المحتوى أو نوع المجلد الموضح في بيانات التعريف.
    • يمكنك إضافة MediaMetadata.isBrowsable كبديل لـ MediaMetadata.folderType. سيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
  • DASH:
    • يمكنك إضافة تحليل كامل لمجموعات تكييف الصورة، بما في ذلك أعداد المربّعات (#3752).
  • واجهة المستخدم:
    • أصلِح الخطأ PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) المتوقّف نهائيًا لضمان تمرير التغييرات المتعلّقة بإذن الوصول إلى المستمع المسجَّل (#229).
    • إصلاح ترتيب عناصر التحكّم في المشغّل الأوسط في PlayerView عند استخدام تنسيق من اليمين إلى اليسار (RTL) (#227)
  • الجلسة:
    • أضف SimpleBasePlayer المجرّد للمساعدة في تنفيذ واجهة Player للّاعبات المخصّصة.
    • إضافة طريقة مساعد لتحويل الرمز المميز لجلسة النظام الأساسي إلى Media3 SessionToken (#171).
    • استخدِم onMediaMetadataChanged لتشغيل تحديثات جلسة وسائط النظام الأساسي (#219).
    • أضِف جلسة الوسائط كوسيطة في getMediaButtons() من DefaultMediaNotificationProvider واستخدِم القوائم غير القابلة للتغيير من أجل الوضوح (#216).
    • أضِف أداة معالجة معاودة الاتصال في onSetMediaItems لتوفير وسائل لتعديل/ضبط قائمة MediaItem، وفهرس البدء والموضع حسب الجلسة قبل الضبط على المشغّل (#156).
    • تجنُّب رصد النقر مرّتين لأحداث زر الوسائط التي لا تستند إلى بلوتوث (#233).
    • جعل QueueTimeline أكثر قوة في حال كانت حالة الجلسة القديمة المظلّلة (#241).
  • بيانات التعريف:
    • تحليل قيم متعددة مفصولة بدون إطارات من إطارات ID3، على النحو المسموح به في الإصدار 2.4 من ID3.
    • أضف MediaMetadata.mediaType للإشارة إلى نوع المحتوى أو نوع المجلد الموضح في بيانات التعريف.
    • يمكنك إضافة MediaMetadata.isBrowsable كبديل لـ MediaMetadata.folderType. سيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
  • إضافة البث:
    • نقل الإصدار 21.2.0 من حزمة تطوير البرامج (SDK) للبث
  • إضافة إعلانات الوسائط التفاعلية:
    • أزِل مستمع المشغّل إلى 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).
    • تجاهل المخزن المؤقت قبل أن يتعطل التشغيل بسبب عدم كفاية الذاكرة المتاحة.
    • يمكنك إغلاق كتلة Tracing "doSomeWork" عند تفعيل عملية إلغاء التحميل.
    • إصلاح مشكلة تتبع الجلسات باستخدام التقديمات السريعة في PlaybackStatsListener (#180).
    • يجب إرسال استدعاء onMediaItemTransition غير متوفر عند الاتصال بـ seekToNext أو seekToPrevious في قائمة تشغيل مؤلفة من عنصر واحد (#10667).
    • أضف علامة Player.getSurfaceSize التي تعرض حجم السطح الذي يتم عرض الفيديو عليه.
    • إصلاح الخطأ الذي تؤدّي فيه إزالة أدوات معالجة الحدث أثناء إصدار المشغّل إلى ظهور IllegalStateException (#10758)
  • الإصدار:
    • فرض الحد الأدنى من compileSdkVersion لتجنب أخطاء التحويل البرمجي (#10684).
    • تجنَّب استخدام حظر النشر عند تضمينه في إصدار آخر من الدرجة الكبيرة.
  • اختيار المقطع الصوتي:
    • تفضيل مقاطع صوتية أخرى على تقنية Dolby Vision إذا كانت الشاشة لا تتيح استخدامها (#8944).
  • عمليات التنزيل:
    • إصلاح التكرارات اللانهائية المحتملة في ProgressiveDownloader الناتجة عن التنزيل والتشغيل المتزامنين باستخدام PriorityTaskManager (#10570).
    • جعل إشعار التنزيل يظهر على الفور (#183).
    • يمكنك حصر عمليات إزالة عمليات التنزيل المتوازية بمجموعة واحدة لتجنُّب الإفراط في إنشاء سلاسل محادثات (#10458).
  • الفيديو:
    • يمكنك تجربة برنامج فك ترميز بديل لـ Dolby Vision إذا كانت الشاشة لا تتيح ذلك. (#9794).
  • الصوت:
    • استخدِم SingleThreadExecutor لإصدار AudioTrack مثيلات لتجنُّب حدوث أخطاء OutOfMemory عند إصدار عدة مشغّلات في وقت واحد (رقم 10057).
    • لإضافة AudioOffloadListener.onExperimentalOffloadedPlayback لحالة إزالة حمولة المقطع الصوتي (#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) لتحديد ما إذا كان العارض سيُخرج البيانات الوصفية مبكرًا أو متزامنًا مع موضع المشغّل.
  • إدارة الحقوق الرقمية:
    • التغلب على خطأ في تنفيذ نظام Android 13 ClearKey الذي يؤدي إلى عرض عنوان URL للترخيص غير فارغ ولكنه غير صالح.
    • إصلاح الخطأ setMediaDrmSession failed: session not opened عند التبديل بين أنظمة إدارة الحقوق الرقمية في قائمة تشغيل (على سبيل المثال، من نطاقا لهم (على سبيل المثال من أجل استخدام أداةClearKey)
  • النص:
    • CEA-608: تأكَّد من معالجة أوامر تبديل الخدمة في الحقل 2 بشكل صحيح (#10666).
  • DASH:
    • تحليل EventStream.presentationTimeOffset من البيانات (#10460).
  • واجهة المستخدم:
    • استخدام عمليات الإلغاء الحالية للمشغّل كإعداد مسبق في TrackSelectionDialogBuilder (#10429).
  • الجلسة:
    • تأكَّد من تنفيذ الأوامر دائمًا بالترتيب الصحيح حتى إذا كانت بعضها تتطلب درجة دقة غير متزامنة (#85).
    • أضِف DefaultMediaNotificationProvider.Builder لإنشاء DefaultMediaNotificationProvider مثيل. يمكن لأداة الإنشاء ضبط معرّف الإشعار ومعرّف قناة الإشعارات واسم قناة الإشعارات التي يستخدمها مقدّم الخدمة. ويمكنك أيضًا إضافة الطريقة DefaultMediaNotificationProvider.setSmallIcon(int) لضبط رمز الإشعارات الصغير. (#104).
    • تأكَّد من عدم تجاهل الأوامر المُرسَلة قبل MediaController.release() (#99).
    • بإمكان SimpleBitmapLoader تحميل الصورة النقطية من معرّفات الموارد المنتظمة (URI) file:// (#108).
    • إصلاح التأكيد الذي يمنع MediaController من تقديم إعلان خلال فترة زمنية (#122).
    • عند انتهاء التشغيل، يتم إيقاف MediaSessionService من المقدمة ويظهر إشعار بإعادة تشغيل آخر عنصر من الوسائط التي تم تشغيلها (#112).
    • عدم بدء خدمة تعمل في المقدّمة بهدف إيقاف مؤقت (#167)
    • إخفاء "الشارة" يدويًا المرتبطة بالإشعار الذي تم إنشاؤه من خلال "DefaultNotificationProvider" على واجهة برمجة التطبيقات 26 وواجهة برمجة التطبيقات 27 (يتم إخفاء الشارة تلقائيًا في واجهة برمجة التطبيقات 28 والإصدارات الأحدث) (#131).
    • إصلاح الخطأ الذي يتسبب في حدوث اتصال صنف ثان لـ MediaSession 3 MediaSession قديم إلى NetzDGStateExceptions (#49).
  • بروتوكول RTSP:
    • إضافة H263 للتعامل مع الحزم المجزأة (#119).
    • إتاحة تنسيق MP4A-LATM (#162)
  • IMA:
    • إضافة مهلة لتحميل معلومات الإعلان للتعامل مع الحالات التي تواجه فيها أداة تطوير البرامج لإعلانات الوسائط التفاعلية صعوبات في تحميل إعلان (#10510).
    • منع تخطّي الإعلانات أثناء التشغيل عند الانتقال إلى نهاية المحتوى (#10685)
    • احتسب بشكل صحيح مدة الفترة الزمنية لأحداث البث المباشر التي تتضمّن إعلانات مضمّنة من جهة الخادم، على سبيل المثال IMA DAI (#10764).
  • الإضافة FFmpeg:
    • أضِف العلامات المطلوبة حديثًا لربط مكتبات FFmpeg بالإصدار 23.1.7779620 أو إصدار أحدث (#9933).
  • إضافة AV1:
    • يجب تحديث إصدار CMake لتجنُّب حالات عدم التوافق مع أحدث إصدارات استوديو Android (#9933).
  • إضافة البث:
    • نفِّذ getDeviceInfo() لتتمكن من تحديد CastPlayer عند التحكم في التشغيل باستخدام MediaController (#142).
  • المحوِّل:
    • أضِف موقّت مراقب النظام لرصد ما إذا كان إنشاء نموذج ناتج بطيء جدًا.
  • أزِل الرموز التي تم إيقافها نهائيًا:
    • إزالة Transformer.Builder.setOutputMimeType(String) لقد تمت إزالة هذه الميزة. سيكون نوع MIME دائمًا MP4 عند استخدام أداة الاختيار التلقائية.

الإصدار 1.0.0-beta02

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

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

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

  • المكتبة الأساسية:
    • تأكَّد من أنّ تغيير ShuffleOrder باستخدام ExoPlayer.setShuffleOrder يؤدي إلى طلب الإجراء Player.Listener#onTimelineChanged باستخدام reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • بالنسبة إلى الوسائط التدريجي، يجب تضمين المقاطع الصوتية المحددة في الموضع المخزّن مؤقتًا فقط (#10361).
    • السماح بالمسجّل المخصّص لجميع مُخرجات سجلات ExoPlayer (#9752).
    • إصلاح تنفيذ setDataSourceFactory في DefaultMediaSourceFactory، والذي كان لا يعمل في بعض الحالات (#116).
  • أدوات استخراج البيانات:
    • إصلاح تحليل مجموعات الصور المرجعية القصيرة المدى H265 (#10316).
    • إصلاح تحليل معدل نقل البيانات من مربعات esds (#10381).
  • DASH:
    • تحليل عنوان URL لترخيص 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. وستفترض عمليات التشغيل هذه أنها شبكة 4G.
    • عدم السماح بمرور null إلى MediaSource.Factory.setDrmSessionManagerProvider و MediaSource.Factory.setLoadErrorHandlingPolicy. ويمكن تمرير مثيلات DefaultDrmSessionManagerProvider وDefaultLoadErrorHandlingPolicy بشكل صريح إذا لزم الأمر.
    • أضِف MediaItem.RequestMetadata لتمثيل البيانات الوصفية اللازمة لتشغيل الوسائط عندما يكون LocalConfiguration غير معروف بالضبط. يمكنك أيضًا إزالة MediaMetadata.mediaUrl لأنّها أصبحت مضمّنة الآن في RequestMetadata.
    • أضِف Player.Command.COMMAND_SET_MEDIA_ITEM للسماح للّاعبين بضبط عنصر واحد.
  • اختيار المقطع الصوتي:
    • يمكنك دمج صف TrackSelectionOverrides في TrackSelectionParameters، وترقية TrackSelectionOverride إلى صف عالي المستوى.
    • إعادة تسمية TracksInfo إلى Tracks وTracksInfo.TrackGroupInfo إلى Tracks.Group. Player.getCurrentTracksInfo وPlayer.Listener.onTracksInfoChanged أيضًا إلى Player.getCurrentTracks وPlayer.Listener.onTracksChanged. يشمل ذلك "إلغاء الإيقاف النهائي" لاسم الطريقة Player.Listener.onTracksChanged، ولكن مع أنواع مختلفة من المَعلمات.
    • يمكنك تغيير DefaultTrackSelector.buildUponParameters وDefaultTrackSelector.Parameters.buildUpon لعرض DefaultTrackSelector.Parameters.Builder بدلاً من DefaultTrackSelector.ParametersBuilder المتوقّفة نهائيًا.
    • إضافة DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities الذي يتم تفعيله تلقائيًا. عند تفعيل هذا الخيار، سيتم تفضيل DefaultTrackSelector المقاطع الصوتية التي لا يتجاوز عدد قنواتها إمكانات إخراج الجهاز. أمّا على الأجهزة المحمولة باليد، فيُفضّل DefaultTrackSelector الاستيريو/أحاديًا على تنسيقات الصوت المتعدّدة القنوات، إلا إذا كان من الممكن أن يكون التنسيق المتعدد القنوات (الإصدار 12L والإصدارات الأحدث من نظام التشغيل Android) أو بتنسيق الصوت المحيطي Dolby. بالإضافة إلى ذلك، على الأجهزة التي تتيح ميزة "تحديد مكان الصوت"، سيراقب DefaultTrackSelector التغييرات في سمات الموقع الجغرافي وسيتم بدء اختيار مقطع صوتي جديد بناءً عليها. لا يتم تطبيق هذه القيود على الأجهزة التي تحتوي television في وضع واجهة المستخدم ويُفضَّل استخدام التنسيق الذي يتضمّن أكبر عدد من القنوات. لتفعيل هذه الميزة، يجب إنشاء المثيل DefaultTrackSelector باستخدام Context.
  • الفيديو:
    • إعادة تسمية DummySurface إلى PlaceholderSurface.
    • إضافة دعم AV1 إلى MediaCodecVideoRenderer.getCodecMaxInputSize
  • الصوت:
    • استخدام برنامج فك ترميز الصوت من LG AC3 للإعلان عن نوع MIME غير عادي
    • عليك تغيير نوع العرض AudioAttributes.getAudioAttributesV21() من android.media.AudioAttributes إلى فئة برامج تضمين AudioAttributesV21 جديدة لمنع إبطاء عملية التحقق من تقنية "ART" على واجهة برمجة التطبيقات < 21.
    • يمكنك الاستعلام عن النظام الأساسي (واجهة برمجة التطبيقات 29 والإصدارات الأحدث) أو افتراض عدد قنوات الترميز الصوتي للعبور الصوتي عند عدم ضبط تنسيق عدد القنوات الصوتية، ما يحدث عند إعداد HLS بدون مقاطع (10204).
    • يمكنك ضبط AudioTrack باستخدام قناع القناة AudioFormat.CHANNEL_OUT_7POINT1POINT4 إذا كان برنامج فك الترميز يعرض صوت PCM بـ 12 قناة (#10322.
  • إدارة الحقوق الرقمية
    • تأكَّد من تحديث جلسة إدارة الحقوق الرقمية بشكل صحيح دائمًا عند تقديم/ترجيع الفيديو فورًا بعد تغيير التنسيق (10274).
  • النص:
    • عليك تغيير Player.getCurrentCues() لعرض CueGroup بدلاً من List<Cue>.
    • SSA: إتاحة إعداد النمط OutlineColour عند ضبط BorderStyle == 3 (أي أنّ OutlineColour يضبط خلفية الإشارة) (#8435).
    • CEA-708: تحليل البيانات في مجموعات خدمة متعددة وتجاهل كتل غير مرتبطة برقم الخدمة المحدّد حاليًا.
    • عليك إزالة السمة RawCcExtractor التي كانت مستخدَمة فقط لمعالجة تنسيق العنوان الفرعي الداخلي في Google.
  • أدوات استخراج البيانات:
    • أضف دعمًا لـ AVI (#2092).
    • Matroska: تحليل DiscardPadding لمسارات Opus.
    • MP4: تحليل معدلات نقل البيانات من مربّعات esds
    • Ogg: السماح بمعرِّف Opus المكرَّر وعناوين التعليقات (#10038).
  • واجهة المستخدم:
    • يجب إصلاح تسليم الأحداث إلى OnClickListener التي تم ضبطها في PlayerView في حال حدوث الخطأ useController=false (#9605). يجب أيضًا إصلاح إرسال الأحداث إلى OnLongClickListener لجميع إعدادات الملف الشخصي.
    • إصلاح المعالجة غير الصحيحة لتسلسل أحداث اللمس التي تخرج من حدود PlayerView قبل ACTION_UP باعتبارها نقرة (#9861).
    • حل مشكلة إمكانية الوصول في PlayerView والتي قد تؤدي إلى تبديل النقر على التشغيل بدلاً من إخفاء عناصر التحكم (#8627).
    • أعِد كتابة TrackSelectionView وTrackSelectionDialogBuilder للعمل باستخدام واجهة Player بدلاً من ExoPlayer. ويسمح ذلك باستخدام طرق العرض مع عمليات تنفيذ Player الأخرى، ويزيل التبعية من وحدة واجهة المستخدم إلى وحدة ExoPlayer. هذا تغيير عاطل.
    • عدم إظهار مسارات نصية مفروضة في أداة اختيار المسار PlayerView، والإبقاء على مسار نص مفروض مناسب ومختارًا في حال اختيار "بلا" (#9432)
  • DASH:
    • تحليل عدد القنوات من عناصر DTS AudioChannelConfiguration يؤدي هذا إلى إعادة تفعيل مرور الصوت لعمليات بث DTS (#10159).
    • عدم السماح بمرور null إلى DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. ويمكن تمرير أمثلة DefaultCompositeSequenceableLoaderFactory بشكل صريح إذا لزم الأمر.
  • بروتوكول HLS:
    • يمكنك الرجوع إلى طريقة الإعداد المقطعي إذا كانت سمة قائمة التشغيل CODECS لا تحتوي على برنامج ترميز الصوت (#10065).
    • عدم السماح بتمرير null إلى HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory وHlsMediaSource.Factory.setPlaylistParserFactory و HlsMediaSource.Factory.setPlaylistTrackerFactory. يمكن تمرير مثيلات DefaultCompositeSequenceableLoaderFactory أو DefaultHlsPlaylistParserFactory أو مرجع إلى DefaultHlsPlaylistTracker.FACTORY بشكل صريح إذا كان هناك حاجة إلى ذلك.
  • البث السلس:
    • عدم السماح بمرور null إلى SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. ويمكن تمرير مثيلات DefaultCompositeSequenceableLoaderFactory صراحةً إذا لزم الأمر.
  • بروتوكول RTSP:
    • أضِف قارئ بروتوكول النقل في الوقت الفعلي (RTP) إلى H263. (#63).
    • أضِف قارئ بروتوكول RTP في ملف MPEG4 (#35).
    • أضِف قارئ بروتوكول النقل في الوقت الفعلي (RTP) إلى HEVC (#36).
    • إضافة قارئ بروتوكول النقل في الوقت الفعلي (RTP) إلى AMR لا تتوفَّر حاليًا سوى أحداث البث المباشر الأحادي القنوات وغير المتداخلة. إنّ حمولة البيانات المركّبة من AMR غير متوافقة. (#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 الذي يؤدي إلى تعذُّر مزامنة مكتبة 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: حلّ المشكلة التي قد تؤدي إلى ظهور البيانات الوصفية لعيّنة الرسائل الإلكترونية بترتيب غير صحيح لأحداث البث التي تتضمّن رمزَي emsg v0 وv1 (#9996).
  • النص:
    • أصلِح تفاعل SingleSampleMediaSource.Factory.setTrackId وMediaItem.SubtitleConfiguration.Builder.setId لمنح الأولوية للحقل SubtitleConfiguration والرجوع إلى القيمة Factory في حال عدم ضبطها (#10016).
  • تشغيل الإعلان:
    • إصلاح حالات الانخفاض في الصوت بين فترات الإعلانات في أحداث البث المباشر وفق بروتوكول HTTP (HLS)

الإصدار 1.0.0-alpha02

2 مارس 2022

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

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

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

الإصدار 1.0.0-alpha01

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

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

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

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

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

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

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