يُستخدَم ExoPlayer من قِبل عدد كبير من تطبيقات Android. بصفتك مصنّعًا أصليًا، لضمان عمل ExoPlayer بشكل صحيح على الأجهزة الجديدة إصدارات أنظمة أساسية جديدة للأجهزة الحالية. توضّح هذه الصفحة التوافق اختبارات ننصحك بإجرائها قبل شحن جهاز أو منصة عبر الهواء واجهت بعض أوضاع الإخفاق الشائعة عند تشغيلها.
إجراء الاختبارات
لإجراء اختبارات تشغيل ExoPlayer، يُرجى أولاً الاطّلاع على أحدث إصدار من ExoPlayer من GitHub. يمكنك بعد ذلك إجراء الاختبارات من سطر الأوامر أو "استوديو Android".
سطر الأوامر
من الدليل الجذر، أنشئ اختبارات التشغيل وثبِّتها:
./gradlew :test-exoplayer-playback:installDebug
بعد ذلك، نفِّذ اختبارات التشغيل في حزمة GTS:
adb shell am instrument -w -r -e debug false \ -e package androidx.media3.test.exoplayer.playback.gts \ androidx.media3.test.exoplayer.playback.test/androidx.test.runner.AndroidJUnitRunner
تظهر نتائج الاختبار في STDOUT.
استوديو Android
افتح مشروع ExoPlayer، وانتقِل إلى وحدة playbacktests
، وانقر بزر الماوس الأيمن
على مجلد gts
وشغِّل الاختبارات. تظهر نتائج الاختبار في قسم Android Studio
تشغيل النافذة.
أوضاع الفشل الشائعة
مصادفة بعض أوضاع الإخفاق الشائعة عند تشغيل ExoPlayer تم وصف الاختبار أدناه، بالإضافة إلى السبب الجذري المحتمل في كل حالة. سنُضيف إلى هذه القائمة المزيد من حالات الأعطال عند اكتشافها.
طابع زمني غير متوقّع لعرض الفيديو في المخزن المؤقت
سيحتوي Logcat على خطأ مشابه لما يلي:
Caused by: java.lang.IllegalStateException: Expected to dequeue video buffer
with presentation timestamp: 134766000. Instead got: 134733000 (Processed
buffers since last flush: 2242).
يحدث هذا الخطأ في أغلب الأحيان بسبب عدم قدرة برنامج ترميز الفيديو الذي يخضع للاختبار على
التخلص من ذاكرة التخزين المؤقت أو إدراجها أو إعادة ترتيبها بشكل صحيح. في المثال أعلاه، قد يكون الاختبار
من المتوقع أن يتم إزالة المخزن المؤقت في قائمة الانتظار بالطابع الزمني للعرض التقديمي 134766000
من
MediaCodec.dequeueOutputBuffer
، ولكن تم اكتشاف أنه تم إزالة المخزن المؤقت من قائمة الانتظار باستخدام
الطابع الزمني للعرض التقديمي 134733000
بدلاً من ذلك. ننصحك بالتحقّق من عملية تنفيذ رمز الترميز عند حدوث هذا الخطأ، لا سيما أنّه يعالج بشكلٍ صحيح عمليات التبديل بين الدقة التكيُّفية بدون تجاهل أيّ ذاكرة تخزين مؤقت.
تم انخفاض عدد كبير جدًا من الموارد الاحتياطية.
سيحتوي Logcat على خطأ مشابه لما يلي:
junit.framework.AssertionFailedError: Codec(DashTest:Video) was late decoding:
200 buffers. Limit: 25.
هذا العُطل هو مشكلة في الأداء، حيث كان مُشفِّر الفيديو الذي يخضع للاختبار متأخّرًا في فك ترميز عدد كبير من وحدات التخزين المؤقت. في المثال أعلاه، إسقاط ExoPlayer 200 مورد احتياطي لأنه تأخرت عند إزالتها من قائمة الانتظار، لإجراء اختبار وتفرض حدًا أقصى للعدد هو 25. والسبب الأكثر وضوحًا هو أن برنامج فك ترميز الفيديو الموارد الاحتياطية لفك الترميز بطيئة جدًا. إذا حدثت حالات الإخفاق فقط لمجموعة فرعية من الاختبارات التي تشغل محتوى Widevine المحمي، فمن المحتمل أن تستخدم عمليات النظام الأساسي لفك تشفير المخزن المؤقت بطيئة للغاية. وننصحك بالتحقق من أداء هذه العناصر، والنظر في ما إذا كان يمكن إجراء أي تحسينات لزيادة السرعة معهم.
تعذّرت مصادقة النافذة الأصلية
سيحتوي Logcat على خطأ مشابه لما يلي:
SurfaceUtils: native window could not be authenticated
ExoPlayerImplInternal: Internal runtime error.
ExoPlayerImplInternal: android.media.MediaCodec$CodecException: Error 0xffffffff
يشير هذا الخطأ إلى تعذُّر ضبط الأمان بشكل صحيح في النظام الأساسي علامة البت.
انتهت مهلة الاختبار
سيحتوي Logcat على خطأ مشابه لما يلي:
AssertionFailedError: Test timed out after 300000 ms.
غالبًا ما يحدث هذا الخطأ بسبب ضعف الاتصال بالشبكة أثناء تنفيذ الاختبار. إذا كان الاتصال بالشبكة جيدًا في الجهاز، يمكن أن
أن الاختبار يتعثر في الاتصال بأحد مكونات النظام الأساسي (مثل
MediaCodec
أو MediaDrm
أو AudioTrack
). فحص حزم الاتصال في
في عملية الاختبار للتأكد مما إذا كان الأمر كذلك.