Eve*_*aak 1 android android-canvas textureview android-bitmap
我有一个显示位图(占位符图像)的TextureView,当用户加载视频时,textureView应该显示视频.
我设法在纹理视图中播放视频并在纹理视图中显示位图,但是当按顺序完成时,我只得到一个黑屏.
在我的onSurfaceTextureAvailable方法中,我在表面视图上绘制一个位图,如下所示:
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.ic_add_clip);
Canvas canvas = lockCanvas();
canvas.drawBitmap(bm, (width/2)-(bm.getWidth()/2), (height/2)-(bm.getHeight()/2), null);
unlockCanvasAndPost(canvas);
}
Run Code Online (Sandbox Code Playgroud)
当用户从其库中选择视频时,我将Uri加载到媒体播放器中并将曲面设置为媒体播放器.但是仍然显示位图.我试图通过清除画布删除位图,它确实删除了位图,但纹理视图只是黑色,也不会显示视频.
public void setMediaPlayer(MediaPlayer mediaPlayer) {
// Canvas canvas = lockCanvas();
// canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
// unlockCanvasAndPost(canvas);
Surface s = new Surface(getSurfaceTexture());
mMediaPlayer = mediaPlayer;
mMediaPlayer.setSurface(s);
mMediaPlayer.setOnPreparedListener(this);
}
Run Code Online (Sandbox Code Playgroud)
有些东西告诉我,用于显示视频的表面视图位于我在TextureAvailble上绘制的位图的后面.当我尝试清除画布时,我也清除了媒体播放器想要使用的表面.有解决方案吗
你的方法不起作用.
Surface是具有生产者 - 消费者关系的缓冲区队列.一次只能有一个生产者,你有两个生产者(Canvas和MediaPlayer).当你调用mMediaPlayer.setSurface()它时附加MediaPlayer; 当你调用lockCanvas()它时附加Canvas.您需要先拆除一个,然后才能连接另一个.
(检查你的logcat输出 - 那里可能有一些"已经连接"的投诉.)
问题是,虽然您应该能够分离MediaPlayer,但您无法分离Canvas.没有电话可以做到这一点.这是API中的一个不幸的工件.(通过4.4"KitKat"确认,我怀疑它已经改变了.)
你有几个选择:
clearSurface()清除屏幕的方法.使用GLES,您可以附着和从表面分离.我应该补充一点,我还没有尝试从Surface中分离MediaPlayer.较低级别的MediaCodec以这种方式工作,如Grafika播放器所示,所以我假设MediaPlayer也会干净利落地分离.但是,对于你的用例,#3可能是最简单的解决方案,并且不需要附加/分离体操.
| 归档时间: |
|
| 查看次数: |
5677 次 |
| 最近记录: |