OEM 테스트

ExoPlayer는 수많은 Android 앱에서 사용됩니다. OEM은 ExoPlayer가 새 기기 및 기존 기기의 새 플랫폼 빌드 모두에서 올바르게 작동하도록 하는 것이 중요합니다. 이 페이지에서는 기기 또는 플랫폼 OTA를 출하하기 전에 권장되는 호환성 테스트와 이를 실행할 때 발생하는 몇 가지 일반적인 장애 모드를 설명합니다.

테스트 실행

ExoPlayer의 재생 테스트를 실행하려면 먼저 GitHub에서 최신 ExoPlayer 버전을 확인하세요. 그런 다음 명령줄이나 Android 스튜디오에서 테스트를 실행할 수 있습니다.

명령줄

루트 디렉터리에서 재생 테스트를 빌드하고 설치합니다.

./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 스튜디오

ExoPlayer 프로젝트를 열고 playbacktests 모듈로 이동한 다음 gts 폴더를 마우스 오른쪽 버튼으로 클릭하고 테스트를 실행합니다. 테스트 결과가 Android 스튜디오의 Run 창에 표시됩니다.

일반적인 장애 모드

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는 25개의 버퍼를 제한하는 테스트에서 버퍼가 큐에서 삭제될 때까지 늦었기 때문에 200개의 버퍼를 삭제했습니다. 가장 확실한 원인은 동영상 디코더의 디코딩 버퍼가 너무 느리기 때문입니다. 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)를 호출하는 동안 중단된 것일 수 있습니다. 테스트 프로세스에서 스레드의 호출 스택을 검사하여 이러한 경우에 해당하는지 확인합니다.