การทดสอบ 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 และทำการทดสอบ ผลการทดสอบจะปรากฏในพร็อพเพอร์ตี้ หน้าต่างเรียกใช้

โหมดความล้มเหลวที่พบบ่อย

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