Media3
آخر تعديل | الإصدار الثابت | إصدار محتمل | الإصدار التجريبي | الإصدار الأولي |
---|---|---|---|---|
26 آذار (مارس) 2025 | 1.6.0 | - | - | - |
الإعلان عن التبعيات
لإضافة تبعية على Media3، يجب إضافة مستودع Google Maven إلى مشروعك. اطّلِع على مستودع Maven من Google لمزيد من المعلومات.
أضِف التبعيات للعناصر التي تحتاج إليها في ملف build.gradle
ل
تطبيقك أو وحدتك:
Groovy
dependencies { def media3_version = "1.6.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 SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs using Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs using Views implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs using Jetpack Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For integrating with Cast implementation "androidx.media3:media3-cast:$media3_version" // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version" // For transforming media files implementation "androidx.media3:media3-transformer:$media3_version" // For applying effects on video frames implementation "androidx.media3:media3-effect:$media3_version" // For muxing media files implementation "androidx.media3:media3-muxer:$media3_version" // Utilities for testing media components (including ExoPlayer components) implementation "androidx.media3:media3-test-utils:$media3_version" // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation "androidx.media3:media3-test-utils-robolectric:$media3_version" // Common functionality for reading and writing media containers implementation "androidx.media3:media3-container:$media3_version" // Common functionality for media database components implementation "androidx.media3:media3-database:$media3_version" // Common functionality for media decoders implementation "androidx.media3:media3-decoder:$media3_version" // Common functionality for loading data implementation "androidx.media3:media3-datasource:$media3_version" // Common functionality used across multiple media libraries implementation "androidx.media3:media3-common:$media3_version" // Common Kotlin-specific functionality implementation "androidx.media3:media3-common-ktx:$media3_version" }
Kotlin
dependencies { val media3_version = "1.6.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 SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs using Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs using Views implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs using Jetpack Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For integrating with Cast implementation("androidx.media3:media3-cast:$media3_version") // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version") // For transforming media files implementation("androidx.media3:media3-transformer:$media3_version") // For applying effects on video frames implementation("androidx.media3:media3-effect:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") // Common Kotlin-specific functionality implementation("androidx.media3:media3-common-ktx:$media3_version") }
لمزيد من المعلومات عن العناصر الاعتمادية، يُرجى الاطّلاع على مقالة إضافة عناصر الاعتماد في عملية الإنشاء.
الملاحظات
تساعدنا ملاحظاتك في تحسين Jetpack. يمكنك استخدام أداة تتبُّع المشاكل في Media3 للعثور على إجابات عن الأسئلة والمشاكل المعروفة وطلبات الميزات، ولتسجيل مشاكل جديدة.
الإصدار 1.6.0
1.6.0
26 آذار (مارس) 2025
تم إصدار androidx.media3:media3-*:1.6.0
.
يتضمّن الإصدار 1.6.0
عمليات الربط هذه.
- المكتبة المشتركة:
- أضِف
AudioManagerCompat
وAudioFocusRequestCompat
لاستبدال الفئات المكافئة فيandroidx.media
. - ترقية Kotlin من الإصدار 1.9.20 إلى الإصدار 2.0.20 واستخدام المكوِّن الإضافي Gradle لـ Compose Compiler عليك ترقية مكتبة KotlinX Coroutines من الإصدار 1.8.1 إلى الإصدار 1.9.0.
- أزِل طريقة
Format.toBundle(boolean excludeMetadata)
واستخدِمFormat.toBundle()
بدلاً منها. - إصلاح خلل في
SimpleBasePlayer
حيث لا يؤدي ضبط قيمة جديدة لسمةcurrentMediaItemIndex
فيState
بعدsetPlaylist
باستخدامnull
MediaMetadata
إلى إعادة تقييم البيانات الوصفية (#1940). - غيِّر إذن الوصول إلى
SimpleBasePlayer.State
من "محمي" إلى "عام" لتسهيل التعامل مع التعديلات في الصفوف الأخرى (#2128).
- أضِف
- ExoPlayer:
- أضِف
MediaExtractorCompat
، وهي فئة جديدة توفّر ميزات مماثلة للمنصّةMediaExtractor
. - إضافة ميزة تجريبية لإعداد "ExoPlayer" مسبقًا لتشغيل المحتوى باستخدام
MediaCodecVideoRenderer
يمكنك ضبطDefaultRenderersFactory
إلىexperimentalSetEnableMediaCodecVideoRendererPrewarming
لتوفيرMediaCodecVideoRenderer
ثانوي لـExoPlayer
. في حال كانت هذه الميزة مفعّلة،ExoPlayer
تعالج الفيديو الخاص بعناصر الوسائط المتتالية مسبقًا أثناء التشغيل لتقليل وقت استجابة الانتقال بين عناصر الوسائط. - عليك خفض القيم التلقائية لكلّ من
bufferForPlaybackMs
وbufferForPlaybackAfterRebufferMs
فيDefaultLoadControl
إلى 1000 و 2000 ملي ثانية على التوالي. - يمكنك بدء
DeviceInfo
ومستوى صوت الجهاز بشكل غير متزامن (إذا كان مفعّلاً باستخدامsetDeviceVolumeControlEnabled
). لا تتوفّر هذه القيم على الفور بعدExoPlayer.Builder.build()
، ويُرسِلPlayer.Listener
إشعارات بالتغييرات من خلالonDeviceInfoChanged
وonDeviceVolumeChanged
. - لم يعُد رقم تعريف جلسة الصوت الأوّلي متاحًا على الفور بعد
إنشاء المشغّل. يمكنك استخدام
AnalyticsListener.onAudioSessionIdChanged
للاستماع إلى العبارة المعدَّلة الأولى إذا لزم الأمر. - يجب مراعاة اللغة عند اختيار مقطع صوتي في الفيديو. يتم تلقائيًا اختيار مقطع فيديو "رئيسي" يتطابق مع لغة مقطع المحتوى الصوتي الذي تم اختياره، إذا كان متاحًا. يمكن تحديد الإعدادات المفضّلة للّغة الفاضحة في الفيديو باستخدام رمز
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s)
. - أضِف المَعلمة
selectedAudioLanguage
إلى الطريقةDefaultTrackSelector.selectVideoTrack()
. - أضِف المَعلمة
retryCount
إلىMediaSourceEventListener.onLoadStarted
وإلى طُرقMediaSourceEventListener.EventDispatcher
المقابلة. - تم إصلاح خطأ كان يؤدي إلى تجميد اللقطات في نهاية العنصر في قوائم التشغيل أو الفترات في أحداث البث باستخدام DASH المتعدّدة الفترات التي لا تتطابق مدّتها مع المحتوى الفعلي (#1698).
- انقل
BasePreloadManager.Listener
إلىPreloadManagerListener
من المستوى الأعلى. - يمكن تنفيذ
RenderersFactory.createSecondaryRenderer
لتوفير مشغّلات عرض ثانوية للإعداد المُسبَق. يتيح وضع "الاستعداد المُسبَق" الانتقال بشكل أسرع بين عناصر الوسائط أثناء التشغيل. - فعِّل إرسال
CmcdData
لطلبات البيان في تنسيقات البث التكيُّفي DASH وHLS وSmoothStreaming (#1951). - أدخِل
MediaCodecInfo
لبرنامج الترميز الذي سيتم إعداده فيMediaCodecRenderer.onReadyToInitializeCodec
(#1963). - غيِّر
AdsMediaSource
للسماح بنموAdPlaybackStates
من خلال إلحاق المجموعات الإعلانية. يتم رصد التعديلات غير الصالحة وطرح استثناء. - حلّ مشكلة ظهور إطارات إضافية مخصّصة لفك التشفير فقط بشكلٍ متتابعٍ سريع عند الانتقال إلى محتوى الوسائط بعد إعلان أثناء التشغيل
- اطلب من
DefaultRenderersFactory
إضافة نسختَين منMetadataRenderer
ل السماح للتطبيقات بتلقّي مخطّطَين مختلفَين للبيانات الوصفية تلقائيًا. - إعادة تقييم ما إذا كان يجب إلغاء تحميل الجزء الجاري عند إيقاف التشغيل مؤقتًا (#1785)
- إضافة خيار إلى
ClippingMediaSource
للسماح بالاقتصاص من المحتوى في الوسائط التي لا يمكن تقديمها أو ترجيعها - تم إصلاح خطأ كان يؤدي إلى حظر انتقال العنصر التالي في الوسائط عند استخدام ميزة "التقديم/الترجيع باستخدام ميزة "الاستعداد المسبق".
- إصلاح خطأ يتسبب في بقاء الرمز
ExoPlayer.isLoading()
علىtrue
بعد أن يتم نقله إلىSTATE_IDLE
أوSTATE_ENDED
(#2133) - أضِف
lastRebufferRealtimeMs
إلىLoadControl.Parameter
(#2113).
- أضِف
- المحوِّل:
- إضافة إمكانية تحويل الترميز إلى تنسيقات بديلة متوافقة مع الإصدارات القديمة
- إتاحة تحويل ترميز تنسيق Dolby Vision (الملف الشخصي 8)
- عدِّل مَعلمات
VideoFrameProcessor.registerInputStream
وVideoFrameProcessor.Listener.onInputStreamRegistered
لاستخدامFormat
. - أنشئ بيانات وصفية ثابتة لفيديوهات HDR عند استخدام
DefaultEncoderFactory
. - فعِّل ميزة بيانات تشخيص نظام Android الأساسي باستخدام
MediaMetricsManager
. يعيد تطبيق Transformer توجيه أحداث التعديل و data الأداء إلى المنصة، ما يساعد في توفير معلومات عن أداء النظام وتصحيح الأخطاء على الجهاز. وقد تجمع Google هذه البيانات أيضًا إذا فعّل مستخدم الجهاز ميزة مشاركة بيانات الاستخدام والتشخيص. يمكن للتطبيقات إيقاف المساهمة في ميزة "التشخيص" لنظام التشغيل في Transformer باستخدامTransformer.Builder.setUsePlatformDiagnostics(false)
. - قسِّم
InAppMuxer
إلىInAppMp4Muxer
وInAppFragmentedMp4Muxer
. يمكنك استخدامInAppMp4Muxer
لإنشاء ملف MP4 غير مجزأ، في حين أنّInAppFragmentedMp4Muxer
مخصّص لإنشاء ملف MP4 مجزأ. - نقل واجهة
Muxer
منmedia3-muxer
إلىmedia3-transformer
- أضِف
MediaProjectionAssetLoader
الذي يقدّم وسائط منMediaProjection
لتسجيل الشاشة، وأضِف إمكانية تسجيل الشاشة إلى تطبيق Transformer التجريبي. - أضِف
#getInputFormat()
إلى واجهةCodec
. - يمكنك تحويل مسؤولية إزالة
GlObjectsProvider
إلى المتصل فيDefaultVideoFrameProcessor
وDefaultVideoCompositor
متى كان ذلك ممكنًا.
- برامج الاستخراج:
- AVI: إصلاح معالجة الملفات التي تتضمّن صوتًا مضغوطًا بمعدل بت ثابت حيث يخزِّن عنوان البث عدد البايت بدلاً من عدد المقاطع
- حلّ مشكلة معالجة وحدات NAL التي يتم التعبير عن أطوالها ببايت واحد أو بايتين (بدلاً من 4)
- إصلاح
ArrayIndexOutOfBoundsException
في قوائم تعديل ملفات MP4 عندما تبدأ قائمة التعديل عند إطار غير متزامن بدون إطار متزامن سابق (#2062) - حلّ مشكلة توقُّف أحداث البث بتنسيق TS على بعض الأجهزة (#2069)
- FLAC: إتاحة استخدام ملفات FLAC بسعة 32 بت في السابق، كان يتعذّر
تشغيل هذه المحتوى باستخدام
IllegalStateException: Playback stuck buffering and not loading
(#2197).
- الصوت:
- يجب إصلاح
onAudioPositionAdvancing
ليتم استدعاؤه عند استئناف التشغيل (كان يتم استدعاؤه سابقًا عند إيقاف التشغيل مؤقتًا). - لا تتجاوز
SonicAudioProcessor
عندما يتم ضبطSpeedChangingAudioProcessor
باستخدام المَعلمات التلقائية. - إصلاح مشكلة النقص في
Sonic#getOutputSize()
التي قد تؤدي إلى تعطُّلDefaultAudioSink
- يجب تصحيح
MediaCodecAudioRenderer.getDurationToProgressUs()
وDecoderAudioRenderer.getDurationToProgressUs()
لكي تتم بشكل صحيح إعادة ضبط المدّات المقدَّمة. - اجعل
androidx.media3.common.audio.SonicAudioProcessor
نهائيًا. - إتاحة استخدام تنسيق PCM العائم في
ChannelMappingAudioProcessor
وTrimmingAudioProcessor
- يجب إصلاح
- الفيديو:
- غيِّر
MediaCodecVideoRenderer.shouldUsePlaceholderSurface
إلى protected لكي تتمكّن التطبيقات من إلغاء حظر استخدام مساحات عرض العناصر النائبة (#1905). - إضافة تحليل تجريبي لاعتمادية عيّنات
ExoPlayer
AV1 لتسريع عملية التقديم/الترجيع فعِّل هذه الميزة باستخدام واجهة برمجة التطبيقات الجديدةDefaultRenderersFactory.experimentalSetParseAv1SampleDependencies
API. - أضِف واجهة برمجة التطبيقات التجريبية
ExoPlayer
لحذفMediaCodecVideoRenderer
مخازن مؤقتة لدخل وحدة الترميز المتأخرة التي لا يعتمد عليها. فعِّل هذه الميزة باستخدامDefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs
. - تم إصلاح مشكلة توفّر مشغّل بدون سطح عرض على الفور ومعالجة الترميز ببطء شديد لأيّ لقطات في انتظار المعالجة (#1973).
- استبعِد أجهزة Xiaomi وOPPO من وضع "السطح المنفصل" لتجنُّب وميض الشاشة (#2059).
- غيِّر
- النص:
- إتاحة ترجمة VobSub (#8260)
- يجب إيقاف تحميل كل ملفات الترجمة والشرح التي تم ضبطها باستخدام
MediaItem.Builder.setSubtitleConfigurations
، وتحميل ملف واحد فقط بدلاً من ذلك إذا تم اختياره من خلال اختيار المقطع الصوتي (#1721). - ملف TTML: إتاحة الإشارة إلى
tts:origin
وtts:extent
باستخدامstyle
(#2953) - يجب أن تكون الطوابع الزمنية لتنسيقَي WebVTT وSubRip محصورة بـ 3 منازل عشرية بالضبط. في السابق، كنّا نفكّر أي عدد من الكسور العشرية بشكل غير صحيح، ولكن كنّا نفترض دائمًا أنّ القيمة بالملي ثانية، ما أدّى إلى ظهور طوابع زمنية غير صحيحة (#1997).
- إصلاح مشكلة تعليق التشغيل عندما تحتوي قائمة التشغيل على مقاطع مقتطعة تتضمّن مقاطع ترجمة وشرح بتنسيق CEA-608 أو CEA-708
- يجب إصلاح
IllegalStateException
عندما يحتوي ملف SSA على إشارة بمدة صفر (وقت البدء والانتهاء متساويان) (#2052). - قم بتجاهل أخطاء تحليل الترجمة (وتسجّلها) عند دمج الترجمة في الحاوية نفسها التي تحتوي على الصوت والفيديو (#2052).
- إصلاح معالجة أحرف UTF-8 المكوّنة من عدة بايت في ملفات WebVTT باستخدام نهايات السطر CR (#2167)
- إدارة الحقوق الرقمية:
- إصلاح الخطأ
MediaCodec$CryptoException: Operation not supported in this configuration
عند تشغيل محتوى ClearKey على الأجهزة التي تستخدم واجهة برمجة تطبيقات أقل من الإصدار 27 (#1732)
- إصلاح الخطأ
- التأثير:
- نقلت وظيفة
OverlaySettings
إلىStaticOverlaySettings
. يمكن إنشاء فئة فرعية منOverlaySettings
للسماح بإعدادات التراكب الديناميكية.
- نقلت وظيفة
- برامج الدمج:
- تم نقل
MuxerException
خارج واجهةMuxer
لتجنُّب استخدام اسم مؤهَّل بالكامل طويل جدًا. - تمت إعادة تسمية طريقة
setSampleCopyEnabled()
إلىsetSampleCopyingEnabled()
في كل منMp4Muxer.Builder
وFragmentedMp4Muxer.Builder
. - يعرض العنوانان
Mp4Muxer.addTrack()
وFragmentedMp4Muxer.addTrack()
الآن معرّف أغنيةint
بدلاً منTrackToken
. - لم تعُد
Mp4Muxer
وFragmentedMp4Muxer
تطبّق واجهةMuxer
. - أوقِف
Mp4Muxer
تجميع عيّنات النسخ والنسخ تلقائيًا. - إصلاح خلل في
FragmentedMp4Muxer
يؤدي إلى إنشاء الكثير من الأجزاء عند كتابة المقطع الصوتي فقط
- تم نقل
- الجلسة:
- الاحتفاظ بحالة الخدمة التي تعمل في المقدّمة لمدة 10 دقائق إضافية عند إيقاف تشغيل المحتوى أو إيقافه مؤقتًا أو تعذُّر تشغيله
يتيح ذلك للمستخدمين استئناف التشغيل خلال مهلة الانتظار هذه بدون التعرّض لقيود الخدمة التي تعمل في المقدّمة على مختلف
الأجهزة. يُرجى العِلم أنّه لم يعُد بإمكانك استخدام
player.pause()
فقط لإيقاف الخدمة التي تعمل في المقدّمة قبلstopSelf()
عند إلغاءonTaskRemoved
، استخدِمMediaSessionService.pauseAllPlayersAndStopSelf()
بدلاً من ذلك. - إبقاء الإشعار مرئيًا عندما يُظهر التشغيل خطأ أو يتوقف لا تتم إزالة الإشعار إلا إذا تم محو قائمة التشغيل أو إغلاق المشغّل.
- تحسين معالجة إجراءات MediaSession على نظام Android الأساسي، مثل ACTION_PLAY وACTION_PAUSE، لضبط أحدهما فقط وفقًا للسماح بالاستجابة للأوامر المتاحة، وقبول ضبط أحدهما فقط
- أضِف
Context
كمَعلمة إلىMediaButtonReceiver.shouldStartForegroundService
(#1887). - تم إصلاح الخلل الذي كان يؤدي إلى فقدان التغييرات من تعديل في انتظار المراجعة عند استدعاء طريقة
Player
علىMediaController
متصل بجلسة قديمة. - اجعل
MediaSession.setSessionActivity(PendingIntent)
تقبل القيمة null (#2109). - إصلاح الخلل الذي كان يؤدي إلى استمرار ظهور إشعار قديم عند clearing (محو) قائمة التشغيل (#2211)
- الاحتفاظ بحالة الخدمة التي تعمل في المقدّمة لمدة 10 دقائق إضافية عند إيقاف تشغيل المحتوى أو إيقافه مؤقتًا أو تعذُّر تشغيله
يتيح ذلك للمستخدمين استئناف التشغيل خلال مهلة الانتظار هذه بدون التعرّض لقيود الخدمة التي تعمل في المقدّمة على مختلف
الأجهزة. يُرجى العِلم أنّه لم يعُد بإمكانك استخدام
- واجهة المستخدم:
- أضِف عناصر الاحتفاظ بالحالة والعناصر القابلة للتجميع إلى وحدة
media3-ui-compose
لعناصرPlayerSurface
وPresentationState
وPlayPauseButtonState
NextButtonState
وPreviousButtonState
وRepeatButtonState
ShuffleButtonState
وPlaybackSpeedState
.
- أضِف عناصر الاحتفاظ بالحالة والعناصر القابلة للتجميع إلى وحدة
- عمليات التنزيل:
- إصلاح خطأ في
CacheWriter
يؤدي إلى إبقاء مصادر البيانات مفتوحة ومناطق ذاكرة التخزين المؤقت مقفلة في حال رمي مصدر البياناتException
غيرIOException
(#9760)
- إصلاح خطأ في
- إضافة HLS:
- أضِف نسخة أولى من
HlsInterstitialsAdsLoader
. يقرأ أداة تحميل الإعلانات الإعلانات البينية لبروتوكول HLS في قائمة تشغيل وسائط HLS ويربطها بملفAdPlaybackState
الذي يتم تمريره إلىAdsMediaSource
. لا يتيح هذا الإصدار الأولي سوى أحداث الفيديو عند الطلب بتنسيق HLS التي تتضمّن سماتX-ASSET-URI
. - أضِف
HlsInterstitialsAdsLoader.AdsMediaSourceFactory
. يمكن للتطبيقات استخدامها لإنشاء مثيلاتAdsMediaSource
تستخدِمHlsInterstitialsAdsLoader
بطريقة ملائمة وآمنة. - تحليل علامة
SUPPLEMENTAL-CODECS
من قائمة تشغيل HLS لرصد تنسيقات Dolby Vision (#1785) - يجب تخفيف شرط الانتقال إلى مواضع المزامنة في بث HLS (#2209).
- أضِف نسخة أولى من
- إضافة DASH:
- إتاحة تنسيق AC-4 من المستوى 4 لتنسيق DASH (#1898)
- حلّ مشكلة في احتساب الفاصل الزمني لتعديل إدراج الإعلانات في أحداث البث المباشر التي تتضمن فترات متعددة (#1698)
- تحليل السمة
scte214:supplementalCodecs
من بيان DASH لتحديد تنسيقات Dolby Vision (#1785) - تحسين معالجة عمليات النقل بين الفترات في أحداث البث المباشر التي تحتوي فيها الفترة على عيّنات وسائط تتجاوز مدة الفترة المعلَن عنها (#1698)
- تم حلّ المشكلة التي كانت تؤدي إلى دمج مجموعات التحويل التي تم وضع علامة
adaptation-set-switching
عليها مع لغات أو علامات أدوار مختلفة (#2222).
- إضافات برامج الترميز (FFmpeg وVP9 وAV1 وما إلى ذلك):
- أضِف وحدة فك ترميز MPEG-H التي تستخدِم وحدة فك ترميز MPEG-H المضمّنة لفك ترميز الصوت بتنسيق MPEG-H (#1826).
- إضافة MIDI:
- ضمِّن نُسخ
AudioSink
وAudioRendererEventListener
المخصّصة فيMidiRenderer
.
- ضمِّن نُسخ
- إضافة البث:
- عليك ترقية الإصدار المُستخدَم من مكتبة
play-services-cast-framework
إلى 21.5.0 لحلّ مشكلة تتعلّق بانهيارFLAG_MUTABLE
في التطبيقات التي تستهدف واجهة برمجة التطبيقات 34 والإصدارات الأحدث على الأجهزة التي تم تثبيت "خدمات Google Play" عليها ولكن تم إيقافها (#2178).
- عليك ترقية الإصدار المُستخدَم من مكتبة
- التطبيق التجريبي:
- يمكنك توسيع نطاق
demo-compose
باستخدام أزرار إضافية وتحسينتكاملPlayerSurface
من خلال إتاحة إمكانية التكبير/التصغير واستخدام الغالق.
- يمكنك توسيع نطاق
- إزالة الرموز المتوقّفة نهائيًا:
- أزِل الطريقة
AudioMixer.create()
التي تم إيقاف استخدامها. استخدِمDefaultAudioMixer.Factory().create()
بدلاً من ذلك. - أزِل طرق
Transformer.Builder
المتوقّفة نهائيًا التالية:setTransformationRequest()
، استخدِمsetAudioMimeType()
setVideoMimeType()
وsetHdrMode()
بدلاً منها.setAudioProcessors()
، اضبط وحدة معالجة الصوت فيEditedMediaItem.Builder.setEffects()
، ثم أعِد توجيهها إلىTransformer.start()
بدلاً من ذلك.setVideoEffects()
، اضبط تأثير الفيديو فيEditedMediaItem.Builder.setEffects()
، ثم أعِد توجيهه إلىTransformer.start()
بدلاً من ذلك.setRemoveAudio()
، استخدِمEditedMediaItem.Builder.setRemoveAudio()
لإزالة الصوت منEditedMediaItem
الذي تم تمريره إلىTransformer.start()
بدلاً من ذلك.setRemoveVideo()
، استخدِمEditedMediaItem.Builder.setRemoveVideo()
لإزالة الفيديو منEditedMediaItem
الذي تم تمريره إلىTransformer.start()
بدلاً من ذلك.setFlattenForSlowMotion()
، استخدِمEditedMediaItem.Builder.setFlattenForSlowMotion()
لتسطيحEditedMediaItem
الذي تم تمريره إلىTransformer.start()
بدلاً من ذلك.setListener()
، استخدِمaddListener()
أوremoveListener()
أوremoveAllListeners()
بدلاً من ذلك.
- أزِل طرق
Transformer.Listener
المتوقّفة نهائيًا التالية:onTransformationCompleted(MediaItem)
، استخدِمonCompleted(Composition, ExportResult)
بدلاً من ذلك.onTransformationCompleted(MediaItem, TransformationResult)
، استخدِمonCompleted(Composition, ExportResult)
بدلاً من ذلك.onTransformationError(MediaItem, Exception)
، استخدِمonError(Composition, ExportResult, ExportException)
بدلاً من ذلك.onTransformationError(MediaItem, TransformationException)
، استخدِمonError(Composition, ExportResult, ExportException)
بدلاً من ذلك.onTransformationError(MediaItem, TransformationResult, TransformationException)
، استخدِمonError(Composition, ExportResult, ExportException)
بدلاً من ذلك.onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest)
، استخدِمonFallbackApplied(Composition, TransformationRequest, TransformationRequest)
بدلاً من ذلك.
- أزِل فئة
TransformationResult
المتوقّفة نهائيًا. استخدِمExportResult
بدلاً من ذلك. - أزِل فئة
TransformationException
المتوقّفة نهائيًا. استخدِمExportException
بدلاً من ذلك. - أزِل
Transformer.PROGRESS_STATE_NO_TRANSFORMATION
المتوقّف نهائيًا. استخدِمTransformer.PROGRESS_STATE_NOT_STARTED
بدلاً من ذلك. - أزِل
Transformer.setListener()
المتوقّف نهائيًا. استخدِمTransformer.addListener()
أوTransformer.removeListener()
أوTransformer.removeAllListeners()
بدلاً من ذلك. - أزِل
Transformer.startTransformation()
المتوقّف نهائيًا. استخدِمTransformer.start(MediaItem, String)
بدلاً من ذلك. - أزِل
SingleFrameGlShaderProgram
المتوقّف نهائيًا. استخدِمBaseGlShaderProgram
بدلاً من ذلك. - أزِل
Transformer.flattenForSlowMotion
. استخدِمEditedMediaItem.flattenForSlowMotion
بدلاً من ذلك. - تمت إزالة
ExoPlayer.VideoComponent
وExoPlayer.AudioComponent
ExoPlayer.TextComponent
وExoPlayer.DeviceComponent
. - تمت إزالة
androidx.media3.exoplayer.audio.SonicAudioProcessor
. - تمت إزالة طرق
DownloadHelper
المتوقّفة نهائيًا التالية:DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[])
، استخدِمDownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList)
بدلاً من ذلك.getRendererCapabilities(RenderersFactory)
، يمكن الحصول على وظائف مماثلة من خلال إنشاءDefaultRendererCapabilitiesList
باستخدامRenderersFactory
، واستخدامDefaultRendererCapabilitiesList.getRendererCapabilities()
.
- تمت إزالة
PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat)
الطريقة. استخدِمPlayerNotificationManager.setMediaSessionToken(MediaSession.Token)
و أدخِل(MediaSession.Token) compatToken.getToken()
بدلاً من ذلك.
- أزِل الطريقة
1.6.0-rc02
19 آذار (مارس) 2025
استخدِم الإصدار الثابت 1.6.0.
1.6.0-rc01
12 آذار (مارس) 2025
استخدِم الإصدار الثابت 1.6.0.
1.6.0-beta01
26 شباط (فبراير) 2025
استخدِم الإصدار الثابت 1.6.0.
الإصدار 1.6.0-alpha03
6 شباط (فبراير) 2025
استخدِم الإصدار الثابت 1.6.0.
الإصدار 1.6.0-alpha02
30 كانون الثاني (يناير) 2025
استخدِم الإصدار الثابت 1.6.0.
الإصدار 1.6.0-alpha01
20 كانون الأول (ديسمبر) 2024
استخدِم الإصدار الثابت 1.6.0.
الإصدار 1.5
الإصدار 1.5.1
19 كانون الأول (ديسمبر) 2024
تم إصدار androidx.media3:media3-*:1.5.1
.
يحتوي الإصدار 1.5.1 على عمليات الربط هذه.
- ExoPlayer:
- أوقِف استخدام ميزة فك التشفير غير المتزامن في MediaCodec لتجنُّب المشاكل المتعلّقة بوقت انتهاء مهلة الترميز التي تم الإبلاغ عنها باستخدام واجهة برمجة التطبيقات هذه للمنصة (#1641).
- برامج الاستخراج:
- MP3: يجب عدم إيقاف التشغيل مبكرًا عندما لا يغطي جدول محتويات إطار
VBRI
جميع بيانات MP3 في ملف (#1904).
- MP3: يجب عدم إيقاف التشغيل مبكرًا عندما لا يغطي جدول محتويات إطار
- الفيديو:
- التراجع عن استخدام
MediaCodecAdapter
قيم نسبة عرض البكسل إلى ارتفاعه المقدَّمة عند تقديمها أثناء معالجةonOutputFormatChanged
(#1371)
- التراجع عن استخدام
- النص:
- تم إصلاح الخلل في
ReplacingCuesResolver.discardCuesBeforeTimeUs
الذي أدى إلى تجاهل المحتوى الذي كان قيد التنفيذ فيtimeUs
(بدأ قبل ذلك ولكن لم ينته بعد) (#1939).
- تم إصلاح الخلل في
- البيانات الوصفية:
- استخرِج رقم القرص أو المقطع الصوتي والنوع من تعليقات Vorbis إلى
MediaMetadata
(#1958).
- استخرِج رقم القرص أو المقطع الصوتي والنوع من تعليقات Vorbis إلى
الإصدار 1.5.0
27 تشرين الثاني (نوفمبر) 2024
تم إصدار androidx.media3:media3-*:1.5.0
.
يتضمّن الإصدار 1.5.0 عمليات الربط هذه.
- المكتبة المشتركة:
- أضِف
ForwardingSimpleBasePlayer
التي تتيح إعادة توجيه المحتوى إلى مشغّل آخر مع إجراء تعديلات طفيفة مع ضمان الاتساق الكامل ومعالجة المستمعين (#1183). - استبدِل
SimpleBasePlayer.State.playlist
بطريقةgetPlaylist()
. - أضِف إلغاءً لـ
SimpleBasePlayer.State.Builder.setPlaylist()
لتحديدTimeline
وTracks
وMetadata
حاليين مباشرةً بدلاً من إنشاء بنية قائمة تشغيل. - زيادة
minSdk
إلى 21 (Android Lollipop) ويتوافق ذلك مع جميع مكتبات AndroidX الأخرى. - إضافة عنصر
androidx.media3:media3-common-ktx
يقدّم وظائف خاصة بلغة Kotlin تم إنشاؤها على أساس المكتبة الشائعة - أضِف
Player.listen
دالة إضافة تعليق مؤقت لتشغيل دالة معالجة متزامنة لمحاولة الاستماع إلىPlayer.Events
في مكتبةmedia3-common-ktx
. - أزِل
@DoNotInline
التعليقات التوضيحية من klassen الداخلية التي تم وضع علامة عليها يدويًا على أنّها غير مُدرَجة، وذلك لتجنُّب حالات تعذُّر التحقّق من فئة وقت التشغيل. في الإصدارات الحديثة من R8، تتم الآن تلقائيًا إزالة المكالمات غير المضمّنة مثل هذه لتجنُّب أخطاء وقت التشغيل (لذلك لم يعُد من الضروري إزالة الخطوط يدويًا). يجب أن يكون جميع مستخدمي Gradle للمكتبة يستخدمون حاليًا إصدارًا من المكوّن الإضافي لنظام Gradle المتوافق مع Android يستخدم إصدارًا من R8 ينفّذ ذلك، بسببcompileSdk = 35
. على مستخدمي المكتبة الذين يستخدمون أنظمة إنشاء غير Gradle التأكّد من أنّ خطوة التقليل/التشويه المعادل لـ R8 تُجري عملية مماثلة تلقائية لإزالة الربط لتجنُّب حالات تعذُّر التحقّق من فئة وقت التشغيل. سبق أن تم تنفيذ هذا التغيير في مكتبات AndroidX الأخرى.
- أضِف
- ExoPlayer:
- يمكن الآن استدعاء
MediaCodecRenderer.onProcessedStreamChange()
لكل عنصر وسائط. لم يتم استدعاؤه سابقًا للمرة الأولى. استخدِمMediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()
لتفعيل هذه الميزة. - أضِف
PreloadMediaSource.PreloadControl.onPreloadError
للسماح لعمليات تنفيذPreloadMediaSource.PreloadControl
باتخاذ إجراءات عند حدوث خطأ. - أضِف
BasePreloadManager.Listener
لنشر أحداث التحميل المُسبَق إلى التطبيقات. - السماح بتغيير مهلة عميل بروتوكول SNTP وإعادة محاولة استخدام العناوين البديلة عند انتهاء المهلة (#1540)
- أزِل
MediaCodecAdapter.Configuration.flags
لأنّ الحقل كان دائمًا صفرًا. - يجب السماح للمستخدم باختيار مكبّر الصوت المدمج لتشغيل المحتوى على Wear OS API 35 والإصدارات الأحدث (حيث يعلن الجهاز عن توفّر هذه الميزة).
- تأجيل طلب الحظر المُرسَل إلى
Context.getSystemService(Context.AUDIO_SERVICE)
إلى أن يتم تفعيل معالجة ميزة "التركيز على الصوت" يضمن ذلك عدم إجراء المكالمة المحظورة في حال عدم تفعيل معالجة التركيز الصوتي (#1616). - السماح بالتشغيل بغض النظر عن مدة التخزين المؤقت عند تعذُّر التحميل (#1571)
- أضِف
AnalyticsListener.onRendererReadyChanged()
للإشارة إلى الحالات التي تسمح فيها أدوات التحويل الفردية ببدء التشغيل. - إصلاح مشكلة ظهور
MediaCodec.CryptoException
أحيانًا على أنّه "خطأ غير متوقّع في بيئة التشغيل" عند تشغيلMediaCodec
في وضع غير متزامن (السلوك التلقائي في الإصدار 31 من واجهة برمجة التطبيقات والإصدارات الأحدث) - نقْل
bufferedDurationUs
بدلاً منbufferedPositionUs
باستخدامPreloadMediaSource.PreloadControl.onContinueLoadingRequested()
. يتم أيضًا تغييرDefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS
إلىDefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS
، ويجب على التطبيقات عندئذٍ إرسال قيمة تمثّل مدة محددة من التلقائي موضع البدء الذي يجب فيه preloadedتحميل مصدر الوسائط المقابل باستخدام IntDef هذا، بدلاً من موضع. - أضِف عملية تنفيذ
ForwardingRenderer
تعيد توجيه جميع طلبات الطريقة إلى أداة عرض أخرى (1703). - إضافة ميزة "التحميل المُسبَق لقائمة التشغيل" للعنصر التالي في قائمة التشغيل يمكن للتطبيقات
تفعيل التحميل المُسبَق من خلال استدعاء
ExoPlayer.setPreloadConfiguration(PreloadConfiguration)
وفقًا لذلك. يكون التحميل المُسبَق غير مفعَّل تلقائيًا. عند تفعيل ميزةDefaultLoadControl
وعدم التدخل في عملية التشغيل، لا يبدأ التحميل المُسبَق ولا يستمر إلا عندما لا يكون المشغّل قيد التحميل. يمكن للتطبيقات تغيير هذا السلوك من خلال تنفيذLoadControl.shouldContinuePreloading()
وفقًا لذلك (مثل عند تجاوز هذه الطريقة فيDefaultLoadControl
). يؤدي التنفيذ التلقائي لـLoadControl
إلى إيقاف التحميل المُسبَق في حال استخدام التطبيق لطريقة تنفيذ مخصّصة لـLoadControl
. - أضِف الطريقة
MediaSourceEventListener.EventDispatcher.dispatchEvent()
لسماحٍ باستدعاء أحداث أدوات معالجة الفئات الفرعية (1736). - أضِف
DefaultPreloadManager.Builder
الذي ينشئ مثيلَيDefaultPreloadManager
وExoPlayer
باستخدام إعدادات مشترَكة باستمرار. - أزِل المَعلمة
Renderer[]
منLoadControl.onTracksSelected()
لأنّ تنفيذDefaultLoadControl
يمكنه استرداد أنواع البث منExoTrackSelection[]
. - تم إيقاف
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])
نهائيًا وتم وضع علامة على الطريقة باعتبارها نهائية لمنع عمليات الاستبدال. يجب استخدام الرمز الجديدDefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])
بدلاً من ذلك. - الإبلاغ عن أحداث
MediaSourceEventListener
من مصادر ثانوية فيMergingMediaSource
سيؤدي ذلك إلى تسجيل أحداث التحميل بدء/خطأ/تم إلغاؤه/اكتمال لملفّات الترجمة والشرح التي تم تحميلها من مصدر خارجي (تلك التي تمت إضافتها باستخدامMediaItem.LocalConfiguration.subtitleConfigurations
)، وقد تظهر كأحداث تحميل مكرّرة يتم إصدارها منAnalyticsListener
. - منع أخطاء الترجمة والشرح والبيانات الوصفية من إيقاف التشغيل تمامًا
بدلاً من ذلك، يتم إيقاف المقطع الصوتي الذي يتضمّن المشكلة ويستمر تشغيل المقطوعات المتبقية
(#1722).
- في عملية معالجة الترجمة والشرح الجديدة (أثناء الاستخراج)، يتمّ بث أخطاء التحليل (مثل
بيانات الترجمة والشرح غير الصالحة) وتحميلها (مثل HTTP 404)
من خلال
onLoadError
عمليات الاستدعاء. - في معالجة الترجمة والشرح القديمة (أثناء العرض)، يتم فقط عرض أخطاء التحميل
المرتبطة من خلال
onLoadError
عمليات الاستدعاء بينما يتم تجاهل أخطاء التحليل بدون إشعار (هذا سلوك سابق).
- في عملية معالجة الترجمة والشرح الجديدة (أثناء الاستخراج)، يتمّ بث أخطاء التحليل (مثل
بيانات الترجمة والشرح غير الصالحة) وتحميلها (مثل HTTP 404)
من خلال
- تم إصلاح خطأ كان يؤدي إلى تجميد اللقطات في نهاية العنصر في قوائم التشغيل أو الفترات في أحداث البث باستخدام DASH المتعدّدة الفترات التي لا تتطابق مدّتها مع المحتوى الفعلي (#1698).
- أضِف طريقة ضبط إلى
SntpClient
لضبط الحد الأقصى للوقت المنقضي منذ آخر تعديل، وبعد ذلك تتم إعادة بدء العميل (#1794).
- يمكن الآن استدعاء
- المحوِّل:
- أضِف
SurfaceAssetLoader
، الذي يتيح إضافة بيانات الفيديو إلى "Surface
" في "Surface
". - يُبلغ
ImageAssetLoader
عن الإدخال غير المتوافق من خلالAssetLoader.onError
بدلاً من عرض خطأIllegalStateException
. - جعل ضبط مدة الصورة باستخدام
MediaItem.Builder.setImageDurationMs
إلزاميًا لتصدير الصور - إضافة إمكانية التصدير للفواصل في تسلسلات عناصر EditedMediaItem الصوتية
- أضِف
- اختيار المقطع الصوتي:
DefaultTrackSelector
: نفضّل استخدام المقاطع الصوتية المستندة إلى العناصر بدلاً من المقاطع الصوتية المستندة إلى القنوات عند تساوي العوامل الأخرى.
- برامج الاستخراج:
- السماح لـ
Mp4Extractor
وFragmentedMp4Extractor
بتحديد عيّنات H264 التي لا يتم استخدامها كمرجع من قِبل عيّنات لاحقة - إضافة خيار لتفعيل التقديم أو الإيقاف بالاستناد إلى الفهرس في
AmrExtractor
- التعامل مع ملفات MP3 التي يزيد حجمها عن 128 كيلوبايت بين الإطارات الصالحة على أنّها مقطوعة
(بدلاً من غير صالحة) وهذا يعني أنّ الملفات التي تحتوي على بيانات غير MP3 في نهايتها،
وبدون بيانات وصفية أخرى للإشارة إلى طول وحدات بت MP3، ستتوقف الآن عن
التشغيل عند نهاية بيانات MP3 بدلاً من تعذُّر تشغيلها مع رمز الخطأ
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}
(الخطأ 1563). - إصلاح مشكلة في معالجة عيّنات "العرض الإعلاني ما قبل التشغيل" لمواضع بدء الوسائط غير المرتبطة بإطار رئيسي عند معالجة قوائم التعديل في ملفات MP4 (#1659)
- تحسين عملية احتساب معدّل عرض اللقطات باستخدام مدة الوسائط من مربّع
mdhd
فيMp4Extractor
وFragmentedMp4Extractor
(#1531) - إصلاح الحجم غير الصحيح
media_time
في قوائم تعديل MP4 على الرغم من أنّه سبق أن تمّت زيادة حجم ملفsegment_duration
بشكلٍ صحيح باستخدام مقياس وقت الفيلم، تمّ الآن زيادة حجم ملفmedia_time
بشكلٍ صحيح باستخدام مقياس وقت المقطع الصوتي، كما هو محدّد في معيار تنسيق MP4 (#1792). - التعامل مع اللقطات غير المرتبطة بترتيب معيّن في عملية احتساب
endIndices
لملفات MP4 باستخدام قائمة تعديل (#1797) - إصلاح تحليل مدة الوسائط في مربّع
mdhd
لملفات MP4 لمعالجة قيم-1
(#1819) - إتاحة إمكانية تحديد مربّع
h263
في ملفات MP4 للفيديوهات بتنسيق H.263 (#1821) - إتاحة تنسيق ملف الوسائط الأساسي AC-4 Level-4 وفقًا لمعيار ISO (#1265)
- السماح لـ
- DataSource:
- تعديل
HttpEngineDataSource
للسماح باستخدام الإصدار S الإضافة 7 بدلاً من المستوى 34 لواجهة برمجة التطبيقات (#1262) DataSourceContractTest
: تأكَّد من أنّDataSource.getUri()
يعرض عنوان URI الذي تمّ حلّه (كما هو موضّح في المستندات). إذا كان هذا العنوان مختلفًا عن عنوان ملف التماثل المُطلوب، يمكن أن تشير الاختبارات إلى ذلك باستخدام الطريقة الجديدةDataSourceContractTest.TestResource.Builder.setResolvedUri()
.DataSourceContractTest
: تأكَّد من أنّDataSource.getUri()
وgetResponseHeaders()
يعرضان القيمة "مفتوح" بعد تعذُّر الاتصال بمحاولةopen()
(بسبب عدم العثور على مورد) وقبل إجراء محاولة متعاقبة لتحميلclose()
.- يتيح إلغاء القيمة
DataSourceContractTest.getNotFoundResources()
لفئات فرعية اختبارية تقديم موارد متعددة "لم يتم العثور عليها"، و تقديم أي رؤوس متوقّعة أيضًا. يتيح ذلك التمييز بين رمز الخطأ HTTP 404 (مع الرؤوس) و "تعذّر العثور على الخادم" (بدون رؤوس).
- يتيح إلغاء القيمة
- تعديل
- الصوت:
- ضبط البيانات الوصفية لمستوى الصوت CTA-2075 تلقائيًا في برنامج الترميز إذا كانت متوفّرة في الوسائط
- تأكَّد من خفض مستوى الصوت بسلاسة عند التقديم أو الإيقاف.
- إصلاح أصوات التنقّل التي قد تحدث أثناء التقديم أو الإيقاف
- إصلاح تراكم أخطاء القطع في خوارزمية التمديد الزمني/تغيير الدرجة الصوتية في Sonic
- إصلاح خطأ في
SpeedChangingAudioProcessor
يؤدي إلى حذف ملفّات مخرج الفيديو
- الفيديو:
MediaCodecVideoRenderer
يتجنّب فك ترميز العيّنات التي لا يتم عرضها أو استخدامها كمرجع من قِبل عيّنات أخرى.- في الإصدار 35 من واجهة برمجة التطبيقات والإصدارات الأحدث، يمكن أن يتلقّى
MediaCodecAdapter
الآنnull
Surface
فيconfigure
ويطلب إجراءً جديدًاdetachOutputSurface
لإزالةSurface
تم ضبطه سابقًا إذا كان برنامج الترميز يتيح ذلك (MediaCodecInfo.detachedSurfaceSupported
). - استخدِم قيم نسبة عرض البكسل إلى ارتفاعه المقدَّمة في
MediaCodecAdapter
إذا تم تقديمها عند معالجةonOutputFormatChanged
(#1371). - إضافة حلّ بديل لمشكلة في جهاز Galaxy Tab S7 FE تؤدي إلى وضع علامة "غير متوافقة" على عمليات بث H264 الآمنة التي تبلغ سرعتها 60 لقطة في الثانية (#1619).
- إضافة حلّ بديل لبرامج الترميز التي تتعذّر إكمالها بعد العيّنة الأخيرة بدون عرض إشارة نهاية البث
- النص:
- أضِف
VoiceSpan
مخصّصًا واملأه لتحديد مقطع الترجمة والشرح الصوتي في WebVTT (#1632). - تأكَّد من عرض WebVTT في HLS مع الطوابع الزمنية للترجمة والشرح الكبيرة جدًا (التي تتجاوز
long
64 بت عند تمثيلها بالميكرو ثانية ومضاعفة90,000
قاعدة وقت MPEG) (#1763). - إتاحة ترجمة CEA-608 في محتوى Dolby Vision (#1820)
- إصلاح مشكلة تعليق التشغيل في أحداث البث المتعدّد الفترات باستخدام DASH عند تفعيل ملفّات ترجمة CEA-608 (#1863)
- أضِف
- البيانات الوصفية:
- يمكنك تحديد النوع
C.TRACK_TYPE_METADATA
للمقاطع الصوتية التي تحتوي على محتوى icy أو vnd.dvb.ait.
- يمكنك تحديد النوع
- الصورة:
- أضِف
ExternallyLoadedImageDecoder
لدمج مبسّط مع مكتبات تحميل الصور الخارجية، مثل Glide أو Coil.
- أضِف
- DataSource:
- أضِف
FileDescriptorDataSource
، وهوDataSource
جديد يمكن استخدامه للقيام بقراءة بيانات منFileDescriptor
(#3757).
- أضِف
- التأثير:
- أضِف
DefaultVideoFrameProcessor
حلًا بديلاًSurfaceTexture
للتصغير البسيط. قد يتضمّنSurfaceTexture
تصغيرًا صغيرًا يقطع حدود 1 بكسل حول حافة مساحة تخزين تم اقتصاصها. تمّت معالجة ذلك الآن كي يكون الناتج أقرب إلى المتوقّع. - زيادة السرعة
DefaultVideoFrameProcessor.queueInputBitmap()
ونتيجةً لذلك، يكون تصدير الصور إلى الفيديوهات باستخدامTransformer
أسرع.
- أضِف
- إضافة IMA:
- تم إصلاح الخلل الذي كان يؤدي إلى ظهور رمز
ArrayIndexOutOfBoundsException
فيImaServerSideAdInsertionMediaSource
عند محو قائمة التشغيل. - إصلاح خطأ يؤدي إلى ظهور
ArrayIndexOutOfBoundsException
عند تشغيل المحتوى بعد انتهاء آخر إعلان أثناء عرض (#1741) في أحداث DAI التي يتم إدراجها من جهة الخادم بدون إعلان ما قبل التشغيل
- تم إصلاح الخلل الذي كان يؤدي إلى ظهور رمز
- الجلسة:
- أضِف
MediaButtonReceiver.shouldStartForegroundService(Intent)
للسماح للتطبيقات بالتجاهل لطلب التشغيل الذي يصل لاستئناف التشغيل من خلال تجاوز هذه الطريقة. يتم تشغيل الخدمة تلقائيًا في كل الأوقات، ولا يمكن إيقاف التشغيل بدون أن يؤدي النظام إلى تعطيل الخدمة باستخدامForegroundServiceDidNotStartInTimeException
(#1528). - تم إصلاح الخلل الذي كان يتسبب في توجيه الطلبات المخصّصة المُرسَلة من
MediaBrowser
إلىMediaSessionCompat.Callback
بدلاً من استخدامMediaBrowserServiceCompat
من الطريقة عند الاتصال بأحد الخدمات القديمة. وقد منع ذلكMediaBrowser
من تلقّي قيمة الردّ الفعلية التي أرسلتها الخدمة القديمة (#1474). - المعالجة
IllegalArgumentException
التي تُعرَض على أجهزة جهات تصنيع معيّنة عند ضبط جهاز استقبال البث لطلبات زر الوسائط (#1730) - أضِف أزرار أوامر لعناصر الوسائط. يؤدي ذلك إلى إضافة Media3 API لما كان يُعرف باسم
Custom browse actions
مع المكتبة القديمة التي تتضمّنMediaBrowserCompat
. يُرجى العِلم أنّه باستخدام Media3، تتوفّر أزرار الأوامر الخاصة بعناصر الوسائط لكلٍّ منMediaBrowser
وMediaController
. راجِع إجراءات التصفّح المخصّصة لنظام التشغيل AAOS. - تم إصلاح الخلل الذي كان يمنع أحيانًا وحدة التحكّم في Media3 من السماح لتطبيق جلسة
ببدء خدمة تعمل في المقدّمة بعد طلب
play()
. - حصر
CommandButton.Builder.setIconUri
لقبول عناوين URL للمحتوى فقط - تمرير إشارات الاتصال لمتصفّح Media3 إلى
MediaBrowserCompat
الأولي عند الاتصال بMediaBrowserCompat
قديم يمكن للخدمة تلقّي إشارات الاتصال التي يتم تمريرها كإشارات جذر مع أول طلب إلىonGetRoot()
. - إصلاح خطأ كان يتسبب في عدم تلقّي
MediaBrowser
خطأ أرسلته الخدمة بعد أن اشترك المتصفّح فيparentid
، وذلك عندما كانMediaBrowser
متصلاً بخدمة متصفّح قديمة - تحسين سلوك التشغيل التفاعلي، بحيث لا يطلب متصفّح Media3 المتصل
بحساب
MediaBrowserService
قديم بيانات أطفال حسابparentId
مرتين عند الاشتراك في حساب أحد الوالدَين
- أضِف
- واجهة المستخدم:
- عليك تفعيل الحلول البديلة لجعل الفيديو المُمطَّل/المقتطع في ميزة "
PlayerView
فيديو ضمن فيديو"AndroidView
، وذلك بسبب المشاكل المتعلّقة بعمليات الانتقال المشترَكة المستندة إلى تنسيق XML. يجب أن تتصل التطبيقات التي تستخدمPlayerView
داخلAndroidView
بخطPlayerView.setEnableComposeSurfaceSyncWorkaround
للموافقة على استخدام الميزة (#1237، #1594). - أضِف
setFullscreenButtonState
إلىPlayerView
للسماح بتعديلات رمز زرّ ملء الشاشة عند الطلب، أي خارج النطاق وليس بشكل تفاعلي عند النقر عليه (#1590، #184). - إصلاح خطأ يمنع ظهور خيار "بدون" في ميزة اختيار النص إذا كانت هناك إعدادات مفضّلة لاختيار مقاطع الترجمة والشرح محدّدة من التطبيق
- عليك تفعيل الحلول البديلة لجعل الفيديو المُمطَّل/المقتطع في ميزة "
- إضافة DASH:
- إتاحة الفترات التي تبدأ في منتصف شريحة (#1440)
- إضافة "البث السلس":
- إصلاح خطأ
Bad magic number for Bundle
عند تشغيل أحداث بث باستخدام تقنية SmoothStreaming تتضمّن مقاطع نصية (#1779)
- إصلاح خطأ
- إضافة RTSP:
- إضافات برامج الترميز (FFmpeg وVP9 وAV1 وما إلى ذلك):
- أضِف وحدة ترميز IAMF التي تتيح تشغيل ملفات MP4
التي تحتوي على مقاطع صوتية بتنسيق IAMF باستخدام مكتبة libiamf الأصلية ل synthesizing audio.
- يمكن تشغيل الصوت بتنسيق الاستيريو وتنسيق 5.1 مع الصوت المكاني، بالإضافة إلى تفعيل ميزة التتبّع الاختياري لحركة الرأس، ولكن لا تتوفّر إمكانية تشغيل الصوت بنطاق الاستماع البشري حاليًا.
- إضافة دعم لصفحات بحجم 16 كيلوبايت لإضافات برامج الترميز على Android 15 (#1685)
- أضِف وحدة ترميز IAMF التي تتيح تشغيل ملفات MP4
التي تحتوي على مقاطع صوتية بتنسيق IAMF باستخدام مكتبة libiamf الأصلية ل synthesizing audio.
- إضافة البث:
- إيقاف تنظيف المخطط الزمني بعد انقطاع الاتصال بجلسة البث، ما يتيح لتطبيق المُرسِل استئناف التشغيل على الجهاز بعد انقطاع الاتصال
- تعبئة
DeviceInfo
في CastPlayer عند توفيرContext
يتيح ذلك ربطMediaSession
بـRoutingSession
، وهو ضروري لدمج "محوِّل الإخراج" (#1056).
- أدوات الاختبار:
- يتضمّن
DataSourceContractTest
الآن اختبارات لإثبات ما يلي:- تم تعديل مصدر البيانات
read position
. - تم تطبيق وحدة تخزين مؤقت للإخراج
offset
بشكل صحيح.
- تم تعديل مصدر البيانات
- يتضمّن
- التطبيق التجريبي
- حلّ مشاكل تسرُّب الذاكرة في التطبيق التجريبي المخصّص لفيديوهات Shorts القصيرة (#1839)
- إزالة الرموز المتوقّفة نهائيًا:
- أزِل العمودَين
Player.hasPrevious
وPlayer.hasPreviousWindow()
اللذَين تم إيقافهما نهائيًا. استخدِمPlayer.hasPreviousMediaItem()
بدلاً من ذلك. - أزِل الطريقة
Player.previous()
التي تم إيقاف استخدامها. استخدِمPlayer.seekToPreviousMediaItem()
بدلاً من ذلك. - أزِل الطريقة
DrmSessionEventListener.onDrmSessionAcquired
التي تم إيقاف استخدامها. - أزِل وظائف إنشاء
DefaultEncoderFactory
المتوقّفة نهائيًا. استخدِمDefaultEncoderFactory.Builder
بدلاً من ذلك.
- أزِل العمودَين
الإصدار 1.5.0-rc02
19 تشرين الثاني (نوفمبر) 2024
استخدِم الإصدار الثابت 1.5.0.
الإصدار 1.5.0-rc01
13 تشرين الثاني (نوفمبر) 2024
استخدِم الإصدار الثابت 1.5.0.
الإصدار 1.5.0-beta01
30 تشرين الأول (أكتوبر) 2024
استخدِم الإصدار الثابت 1.5.0.
الإصدار 1.5.0-alpha01
10 أيلول (سبتمبر) 2024
استخدِم الإصدار الثابت 1.5.0.
الإصدار 1.4.0
الإصدار 1.4.1
27 آب (أغسطس) 2024
تم إصدار androidx.media3:media3-*:1.4.1
.
يحتوي الإصدار 1.4.1 على عمليات الربط هذه.
- ExoPlayer:
- برامج الاستخراج:
- MP3: يجب إصلاح الخطأ
Searched too many bytes
عن طريق تجاهل data غير MP3 التي تظهر في نهاية الملف بشكلٍ صحيح استنادًا إلى حقل الطول في إطارInfo
(#1480).
- MP3: يجب إصلاح الخطأ
- النص:
- ملف TTML: إصلاح معالجة قيم النسبة المئوية
tts:fontSize
لضمان اكتسابها بشكل صحيح من العقد الرئيسية التي تحتوي على قيم النسبة المئويةtts:fontSize
- تم إصلاح
IndexOutOfBoundsException
فيLegacySubtitleUtil
بسبب التعامل بشكل غير صحيح مع حالة وقت بدء الإخراج المطلوب الذي كان أكبر من أو يساوي وقت الحدث النهائي فيSubtitle
(#1516).
- ملف TTML: إصلاح معالجة قيم النسبة المئوية
- إدارة الحقوق الرقمية:
- إصلاح خطأ
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE
على الأجهزة التي تعمل بالإصدار 31 من واجهة برمجة التطبيقات أو الإصدارات الأحدث عند تشغيل محتوى L1 Widevine يرجع سبب حدوث هذا الخطأ إلى عدم اكتمال تنفيذ أسلوب الإطار العملMediaDrm.requiresSecureDecoder
(#1603).
- إصلاح خطأ
- التأثير:
- أضِف طريقة
release()
إلىGlObjectsProvider
.
- أضِف طريقة
- الجلسة:
- إضافة RTSP:
- تخطّي أوصاف الوسائط غير الصالحة في تحليل SDP (#1087)
الإصدار 1.4.0
25 تموز (يوليو) 2024
تم إصدار androidx.media3:media3-*:1.4.0
.
يحتوي الإصدار 1.4.0 على عمليات الربط هذه.
- المكتبة المشتركة:
- يجب إعادة توجيه طلبات البحث التي يُفترض أنّها لا تؤدي إلى أي إجراء إلى الطريقتَين المحميتَين
BasePlayer.seekTo()
وSimpleBasePlayer.handleSeek()
بدلاً من تجاهلها. إذا كنت تطبّق هذه الطرق في مشغّل مخصّص، قد تحتاج إلى معالجة هذه الطلبات الإضافية باستخدامmediaItemIndex == C.INDEX_UNSET
. - إزالة الاعتماد على ميزة إزالة الرمز البرمجي غير القابل للتنفيذ في Java 8 المحسَّنة أثناء عملية الترجمة (#1312)
- تأكَّد من أنّ المدة التي تم تمريرها إلى
MediaItem.Builder.setImageDurationMs()
يتم تجاهلها إذا كانMediaItem
غير صورة (كما هو موضّح في المستندات). - أضِف
Format.customData
لتخزين المعلومات المخصّصة التي يوفّرها التطبيق حول مواردFormat
.
- يجب إعادة توجيه طلبات البحث التي يُفترض أنّها لا تؤدي إلى أي إجراء إلى الطريقتَين المحميتَين
- ExoPlayer:
- أضِف
BasePreloadManager
الذي ينظّم عملية التحميل المُسبَق لمصادر متعدّدة استنادًا إلى الأولويات التي تحدّدهاrankingData
. يمكن إجراء التخصيص من خلال توسيع نطاق هذه الفئة. أضِفDefaultPreloadManager
الذي يستخدمPreloadMediaSource
لتحميل عيّنات من الوسائط مسبَقًا من المصادر إلى الذاكرة، ويستخدم عددًا صحيحًاrankingData
يشير إلى فهرس عنصر في واجهة المستخدم. - أضِف
PlayerId
إلى معظم طرقLoadControl
لتفعيل عمليات تنفيذLoadControl
لتتوافق مع لاعبين متعدّدين. - أزِل
Buffer.isDecodeOnly()
وC.BUFFER_FLAG_DECODE_ONLY
. ليس هناك حاجة إلى ضبط هذه العلامة لأنّ برامج عرض الفيديو وبرامج ترميز الفيديو ستقرر تخطّي المخازن المؤقتة استنادًا إلى الطابع الزمني. يجب أن تتحقّق عمليات تنفيذRenderer
المخصّصة مما إذا كان وقت التخزين المؤقت لا يقل عنBaseRenderer.getLastResetPositionUs()
لتحديد ما إذا كان يجب عرضRenderer
. يمكن لعمليات تنفيذSimpleDecoder
المخصّصة التحقّق منisAtLeastOutputStartTimeUs()
إذا لزم الأمر أو وضع علامة على ذاكرات التخزين المؤقت الأخرى باستخدامDecoderOutputBuffer.shouldBeSkipped
لتخطّيها. - اسمح بعرض قيمة فارغة من خلال
TargetPreloadStatusControl.getTargetPreloadStatus(T)
للإشارة إلى عدم تحميلMediaSource
مسبقًا باستخدامrankingData
المحدّد. - أضِف
remove(MediaSource)
إلىBasePreloadManager
. - أضِف
reset()
إلىBasePreloadManager
لتحرير جميع مصادر الانتظار مع الاحتفاظ بمثيل "مدير التحميل المُسبَق". - أضِف
ExoPlayer.setPriority()
(وBuilder.setPriority()
) لتحديد قيمة الأولوية المستخدَمة فيPriorityTaskManager
وأهمية MediaCodec بدءًا من الإصدار 35 من واجهة برمجة التطبيقات. - تم حلّ مشكلة تعديل وقت إعادة التخزين الأخير الذي أدّى إلى استخدام مفتاح
bs
(عدم توفّر مساحة كافية في ذاكرة التخزين المؤقت) غير صحيح في CMCD (#1124). - أضِف
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
للإشارة إلى أنّه تم تحميل المصدر بالكامل. يتيح ذلك لعمليات تنفيذDefaultPreloadManager
وPreloadMediaSource.PreloadControl
المخصّصة تحميل المصدر التالي مسبقًا أو اتّخاذ إجراءات أخرى. - إصلاح خطأ كان يؤدي إلى بدء استثناء أثناء التشغيل عند تخطّي الصمت في نهاية العناصر
- أضِف
clear
إلىPreloadMediaSource
لتجاهل فترة التحميل المُسبَق. - أضِف رمز خطأ جديدًا هو
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED
يُستخدَم عند استرداد موارد ترميز الصوت والفيديو للمهام ذات الأولوية الأعلى. - اسمح
AdsMediaSource
بتحميل الإعلانات ما قبل التشغيل قبل اكتمال عملية تجهيز وسائط المحتوى الأولية (#1358). - تم إصلاح خلل كان يؤدي إلى نقل التشغيل إلى
STATE_ENDED
عند إعادة إعداد بث مباشر باستخدام DASH يتضمن عدة فترات بعد أن تمت إزالة الفترة الأصلية من البيان. - أعد تسمية
onTimelineRefreshed()
إلىonSourcePrepared()
وonPrepared()
إلىonTracksSelected()
فيPreloadMediaSource.PreloadControl
. أعِد أيضًا تسمية IntDefs فيDefaultPreloadManager.Stage
وفقًا لذلك. - إضافة ميزة تجريبية للتخطيط الديناميكي لمواءمة العمل بشكل أفضل مع دورات تنشيط وحدة المعالجة المركزية وتأخير التنشيط إلى حين أن يتمكّن مُنشئ العرض من التقدّم
يمكنك تفعيل هذا الخيار باستخدام
experimentalSetDynamicSchedulingEnabled()
عند إعداد مثيل ExoPlayer. - أضِف
Renderer.getDurationToProgressUs()
. يمكن لـRenderer
تنفيذ هذه الطريقة لإعادة إرسال المدة التي يجب أن يتقدم فيها التشغيل إلى ExoPlayer لكي يتقدّم مُنشئ العرض. إذا تم ضبطExoPlayer
باستخدامexperimentalSetDynamicSchedulingEnabled()
، سيستدعيExoPlayer
هذه الطريقة عند احتساب الوقت لجدولة مهمة العمل. - أضِف
MediaCodecAdapter#OnBufferAvailableListener
لتنبيه عندما تكون ملفّات تخزين مؤقتة للإدخال والإخراج متاحة لاستخدامMediaCodecRenderer
. سيُرسِلMediaCodecRenderer
إشارة إلىExoPlayer
عند تلقّي هذه callbacks، وإذا تم ضبطExoPlayer
باستخدامexperimentalSetDynamicSchedulingEnabled()
، سيُحدِّدExoPlayer
جدولاً زمنيًا لحلقة العمل لأنّه يمكن لأدوات التقديم والعرض تحقيق تقدّم. - استخدِم فئة البيانات لطرق
LoadControl
بدلاً من المَعلمات الفردية. - أضِف
ExoPlayer.isReleased()
للتحقّق مما إذا تمّت دعوةExoplayer.release()
. - أضِف
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
لضبط الحد الأقصى للمكان الذي يبحث فيهseekToPrevious()
عن العنصر السابق (#1425). - إصلاح بعض التناقضات في تركيز الصوت، مثل عدم الإبلاغ عن فقدان التركيز الكامل أو المؤقت أثناء إيقاف المشغّل مؤقتًا (#1436)
- حلّ مشكلة
IndexOutOfBoundsException
المحتمَلة التي تحدث بسبب أدوات الاستخراج التي تُبلغ عن أغانٍ إضافية بعد خطوة الإعداد الأولية (#1476) - سيتلقّى
Effects
فيExoPlayer.setVideoEffect()
الطوابع الزمنية بعد إزالة إزاحة أداة التحويل (#1098). - إصلاح مشكلة
IllegalArgumentException
محتملة عند معالجة خطأ في المشغّل حدث أثناء قراءة المحتوى إلى الأمام في عنصر آخر من قائمة التشغيل (#1483)
- أضِف
- المحوِّل:
- أضِف
audioConversionProcess
وvideoConversionProcess
إلىExportResult
للإشارة إلى كيفية إنشاء المقطع الصوتي المعني في ملف الإخراج. - تم تخفيف عمليات التحقّق من مستوى تحسين القطع باستخدام برنامج الترميز H.264.
- إضافة إمكانية التبديل بين وسائط الإدخال بتنسيق SDR وHDR بشكل تسلسلي
- إتاحة استخدام المؤثرات الصوتية على مستوى التركيب
- إتاحة إعادة ترميز صور Ultra HDR إلى فيديوهات HDR
- تم إصلاح مشكلة عدم عرض
DefaultAudioMixer
للقيمة الصحيحة للبايت بعد إعادة ضبطه وإعادة استخدامه. - حلّ مشكلة خطأ في وحدة الترميز حيث كان عدد القنوات الصوتية محدودًا بالصوت الاستيريو عند معالجة إدخال PCM
- عند اختيار المقاطع الصوتية في
ExoPlayerAssetLoader
، تجاهل القيود المفروضة على عدد قنوات الصوت، لأنّها لا تنطبق إلا على التشغيل. - استبدِل واجهة
androidx.media3.transformer.Muxer
بواجهةandroidx.media3.muxer.Muxer
وأزِلandroidx.media3.transformer.Muxer
. - حلّ مشاكل تحميل صور HEIC من مخططات معرّفات الموارد المنتظمة للمحتوى (#1373).
- يمكنك تعديل مدة المقطع الصوتي في
AudioGraphInput
لتحسين مزامنة الصوت والصورة. - أزِل حقل
ExportResult.processedInputs
. إذا كنت تستخدم هذا الحقل لتحديد تفاصيل الترميز، استخدِمDefaultDecoderFactory.listener
بدلاً من ذلك. فيحال حدوث استثناء في برنامج ترميز الفيديو، ستتوفّر تفاصيل برنامج الترميز فيExportException.codecInfo
.
- أضِف
- برامج الاستخراج:
- MPEG-TS: يمكنك الرجوع إلى التغيير مع التأكّد من عرض الإطار الأخير من خلال تمرير وحدة الوصول الأخيرة من البث إلى قائمة انتظار العيّنات (#7909). دمج إصلاحات لحلّ المشاكل التي ظهرت في بثّات HLS التي تتضمّن إطارات I فقط(#1150) وبثّات HLS التي تتضمّن ترميز H.262 (#1126)
- MP3: يُفضّل استخدام حجم البيانات من إطار
Info
بدلاً من الحجم الذي يُبلِغ عنه البث الأساسي (مثل حجم الملف أو رأس HTTPContent-Length
). يساعد ذلك في استبعاد بيانات المقاطع الدعائية غير القابلة للتشغيل (مثل أعمال فنية للألبومات) من عمليات احتساب التقديم/الترجيع بمعدّل نقل بيانات ثابت، ما يجعل عمليات التقديم/الترجيع أكثر دقةً (#1376). - MP3: استخدِم عدد اللقطات والبيانات الأخرى في لقطة
Info
(في حال توفّرها) لحساب متوسط معدل نقل البيانات من أجل البحث عن معدل ثابت لنقل البيانات، بدلاً من التقريب من معدل نقل البيانات للّقطة بعد لقطةInfo
، التي قد تكون صغيرة بشكل مصطنع، مثل لقطةPCUT
(#1376). - إصلاح استخراج تنسيق الصوت PCM في حاويات AVI
- الصوت:
- إصلاح سمات ترميز DTS:X Profile 2 لتشغيل "التشغيل المباشر" (#1299)
- بالنسبة إلى التشغيل بلا إنترنت، يجب إعادة ضبط حقل التتبّع لإكمال البث
في
DefaultAudioSink
قبل استدعاءAudioTrack.stop()
لكي تتمكّنAudioTrack.StreamEventCallback#onPresentationEnded
من التعرّف بشكلٍ صحيح على وقت تشغيل جميع البيانات في انتظار المعالجة. - إصلاح خطأ في
SilenceSkippingAudioProcessor
حيث يمكن أن تؤدي عمليات النقل بين تنسيقات الصوت المختلفة (على سبيل المثال، الاستيريو إلى الصوت الأحادي) إلى طرح المعالج استثناءً (#1352) - نفِّذ
MediaCodecAudioRenderer.getDurationToProgressUs()
لكي يحدِّد ExoPlayer جدولاً زمنيًا ديناميكيًا لحلقة العمل الرئيسية عندما يمكن لمحاولة MediaCodecAudioRenderer إحراز تقدم.
- الفيديو:
- إصلاح مشكلة ظهور
Listener.onRenderedFirstFrame()
مبكرًا جدًا عند تبديل مساحات العرض أثناء التشغيل - إصلاح منطق التراجع عن فك ترميز Dolby Vision لاستخدام فك ترميز AV1 متوافق إذا لزم الأمر (#1389)
- حلّ استثناء ترميز الفيديو الذي قد ينتج عن تفعيل أداة عرض فيديو أثناء تشغيل الفيديو
- إصلاح مشكلة ظهور
- النص:
- إصلاح مشكلة تخطّي الترجمة والشرح التي تبدأ قبل موضع التقديم/الترجيع لم تظهر هذه المشكلة إلا في الإصدار Media3 1.4.0-alpha01.
- يمكنك تغيير السلوك التلقائي لتحليل الترجمة والشرح لكي يتم ذلك أثناء الاستخراج بدلاً من أثناء العرض (اطّلِع على مخطّط العمارة في ExoPlayer للتعرّف على الفرق بين الاستخراج والعرض).
- يمكن إلغاء هذا التغيير من خلال استدعاء كلا
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)
وTextRenderer.experimentalSetLegacyDecodingEnabled(true)
. اطّلِع على المستندات حول التخصيص لمعرفة كيفية دمج هذه المكوّنات في مثيلExoPlayer
. ستتم إزالة هذه الطرق (وجميع ميزات فك ترميز الترجمة والشرح القديمة) في إصدار مستقبلي. - يجب تعديل التطبيقات التي تستخدم عمليات تنفيذ
SubtitleDecoder
مخصّصة لتنفيذSubtitleParser
بدلاً من ذلك (وSubtitleParser.Factory
بدلاً منSubtitleDecoderFactory
).
- يمكن إلغاء هذا التغيير من خلال استدعاء كلا
- PGS: يجب تصحيح ترميز عدد مرات تكرار الوحدات لتحديد
0
كفهرس لون بدلاً من قيمة لونية صريحة (#1367). - CEA-708: تجاهُل قيمة
rowLock
تنص مواصفة CEA-708-E S-2023 على أنّه ينبغي افتراض أنّ كلاً منrowLock
وcolumnLock
صحيحان، بغض النظر عن القيم المتوفّرة في البث (لم يتم تفعيلcolumnLock
، لذا يُفترض أنّه خطأ دائمًا).- كان هذا التغيير مضمّنًا في الأصل في ملاحظات الإصدار
1.3.0-alpha01
، ولكن تم التراجع عن التغيير عن طريق الخطأ قبل إصدار1.3.0-rc01
. تم حلّ هذه المشكلة الآن، لذا أصبح التغيير متوفّرًا مرة أخرى.
- كان هذا التغيير مضمّنًا في الأصل في ملاحظات الإصدار
- CEA-708: تجنَّب إضافة أسطر جديدة مكرّرة من خلال معالجة ExoPlayer الساذجة لأمر "set pen location" (#1315).
- يجب حلّ مشكلة
IllegalArgumentException
منLegacySubtitleUtil
عندما لا يحتوي ملفIllegalArgumentException
على مقتطفات من ملفLegacySubtitleUtil
، مثلاً كجزء من بث DASH (#1516).
- البيانات الوصفية:
- إصلاح تعيين علامات ترتيب MP4 إلى علامات ID3 في السابق، كانت علامات "ترتيب الألبوم"
(
soal
) و"ترتيب الفنان" (soar
) و"ترتيب فنان الألبوم" (soaa
) في MP4 مرتبطة بشكل خاطئ بعلاماتTSO2
وTSOA
وTSOP
ID3 (#1302). - إصلاح قراءة علامتَي MP4 (/iTunes) الرقميتَين
gnre
(النوع) وtmpo
(السرعة) عندما تكون القيمة أطول من بايت واحد - انشر إطار
TCON
في ID3 إلىMediaMetadata.genre
(#1305).
- إصلاح تعيين علامات ترتيب MP4 إلى علامات ID3 في السابق، كانت علامات "ترتيب الألبوم"
(
- الصورة:
- إتاحة استخدام شبكات الصور المصغّرة غير المربّعة في DASH (#1300)
- إتاحة استخدام تنسيق AVIF مع الإصدار 34 من واجهة برمجة التطبيقات والإصدارات الأحدث
- السماح باستخدام
null
كمَعلمة لـExoPlayer.setImageOutput()
لمحوImageOutput
تم ضبطه سابقًا
- DataSource:
- يجب توفير إمكانية استخدام عناوين URL لمواد العرض الأوّلية
android.resource://package/id
حيث يختلفpackage
عن حزمة التطبيق الحالي. لم يكن هذا الإجراء موثَّقًا في السابق، ولكنه يمثّل طريقة أكثر فعالية للوصول إلى الموارد في حزمة أخرى مقارنةً بالوصول إليها بالاسم. - تأكَّد من أنّ
url
غير فارغ في وظائف إنشاءDataSpec
. سبق أن تم وضع تعليق توضيحي على هذه القيمة لتكون غير فارغة. - اسمح لـ
ByteArrayDataSource
بتحليل معرّف الموارد المنتظم (URI) إلى صفيف بايت أثناءopen()
، بدلاً من برمجته بشكل ثابت عند الإنشاء (#1405).
- يجب توفير إمكانية استخدام عناوين URL لمواد العرض الأوّلية
- إدارة الحقوق الرقمية:
- السماح بضبط
LoadErrorHandlingPolicy
علىDefaultDrmSessionManagerProvider
(#1271)
- السماح بضبط
- التأثير:
- أن تتيح تغييرات متعددة في السرعة ضمن
EditedMediaItem
أوComposition
نفسه فيSpeedChangeEffect
- إتاحة إخراج HLG وPQ من إدخال ملفات بترميز مرئي بدقة فائقة للغاية
- إضافة إمكانية استخدام EGL_GL_COLORSPACE_BT2020_HLG_EXT، ما يؤدي إلى تحسين إخراج سطح HLG في ExoPlayer.setVideoEffect وDebug SurfaceView في Transformer
- عدِّل عملية تنفيذ مصفوفة التراكب لتكون متسقة مع مستندات المساعدة من خلال قلب قيم x وy المطبَّقة في
setOverlayFrameAnchor()
. في حال استخدامOverlaySettings.Builder.setOverlayFrameAnchor()
، يمكنك قلب قيم x وy بضربهما في-1
. - إصلاح خطأ يؤدي إلى تعطُّل
TimestampWrapper
عند استخدامه معExoPlayer#setVideoEffects
(#821) - تغيير مساحة العمل التلقائية للألوان بنطاق ديناميكية عادي (SDR) من الألوان الخطية إلى الكهربائية فيديو بنطاق ديناميكية عادي (SDR) بتنسيق BT 709 قدِّم أيضًا خيارًا ثالثًا للاحتفاظ بالملفّ الشخصي للألوان الأصلي.
- السماح بتحديد ترتيب z غير المحدّد لـ EditedMediaItemSequences (#1055)
- الحفاظ على نطاق سطوع متسق في أجزاء مختلفة من محتوى HDR (يستخدم نطاق HLG)
- إتاحة استخدام ميزة "العرض الفائق بدقة عالية الدقة (الصور النقطية)" على المحتوى بدقة عالية الدقة
- السماح باستخدام تأثيرات
SeparableConvolution
قبل الإصدار 26 من واجهة برمجة التطبيقات - أزِل
OverlaySettings.useHdr
غير المستخدَمة لأنّ النطاق الديناميكي للعنصر المتراكب والإطار يجب أن يتطابقا. - إتاحة استخدام ميزة "النطاق العالي الديناميكية" في
TextOverlay
يمكن تعديل سطوع النص المتراكب باستخدامOverlaySettings.Builder.setHdrLuminanceMultiplier()
.
- أن تتيح تغييرات متعددة في السرعة ضمن
- إضافة IMA:
- ترقية واجهة برمجة التطبيقات المطلوبة للتطبيقات لتشغيل عمليات عرض الإعلانات الديناميكية أثناء التشغيل إلى الإصدار الثابت
- أضِف
replaceAdTagParameters(Map <String, String>)
إلىImaServerSideAdInsertionMediaSource.AdLoader
التي تسمح باستبدال مَعلمات علامة الإعلان أثناء التشغيل. - إصلاح خطأ عدم
استدعاء
VideoAdPlayer.VideoAdPlayerCallback.onError()
عند حدوث خطأ في المشغّل أثناء تشغيل الإعلان (#1334) - عليك ترقية إصدار حزمة IMA SDK إلى 3.33.0 لحلّ مشكلة
NullPointerException
عند استخدام معرّفات الموارد المنتظمة (URI) لعلامة الإعلانdata://
(#700).
- الجلسة:
- غيِّر القيمة التلقائية من
CommandButton.enabled
إلىtrue
وتأكَّد من أنّه يمكن إبقاء القيمة خطأ لعناصر التحكّم حتى إذا كان الأمر المرتبط بها متاحًا. - أضِف ثوابت الرموز لـ
CommandButton
التي يجب استخدامها بدلاً من مصادر الرموز المخصّصة. - أضِف
MediaSessionService.isPlaybackOngoing()
للسماح للتطبيقات بالاستعلام عمّا إذا كان يجب إيقاف الخدمة فيonTaskRemoved()
(#1219). - أضِف
MediaSessionService.pauseAllPlayersAndStopSelf()
الذي يتيح بشكل ملائم إيقاف تشغيل كل الجلسات مؤقتًا واستدعاءstopSelf()
ل إنهاء دورة حياةMediaSessionService
. - يمكنك إلغاء القيمة
MediaSessionService.onTaskRemoved(Intent)
لتوفير تنفيذ افتراضي آمن يحافظ على تشغيل الخدمة في المقدّمة إذا كان التشغيل مستمرًا أو يوقف الخدمة في حال أخرى. - إخفاء شريط التمرير في إشعار الوسائط الخاص بالبث المباشر من خلال عدم ضبط المدّة في البيانات الوصفية لجلسة المنصة (#1256)
- يجب مواءمة تحويل
MediaMetadata
إلىMediaDescriptionCompat
لاستخدام الترتيب المنطقي المفضّل نفسه عند اختيار سمات البيانات الوصفية كما هو الحال في media1. - أضِف
MediaSession.sendError()
الذي يسمح بإرسال الأخطاء غير المميتة إلى معالج Media3. عند استخدام وحدة التحكّم في الإشعارات (راجِعMediaSession.getMediaNotificationControllerInfo()
)، يتم استخدام خطأ مخصّص لتحديثPlaybackState
لجلسة النظام الأساسي إلى حالة خطأ تتضمّن معلومات الخطأ المحدّدة (#543). - أضِف
MediaSession.Callback.onPlayerInteractionFinished()
لإعلام الجلسات عند انتهاء سلسلة من تفاعلات اللاعب من وحدة تحكّم معيّنة. - أضِف
SessionError
واستخدِمه فيSessionResult
وLibraryResult
بدلاً من رمز الخطأ لتقديم مزيد من المعلومات عن الخطأ وكيفية حلّه إن أمكن. - انشر رمز تطبيق اختبار وحدة التحكّم في Media3 الذي يمكن استخدامه لاختبار التفاعلات مع التطبيقات التي تنشر جلسة وسائط.
- انشر الإضافات التي تم تمريرها إلى
MediaSession[Builder].setSessionExtras()
في media3 إلىPlaybackStateCompat.getExtras()
في وحدة التحكّم في media1. - يمكنك ربط الأخطاء الفادحة وغير الفادحة بجلسة المنصة ومنها. يتمّ ربط
PlaybackException
بحالة خطأ فادح فيPlaybackStateCompat
. يتمّ ربطSessionError
المُرسَل إلى وحدة التحكّم في إعلام الوسائط باستخدامMediaSession.sendError(ControllerInfo, SessionError)
بخطأ غير مميت فيPlaybackStateCompat
، ما يعني أنّه يتمّ ضبط رمز الخطأ والرسالة ولكنّ حالة جلسة المنصة تظلّ مختلفة عنSTATE_ERROR
. - السماح بضبط نشاط الجلسة لكل وحدة تحكّم لإلغاء
نشاط الجلسة العام يمكن تحديد نشاط الجلسة لجهاز التحكّم عند وقت الاتصال من خلال إنشاء
ConnectionResult
باستخدامAcceptedResultBuilder.setSessionActivivty(PendingIntent)
. بعد الاتصال، يمكن تعديل نشاط الجلسة باستخدامMediaSession.setSessionActivity(ControllerInfo, PendingIntent)
. - تحسين تكرار الأخطاء في المكالمات إلى
MediaLibrarySession.Callback
يمكن الآن ضبط تكرار الأخطاء باستخدامMediaLibrarySession.Builder.setLibraryErrorReplicationMode()
لتحديد نوع الخطأ أو إيقاف تكرار الأخطاء الذي يكون مفعّلاً تلقائيًا.
- غيِّر القيمة التلقائية من
- واجهة المستخدم:
- إضافة ميزة عرض الصور إلى
PlayerView
عند ربطه بجهازExoPlayer
(#1144) - أضِف تخصيصًا للرموز المختلفة في
PlayerControlView
من خلال سمات xml للسماح بأشكال مختلفة للرسم لكل مثيل منPlayerView
، بدلاً من عمليات الاستبدال الشاملة (#1200). - حلّ مشكلة خطأ في النظام الأساسي يؤدي إلى تمديد الفيديو أو اقتصاصه عند استخدام
SurfaceView
داخل رمز إنشاءAndroidView
في واجهة برمجة التطبيقات 34 (#1237)
- إضافة ميزة عرض الصور إلى
- عمليات التنزيل:
- تأكَّد من أنّ
DownloadHelper
لا يُسرِّب مثيلاتRenderer
غير المنشورة، ما قد يؤدي في النهاية إلى تعطُّل التطبيق معIllegalStateException: Too many receivers, total of 1000, registered for pid
(#1224).
- تأكَّد من أنّ
- إضافة Cronet:
- حلّ المشكلة
SocketTimeoutException
فيCronetDataSource
في بعض إصدارات Cronet، لا يكون الطلب المقدَّم من خلال دالة الاستدعاء هو نفسه في كلّ مرة. يؤدي ذلك إلى عدم اكتمال عملية طلب إعادة الاتصال وانتهاء مهلة الطلب (https://issuetracker.google.com/328442628).
- حلّ المشكلة
- إضافة HLS:
- تم إصلاح الخلل الذي كان يؤدي إلى تعيين عيّنات EMSG في انتظار حدوث انقطاع في
HlsSampleStreamWrapper
باستخدام إزاحة غير صحيحة، ما يؤدي إلى حدوثIndexOutOfBoundsException
أوIllegalArgumentException
(#1002). - إصلاح الخلل الذي كان يؤدي إلى إعادة تحميل قوائم التشغيل غير الأساسية باستمرار لأحداث البث المباشر باستخدام بروتوكول HLS المنخفض التكلفة (#1240)
- تم إصلاح خطأ كان يؤدي إلى ظهور
Source Error
وIllegalArgumentException
عند تفعيل ميزة "إدارة المحتوى من جهة العميل" لبروتوكول HLS مع مقاطع الإعداد. - إصلاح الخلل الذي كان يؤدي إلى عدم إعادة تحميل قوائم التشغيل غير الأساسية أثناء التشغيل المباشر (#1240)
- إصلاح خطأ يؤدي إلى حدوث مشكلة عند تفعيل ميزة "إدارة المحتوى من خلال علامة مائية" لأحداث البث المباشر وفق بروتوكول HTTP (HLS)
ArrayIndexOutOfBoundsException
(#1395)
- تم إصلاح الخلل الذي كان يؤدي إلى تعيين عيّنات EMSG في انتظار حدوث انقطاع في
- إضافة DASH:
- إضافة البث:
- تم إصلاح الخطأ الذي كان يحوّل عنوان الألبوم في
MediaQueueItem
إلى اسم الفنان في ملف الوسائط Media3 (#1255).
- تم إصلاح الخطأ الذي كان يحوّل عنوان الألبوم في
- أدوات الاختبار:
- نفِّذ
onInit()
وonRelease()
فيFakeRenderer
. - غيِّر طرق
TestPlayerRunHelper.runUntil()/playUntil()
لتتعطّل عند حدوث أخطاء غير خطيرة (مثل الأخطاء التي تم الإبلاغ عنها إلىAnalyticsListener.onVideoCodecError()
). استخدِم سلسلة الأسلوبTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
الجديدة لإيقاف هذا السلوك.
- نفِّذ
- التطبيق التجريبي:
- استخدِم
DefaultPreloadManager
في تطبيق الإصدار التجريبي من فيديوهات Shorts القصيرة. - السماح بضبط وضع التكرار باستخدام وسيطات
Intent
من سطر الأوامر (#1266) - استخدِم
HttpEngineDataSource
كسمةHttpDataSource
إذا كان ذلك متوافقًا مع الجهاز.
- استخدِم
- إزالة الرموز المتوقّفة نهائيًا:
- أزِل
CronetDataSourceFactory
. استخدِمCronetDataSource.Factory
بدلاً من ذلك. - أزِل بعض وظائف الإنشاء
DataSpec
. استخدِمDataSpec.Builder
بدلاً من ذلك. - أزِل طريقة الدفع
setContentTypePredicate(Predicate)
منDefaultHttpDataSource
وOkHttpDataSource
وCronetDataSource
. استخدِم الطريقة المكافئة في كلXXXDataSource.Factory
بدلاً من ذلك. - أزِل
OkHttpDataSource
وOkHttpDataSourceFactory
. استخدِمOkHttpDataSource.Factory
بدلاً من ذلك. - أزِل
PlayerMessage.setHandler(Handler)
. استخدِمsetLooper(Looper)
بدلاً من ذلك. - أزِل حقل
Timeline.Window.isLive
. استخدِم طريقةisLive()
بدلاً من ذلك. - أزِل
DefaultHttpDataSource
عنصر إنشاء. استخدِمDefaultHttpDataSource.Factory
بدلاً من ذلك. - أزِل
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS
. استخدِمDashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
بدلاً من ذلك. - أزِل
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)
. استخدِمMediaCodecInfo.canReuseCodec(Format, Format)
بدلاً من ذلك. - أزِل طريقة
DrmSessionManager.DUMMY
وgetDummyDrmSessionManager()
. استخدِمDrmSessionManager.DRM_UNSUPPORTED
بدلاً من ذلك. - أزِل
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)
،AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)
،AudioRendererEventListener.onAudioInputFormatChanged(Format)
،VideoRendererEventListener.onVideoInputFormatChanged(Format)
. استخدِم الدوال المتعلّقة التي تأخذDecoderReuseEvaluation
بدلاً من ذلك. - أزِل الثابتَين
RendererSupport.FormatSupport
IntDef وFORMAT_HANDLED
،FORMAT_EXCEEDS_CAPABILITIES
،FORMAT_UNSUPPORTED_DRM
،FORMAT_UNSUPPORTED_SUBTYPE
،FORMAT_UNSUPPORTED_TYPE
. استخدِم العنصر IntDef والثوابت المكافئَين فيandroidx.media3.common.C
بدلاً من ذلك (مثلC.FORMAT_HANDLED
). - أزِل واجهة
Bundleable
. ويشمل ذلك إزالة جميع حقولBundleable.Creator<Foo> CREATOR
الثابتة. على المُتصلين استخدام الأسلوبينBundle toBundle()
وstatic Foo fromBundle(Bundle)
مع كل نوع بدلاً من ذلك.
- أزِل
الإصدار 1.4.0-rc01
10 تموز (يوليو) 2024
استخدِم الإصدار الثابت 1.4.0.
الإصدار 1.4.0-beta01
26 حزيران (يونيو) 2024
استخدِم الإصدار الثابت 1.4.0.
الإصدار 1.4.0-alpha02
7 يونيو 2024
استخدِم الإصدار الثابت 1.4.0.
الإصدار 1.4.0-alpha01
17 نيسان (أبريل) 2024
استخدِم الإصدار الثابت 1.4.0.
الإصدار 1.3.0
الإصدار 1.3.1
11 نيسان (أبريل) 2024
تم إصدار androidx.media3:media3-*:1.3.1
.
يتضمّن الإصدار 1.3.1 عمليات الربط هذه.
- المكتبة المشتركة:
- أضِف
Format.labels
للسماح بتصنيفات بديلة مترجَمة أو غير ذلك.
- أضِف
- ExoPlayer:
- إصلاح مشكلة تعذُّر الاحتفاظ بالبث على
PreloadMediaPeriod
عند تحميله مسبقًا مرة أخرى - طبِّق
TrackSelectionResult
المناسب على مدّة المحتوى المشغّل عند إعادة اختيار المقطع الصوتي. - عدم بدء تشغيل أدوات التحويل المفعَّلة مبكرًا إلا بعد تقدُّم فترة التشغيل عند الانتقال بين عناصر الوسائط (#1017)
- أضِف نوع الإرجاع غير المتوفّر إلى قاعدة
-keepclasseswithmembers
في Proguard لملف APKDefaultVideoFrameProcessor.Factory.Builder.build()
(#1187).
- إصلاح مشكلة تعذُّر الاحتفاظ بالبث على
- المحوِّل:
- إضافة حلّ بديل للاستثناء الذي تم طرحه بسبب عدم توافق
MediaMuxer
مع الطوابع الزمنية السلبية للعرض قبل الإصدار 30 من واجهة برمجة التطبيقات
- إضافة حلّ بديل للاستثناء الذي تم طرحه بسبب عدم توافق
- اختيار المقطع الصوتي:
DefaultTrackSelector
: يُفضَّل استخدام مسارات الفيديو التي تتضمّن معدّل مقبولاً لعدد اللقطات في الثانية (10 لقطات في الثانية أو أكثر) بدلاً من مسارات الفيديو التي تتضمّن معدّلًا أقل أو لم يتم ضبطه. يضمن ذلك أن يختار المشغّل مسار الفيديو "الحقيقي" في ملفات MP4 المستخرَجة من صور متحركة يمكن أن تحتوي على مسارَين بترميز HEVC يكون أحدهما بدرجة دقة أعلى ولكن مع عدد صغير جدًا من اللقطات (#1051).
- برامج الاستخراج:
- تم إصلاح مشكلة عدم تخطّي الحشو عند قراءة أجزاء ذات أحجام فردية من ملفات WAV (#1117).
- MP3: يمكنك تعبئة
Format.averageBitrate
من إطارات البيانات الوصفية، مثلXING
وVBRI
. - MPEG-TS: التراجع عن تغيير كان يهدف إلى ضمان عرض اللقطة الأخيرة من خلال تمرير وحدة الوصول الأخيرة من البث إلى قائمة انتظار العيّنات (#7909) ويعود سبب ذلك إلى أنّ التغيير يتسبب في مشاكل جديدة في أحداث البث المباشر وفق بروتوكول HTTP التي تتضمّن إطارات I فقط (#1150) وأحداث البث المباشر وفق بروتوكول HTTP التي تتضمّن ترميز H.262 (#1126).
- الصوت:
- السماح باسترداد وحدة التحويل من خلال إيقاف وضع "إلغاء التحميل" إذا تعذّر بدء تشغيل المقطع الصوتي في وضع "إلغاء التحميل"
- الفيديو:
- إضافة حلّ بديل لمشكلة في جهاز Galaxy Tab S7 FE وChromecast مع Google TV وLenovo M10 FHD Plus تؤدي إلى وضع علامة "غير متوافقة" على عمليات بث H265 بمعدّل 60 لقطة في الثانية
- إضافة حلّ بديل يضمن عرض اللقطة الأولى دائمًا أثناء إنشاء نفق حتى إذا لم ينفّذ الجهاز ذلك تلقائيًا على النحو المطلوب من واجهة برمجة التطبيقات (#1169) (#966)
- حلّ مشكلة تؤدي إلى حدوث خلل في برنامج الترميز عند معالجة معلومات ألوان HDR وgátمنع تبديل التنسيقات التكيُّفية لملفات الفيديو بتنسيق SDR (#1158)
- النص:
- WebVTT: منع الإشارات المتتالية مباشرةً من إنشاء
حالات
CuesWithTiming
إضافية غير صحيحة منWebvttParser.parse
(#1177).
- WebVTT: منع الإشارات المتتالية مباشرةً من إنشاء
حالات
- إدارة الحقوق الرقمية:
- حلّ مشكلة
NoSuchMethodError
التي يمكن أن يطرحها إطار عملMediaDrm
بدلاً منResourceBusyException
أوNotProvisionedException
على بعض أجهزة Android 14 (#1145)
- حلّ مشكلة
- التأثير:
- تحسين ميزة ربط درجات الألوان من PQ إلى SDR من خلال تحويل مساحات اللون
- الجلسة:
- واجهة المستخدم:
- يمكنك استخدام الإجراء الاحتياطي لتضمين اسم لغة المقطع الصوتي إذا تعذّر على
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
. - ارفع الإصدار إلى 19 (Android KitKat).
minSdk
ويتم ذلك بهدف مواءمة جميع مكتبات 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
). في السابق، استخدمنا جدول تحديد المحتوى من عنوانInfo
، ولكنّ ذلك يؤدي إلى تحديد محتوى أقل دقة مقارنةً بتجاهله والافتراض أنّ الملف هو CBR. - MPEG2-TS: إتاحة DTS وDTS-LBR وDTS:X Profile2 (#275)
- استخراج أنواع المحتوى الصوتي من أوصاف TS وربطها بعلامات الأدوار، مما يتيح للمستخدمين اختيار مقاطع صوتية مدروسة بشكل أفضل (#973)
- إضافة تحليل إضافي لتنسيق AV1C إلى أداة استخراج MP4 لاسترداد قيم
- الصوت:
- الفيديو:
- غيِّر الدالة الإنشائية
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 يتم اقتصاص صور الشبكة وعرض Thumbnails فردية
ImageOutput
بالقرب من وقت عرضها.
- إضافة ميزة عرض الصور المصغّرة بتنسيق DASH يتم اقتصاص صور الشبكة وعرض Thumbnails فردية
- إدارة الحقوق الرقمية:
- يتم تشغيل عيّنات "المحتوى الرئيسي" غير المشفَّرة في المحتوى الخاضع لإدارة الحقوق الرقمية على الفور
تلقائيًا، حتى إذا لم تكن مفاتيح العيّنات المشفَّرة اللاحقة جاهزة
بعد. وقد يؤدي ذلك إلى توقُّف التشغيل أثناء التشغيل إذا لم تكن المفاتيح جاهزة
عندما يصل موضع التشغيل إلى العيّنات المشفَّرة (ولكن في السابق،
لم يكن من الممكن بدء التشغيل على الإطلاق في هذه المرحلة). يمكن
إيقاف هذا السلوك باستخدام
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
أوDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
.
- يتم تشغيل عيّنات "المحتوى الرئيسي" غير المشفَّرة في المحتوى الخاضع لإدارة الحقوق الرقمية على الفور
تلقائيًا، حتى إذا لم تكن مفاتيح العيّنات المشفَّرة اللاحقة جاهزة
بعد. وقد يؤدي ذلك إلى توقُّف التشغيل أثناء التشغيل إذا لم تكن المفاتيح جاهزة
عندما يصل موضع التشغيل إلى العيّنات المشفَّرة (ولكن في السابق،
لم يكن من الممكن بدء التشغيل على الإطلاق في هذه المرحلة). يمكن
إيقاف هذا السلوك باستخدام
- إضافة IMA:
- إصلاح مشكلة تعذُّر تشغيل إعلانات DASH وHLS بدون إضافة الملف المناسبة
- الجلسة:
- أوقِف ميزة رصد النقر مرّتين في تطبيقات التلفزيون (#962).
- تم حلّ المشكلة المتعلّقة بعدم نقل
MediaItem.RequestMetadata
مع الإضافات غير الصفرية فقط بين وحدات التحكّم في الوسائط والجلسات. - أضِف عنصر إنشاء إلى
MediaLibrarySession.Builder
لا يقبل سوىContext
بدلاً منMediaLibraryService
.
- إضافة HLS:
- خفض مستوى إذن الوصول إلى
HlsMediaPeriod
إلى "مستوى الوصول الخاص بالحزمة" يجب عدم الاعتماد على هذا النوع مباشرةً من خارج حزمة HLS. - يبحث Resolve عن بداية المقطع بكفاءة أكبر (#1031).
- خفض مستوى إذن الوصول إلى
- إضافات برامج الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
- وحدة ترميز MIDI: تجاهل رسائل أحداث SysEx (#710).
- أدوات الاختبار:
- لا تتوقف عن تشغيل الفيديو مؤقتًا في
TestPlayerRunHelper.playUntilPosition
. يحافظ الاختبار على تشغيل الفيديو، ولكنّه يوقف التقدّم إلى أن تتمكّن الاختبار من إضافة تأكيدات وإجراءات أخرى.
- لا تتوقف عن تشغيل الفيديو مؤقتًا في
- التطبيق التجريبي:
- أضِف وحدة عرض توضيحي للمحتوى القصير لعرض استخدام
PreloadMediaSource
مع حالة استخدام المحتوى القصير.
- أضِف وحدة عرض توضيحي للمحتوى القصير لعرض استخدام
الإصدار 1.3.0-rc01
22 شباط (فبراير) 2024
استخدِم الإصدار الثابت 1.3.0.
الإصدار 1.3.0-beta01
7 شباط (فبراير) 2024
استخدِم الإصدار الثابت 1.3.0.
الإصدار 1.3.0-alpha01
15 كانون الثاني (يناير) 2024
استخدِم الإصدار الثابت 1.3.0.
الإصدار 1.2.0
الإصدار 1.2.1
9 كانون الثاني (يناير) 2024
- ExoPlayer:
- تم إصلاح مشكلة استمرار تعديل الفاصل الزمني للرجوع إلى
min/maxOffset
عند إجراء عمليات بحث يدوي خارج نطاقLiveConfiguration.min/maxOffset
. - حلّ مشكلة تنسيقات قنوات OPUS وVORBIS غير الصحيحة للقنوات 3 و5 و6 و7 و8 (#8396)
- تم إصلاح مشكلة عدم بدء البث المباشر من موضع البداية التلقائي عند اختيار الأغاني والرجوع إلى النقطة صفر في البث المباشر (#9347).
- حلّ المشكلة التي كانت تؤدي إلى تلقّي النُسخ الجديدة من
CmcdData.Factory
قيمًا سالبة لسمةbufferedDurationUs
من مصادر المقاطع، ما يؤدي بدوره إلى ظهورIllegalArgumentException
(#888).
- تم إصلاح مشكلة استمرار تعديل الفاصل الزمني للرجوع إلى
- المحوِّل:
- حلّ مشكلة تؤدي إلى ظهور خطأ في برنامج الترميز أثناء عملية الضبط بسبب ضبط معدّل تشغيل مرتفع
- برامج الاستخراج:
- ضَع علامة "
ROLE_FLAG_ALTERNATE
" على مسارات HEVC الثانوية (غير القابلة للتشغيل) في صور JPEG المتحركة لمنع اختيارها تلقائيًا لبدء التشغيل بسبب دقتها العالية. - إصلاح مشكلة رصد الإطارات الرئيسية غير الصحيحة لأحداث البث بتنسيق TS H264 (#864)
- إصلاح تقدير المدة لأحداث البث بتنسيق TS التي تزيد مدتها عن 47721 ثانية (#855)
- ضَع علامة "
- الصوت:
- حلّ مشكلة معالجة نهاية الجلسة في
SilenceSkippingAudioProcessor
عند الاتصال بها متعدد المرات (#712)
- حلّ مشكلة معالجة نهاية الجلسة في
- الفيديو:
- إضافة حلّ بديل لمشكلة في جهاز Galaxy Tab S7 FE وChromecast مع Google TV وLenovo M10 FHD Plus تؤدي إلى وضع علامة "غير متوافقة" على عمليات بث AVC بمعدّل 60 لقطة في الثانية (#693)
- البيانات الوصفية:
- إصلاح خطأ كان يؤدي إلى تعبئة
MediaMetadata
من تعليقات Vorbis فقط باستخدام مفاتيح بأحرف كبيرة (#876) - يمكنك معالجة
OutOfMemoryError
عند تحليل إطارات ID3 كبيرة جدًا، ما يعني أنّه يمكن مواصلة التشغيل بدون معلومات العلامة بدلاً من إيقاف التشغيل تمامًا.
- إصلاح خطأ كان يؤدي إلى تعبئة
- إدارة الحقوق الرقمية:
- توسيع نطاق الحلّ البديل لعنوان URL غير الصالح لترخيص ClearKey
https://default.url
لتشمل المستوى 33 من واجهة برمجة التطبيقات والإصدارات الأحدث (في السابق، كان الحلّ البديل ينطبق على المستوى 33 من واجهة برمجة التطبيقات بالضبط فقط) (#837) - حلّ مشكلة
ERROR_DRM_SESSION_NOT_OPENED
عند التبديل من محتوى مشفّر إلى محتوى واضح بدون سطح مرتبط بالوسيط حدث الخطأ بسبب استخدام وحدة فك ترميز آمنة بشكل غير صحيح لتشغيل المحتوى الواضح.
- توسيع نطاق الحلّ البديل لعنوان URL غير الصالح لترخيص ClearKey
- الجلسة:
- ضَع المفاتيح والقيم المخصّصة في
MediaMetadataCompat
إلىMediaMetadata.extras
وMediaMetadata.extras
إلىMediaMetadataCompat
(#756، #802). - إصلاح بث
notifyChildrenChanged
لأجهزة التحكّم القديمة (#644) - تم إصلاح خطأ كان يؤدي إلى تعطُّل بعض الأجهزة عند ضبط وقت سلبي لموقّت
setWhen
غير مفعّل للإشعار (#903). - إصلاح
IllegalStateException
عندما لا يكتمل اتصال وحدة التحكّم في إشعارات الوسائط عند طلب تعديل الإشعار الأول (#917)
- ضَع المفاتيح والقيم المخصّصة في
- واجهة المستخدم:
- إضافة DASH:
- عالج القيمة "f800" على أنّها عدد قنوات يبلغ 5 قنوات لملفات بيان Dolby في DASH (#688).
- إضافات برامج الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
- إضافة البث:
- يجب فحص عملية إنشاء
Timeline
لتجنّب تعطُّل التطبيق عند تعذُّر تحميل الوسائط على جهاز البث (#708).
- يجب فحص عملية إنشاء
الإصدار 1.2.0
15 تشرين الثاني (نوفمبر) 2023
- المكتبة المشتركة:
- أضِف مَعلمة
@Nullable Throwable
إلى الطرق في واجهةLog.Logger
. لم تعُد المَعلمةmessage
لهذه الطُرق تحتوي على أي معلومات عنThrowable
التي تم تمريرها إلى طُرقLog.{d,i,w,e}()
، لذا يجب أن تُلحق عمليات التنفيذ هذه المعلومات يدويًا إذا أرادت ذلك (ربما باستخدامLogger.appendThrowableString(String, Throwable)
). - حلّ مشكلة التوافق مع Kotlin حيث لا يتم رصد مَعلمات النوع العام nullable
وأنواع عناصر المصفوفة nullable على أنّها nullable ومن الأمثلة على ذلك
مَعلمات الطريقة
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). - أضِف عمق البتّ لكل من luminance وchroma إلى
ColorInfo
(#491). - أضِف حقولًا إضافية إلى تسجيل "بيانات العميل المشترِك في الوسائط الشائعة" (CMCD): طلب العنصر التالي (
nor
) وطلب النطاق التالي (nrr
) (#8699). - إضافة وظيفة لنقل بيانات Common Media Client Data (CMCD) باستخدام مَعلمات طلب البحث (#553)
- حلّ المشكلة
ConcurrentModificationException
فيExperimentalBandwidthMeter
(#612) - أضِف المَعلمة
MediaPeriodId
إلىCompositeMediaSource.getMediaTimeForChildMediaTime
. - إتاحة
ClippingMediaSource
(والمصادر الأخرى التي تتضمّن Offsets لوقت الفترة/الإطار الزمني) فيConcatenatingMediaSource2
(#11226) - غيِّر
BaseRenderer.onStreamChanged()
لتلقّي وسيطةMediaPeriodId
أيضًا.
- المحوِّل:
- تحليل بيانات دوران EXIF لإدخالات الصور
- أزِل نوع التعليق التوضيحي
TransformationRequest.HdrMode
والثوابت المرتبطة به. استخدِمComposition.HdrMode
والثابتات المرتبطة به بدلاً من ذلك. - عليك تبسيط
OverlaySettings
لحلّ مشاكل التدوير. - تم تغيير مَعلمتَي
frameRate
وdurationUs
فيSampleConsumer.queueInputBitmap
إلىTimestampIterator
.
- اختيار المقطع الصوتي:
- أضِف
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness
للسماح صراحةً بالتكيّف غير السلس أو عدم السماح به. يظل الإعداد التلقائي على سلوكه الحاليtrue
.
- أضِف
- برامج الاستخراج:
- MPEG-TS: تأكَّد من عرض الإطار الأخير من خلال تمرير وحدة الوصول الماضية للبث إلى قائمة انتظار العيّنات (#7909).
- تصحيح الخطأ الإملائي عند تحديد
rotationDegrees
تم تغييرprojectionPosePitch
إلىprojectionPoseRoll
(#461). - أزِل الافتراض بأنّه يمكن فحص مثيلات
Extractor
مباشرةً باستخدامinstanceof
. إذا كنت تريد الوصول إلى تفاصيل تنفيذExtractor
أثناء التشغيل، عليك أولاً استدعاءExtractor.getUnderlyingInstance
. - أضِف
BmpExtractor
. - أضِف
WebpExtractor
. - أضِف
HeifExtractor
. - إتاحة استخدام
QuickTime classic
في
Mp4Extractor
- الصوت:
- إتاحة استخدام ترميز PCM بترتيب كبير للبتّين 24/32 في MP4 وMatroska وتحليل ترميز
PCM لملف
lpcm
في MP4 - إتاحة استخراج الصوت بتنسيق Vorbis في ملف MP4
- أضِف
AudioSink.getFormatOffloadSupport(Format)
لاسترداد مستوى دعم التفريغ الذي يمكن أن يوفّره المصرف للتنسيق من خلالDefaultAudioOffloadSupportProvider
. ويعرض الجدول الجديدAudioOffloadSupport
الذي يحتوي علىisFormatSupported
isGaplessSupported
وisSpeedChangeSupported
. - أضِف
AudioSink.setOffloadMode()
الذي يتم من خلاله ضبط إعدادات نقل البيانات في وحدة نقل الصوت. القيمة التلقائية هيAudioSink.OFFLOAD_MODE_DISABLED
. - يمكن تفعيل ميزة "تخفيف الضغط على الذاكرة" من خلال
setAudioOffloadPreference
فيTrackSelectionParameters
. إذا كان الخيار المفضّل المضبوط هو التفعيل، ويتوافق الجهاز مع ميزة "إلغاء تحميل المحتوى" للتنسيق، وكان اختيار المقطع الصوتي هو مقطع صوتي واحد، سيتم تفعيل ميزة "إلغاء تحميل المحتوى" للصوت. - إذا تم ضبط
audioOffloadModePreference
علىAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
، لن يختارDefaultTrackSelector
مقطعًا صوتيًا إلا إذا كان تنسيقه متوافقًا مع عملية التفريغ. إذا لم يكن هناك مقطع صوتي متوافق في عملية التفريغ، لن يتم اختيار أي مقطع صوتي. - إيقاف ميزة التشغيل بدون انقطاع لميزة "إلغاء التحميل" في الإصدارات الأقدم من المستوى 33 لواجهة برمجة التطبيقات بسبب مشكلة في موضع التشغيل بعد الانتقال إلى مقطع صوتي آخر
- أزِل المَعلمة
enableOffload
من توقيع الأسلوبDefaultRenderersFactory.buildAudioSink
. - أزِل الطريقة
DefaultAudioSink.Builder.setOffloadMode
. - أزِل قيمة intdef
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
. - إتاحة البيانات الوصفية لتنسيق Opus بدون انقطاع أثناء تشغيل المحتوى الذي تم نقله
- السماح باسترداد وحدة العرض من خلال إيقاف ميزة "التنزيل" في حال تعذّر الكتابة الأولى (#627)
- تفعيل ميزة "تحديد موعد لإزالة المحتوى من الجهاز" تلقائيًا لتشغيل المحتوى الصوتي فقط الذي تمت إزالته من الجهاز
- حذف
ExoPlayer.experimentalSetOffloadSchedulingEnabled
AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
- تمت إعادة تسمية
onExperimentalSleepingForOffloadChanged
باسمonSleepingForOffloadChanged
وonExperimentalOffloadedPlayback
باسمonOffloadedPlayback
. - نقل واجهات
TrackSelectionParameters
والتعريفات المرتبطة بوضع نقل الصوت إلى فئةAudioOffloadPreferences
داخلية - أضِف طلبات إعادة الاتصال
onAudioTrackInitialized
وonAudioTrackReleased
إلىAnalyticsListener
وAudioRendererEventListener
وAudioSink.Listener
. - حلّ مشكلة انخفاض عدد العناصر في مخزن مؤقت للصوت في DTS Express (#650)
- إصلاح خطأ يؤدي إلى ظهور رمز الخطأ
IllegalArgumentException
(#677) عند التحقّق من الإمكانات المتاحة لتنسيق E-AC3-JOC
- إتاحة استخدام ترميز PCM بترتيب كبير للبتّين 24/32 في MP4 وMatroska وتحليل ترميز
PCM لملف
- الفيديو:
- اسمح لتطبيق
MediaCodecVideoRenderer
باستخدامVideoFrameProcessor.Factory
مخصّص. - إصلاح الخلل الذي كان يؤدي إلى تعذُّر عرض اللقطة الأولى إذا كان بث الصوت يبدأ بطوابع زمنية سلبية (#291)
- اسمح لتطبيق
- النص:
- أزِل
ExoplayerCuesDecoder
. يتم الآن التعامل مع مسارات النص التي تحتوي علىsampleMimeType = application/x-media3-cues
مباشرةً من خلالTextRenderer
بدون الحاجة إلى مثيلSubtitleDecoder
.
- أزِل
- البيانات الوصفية:
- لن يتمّ استدعاء
MetadataDecoder.decode
بعد الآن لتحليل عيّنات "فك التشفير فقط" لأنّ التنفيذ يجب أن يعرض قيمة فارغة على أيّ حال.
- لن يتمّ استدعاء
- التأثير:
- أضِف
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
وضع إدخال الصورة النقطية في "قائمة الانتظار" حسب الطابع الزمني. - غيِّر
VideoFrameProcessor.registerInputStream()
إلى غير حظر. يجب أن تنفِّذ التطبيقاتVideoFrameProcessor.Listener#onInputStreamRegistered()
. - تم تغيير مَعلمتَي
frameRate
وdurationUs
فيVideoFrameProcessor.queueInputBitmap
إلىTimestampIterator
.
- أضِف
- إضافة IMA:
- إصلاح خطأ كان يؤدي إلى ظهور استثناء عند بث مباشر باستخدام DASH لعدة فترات ليس هو العنصر الأول في قائمة تشغيل (#571)
- يجب تحرير StreamManager قبل الاتصال بـ
AdsLoader.destroy()
. - عليك ترقية إصدار حزمة تطوير البرامج لإعلانات الوسائط التفاعلية إلى 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()
ناجحًا، يتم قبول الاشتراك ويتم استدعاء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:
- أعِد تحميل قائمة التشغيل المباشرة بتنسيق HLS باستخدام فاصل زمني يتم احتسابه من وقت بدء عملية التحميل الأخيرة بدلاً من وقت اكتمال عملية التحميل الأخيرة (#663).
- إضافة DASH:
- السماح بعدة أرقام تعريف DASH نفسها في عنوان URL لنموذج الشريحة
- إضافة ميزة تجريبية لتحليل الترجمة أثناء الاستخراج يقدّم هذا الإصدار
دعمًا أفضل لدمج الترجمة والشرح المتداخلَين، بما في ذلك
حلّ مشكلة الوميض عند الانتقال بين مقاطع الترجمة والشرح. يمكنك
تفعيل هذه الميزة باستخدام
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
(#288).
- إضافة RTSP:
- تم إصلاح مشكلة تعارض في المعالجة يمكن أن تؤدي إلى
IndexOutOfBoundsException
عند الرجوع إلى بروتوكول TCP أو تعليق التشغيل في بعض الحالات. - التحقّق من الحالة في إعداد RTSP عند عرض حالة التحميل لملف
RtspMediaPeriod
(#577) - تجاهل طرق طلب Rtsp المخصّصة في الرأس العام للردّ على الخيارات (#613).
- استخدِم قيمة مهلة استجابة إعداد بروتوكول RTSP في الفاصل الزمني لإرسال طلبات خيارات RTSP للحفاظ على الاتصال (#662).
- تم إصلاح مشكلة تعارض في المعالجة يمكن أن تؤدي إلى
- إضافات برامج الترميز (FFmpeg وVP9 وAV1 وMIDI وما إلى ذلك):
- يمكنك إصدار وحدة فك ترميز MIDI التي تتيح تشغيل ملفات MIDI العادية باستخدام مكتبة Jsyn لإنشاء الصوت.
- أضِف
DecoderOutputBuffer.shouldBeSkipped
لتمييز ملف "تخزين مؤقت" لإخراج الذي لا يلزم عرضه مباشرةً. ويُفضّل استخدام هذا الإجراء بدلاً منC.BUFFER_FLAG_DECODE_ONLY
الذي سيتم إيقافه نهائيًا. - أضِف
Decoder.setOutputStartTimeUs
وSimpleDecoder.isAtLeastOutputStartTimeUs
للسماح لأجهزة فك التشفير بإسقاط عيّنات فك التشفير فقط قبل وقت البدء. ويجب استخدام هذا الإجراء بدلاً منBuffer.isDecodeOnly
الذي سيتم إيقافه نهائيًا. - إصلاح خطأ في نشر عنصر ترميز MIDI في مستودع Maven تمت إعادة تسمية القطعة
الترميزية إلى
media3-exoplayer-midi
(#734).
- إضافة Leanback:
- تم إصلاح الخلل الذي كان يؤدي إلى ظهور رمز
ArithmeticException
في رمز Leanback عند إيقاف سطح عرض (#617).
- تم إصلاح الخلل الذي كان يؤدي إلى ظهور رمز
- أدوات الاختبار:
- اجعل
TestExoPlayerBuilder
وFakeClock
متوافقَين مع اختبارات واجهة مستخدم Espresso واختبارات واجهة مستخدم Compose. يعالج هذا الخطأ الذي كان يؤدي إلى تقدُّم التشغيل بشكل غير محدّد أثناء التفاعلات مع عرض Espresso أو Compose.
- اجعل
- إزالة الرموز المتوقّفة نهائيًا:
- أزِل
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
وTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
. استخدِمComposition.Builder.setHdrMode(int)
وأرسِلComposition
إلىTransformer.start(Composition, String)
بدلاً من ذلك. - أزِل طريقة
DownloadNotificationHelper.buildProgressNotification
المتوقفة نهائيًا، واستخدِم طريقة غير متوقفة نهائيًا تأخذ مَعلمةnotMetRequirements
بدلاً منها.
- أزِل
الإصدار 1.2.0-rc01
1 تشرين الثاني (نوفمبر) 2023
استخدِم الإصدار الثابت 1.2.0.
الإصدار 1.2.0-beta01
19 تشرين الأول (أكتوبر) 2023
استخدِم الإصدار الثابت 1.2.0.
الإصدار 1.2.0-alpha02
29 أيلول (سبتمبر) 2023
استخدِم الإصدار الثابت 1.2.0.
الإصدار 1.2.0-alpha01
17 آب (أغسطس) 2023
استخدِم الإصدار الثابت 1.2.0.
الإصدار 1.1.0
الإصدار 1.1.1
16 آب (أغسطس) 2023
- المكتبة المشتركة:
- أزِل الاعتماد على
multidex
الذي تمت إضافته عن طريق الخطأ من جميع الوحدات (#499).
- أزِل الاعتماد على
- ExoPlayer:
- حلّ المشكلة في
PlaybackStatsListener
التي يتم فيها إنشاءPlaybackStats
زائفة بعد محو قائمة التشغيل - أضِف حقولًا إضافية إلى تسجيل بيانات العميل المشترك في الوسائط (CMCD): تنسيق البث (sf) ونوع البث (st) والإصدار (v) وأعلى معدل نقل بيانات (tb)، ومدة العنصر (d) ومعدل نقل البيانات المقاس (mtp) ونوع العنصر (ot) (#8699).
- حلّ المشكلة في
- الصوت:
- تم إصلاح خطأ كان يمنع الانتقال من
Player.getState()
إلىSTATE_ENDED
عند تشغيل ملفات قصيرة جدًا (#538).
- تم إصلاح خطأ كان يمنع الانتقال من
- نقل بيانات الصوت:
- يجب إضافة صفحتَي Header ID وComment Header إلى بث البتات لتشغيل Opus الذي تم نقله خارج الجهاز وفقًا لمعيار RFC 7845.
- الفيديو:
- H.265/HEVC: إصلاح أخطاء تحليل معلومات الصورة المرجعية على المدى القصير والطويل في SPS
- النص:
- CEA-608: تغيير منطق اقتطاع المقاطع الصوتية لعرض النص المرئي فقط في السابق، كان يتم تضمين مسافة بادئة وعلامة تبويب عند الحد من طول العبارة المرجعية إلى 32 حرفًا (وهو ما كان صحيحًا من الناحية الفنية وفقًا للمواصفات) (#11019).
- إضافة IMA:
- عليك ترقية إصدار حزمة تطوير البرامج (SDK) لإعلانات الوسائط التفاعلية إلى 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
- أضِف طرقًا مُحمَّلة إلى Player تسمح للمستخدمين بتحديد علامات
مستوى الصوت:
void setDeviceVolume(int, int)
void increaseDeviceVolume(int)
void decreaseDeviceVolume(int)
void setDeviceMuted(boolean, int)
- أضِف
Builder
لـDeviceInfo
وأوقِف نهائيًا طريقة الإنشاء الحالية. - أضِف
DeviceInfo.routingControllerId
لتحديد معرّف وحدة التحكّم في التوجيه لعمليات التشغيل عن بُعد. - أضِف
Player.replaceMediaItem(s)
كاختصار لإضافة العناصر وإزالتها في الموضع نفسه (#8046).
- ExoPlayer:
- لا تسمح لتطبيق ExoPlayer بالتحكم في طرق التحكّم بمستوى صوت الجهاز إلا إذا
تم تفعيل هذه الميزة صراحةً. استخدِم
ExoPlayer.Builder.setDeviceVolumeControlEnabled
للوصول إلى ما يلي:getDeviceVolume()
isDeviceMuted()
setDeviceVolume(int)
وsetDeviceVolume(int, int)
increaseDeviceVolume(int)
وincreaseDeviceVolume(int, int)
decreaseDeviceVolume(int)
وdecreaseDeviceVolume(int, int)
- أضِف
FilteringMediaSource
للسماح بفلترة أنواع الأغاني المتاحة منMediaSource
. - إضافة إمكانية تضمين بيانات العميل الشائعة للوسائط (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()
لتفعيل تسجيل المفاتيح المخصّص.
- يكون تسجيل بيانات CMCD غير مفعَّل تلقائيًا، استخدِم
- إضافة إجراء إضافي إلى بيان التطبيق التجريبي الرئيسي لتسهيل بدء التطبيق التجريبي باستخدام ملف
*.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)
عند استدعائهما في قائمة تشغيل فارغة
- لا تسمح لتطبيق ExoPlayer بالتحكم في طرق التحكّم بمستوى صوت الجهاز إلا إذا
تم تفعيل هذه الميزة صراحةً. استخدِم
- المحوِّل:
- أزِل
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)
. استخدِمExoPlayerAssetLoader.Factory(MediaSource.Factory)
وTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
بدلاً منهما. - أزِل
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
. - تم إصلاح خطأ كان يؤدي إلى توقُّف عملية التحويل (ما يؤدي إلى انتهاء مهلة أداة muxer) في حال تم إرسال إشارة بنهاية بث الفيديو في اللحظة التي كان فيها إطار الإدخال في انتظار المعالجة.
- يمكنك طلب ترميزات الصوت والفيديو من خلال
MediaCodecList
بدلاً من استخدام أدواتfindDecoder/EncoderForFormat
لتوسيع نطاق التوافق. - أزِل إعدادات اللقطات البينية في
DefaultEncoderFactory
لأنّها لا تعمل على بعض الأجهزة.
- أزِل
- اختيار الأغنية:
- أضِف
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
الذي يكون غير مفعَّل تلقائيًا. عند تفعيلDefaultTrackSelector
، سيتم اختيار مسار جديد عند تغيُّر إمكانات أداة التحويل.
- أضِف
- برامج الاستخراج:
- الصوت:
- إصلاح الخلل الذي كان يؤدي إلى تعذُّر تشغيل بعض المحتوى عند تفعيل وضع النفق واستخدام ميزة
AudioProcessors
، مثل ميزة الاقتصاص بدون فواصل (#10847) - تجميع إطارات Opus في حزم Ogg أثناء التشغيل المباشر (التحميل)
- توقّع الموقع الجغرافي الحالي أثناء وضع السكون من خلال جدولة عمليات التفريغ
- أضِف
Renderer.release()
وAudioSink.release()
لإصدار الموارد في نهاية دورة حياة اللاعب. - الاستماع إلى التغييرات في إمكانات الصوت في
DefaultAudioSink
أضِف مَعلمة مطلوبةcontext
في عنصر الإنشاء لـDefaultAudioSink
، التي سيُسجِّل بهاDefaultAudioSink
كمُستمع إلىAudioCapabilitiesReceiver
ويُعدِّل سمةaudioCapabilities
عند إبلاغه بتغيير في الإمكانات. - يمكنك نشر التغييرات في إمكانات الصوت من خلال حدث جديد
onAudioCapabilitiesChanged
في واجهةAudioSink.Listener
و واجهة جديدةRendererCapabilities.Listener
تؤدي إلى بدء أحداثonRendererCapabilitiesChanged
. - أضِف
ChannelMixingAudioProcessor
لتطبيق عمليات التكبير/التصغير أو المزج على قنوات المحتوى الصوتي. - أضِف قيمة int جديدة
DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
إلىDecoderDiscardReasons
لتجاهل وحدة ترميز الصوت عندما يكون وضع الالتفاف متاحًا بعد تغيير إمكانات الصوت. - إتاحة التشغيل المباشر لتنسيقَي DTS Express وDTS:X (#335)
- إصلاح الخلل الذي كان يؤدي إلى تعذُّر تشغيل بعض المحتوى عند تفعيل وضع النفق واستخدام ميزة
- الفيديو:
- اجعل
MediaCodecVideoRenderer
يُبلغ عنVideoSize
بعرض و ارتفاع يساويان 0 عندما يكون مُنشئ العرض غير مفعّل. يتمّ استدعاءPlayer.Listener.onVideoSizeChanged
وفقًا لذلك عند تغيُّرPlayer.getVideoSize()
. بعد إجراء هذا التغيير، يكون عرض وارتفاع حجم الفيديو في ExoPlayer باستخدامMediaCodecVideoRenderer
صفرًا عندما لا يتوافقPlayer.getCurrentTracks
مع الفيديو أو لم يتم تحديد حجم المسار الصوتي المتوافق مع الفيديو بعد.
- اجعل
- إدارة الحقوق الرقمية:
- يمكنك تقليل مستوى رؤية العديد من الطرق الداخلية فقط في
DefaultDrmSession
التي لا يُتوقّع استدعاؤها من خارج حزمة إدارة الحقوق الرقمية:void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- يمكنك تقليل مستوى رؤية العديد من الطرق الداخلية فقط في
- أداة الدمج:
- أضِف مكتبة جديدة لبرنامج ربط الوسائط يمكن استخدامها لإنشاء ملف حاوية MP4.
- إضافة IMA:
- تفعيل أحداث بث DASH مباشر متعددة الفترات لميزة "الإعلانات أثناء التشغيل" يُرجى العِلم أنّه لا يمكن حاليًا استخدام ميزة التقديم/الترجيع في أحداث البث المباشر (#10912).
- إصلاح خطأ يؤدي إلى إدراج مجموعة إعلانية جديدة في أحداث البث المباشر لأنّه يختلف موضع المحتوى المحسوب في المخططات الزمنية المتتالية قليلاً
- الجلسة:
- أضِف طريقة مساعدة
MediaSession.getControllerForCurrentRequest
للحصول على معلومات عن وحدة التحكّم التي تستدعي حاليًا طريقةPlayer
. - أضِف
androidx.media3.session.MediaButtonReceiver
لتفعيل التطبيقات على تنفيذ استئناف التشغيل من خلال أحداث أزرار الوسائط التي ترسلها، مثلاً، سماعات رأس بلوتوث (#167). - أضِف التنفيذ التلقائي إلى
MediaSession.Callback.onAddMediaItems
لسماح بتمريرMediaItems
المطلوبة إلىPlayer
إذا كان لديهاLocalConfiguration
(مثل عنوان URL) (#282). - إضافة زرَّي الأمرَين "التقديم إلى المحتوى السابق" و "التقديم إلى المحتوى التالي" في عرض إشعارات الوسائط المكثّف تلقائيًا على الإصدار 12 من نظام التشغيل Android والإصدارات الأقدم (#410)
- أضِف التنفيذ التلقائي إلى
MediaSession.Callback.onAddMediaItems
لسماح بتمريرMediaItems
المطلوبة إلىPlayer
إذا كان لديهاLocalConfiguration
(مثل عنوان URL) (#282). - إضافة زرَّي الأمرَين "التقديم إلى المحتوى السابق" و "التقديم إلى المحتوى التالي" في عرض إشعارات الوسائط المكثّف تلقائيًا على الإصدار 12 من نظام التشغيل Android والإصدارات الأقدم (#410)
- أضِف طريقة مساعدة
- واجهة المستخدم:
- أضِف طريقتَي Util
shouldShowPlayButton
وhandlePlayPauseButtonAction
لكتابة عناصر واجهة مستخدِم مخصّصة تتضمّن زرَّي تشغيل/إيقاف مؤقت.
- أضِف طريقتَي Util
- إضافة RTSP:
- إضافة DASH:
- أزِل مدة بدء عرض الوسائط من
MediaLoadData.startTimeMs
وMediaLoadData.endTimeMs
لأحداث البث باستخدام بروتوكول DASH ذات الفترات المتعددة. - تم إصلاح خطأ كان يؤدي إلى ظهور
IndexOutOfBoundsException
(#10838) عند إعادة إعداد مصدر وسائط Dash المباشر المتعدّد الفترات.
- أزِل مدة بدء عرض الوسائط من
- إضافة HLS:
- أضِف
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
لضبط مهلة لمؤشر تحميل السلسلة من أجل انتظار بدءTimestampAdjuster
. إذا لم يكتمل الإعداد قبل انتهاء المهلة، يتم طرحPlaybackException
لتجنُّب توقّف التشغيل بشكلٍ لا نهائي. يتم ضبط المهلة على صفر تلقائيًا (#323).
- أضِف
- أدوات الاختبار:
- تحقَّق من عدم حساسية نظام URI لحالة الأحرف في
DataSourceContractTest
.
- تحقَّق من عدم حساسية نظام URI لحالة الأحرف في
- إزالة الرموز المتوقّفة نهائيًا:
- أزِل وظائف الإنشاء
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
. - أزِل ثوابت String المتوقّفة نهائيًا لمجموعات الأحرف (
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()
و methods setter بدلاً منها. - أزِل العنصر
ExoPlayer.retry()
الذي تم إيقافه نهائيًا واستخدِمprepare()
بدلاً منه. - أزِل باني
DefaultTrackSelector
الذي يستخدم مَعلمة واحدة وتم إيقافه نهائيًا، واستخدِمDefaultTrackSelector(Context)
بدلاً منه. - أزِل باني
OfflineLicenseHelper
الذي تم إيقافه نهائيًا واستخدِمOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
بدلاً منه. - أزِل باني
DownloadManager
الذي تم إيقافه نهائيًا، واستخدِم بانيExecutor
الذي يقبل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)
- أضِف
- برامج الاستخراج:
- إصلاح تحليل SPS في H.265 في ملفات MPEG-TS من خلال إعادة استخدام منطق التحليل الذي سبق أن استخدمته أدوات استخراج RTSP وMP4 (#303)
- النص:
- SSA: إضافة إمكانية استخدام ملفات UTF-16 إذا كانت تبدأ بعلامة ترتيب وحدات البايت (#319).
- الجلسة:
- حلّ المشكلة المتعلّقة بعدم تعديل
MediaController
للأوامر المتاحة عند الاتصال بجهازMediaSessionCompat
قديم يعدّل إجراءاته - إصلاح خطأ كان يمنع
MediaLibraryService
من عرض قيمة فارغة عند تلقّي طلب من واجهة مستخدم النظام إلىCallback.onGetLibraryRoot
باستخدامparams.isRecent == true
في واجهة برمجة التطبيقات 30 (#355) - إصلاح تسرب الذاكرة في
MediaSessionService
أوMediaLibraryService
(#346) - تم إصلاح خطأ كان يؤدي إلى أن يؤدي تعديل
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) بسبب الخطأ 461 UnsupportedTransport (#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.
- المكتبة الأساسية:
- عمليات التنزيل:
- يمكنك ضبط الحد الأقصى للفرق في وقت بدء شرائحتَين سيتم دمجهما في
SegmentDownloader
والفئات الفرعية (#248).
- يمكنك ضبط الحد الأقصى للفرق في وقت بدء شرائحتَين سيتم دمجهما في
- الصوت:
- الفيديو:
- ربط تنسيق HEVC HDR10 بـ
HEVCProfileMain10HDR10
بدلاً منHEVCProfileMain10
- إضافة حلّ بديل لمشكلة في جهاز "Chromecast مع Google TV" وجهاز Lenovo M10 FHD Plus تؤدي إلى وضع علامة "غير متوافقة" على عمليات بث AVC بمعدّل 60 لقطة في الثانية (#10898).
- حلّ مشاكل الأداء في عملية تحرير اللقطات عند تشغيل الوسائط بمعدّل لقطات أعلى بكثير من معدّل تحديث الشاشة
- ربط تنسيق HEVC HDR10 بـ
- البث:
- إصلاح الرمز المؤقت
STATE_IDLE
عند الانتقال بين عناصر الوسائط (#245)
- إصلاح الرمز المؤقت
- RTSP:
- عليك رصد IllegalArgumentException الذي يتم طرحه عند تحليل طلب RTSP غير الصالح، ووصف رسائل الاستجابة (#10971).
- الجلسة:
- إصلاح خلل يؤدي إلى عدم تعديل زر التشغيل/الإيقاف في الإشعارات تبعًا لحالة المشغّل (#192)
- إضافة IMA:
- إصلاح خطأ كان يمنع بدء أحداث DAI بدون أي إعلانات
لأنّه لم يتم استلام الحدث
LOADED
الأول (والوحيد في حال عدم عرض الإعلانات).
- إصلاح خطأ كان يمنع بدء أحداث DAI بدون أي إعلانات
لأنّه لم يتم استلام الحدث
الإصدار 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
الذي يُعدّ سلسلة محادثات pre-existing playback لمثيل ExoPlayer جديد. - السماح بمحو مساعدات مدير التنزيل (#10776)
- أضِف مَعلمة إلى
BasePlayer.seekTo
للإشارة أيضًا إلى الأمر المستخدَم للتقديم أو الإيقاف. - استخدِم المظهر عند تحميل عناصر قابلة للرسم في الإصدار 21 من واجهة برمجة التطبيقات والإصدارات الأحدث. (#220).
- أضِف
ConcatenatingMediaSource2
يسمح بدمج عناصر وسائط متعددة في نافذة واحدة (#247).
- عدِّل منطق طلب وحدة ترميز المشغِّل للحفاظ على الإعدادات المفضّلة لملف
- برامج الاستخراج:
- يجب عرض
ParserException
بدلاً منNullPointerException
إذا كان جدول عيّنات المحتوى (stbl) لا يتضمّن وصف عيّنة مطلوبًا (stsd) عند تحليل وحدات trak. - تخطّي العيّنات بشكلٍ صحيح عند التقديم/الترجيع مباشرةً إلى إطار مزامنة في fMP4 (#10941)
- يجب عرض
- الصوت:
- استخدِم معدل نقل البيانات لتنسيق الصوت المضغوط لاحتساب الحد الأدنى لحجم المخزن المؤقت
لملف
AudioTrack
في عمليات التشغيل المباشر (التشغيل المباشر).
- استخدِم معدل نقل البيانات لتنسيق الصوت المضغوط لاحتساب الحد الأدنى لحجم المخزن المؤقت
لملف
- النص:
- يجب إصلاح مشكلة
TextRenderer
تمرير فهرس غير صالح (سلبي) إلىSubtitle.getEventTime
إذا كان ملف الترجمة والشرح لا يحتوي على إشارات. - SubRip: إتاحة استخدام ملفات UTF-16 إذا كانت تبدأ بعلامة ترتيب وحدات البايت
- يجب إصلاح مشكلة
- البيانات الوصفية:
- تحليل قيم متعددة مفصولة بقيم فارغة من إطارات ID3، على النحو المسموح به في الإصدار ID3 2.4
- أضِف
MediaMetadata.mediaType
للإشارة إلى نوع المحتوى أو نوع المجلد الذي تصف البيانات الوصفية. - أضِف
MediaMetadata.isBrowsable
كبديل لMediaMetadata.folderType
. سيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
- DASH:
- إضافة تحليل كامل لمجموعات تعديل الصور، بما في ذلك أعداد المربّعات (#3752)
- واجهة المستخدم:
- الجلسة:
- أضِف
SimpleBasePlayer
مجردة للمساعدة في تنفيذ واجهةPlayer
للاعبين المخصّصين. - إضافة طريقة مساعدة لتحويل الرمز المميّز لجلسة المنصة إلى Media3
SessionToken
(#171). - استخدِم
onMediaMetadataChanged
لتشغيل تعديلات جلسة وسائط المنصة (#219). - أضِف جلسة الوسائط كوسيطة
getMediaButtons()
منDefaultMediaNotificationProvider
واستخدِم القوائم الثابتة للوضوح (#216). - أضِف مستمعًا لطلبات إعادة الاتصال
onSetMediaItems
لتوفير وسائل لتعديل/ضبط قائمةMediaItem
والفهرس الأولي والموقع حسب الجلسة قبل ضبط على "مشغّل الوسائط" (#156). - تجنَّب رصد النقر مرّتين لأحداث أزرار الوسائط غير المزوّدة بتقنية البلوتوث (#233).
- جعل
QueueTimeline
أكثر أمانًا في حال كانت حالة الجلسة القديمة مشكوكًا فيها (#241).
- أضِف
- البيانات الوصفية:
- تحليل قيم متعددة مفصولة بقيم فارغة من إطارات ID3، على النحو المسموح به في الإصدار ID3 2.4
- أضِف
MediaMetadata.mediaType
للإشارة إلى نوع المحتوى أو نوع المجلد الذي تصف البيانات الوصفية. - أضِف
MediaMetadata.isBrowsable
كبديل لMediaMetadata.folderType
. سيتم إيقاف نوع المجلد نهائيًا في الإصدار التالي.
- إضافة البث:
- عليك تحديث إصدار حزمة تطوير البرامج (SDK) لتطبيق Cast إلى 21.2.0.
- إضافة IMA:
- أزِل مستمع اللاعب من
ImaServerSideAdInsertionMediaSource
على سلسلة محادثات التطبيق لتجنُّب مشاكل تتعلق بسلسلة المحادثات. - أضِف سمة
focusSkipButtonWhenAvailable
إلىImaServerSideAdInsertionMediaSource.AdsLoader.Builder
لطلب تركيز زر التخطّي على أجهزة التلفزيون وضبطه على true تلقائيًا. - أضِف طريقة
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
لتجنُّب أخطاء الترجمة compiling errors (#10684). - تجنَّب نشر الحظر عند تضمينه في إصدار آخر من gradle.
- يجب فرض الحد الأدنى
- اختيار المقطع الصوتي:
- يجب تفضيل المقاطع الصوتية الأخرى على تقنية Dolby Vision إذا كانت الشاشة لا تتيح استخدامها. (#8944)
- عمليات التنزيل:
- الفيديو:
- جرِّب وحدة ترميز بديلة لتقنية Dolby Vision إذا كانت الشاشة لا تتوافق معها. (#9794).
- الصوت:
- استخدِم
SingleThreadExecutor
لتحرير عمليات إنشاءAudioTrack
لتجنُّب أخطاء OutOfMemory عند تحرير عدّة لاعبين في الوقت نفسه (#10057). - تضيف
AudioOffloadListener.onExperimentalOffloadedPlayback
لحالة تفريغ محتوى AudioTrack. (#134). - اجعل
AudioTrackBufferSizeProvider
واجهة علنية. - أضِف
ExoPlayer.setPreferredAudioDevice
لضبط جهاز مخرج الصوت المفضّل (#135). - أعِد تسمية
androidx.media3.exoplayer.audio.AudioProcessor
إلىandroidx.media3.common.audio.AudioProcessor
. - ربط الصوت المكوّن من 8 قنوات و12 قناة بقناتَي 7.1 و7.1.4 على التوالي في جميع إصدارات Android (#10701)
- استخدِم
- البيانات الوصفية:
- يمكن الآن ضبط
MetadataRenderer
لعرض البيانات الوصفية فورًا عند توفّرها. أنشئ مثيلًا باستخدامMetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)
لتحديد ما إذا كان مشغّل الوسائط سيعرض البيانات الوصفية مبكرًا أو بالتزامن مع موضع المشغّل.
- يمكن الآن ضبط
- إدارة الحقوق الرقمية:
- حلّ مشكلة خطأ في عملية تنفيذ ClearKey على نظام التشغيل Android 13 يؤدي إلى عرض عنوان URL غير فارغ ولكنّه غير صالح
- إصلاح الخطأ
setMediaDrmSession failed: session not opened
عند التبديل بين مخططات إدارة الحقوق الرقمية في قائمة تشغيل (مثل Widevine إلى ClearKey)
- النص:
- CEA-608: تأكَّد من معالجة أوامر تبديل الخدمة في الحقل 2 بشكل صحيح (#10666).
- DASH:
- تحليل
EventStream.presentationTimeOffset
من ملفات البيانات (#10460)
- تحليل
- واجهة المستخدم:
- استخدِم الإعدادات الحالية التي تم إلغاؤها في المشغّل كإعداد مُعدّ مسبقًا في
TrackSelectionDialogBuilder
(#10429).
- استخدِم الإعدادات الحالية التي تم إلغاؤها في المشغّل كإعداد مُعدّ مسبقًا في
- الجلسة:
- تأكَّد من تنفيذ الأوامر دائمًا بالترتيب الصحيح حتى إذا كانت بعض الأوامر تتطلّب حلًا غير متزامن (#85).
- أضِف
DefaultMediaNotificationProvider.Builder
لإنشاء مثيلاتDefaultMediaNotificationProvider
. يمكن لصانع المحتوى ضبط معرّف الإشعار ومعرّف قناة الإشعار واسم قناة الإشعار التي يستخدمها مقدّم الخدمة. أضِف أيضًا الطريقةDefaultMediaNotificationProvider.setSmallIcon(int)
لضبط رمز إعلامات التطبيقات الصغير. (#104) - تأكَّد من عدم إسقاط الأوامر المُرسَلة قبل
MediaController.release()
(#99). - يمكن أن تحمِّل
SimpleBitmapLoader
ملفًا بتنسيق bitmap من معرّفات الموارد المنتظمةfile://
(#108). - يجب إصلاح العبارة التي تمنع
MediaController
من التقديم أو الإيقاف أثناء عرض إعلان في فترة معيّنة (#122). - عند انتهاء التشغيل، يتم إيقاف
MediaSessionService
من المستوى الأول ويظهر إشعار لإعادة تشغيل آخر عنصر وسائط تم تشغيله (#112). - لا تبدأ خدمة تعمل في المقدّمة باستخدام نية معلّقة للتوقف مؤقتًا (#167).
- إخفاء "الشارة" يدويًا المرتبطة بالإشعار الذي أنشأه
DefaultNotificationProvider
على واجهتَي برمجة التطبيقات 26 و27 (يتم إخفاء الشارة تلقائيًا على واجهة برمجة التطبيقات 28 والإصدارات الأحدث) (#131) - تم إصلاح الخلل الذي كان يؤدي إلى حدوث IllegalStateExceptions (#49) عند إجراء اتصال ثانٍ من MediaSession قديم بأحد مكونات Media3 MediaController.
- RTSP:
- IMA:
- أضِف مهلة لتحميل معلومات الإعلان من أجل معالجة الحالات التي تتعذّر فيها على حزمة تطوير البرامج لإعلانات الوسائط التفاعلية loading an ad (#10510).
- منع تخطّي الإعلانات أثناء التشغيل عند الانتقال إلى نهاية المحتوى (#10685)
- احتساب مدة النافذة بشكل صحيح للبث المباشر الذي يتضمّن إعلانات مضمّنة من جهة الخادم، مثل IMA DAI (#10764)
- إضافة FFmpeg:
- أضِف علامات مطلوبة حديثًا لربط مكتبات FFmpeg بمجموعة تطوير البرامج (NDK) 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).
- تأكَّد من أنّ تغيير
- برامج الاستخراج:
- DASH:
- تحليل عنوان URL لترخيص ClearKey من ملفات البيان (#10246)
- واجهة المستخدم:
- تأكَّد من أنّ TalkBack يُعلِن عن خيار السرعة النشطة حاليًا في قائمة عناصر التحكّم في التشغيل (#10298).
- RTSP:
- إضافة معالجة الحِزم المجزّأة في VP8 (#110)
- إضافة Leanback:
- استمع إلى التغييرات في
playWhenReady
فيLeanbackAdapter
(10420).
- استمع إلى التغييرات في
- البث:
الإصدار 1.0.0-beta01
16 حزيران (يونيو) 2022
تم إصدار androidx.media3:media3-*:1.0.0-beta01
.
يحتوي الإصدار 1.0.0-beta01 على هذه المراجعات.
ويتوافق ذلك مع إصدار ExoPlayer 2.18.0.
- المكتبة الأساسية:
- فعِّل ميزة بيانات تشخيص نظام Android الأساسي من خلال
MediaMetricsManager
. سيعيد ExoPlayer توجيه أحداث التشغيل و data الأداء إلى المنصة، ما يساعد في توفير معلومات عن أداء النظام وتصحيح الأخطاء على الجهاز. وقد تجمع 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
للسماح للّاعبين بتحديد عنصر واحد.
- فعِّل ميزة بيانات تشخيص نظام Android الأساسي من خلال
- اختيار المقطع الصوتي:
- دمج فئة
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
استخدام الصوت الاستيريو/المونو بدلاً من تنسيقات الصوت المتعدّد القنوات، ما لم يكن بإمكانه استخدام ميزة الصوت المكاني (Android 12L والإصدارات الأحدث) مع تنسيق الصوت المتعدّد القنوات أو استخدام تنسيق صوت محيطي بتقنية Dolby. بالإضافة إلى ذلك، على الأجهزة التي تتيح ميزة "الصوت المكاني"،DefaultTrackSelector
سترصد التغييرات في خصائص أداة "الصوت المكاني" وسيتم اختيار مقطع صوتي جديد استنادًا إلى هذه التغييرات. يتم استبعاد الأجهزة التي تعمل فيtelevision
وضع واجهة المستخدم من هذه القيود، وسيتم تفضيل التنسيق الذي يتضمّن أكبر عدد من القنوات. لتفعيل هذه الميزة، يجب إنشاء مثيلDefaultTrackSelector
باستخدامContext
.
- دمج فئة
- الفيديو:
- أعِد تسمية
DummySurface
إلىPlaceholderSurface
. - أضِف تنسيق AV1 إلى
MediaCodecVideoRenderer.getCodecMaxInputSize
.
- أعِد تسمية
- الصوت:
- استخدام برنامج ترميز الصوت AC3 من LG للإعلان عن نوع 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.
- غيِّر
- برامج الاستخراج:
- واجهة المستخدم:
- حلّ مشكلة إرسال الأحداث إلى
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
بشكل صريح إذا لزم الأمر.
- تحليل عدد القنوات من عناصر DTS
- HLS:
- الاعتماد على الإعداد المجزّأ إذا كانت سمة CODECS في قائمة التشغيل لا تحتوي على برنامج ترميز الصوت (#10065)
- لا تسمح بنقل
null
إلىHlsMediaSource.Factory.setCompositeSequenceableLoaderFactory
وHlsMediaSource.Factory.setPlaylistParserFactory
وHlsMediaSource.Factory.setPlaylistTrackerFactory
. يمكن تمرير نُسخ منDefaultCompositeSequenceableLoaderFactory
أوDefaultHlsPlaylistParserFactory
أو مرجع إلىDefaultHlsPlaylistTracker.FACTORY
بشكل صريح إذا كان ذلك مطلوبًا.
- ميزة "البث السلس":
- لا تسمح بنقل
null
إلىSsMediaSource.Factory.setCompositeSequenceableLoaderFactory
. يمكن تمرير نُسخ منDefaultCompositeSequenceableLoaderFactory
صراحةً إذا لزم الأمر.
- لا تسمح بنقل
- RTSP:
- إضافة قارئ RTP لتنسيق H263 (#63)
- إضافة قارئ RTP لتنسيق MPEG4 (#35)
- إضافة قارئ RTP لتنسيق HEVC (#36)
- إضافة قارئ RTP لتنسيق AMR لا تتوفّر حاليًا سوى عمليات نقل AMR المتعدّدة القنوات غير المتداخلة. لا تتوفّر حمولة RTP المركبة لبروتوكول 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
. - حلّ مشكلة "الخطأ في وقت التشغيل" في
MediaControllerImplLegacy
(#59) - تعديل معلومات موضع الجلسة على المخطط الزمني change(#51).
- إصلاح خطأ NPE في
MediaControllerImplBase
بعد إعادة تشغيل وحدة التحكّم (#74)
- استبدِل
- تشغيل الإعلانات / IMA:
- يمكنك خفض معدّل الاستطلاع الإعلاني من كل 100 ملي ثانية إلى كل 200 ملي ثانية، بما يتوافق مع اقتراحات "مجلس تقييم الوسائط" (MRC).
- إضافة FFmpeg:
- عليك تحديث إصدار CMake إلى
3.21.0+
لتجنُّب خطأ في CMake يؤدي إلى تعطُّل gradle sync في AndroidStudio (#9933).
- عليك تحديث إصدار CMake إلى
- إزالة الرموز المتوقّفة نهائيًا:
- أزِل
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 بترتيب غير صحيح في أحداث البث التي تحتوي على ذرات emsg من الإصدار 0 والإصدار 1 (#9996).
- النص:
- يجب إصلاح التفاعل بين
SingleSampleMediaSource.Factory.setTrackId
وMediaItem.SubtitleConfiguration.Builder.setId
لمنح الأولوية لمحاولة استخدام حقلSubtitleConfiguration
والرجوع إلى القيمةFactory
في حال عدم تحديده (#10016).
- يجب إصلاح التفاعل بين
- تشغيل الإعلان:
- إصلاح مشاكل تأخّر الصوت بين فترات عرض الإعلانات في أحداث البث المباشر باستخدام تقنية SSAI في بروتوكول 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
يمكن دائمًا تمييزTrackGroup
s من خلال ضبطid
في constructorTrackGroup
. يعالج هذا التحديث مشكلة الأعطال عند استئناف التشغيل بعد وضع التطبيق في الخلفية مع إلغاء مسار نشط (#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)
- برامج الاستخراج:
- النص:
- إدارة الحقوق الرقمية:
- أزِل
playbackLooper
منDrmSessionManager.(pre)acquireSession
. عندما يستخدم تطبيقDrmSessionManager
فيMediaSource
مخصّص، يجب تمريرplaybackLooper
إلىDrmSessionManager.setPlayer
بدلاً من ذلك.
- أزِل
- تشغيل الإعلانات / IMA:
- إتاحة استخدام ميزة إدراج الإعلانات الديناميكية في IMA (DAI) (#8213)
- أضِف طريقة إلى
AdPlaybackState
للسماح بإعادة ضبط مجموعة إعلانية لكي يمكن تشغيلها مرة أخرى (#9615). - فرض سرعة تشغيل 1.0 أثناء تشغيل الإعلان (#9018)
- تم إصلاح مشكلة كانت تؤدي إلى إعادة ضبط التشغيل على الفور في حال تعذّر تحميل مجموعة إعلانية (#9929).
- واجهة المستخدم:
- DASH:
- أضِف السمات الأساسية والتكميلية التي تمّت تحليلها إلى
Representation
(#9579). - إتاحة دور تتبُّع
forced-subtitle
(#9727) - توقّف عن تفسير دور قناة الإصدار
main
على أنّهC.SELECTION_FLAG_DEFAULT
. - إصلاح منطق استبعاد عنوان URL الأساسي في ملفات البيان التي لا تحدّد مساحة اسم DVB (#9856)
- السماح بعناوين URL
MPD.Location
النسبية (#9939)
- أضِف السمات الأساسية والتكميلية التي تمّت تحليلها إلى
- HLS:
- يجب تعبئة الحقل
Format.label
بشكل صحيح لأحداث البث المباشر وفق بروتوكول HLS التي تتضمّن صوتًا فقط (#9608). - استخدِم ميزة "الإعداد بدون أجزاء" تلقائيًا لتحسين وقت بدء التشغيل. إذا كانت
الإصدارات تتضمّن مقاطع صوتية مضمّنة لترجمة وشرح لم يتمّ تحديدها
في قائمة التشغيل الرئيسية، عليك إضافتها إلى قائمة التشغيل الرئيسية لتكون
متوفّرة للتشغيل، أو إيقاف الإعداد بدون أجزاء باستخدام
HlsMediaSource.Factory.setAllowChunklessPreparation(false)
. - إتاحة إمكانية التقديم أو الإيقاف السريع بدقة في اللقطة الرئيسية في HLS (#2882)
- يجب تعبئة الحقل
- RTSP:
- المحوِّل:
- يجب زيادة الحد الأدنى المطلوب لإصدار واجهة برمجة التطبيقات إلى 21.
- يُستخدَم الرمز
TransformationException
الآن لوصف الأخطاء التي تحدث أثناء عملية التحويل. - أضِف
TransformationRequest
لتحديد خيارات التحويل. - السماح بتسجيل مستمعين متعدّدين
- إصلاح مشكلة توقف Transformer عند قراءة ناتج ترميز الصوت والفيديو جزئيًا
- حلّ مشكلة "الخطأ في وقت التشغيل" المحتمَلة في
Transformer.getProgress
عند رمي muxer throws - أضِف تطبيقًا تجريبيًا لتطبيق عمليات التحويل.
- إضافة MediaSession:
- يُمحو الرمز
MediaSessionConnector
تلقائيًا قائمة التشغيل عند إيقافها. يمكن للتطبيقات التي تريد الاحتفاظ بقائمة التشغيل الاتصال بواجهة برمجة التطبيقاتsetClearMediaItemsOnStop(false)
في أداة الربط.
- يُمحو الرمز
- إضافة البث:
- إضافة FFmpeg:
- اجعل
build_ffmpeg.sh
يعتمد على أدوات bin utils من LLVM بدلاً من أدوات GNU (#9933).
- اجعل
- التوافق مع Android 12:
- عليك ترقية إضافة Cast لتصبح تعتمد على
com.google.android.gms:play-services-cast-framework:20.1.0
. إنّ الإصدارات السابقة منplay-services-cast-framework
غير متوافقة مع التطبيقات التي تستهدف الإصدار 12 من نظام التشغيل Android، وستتعطّل بسببIllegalArgumentException
عند إنشاءPendingIntent
(#9528).
- عليك ترقية إضافة Cast لتصبح تعتمد على
- إزالة الرموز المتوقّفة نهائيًا:
- أزِل
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، مثل إدراج الإعلانات من خلال حزمة تطوير البرامج (SDK) لإعلانات الوسائط التفاعلية
لمزيد من المعلومات، يُرجى الاطّلاع على مشروع Media3 على GitHub.
كان ExoPlayer مستضافًا سابقًا في مشروع ExoPlayer على GitHub منفصل. في Media3، اسم الحزمة هو androidx.media3.exoplayer
. نخطّط لمواصلة صيانة و
إصدار مشروع ExoPlayer على GitHub لبعض الوقت لإتاحة الوقت للتطبيقات لنقل بياناتها إلى
Media3. تتضمّن Media3 بدائل لجميع وحدات ExoPlayer، باستثناء
إضافات media2 وmediasession القديمة التي تم استبدالها بالوحدة الجديدة
media3-session
. يوفر ذلك عملية دمج مباشرة بين مشغّلات التطبيقات وجلسات الوسائط بدون الحاجة إلى استخدام فئة محوِّل/موصّل.