如何拍摄surfaceview的快照?

时间:2014-12-15 14:22:34

标签: android surfaceview

使用SurfaceView在Android应用程序中使用H264视频渲染。它有一个功能,可以在表面视图上渲染视频时拍摄快照。每当我拍摄快照时,我只会获得透明/黑屏。我使用getDrawingCache()方法捕获仅返回空值的屏幕。我使用下面的代码捕获屏幕。

SurfaceView mSUrfaceView = new SurfaceView(this); //Member variable

if(mSUrfaceView!=null)
  mSUrfaceView.setDrawingCacheEnabled(true); // After video render on surfaceview i enable the drawing cache

Bitmap bm = mSUrfaceView.getDrawingCache(); // return null  

1 个答案:

答案 0 :(得分:5)

除非您使用Canvas将软件中的H.264视频帧渲染到视图上,否则绘图缓存方法无法工作(请参阅例如this answer)。

您无法从SurfaceView的Surface部分读取像素。基本问题是Surface是具有生产者 - 消费者界面的缓冲区队列,而您的应用程序位于生产者端。消费者,通常是系统合成器(SurfaceFlinger),能够捕获屏幕截图,因为它位于管道的另一端。

要在渲染视频时抓取快照,您可以将视频帧渲染为SurfaceTexture,这会在您的应用流程中为制作人和消费者提供。然后,您可以使用GLES渲染纹理以进行显示,也可以使用glReadPixels()抓取像素作为快照。

Grafika应用程序展示了各种各样的内容,但没有一项活动专门解决您的问题。例如,"连续捕获"将相机预览指向SurfaceTexture,然后将其渲染两次(一次用于显示,一次用于视频编码),这与您想要做的类似。 GLES实用程序类包含saveFrame()函数,该函数显示如何使用glReadPixels()创建位图。

另请参阅Android System-Level Graphics Architecture文档。