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