การทดสอบ OEM

แอป Android จำนวนมากใช้ 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

Android Studio

เปิดโปรเจ็กต์ 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) ตรวจสอบสแต็กการเรียกของ เธรดในกระบวนการทดสอบเพื่อพิจารณาว่าเกิดกรณีนี้หรือไม่