تحديد المشاكل وحلّها


إصلاح أخطاء "زيارات HTTP غير مسموح بها"

سيحدث هذا الخطأ إذا كان تطبيقك يطلب زيارات HTTP بالنص الواضح (أي http:// بدلاً من https://) عندما لا يسمح ذلك في إعدادات أمان الشبكة. إذا كان تطبيقك يستهدف الإصدار 9 من نظام التشغيل Android (المستوى 28 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث، يتم إيقاف زيارات بروتوكول HTTP إلى نص بشكل تلقائي وفقًا للإعدادات التلقائية.

إذا كان تطبيقك يحتاج إلى العمل مع حركة بيانات cleartext HTTP، عليك استخدام إعدادات أمان الشبكة التي تسمح بذلك. راجع مستندات أمان الشبكات في Android للحصول على مزيد من التفاصيل. لإتاحة جميع زيارات بروتوكول HTTP التي لن اتّبِعها الواضحة، يمكنك ببساطة إضافة android:usesCleartextTraffic="true" إلى العنصر application في AndroidManifest.xml في تطبيقك.

يستخدم تطبيق ExoPlayer التجريبي "الإعداد التلقائي لأمان الشبكة"، ولذلك لا يسمح بحركة مرور بيانات cleartext HTTP. يمكنك تفعيله باتّباع التعليمات أعلاه.

إصلاح أخطاء "SSLHandtakeException" و"CertPathPolicyatorException" و "ERR_CERT_AUTHORITY_ATTRIBUTE"

تشير كل من SSLHandshakeException وCertPathValidatorException وERR_CERT_AUTHORITY_INVALID إلى وجود مشكلة في شهادة طبقة المقابس الآمنة (SSL) الخاصة بالخادم. هذه الأخطاء ليست محدَّدة بمنصة ExoPlayer. للحصول على مزيد من التفاصيل، يمكنك الاطّلاع على وثائق طبقة المقابس الآمنة (SSL) في Android.

لماذا لا يمكن البحث عن بعض ملفات الوسائط؟

بشكل تلقائي، لا يتيح ExoPlayer تقديم البحث في الوسائط حيث تكون الطريقة الوحيدة لتنفيذ عمليات البحث الدقيق هي أن يفحص المشغّل الملف بأكمله وفهرسته. يعتبر ExoPlayer أنّ هذه الملفات غير قابلة للبحث. تشتمل معظم تنسيقات حاويات الوسائط الحديثة على بيانات وصفية للتقديم/الترجيع (مثل فهرس العينة)، أو لديها خوارزمية بحث محددة جيدًا (على سبيل المثال، بحث بقسمة مدخلة لـ Ogg)، أو تشير إلى أن المحتوى بمعدل نقل بيانات ثابت. من الممكن إجراء عمليات البحث الفعّالة ودعمها من قِبل ExoPlayer في هذه الحالات.

إذا كنت تحتاج إلى التقديم/الترجيع ولكن لديك وسائط غير مرغوب فيها، نقترح عليك تحويل المحتوى الخاص بك لاستخدام تنسيق حاوية أكثر ملاءمة. بالنسبة إلى ملفات MP3 وADTS وAMR، يمكنك أيضًا تفعيل التقديم/الترجيع بافتراض أنّ الملفات بها معدل نقل بيانات ثابت، كما هو موضّح هنا.

لماذا يكون التقديم/الترجيع غير دقيق في بعض ملفات MP3؟

لا تناسب ملفات MP3 ذات معدل نقل البيانات المتغير (VBR) بشكل أساسي حالات الاستخدام التي تتطلب التقديم/الترجيع بدقة. وهناك سببان لذلك:

  1. للتقديم/الترجيع بدقة، يوفّر تنسيق الحاوية تخطيطًا دقيقًا من وقت إلى بايت في العنوان. يسمح هذا التعيين للّاعب بتعيين وقت التقديم المطلوب لإزاحة البايت المقابلة، وبدء طلب الوسائط وتحليلها وتشغيلها من تلك الإزاحة. للأسف، غالبًا ما تكون العناوين المتاحة لتحديد هذا التعيين بتنسيق MP3 (مثل عناوين XING) غير دقيقة.
  2. بالنسبة إلى تنسيقات الحاويات التي لا توفّر تعيينًا دقيقًا للوقت إلى بايت (أو أي تعيين من وقت إلى بايت على الإطلاق)، لا يزال من الممكن إجراء بحث دقيق إذا كانت الحاوية تتضمّن طوابع زمنية مطلقة للعينة في البث. في هذه الحالة، يمكن للّاعب ربط وقت التقديم/الترجيع بأفضل تخمين لإزاحة البايت المقابلة، والبدء في طلب الوسائط من هذا الإزاحة، وتحليل أول عيّنة زمنية مطلقة، وإجراء بحث ثنائي إرشادي في الوسائط بشكل فعّال إلى أن يعثر على العيّنة الصحيحة. لا يتضمّن تنسيق MP3 طوابع زمنية مطلقة في البث، وبالتالي لا يمكن تطبيق هذا الأسلوب.

لهذه الأسباب، تتمثل الطريقة الوحيدة لإجراء محاولة دقيقة في ملف VBR MP3 في فحص الملف بأكمله وإنشاء تعيين مدة إلى بايت يدويًا في المشغّل. يمكن تفعيل هذه الاستراتيجية باستخدام FLAG_ENABLE_INDEX_SEEKING، والتي يمكن ضبطها على DefaultExtractorsFactory باستخدام setMp3ExtractorFlags. يُرجى العِلم أنّ هذا التنسيق لا يناسب ملفات MP3 الكبيرة، لا سيّما إذا حاول المستخدم الانتقال إلى نهاية البث بعد بدء التشغيل بفترة قصيرة، ما يتطلّب من المشغّل الانتظار إلى أن يتم تنزيله ويفهرس مجموعة البث بالكامل قبل تنفيذ عملية التقديم/الترجيع. في ExoPlayer، قرّرنا في هذه الحالة تحسين السرعة بدلاً من الدقة، وبالتالي تم إيقاف FLAG_ENABLE_INDEX_SEEKING تلقائيًا.

إذا كنت تتحكم في الوسائط التي تشغلها، ننصحك بشدة باستخدام تنسيق حاوية أكثر ملاءمة، مثل MP4. لا توجد حالات استخدام نحن على دراية بها حيث يكون MP3 هو الخيار الأفضل لتنسيق الوسائط.

لماذا يكون وضع التقديم/الترجيع في الفيديو بطيئًا؟

عندما ينتقل المشغّل إلى موضع تشغيل جديد في الفيديو، يحتاج إلى اتخاذ إجراءين:

  1. حمِّل البيانات المقابلة لموضع التشغيل الجديد في المخزن المؤقت (قد لا يكون ذلك ضروريًا إذا سبق تخزين هذه البيانات مؤقتًا).
  2. امسح برنامج فك ترميز الفيديو وابدأ فك الترميز من الإطار I-frame (الإطار الرئيسي) قبل موضع التشغيل الجديد، وذلك بسبب الترميز داخل الإطار الذي تستخدمه معظم تنسيقات ضغط الفيديو. لضمان أن يكون وضع التقديم/الترجيع دقيقًا (أي أن التشغيل يبدأ من موضع البحث بالضبط)، يجب فك ترميز جميع الإطارات بين الإطار I السابق وموضع البحث وتجاهلها فورًا (بدون عرضها على الشاشة).

يمكن التخفيف من وقت الاستجابة (1) من خلال إما زيادة كمية البيانات التي يخزّنها المشغّل في الذاكرة مؤقتًا أو تخزين البيانات مؤقتًا بشكل مسبق على القرص.

يمكن التخفيف من وقت الاستجابة الناتج عن (2) إما من خلال تقليل دقة التقديم أو الترجيع باستخدام ExoPlayer.setSeekParameters أو إعادة ترميز الفيديو للحصول على إطارات I-Frame أكثر تكرارًا (ما سيؤدي إلى إنشاء ملف إخراج أكبر).

لماذا يتعذّر تشغيل بعض ملفات MPEG-TS؟

لا تحتوي بعض ملفات MPEG-TS على محدِّدات وحدات الوصول (AUD). تعتمد ExoPlayer تلقائيًا على حسابات AUD لاكتشاف حدود الإطار بسعر زهيد. وبالمثل، لا تحتوي بعض ملفات MPEG-TS على إطارات رئيسية لـ IDR. بشكل افتراضي، هذه هي النوع الوحيد من الإطارات الرئيسية التي يأخذها ExoPlayer في الاعتبار.

يبدو أنّ ExoPlayer عالقاً في حالة التخزين المؤقت عندما يُطلب منك تشغيل ملف MPEG-TS لا يتضمّن إطارات AUD أو IDR الرئيسية. إذا كنت تريد تشغيل هذه الملفات، يمكنك تشغيلها باستخدام FLAG_DETECT_ACCESS_UNITS وFLAG_ALLOW_NON_IDR_KEYFRAMES على التوالي. يمكن وضع هذه العلامات على DefaultExtractorsFactory باستخدام setTsExtractorFlags أو على DefaultHlsExtractorFactory باستخدام المنشئ. ليس لاستخدام FLAG_DETECT_ACCESS_UNITS أي آثار جانبية غير أنّه مكلف من الناحية الحسابية مقارنةً برصد حدود الإطار استنادًا إلى دولار أسترالي. قد يؤدي استخدام FLAG_ALLOW_NON_IDR_KEYFRAMES إلى تلف مرئي مؤقت في بداية التشغيل وبعده مباشرةً عند تشغيل بعض ملفات MPEG-TS.

لماذا لا يتم العثور على الترجمات في بعض ملفات MPEG-TS؟

تحتوي بعض ملفات MPEG-TS على مسارات CEA-608 ولكن لا تذكرها في البيانات الوصفية للحاويات، لذلك لا يمكن لـ ExoPlayer رصدها. ويمكنك تحديد أي مقاطع ترجمة وشرح يدويًا من خلال توفير قائمة بتنسيقات العناوين الفرعية المتوقّعة لـ DefaultExtractorsFactory، بما في ذلك قنوات تسهيل الاستخدام التي يمكن استخدامها للتعرّف عليها في بث MPEG-TS:

Kotlin

val extractorsFactory =
  DefaultExtractorsFactory()
    .setTsSubtitleFormats(
      listOf(
        Format.Builder()
          .setSampleMimeType(MimeTypes.APPLICATION_CEA608)
          .setAccessibilityChannel(accessibilityChannel)
          // Set other subtitle format info, such as language.
          .build()
      )
    )
val player: Player =
  ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, extractorsFactory)).build()

Java

DefaultExtractorsFactory extractorsFactory =
    new DefaultExtractorsFactory()
        .setTsSubtitleFormats(
            ImmutableList.of(
                new Format.Builder()
                    .setSampleMimeType(MimeTypes.APPLICATION_CEA608)
                    .setAccessibilityChannel(accessibilityChannel)
                    // Set other subtitle format info, such as language.
                    .build()));
Player player =
    new ExoPlayer.Builder(context, new DefaultMediaSourceFactory(context, extractorsFactory))
        .build();

لماذا يتم تشغيل بعض ملفات MP4/FMP4 بشكل غير صحيح؟

تحتوي بعض ملفات MP4 أو FMP4 على قوائم تعديل تعيد كتابة المخطط الزمني للوسائط عن طريق تخطي قوائم النماذج أو نقلها أو تكرارها. لدى ExoPlayer دعم جزئي لتطبيق قوائم التعديل. على سبيل المثال، قد يؤخّر تشغيل مجموعات من النماذج أو يكررها بدءًا من عينة مزامنة، لكنه لا يقتطع العيّنات الصوتية أو وسائط ما قبل التشغيل للتعديلات التي لا تبدأ في عيّنة مزامنة.

إذا لاحظت أنّ جزءًا من الوسائط مفقود أو متكرّرًا بشكل غير متوقّع، حاوِل ضبط Mp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS أو FragmentedMp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS، وسيؤدي ذلك إلى تجاهل أداة الاستخراج لقوائم التعديل تمامًا. ويمكن ضبطها على DefaultExtractorsFactory باستخدام setMp4ExtractorFlags أو setFragmentedMp4ExtractorFlags.

لماذا تخفق بعض عمليات البث مع رمز استجابة HTTP 301 أو 302؟

يشير رمزا استجابة HTTP 301 و302 إلى إعادة التوجيه. يمكن العثور على أوصاف موجزة على ويكيبيديا. عندما يقدّم ExoPlayer طلبًا ويتلقّى ردًا برمز الحالة 301 أو 302، سيتتبّع عادةً عملية إعادة التوجيه ويبدأ تشغيل الفيديو كالمعتاد. وهناك حالة لا يحدث فيها هذا الأمر بشكل افتراضي هي عمليات إعادة التوجيه بين البروتوكولات. عملية إعادة التوجيه عبر البروتوكولات هي عملية إعادة توجيه من HTTPS إلى HTTP أو العكس (أو بشكل أقل شيوعًا بين زوج آخر من البروتوكولات). يمكنك استخدام أداة سطر الأوامر wget على النحو التالي لاختبار ما إذا كان عنوان URL يؤدي إلى إعادة توجيه عبر البروتوكول:

wget "https://yourserver.com/test.mp3" 2>&1  | grep Location

يجب أن تبدو المخرجات على النحو التالي:

Location: https://second.com/test.mp3 [following]
Location: http://third.com/test.mp3 [following]

في هذا المثال، هناك عمليتا إعادة توجيه. تتم عملية إعادة التوجيه الأولى من https://yourserver.com/test.mp3 إلى https://second.com/test.mp3. وكلاهما يستخدم بروتوكول HTTPS، وبالتالي لا يُعدّ عملية إعادة توجيه بين بروتوكولات. وتتم عملية إعادة التوجيه الثانية من https://second.com/test.mp3 إلى http://third.com/test.mp3. إنّ عمليات إعادة التوجيه هذه من HTTPS إلى HTTP وكذلك عملية إعادة التوجيه عبر بروتوكولات متعددة. لن يتّبع ExoPlayer عملية إعادة التوجيه هذه في الإعدادات التلقائية، ما يعني أنّه سيتعذّر التشغيل.

وإذا كنت بحاجة إلى ذلك، يمكنك ضبط ExoPlayer لاتّباع عمليات إعادة التوجيه عبر البروتوكولات عند إنشاء مثيل لمثيلات DefaultHttpDataSource.Factory المستخدمة في تطبيقك. يمكنك الاطّلاع على مزيد من المعلومات حول اختيار حزمة الشبكات وضبطها من هنا.

لماذا تفشل بعض عمليات البث باستخدام UnknownInputFormatException؟

يتعلق هذا السؤال بحالات إخفاق التشغيل في النموذج التالي:

UnrecognizedInputFormatException: None of the available extractors
(MatroskaExtractor, FragmentedMp4Extractor, ...) could read the stream.

هناك سببان محتملان لهذا الإخفاق. السبب الأكثر شيوعًا هو أنّك تحاول تشغيل محتوى عبر DASH (mpd) أو HLS (m3u8) أو SmoothStreaming (ism، isml)، ولكن يحاول المشغّل تشغيله كبث تدريجي. لتشغيل مثل هذه البث، عليك الاعتماد على وحدة ExoPlayer المعنيّة. في الحالات التي لا ينتهي في مصدر URI للبث بامتداد الملف العادي، يمكنك أيضًا ضبط MimeTypes.APPLICATION_MPD أو MimeTypes.APPLICATION_M3U8 أو MimeTypes.APPLICATION_SS على setMimeType من MediaItem.Builder لتحديد نوع البث بشكل صريح.

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

لماذا لا تعمل سياسة setplayParameters بشكل صحيح على بعض الأجهزة؟

عند استخدام إصدار تصحيح أخطاء في تطبيقك على Android M والإصدارات الأقدم، قد تلاحظ حدوث تقطُّع في الأداء ووجود عناصر مسموعة وارتفاع معدّل استخدام وحدة المعالجة المركزية (CPU) عند استخدام واجهة برمجة التطبيقات setPlaybackParameters. ويرجع هذا إلى أنّ عملية تحسين مهمة لواجهة برمجة التطبيقات هذه تم إيقافها في إصدارات تصحيح الأخطاء التي تعمل على هذه الإصدارات من Android.

يُرجى العلم أنّ هذه المشكلة لا تؤثّر إلا في إصدارات تصحيح الأخطاء. ولا يؤثّر ذلك في تصميمات الإصدارات، حيث يكون التحسين مفعَّلاً دائمًا. وبالتالي، من المفترض ألا يتأثر الإصدارات التي تقدمها للمستخدمين النهائيين بهذه المشكلة.

ما معنى أخطاء "تم الوصول إلى المشغّل من خلال سلسلة محادثات خاطئة"؟

يمكنك الاطّلاع على ملاحظة حول سلاسل المحادثات في صفحة البدء.

كيف يمكنني حلّ مشكلة "سطر الحالة غير المتوقع: ICY 200 OK"؟

يمكن أن تحدث هذه المشكلة إذا تضمنت استجابة الخادم سطر حالة ICY، بدلاً من سطر متوافق مع HTTP. تم إيقاف سطور الحالة ICY ويجب عدم استخدامها، لذا إذا كنت تتحكم في الخادم، ينبغي عليك تحديثه لتقديم استجابة متوافقة مع HTTP. إذا لم تتمكن من القيام بذلك، فإن استخدام مكتبة ExoPlayer OkHttp سيحل المشكلة، حيث يمكنه التعامل مع سطور الحالة ICY بشكل صحيح.

كيف يمكنني معرفة ما إذا كان البث الذي يتم تشغيله عبارة عن بث مباشر؟

يمكنك طلب البحث عن طريقة isCurrentWindowLive للمشغل. بالإضافة إلى ذلك، يمكنك الاطّلاع على isCurrentWindowDynamic لمعرفة ما إذا كانت النافذة ديناميكية (أي لا يزال يتم تعديلها بمرور الوقت).

كيف يمكنني مواصلة تشغيل الصوت عندما يعمل تطبيقي في الخلفية؟

اتّبِع الخطوات التالية لضمان استمرار تشغيل الصوت عندما يكون تطبيقك في الخلفية:

  1. يجب أن تكون خدمة تعمل في المقدّمة قيد التشغيل. يمنع هذا النظام من إنهاء عمليتك لتحرير الموارد.
  2. عليك الضغط مع الاستمرار على WifiLock وWakeLock. يضمن ذلك أن يُبقي النظام راديو WiFi ووحدة المعالجة المركزية في الوضع النشط. يمكن إجراء ذلك بسهولة في حال استخدام ExoPlayer من خلال استدعاء setWakeMode، الذي سيقوم تلقائيًا بالحصول على الأقفال المطلوبة وتحريرها في الأوقات الصحيحة.

من المهم فتح القفل (في حال عدم استخدام setWakeMode) وإيقاف الخدمة فور إيقاف تشغيل الصوت.

لماذا يتوافق تطبيق ExoPlayer مع المحتوى الخاص بي ولكنّ مكتبة ExoPlayer Cast لا تتوافق معه؟

من المحتمل أن يكون المحتوى الذي تحاول تشغيله غير تم تفعيل CORS. ويتطلّب إطار عمل البثّ تفعيل سياسة CORS من أجل تشغيله.

لماذا يتعذّر تشغيل المحتوى بدون ظهور أي خطأ؟

قد لا يتوافق الجهاز الذي يتم تشغيل المحتوى عليه مع تنسيق معيّن لعيّنة الوسائط. يمكن التأكّد بسهولة من ذلك من خلال إضافة EventLogger كمستمع إلى المشغّل والبحث عن سطر يشبه هذا السطر في Logcat:

[ ] Track:x, id=x, mimeType=mime/type, ... , supported=NO_UNSUPPORTED_TYPE

تعني NO_UNSUPPORTED_TYPE أنّ الجهاز لا يمكنه فك ترميز تنسيق نموذج الوسائط المحدّد في mimeType. يمكنك الاطّلاع على مستندات تنسيقات وسائط Androidللحصول على معلومات حول نماذج التنسيقات المتوافقة. وقد يكون السؤال كيف يمكنني الحصول على مكتبة فك ترميز لتحميلها واستخدامها للتشغيل؟ قد يكون مفيدًا أيضًا.

كيف يمكنني تحميل مكتبة فك ترميز واستخدامها للتشغيل؟

  • تحتوي معظم مكتبات برامج فك الترميز على خطوات يدوية للتحقق من التبعيات وإنشائها، لذا تأكد من اتباعك للخطوات الواردة في الملف التمهيدي للمكتبة ذات الصلة. على سبيل المثال، بالنسبة إلى مكتبة ExoPlayer FFmpeg، من الضروري اتّباع التعليمات الواردة في libraries/decoder_ffmpeg/README.md، بما في ذلك ضبط علامات الضبط لتفعيل برامج فك الترميز لأي تنسيقات تريد تشغيلها.
  • بالنسبة إلى المكتبات التي تتضمّن رموزًا برمجية أصلية، تأكَّد من استخدام الإصدار الصحيح من Android NDK كما هو محدّد في ملف README وانتبه إلى أيّ أخطاء تظهر أثناء عملية الإعداد والإنشاء. من المفترَض أن تظهر لك ملفات .so في الدليل الفرعي libs في مسار المكتبة لكل بنية متوافقة بعد اتّباع الخطوات الواردة في الملف التمهيدي.
  • لتجربة تشغيل المحتوى باستخدام المكتبة في التطبيق التجريبي، يمكنك الاطّلاع على تفعيل برامج فك الترميز المجمَّعة. راجع ملف README للمكتبة للحصول على تعليمات حول استخدام المكتبة من تطبيقك الخاص.
  • في حال استخدام DefaultRenderersFactory، من المفترض أن يظهر لك سطر سجلّ على مستوى المعلومات، مثل "Loaded Ffmpeg AudioRenderer" في Logcat عند تحميل برنامج فك الترميز. إذا تعذّر ذلك، تأكَّد من أنّ التطبيق يعتمد على مكتبة فك الترميز.
  • إذا رأيت سجلات على مستوى التحذير من LibraryLoader في Logcat، يشير ذلك إلى تعذُّر تحميل المكوّن الأصلي للمكتبة. إذا حدث ذلك، فتأكد من أنك اتبعت الخطوات الواردة في ملف README للمكتبة بشكل صحيح وأنه لم تظهر أي أخطاء أثناء اتباع التعليمات.

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

هل يمكنني تشغيل فيديوهات YouTube مباشرةً باستخدام ExoPlayer؟

لا، لا يمكن لتطبيق ExoPlayer تشغيل الفيديوهات من YouTube، مثل عناوين URL بالنموذج https://www.youtube.com/watch?v=.... بدلاً من ذلك، يجب استخدام واجهة برمجة تطبيقات YouTube IFrame Player، وهي الطريقة الرسمية لتشغيل مقاطع فيديو YouTube على Android.

جارٍ تشغيل الفيديو متقطع

قد لا يتمكّن الجهاز من فك ترميز المحتوى بسرعة كافية إذا كانت، على سبيل المثال، تجاوز معدل نقل بيانات المحتوى أو درجة دقته إمكانات الجهاز. قد تحتاج إلى استخدام محتوى منخفض الجودة للحصول على أداء جيد على هذه الأجهزة.

إذا كنت تواجه تقطّعًا في الفيديوهات على جهاز يعمل بإصدار Android بدءًا من Android 6.0 (المستوى 23 لواجهة برمجة التطبيقات) ووصولاً إلى نظام Android 11 (المستوى 30 لواجهة برمجة التطبيقات)، خاصةً عند تشغيل محتوى محمي بموجب إدارة الحقوق الرقمية أو محتوى بعدد لقطات مرتفع في الثانية، يمكنك تجربة تفعيل ميزة "قائمة انتظار التخزين المؤقت غير المتزامنة".