VideoView getDrawingCache is returning black

后端 未结 2 1205
花落未央
花落未央 2020-11-27 06:39

So I\'m trying to do a screen shot of a VideoView. I figured the easiest way would be:

videoView.setDrawingCacheEnabled(true);

Then when I

相关标签:
2条回答
  • 2020-11-27 07:16

    From the docs for View#setDrawingCacheEnabled:

    Enabling the drawing cache is similar to setting a layer when hardware acceleration is turned off. When hardware acceleration is turned on, enabling the drawing cache has no effect on rendering because the system uses a different mechanism for acceleration which ignores the flag. If you want to use a Bitmap for the view, even when hardware acceleration is enabled, see setLayerType(int, android.graphics.Paint) for information on how to enable software and hardware layers.

    It's possible that the VideoView operates with hardware acceleration and is bypassing the caching mechanism. A good source dive might shed some light.

    Edit - this post seems to clear some things up:

    Sorry, by its nature a SurfaceView does not draw in the normal view hierarchy update system, so it won't be drawn in that.

    (VideoView is a child of SurfaceView)

    0 讨论(0)
  • 2020-11-27 07:32

    Since API 10, you can use MediaMetadataRetriever to retrieve a frame at given time (in micro seconds). Here is a sample code:

    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;
    }
    
    0 讨论(0)
提交回复
热议问题