所以我试图做一个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 javadocs中记录。有帮助吗?
来自文档 查看#setDrawingCacheEnabled:
启用绘图缓存类似
在硬件上设置图层
加速度已关闭。什么时候
硬件加速已打开,
启用绘图缓存没有
因为系统对渲染的影响
使用不同的机制
忽略旗帜的加速度。
如果你想使用Bitmap
查看,即使硬件加速
已启用,请参阅setLayerType(int,
android.graphics.Paint)for
有关如何启用软件的信息
和硬件层。
VideoView可能通过硬件加速运行并绕过缓存机制。一个好的潜水源潜水可能会有所启发。
编辑 - 这个帖子 似乎清除了一些事情:
抱歉,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;
}