Он прекрасно работает на большинстве моих тестовых устройств (например, устройств iOS, устройств Samsung и т. д.). Однако на одном конкретном устройстве (телефоне Redmi) видео вообще отказывается воспроизводиться или воспроизводится с серьезными глюками. Они часто показывают постоянный индикатор загрузки или просто черный экран, а аппаратный декодер, похоже, дает сбой.
Установка:
- Flutter SDK: последняя стабильная версия
- Пакет: video_player: ^2.11.1 (с использованием стандартного VideoPlayerController.networkUrl)
- Android compileSdk: 36 (пришлось обновить с 35 из-за других требований плагина)
- Реализация: сохранение экземпляров VideoPlayerController в списке и создание
виджетов VideoPlayer в ListView/.Код: Выделить всё
Column
Раньше, до обновлений SDK и compileSdk, эти же самые видео прекрасно воспроизводились на этом же устройстве.
Теперь при инициализации VideoPlayerController видео часто не запускается рендеринг, и журналы заполняются декодером. и ошибки цикла BufferQueueProducer.
Вот соответствующие трассировки Logcat с неисправного устройства:
Код: Выделить всё
W/AudioCapabilities(26151): Unsupported mime audio/x-adpcm-ms
W/AudioCapabilities(26151): Unsupported mime audio/x-adp
/OMXClient(26151): IOmx service obtained
D/SurfaceUtils(26151): connecting to surface 0x785f6d4010, reason connectToSurface
D/Surface (26151): Surface::connect(this=0x785f6d4000,api=3)
I/BufferQueueProducer(26151): \[ImageReader-1x1f22m7-26151-3\](this:0x7801d2b800,id:3,api:3,p:26151,c:26151) connect(P): api=3 producer=(26151:com.my.app) producerControlledByApp=true
I/MediaCodec(26151): \[OMX.MTK.VIDEO.DECODER.AVC\] setting surface generation to 26778628
D/SurfaceUtils(26151): disconnecting from surface 0x785f6d4010, reason connectToSurface(reconnect)
D/Surface (26151): Surface::disconnect(this=0x785f6d4000,api=3)
I/BufferQueueProducer(26151): \[ImageReader-1x1f22m7-26151-3\](this:0x7801d2b800,id:3,api:3,p:26151,c:26151) disconnect(P): api 3
D/SurfaceUtils(26151): connecting to surface 0x785f6d4010, reason connectToSurface(reconnect)
D/Surface (26151): Surface::connect(this=0x785f6d4000,api=3)
Что я подозреваю:
Поскольку плагин video_player_android использует androidx.media3 (ExoPlayer) под капотом, я подозреваю, что обновление compileSdk до версии 36 заставило Gradle включиться более новая версия библиотек Media3 ExoPlayer. Эта более новая версия, в сочетании с логикой создания поверхности встраивания Android Flutter, похоже, имеет периодические сбои выделения буфера аппаратного кодировщика на этом конкретном устройстве.
Я пытался понизить версию compileSdk обратно до 35, но меня заблокировали, потому что несколько других плагинов Firestore/core Flutter теперь явно требуют compileSdk 36.
Вопросы:
- Есть ли способ заставить flutter video_player использовать конкретную, более старую версию androidx.media3, которая может не иметь этого цикла поверхностного перераспределения?
- Кто-нибудь сталкивался с этим сбоем/проблемой аппаратного декодера ExoPlayer на определенных устройствах Android? Есть ли флаг конфигурации или возможностей на стороне клиента, который я могу передать в VideoPlayerController, чтобы обойти это?
- Может ли это быть связано с тем, как Flutter 3.27 обрабатывает рендеринг текстур на Android?
Подробнее: https://stackoverflow.com/questions/799 ... ce-after-s
Мобильная версия