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