VideoView getDrawingCache返回黑色

时间:2011-03-11 21:44:07

标签: android bitmap screenshot android-videoview

所以我正在尝试对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中。有什么帮助吗?

2 个答案:

答案 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;
}