تست OEM

ExoPlayer توسط تعداد زیادی از برنامه‌های اندروید استفاده می‌شود. به عنوان یک تولیدکننده اصلی تجهیزات (OEM)، اطمینان از عملکرد صحیح ExoPlayer هم در دستگاه‌های جدید و هم در پلتفرم‌های جدید ساخته شده برای دستگاه‌های موجود، بسیار مهم است. این صفحه تست‌های سازگاری را که توصیه می‌کنیم قبل از ارسال یک دستگاه یا پلتفرم OTA انجام دهید، و برخی از حالت‌های خرابی رایج هنگام اجرای آنها را شرح می‌دهد.

اجرای تست‌ها

برای اجرای تست‌های پخش ExoPlayer، ابتدا آخرین نسخه ExoPlayer را از GitHub بررسی کنید. سپس می‌توانید تست‌ها را از خط فرمان یا اندروید استودیو اجرا کنید.

خط فرمان

از دایرکتوری ریشه، تست‌های پخش را بسازید و نصب کنید:

./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 کلیک راست کنید و تست‌ها را اجرا کنید. نتایج تست در پنجره Run اندروید استودیو ظاهر می‌شوند.

حالت‌های خرابی رایج

برخی از حالت‌های خرابی رایج هنگام اجرای تست‌های پخش 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 به دلیل تأخیر در زمان خارج شدن از صف، ۲۰۰ بافر را از دست داد، برای آزمایشی که محدودیت ۲۵ را اعمال می‌کند. واضح‌ترین علت این است که رمزگشای ویدیو در رمزگشایی بافرها بسیار کند است. اگر این خرابی‌ها فقط برای زیرمجموعه‌ای از آزمایش‌هایی که محتوای محافظت‌شده 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 ) گیر کرده باشد. برای بررسی این موضوع، پشته‌های فراخوانی نخ‌ها را در فرآیند تست بررسی کنید.

،

ExoPlayer توسط تعداد زیادی از برنامه‌های اندروید استفاده می‌شود. به عنوان یک تولیدکننده اصلی تجهیزات (OEM)، اطمینان از عملکرد صحیح ExoPlayer هم در دستگاه‌های جدید و هم در پلتفرم‌های جدید ساخته شده برای دستگاه‌های موجود، بسیار مهم است. این صفحه تست‌های سازگاری را که توصیه می‌کنیم قبل از ارسال یک دستگاه یا پلتفرم OTA انجام دهید، و برخی از حالت‌های خرابی رایج هنگام اجرای آنها را شرح می‌دهد.

اجرای تست‌ها

برای اجرای تست‌های پخش ExoPlayer، ابتدا آخرین نسخه ExoPlayer را از GitHub بررسی کنید. سپس می‌توانید تست‌ها را از خط فرمان یا اندروید استودیو اجرا کنید.

خط فرمان

از دایرکتوری ریشه، تست‌های پخش را بسازید و نصب کنید:

./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 کلیک راست کنید و تست‌ها را اجرا کنید. نتایج تست در پنجره Run اندروید استودیو ظاهر می‌شوند.

حالت‌های خرابی رایج

برخی از حالت‌های خرابی رایج هنگام اجرای تست‌های پخش 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 به دلیل تأخیر در زمان خارج شدن از صف، ۲۰۰ بافر را از دست داد، برای آزمایشی که محدودیت ۲۵ را اعمال می‌کند. واضح‌ترین علت این است که رمزگشای ویدیو در رمزگشایی بافرها بسیار کند است. اگر این خرابی‌ها فقط برای زیرمجموعه‌ای از آزمایش‌هایی که محتوای محافظت‌شده 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 ) گیر کرده باشد. برای بررسی این موضوع، پشته‌های فراخوانی نخ‌ها را در فرآیند تست بررسی کنید.