不要问我为什么,但是我正在尝试将视频渲染到ImageView中。
为此,我将MediaPlayer的视频播放到具有getBitmap()方法的TextureView中。
因此,我在主线程上有一个计时器(或者,您可以根据需要使用onSurfaceTextureUpdated侦听器方法),该计时器会定期从TextureView获取位图,并将该位图提供给ImageView。而且有效,这是更新ImageView的代码:
videoBitmap=textureView.getBitmap();
BitmapDrawable d = new BitmapDrawable(getResources(), videoBitmap);
videoImageView.setImageDrawable(d);
好的,它工作正常,我可以在视图层次结构中看到2个视频,其中一个在TextureView上,一个在ImageView上。它们几乎相同,这取决于您更新ImageView的速度,我每秒执行20次。
它正在工作,但是我在代码中看到TextureView有一个方法
public Bitmap getBitmap (Bitmap bitmap)
复制此内容 视图的表面纹理转换为指定的位图。如果表面 纹理不可用,无法执行复制。的内容 将缩放表面纹理以使其恰好位于指定的内部 位图。
因此,我认为通过这种方法,我可以在每次更新时节省昂贵的位图创建,因此我尝试了如下操作:
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,而没有更改位图地址。