ExoPlayer используется большим количеством приложений для Android. Для производителя оборудования важно обеспечить корректную работу 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 ). Проверьте стеки вызовов потоков в процессе тестирования, чтобы установить, так ли это.
ExoPlayer используется большим количеством приложений для Android. Для производителя оборудования важно обеспечить корректную работу 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 ). Проверьте стеки вызовов потоков в процессе тестирования, чтобы установить, так ли это.