Воспроизведение видео в TextureView, затем в ImageView - PullRequest
0 голосов
/ 18 ноября 2018

Не спрашивайте меня, почему, но я пытаюсь сделать видео в 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 новым содержимым растрового изображения, БЕЗ изменения адреса растрового изображения.

...