所以我正在尝试对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中。有什么帮助吗?
答案 0 :(得分:13)
来自View#setDrawingCacheEnabled的文档:
启用绘图缓存类似 在硬件上设置图层 加速关闭。什么时候 硬件加速已打开, 启用绘图缓存没有 因为系统对渲染的影响 使用不同的机制 忽略旗帜的加速度。 如果你想使用Bitmap 查看,即使硬件加速 已启用,请参阅setLayerType(int, android.graphics.Paint)for 有关如何启用软件的信息 和硬件层。
VideoView可能会通过硬件加速运行并绕过缓存机制。一个好的消息来源可能会有所启发。
修改 - this post似乎清除了一些事情:
抱歉,SurfaceView本身就是这样 不在普通视图层次结构中绘制 更新系统,因此不会被绘制 这一点。
(VideoView是SurfaceView的孩子)
答案 1 :(得分:0)
自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;
}