Как очистить SurfaceTexture после использования с MediaPlayer?

Я использую ListView с детьми TextureView. TextureView использует MediaPlayer для воспроизведения видео. Когда TextureView перерабатывается, последний кадр остается на поверхности, пока следующий MediaPlayer не использует его.

Каков самый простой способ "очистить" поверхность TextureView (например, черный), чтобы старые кадры не отображались?

Ответ 1

После того, как я боролся с этим некоторое время, я придумал пару возможных решений:

a) очистить поверхность, используя GLES. Вы можете увидеть пример в Grafika (проверьте метод clearSurface()). Я лично не поклонник этого, потому что я не думаю, что резкий переход к черному выглядит особенно хорошо, и это справедливый бит технических накладных расходов, если вы еще не используете GL-код. Кроме того, это, похоже, работает только для API 17 +.

b) Мое выбранное решение состояло в том, чтобы просто создать новый TextureView и добавить его в соответствующее представление каждый раз, когда я захочу воспроизвести видео, вместо повторного использования старого. Я бы не стал называть это хорошим решением, но это наименее ужасное, что я мог найти.

c) Одна вещь, которую вы могли бы сделать, если снова воспроизводить одно и то же видео, - это попытаться найти первый кадр видео, когда он будет воспроизводиться. Затем в следующий раз, когда последний кадр будет мигать, он не будет виден, так как он будет тем же самым кадром, что и начало видео. У меня был некоторый успех в этом, но я не мог заставить его работать надежно на всех устройствах. Это также довольно четко взломать.

Удачи, это было очень неприятно, чтобы попытаться исправить.