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