VideoView getDrawingCache正在返回黑色
所以我试图做一个VideoView的屏幕截图。 我想最简单的方法是:
videoView.setDrawingCacheEnabled(true);
那么当我需要截图的时候
Bitmap screenshot = videoView.getDrawingCache();
但是由于某种原因,我每次得到的位图都是黑色的。 任何人都有这个成功吗? 我也试过:
Bitmap bitmap = Bitmap.createBitmap(videoView.getWidth(), videoView.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); videoView.draw(canvas);
但是,再一次,这给我一个黑色的形象。 我可以看到VideoView在Android javadoc中几乎没有logging。 任何帮助?
从View#setDrawingCacheEnabled的文档:
启用绘图caching与在硬件加速closures时设置图层类似。 启用硬件加速时,启用绘图caching对渲染没有影响,因为系统使用不同的加速机制来忽略该标记。 如果要为视图使用位图,即使已启用硬件加速,请参阅setLayerType(int,android.graphics.Paint)以获取有关如何启用软件和硬件层的信息。
VideoView有可能在硬件加速的情况下运行,并绕过caching机制。 一个好的潜水点可能会有一些亮点。
编辑 – 这篇文章似乎清除了一些事情:
对不起,由于它的性质,SurfaceView不会在正常的视图层次更新系统中绘制,所以它不会被绘制。
(VideoView是SurfaceView的孩子)
从API 10开始,您可以使用MediaMetadataRetriever在给定时间(以微秒为单位 )检索帧。 这是一个示例代码:
public Bitmap videoFrame(String uri, long msec) { MediaMetadataRetriever retriever = new MediaMetadataRetriever(); try { retriever.setDataSource(uri); return retriever.getFrameAtTime(msec); } catch (IllegalArgumentException ex) { ex.printStackTrace(); } catch (RuntimeException ex) { ex.printStackTrace(); } finally { try { retriever.release(); } catch (RuntimeException ex) { } } return null; }