Не спрашивайте меня, почему, но я пытаюсь сделать видео в ImageView.
Для этого я воспроизводю видео с MediaPlayer в TextureView, в котором есть метод getBitmap ().
Так что у меня есть таймер в главном потоке (или вы можете использовать метод слушателя onSurfaceTextureUpdated, если хотите), который периодически получает растровое изображение из TextureView и передает ImageView этим растровым изображением. И это работает, вот код для обновления ImageView:
videoBitmap=textureView.getBitmap();
BitmapDrawable d = new BitmapDrawable(getResources(), videoBitmap);
videoImageView.setImageDrawable(d);
Хорошо, хорошо, что это работает, я вижу 2 видео в иерархии представлений, одно в TextureView, а другое в ImageView. Они практически идентичны, это зависит от того, насколько быстро вы обновляете ImageView, я делаю это 20 раз в секунду.
Это работает, но я видел в коде, что у TextureView есть метод
общедоступное растровое изображение getBitmap (растровое растровое изображение)
Копирует содержимое этого
просмотреть текстуру поверхности в указанном растровом изображении. Если поверхность
текстура недоступна, копия не выполнена. Содержание
текстура поверхности будет масштабирована так, чтобы она точно вписывалась в указанную
растровое изображение.
Поэтому я подумал, что с помощью этого метода я смогу сохранить дорогостоящее растровое изображение при каждом обновлении, поэтому я попробовал что-то вроде этого:
if (videoBitmap==null) videoBitmap=textureView.getBitmap();
else {
textureView.getBitmap(videoBitmap);
}
BitmapDrawable d = new BitmapDrawable(getResources(), videoBitmap);
videoImageView.setImageDrawable(null);
videoImageView.setImageDrawable(d);
Но это не работает. Я получаю первый кадр видео в ImageView, но videoBitmap=textureView.getBitmap(videoBitmap);
, похоже, ничего не делает. И после проверки, кажется, что он обновляет растровое изображение. Я проверил это, изменив:
textureView.getBitmap(videoBitmap);
в
textureView.getBitmap(videoBitmap);
Bitmap tmpBitmap = videoBitmap.copy(videoBitmap.getConfig(), true);
videoBitmap=tmpBitmap;
Таким образом, похоже, что проблема возникает из-за обновления ImageView новым содержимым растрового изображения, БЕЗ изменения адреса растрового изображения.