ExoPlayer توسط تعداد زیادی از برنامه های اندروید استفاده می شود. به عنوان یک OEM، مهم است که مطمئن شوید که ExoPlayer هم در دستگاه های جدید و هم در پلتفرم های جدید برای دستگاه های موجود به درستی کار می کند. این صفحه آزمایشهای سازگاری را شرح میدهد که توصیه میکنیم قبل از ارسال یک دستگاه یا پلتفرم OTA اجرا شوند، و برخی از حالتهای خرابی رایج که هنگام اجرای آنها با آن مواجه میشویم.
اجرای تست ها
برای اجرای تست های پخش ExoPlayer، ابتدا آخرین نسخه ExoPlayer را از GitHub بررسی کنید. سپس می توانید تست ها را از خط فرمان یا Android Studio اجرا کنید.
خط فرمان
از دایرکتوری ریشه، تست های پخش را بسازید و نصب کنید:
./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 ظاهر می شود.
اندروید استودیو
پروژه 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
) گیر کند. پشته های فراخوانی thread ها را در فرآیند آزمایش بررسی کنید تا مطمئن شوید که آیا این مورد است.