如何拍摄surfaceview的快照?

mar*_*thu 2 android surfaceview

我正在Android应用程序中使用H264视频渲染SurfaceView.它有一个功能,可以在表面视图上渲染视频时拍摄快照.每当我拍摄快照时,我只会获得透明/黑屏.我使用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  
Run Code Online (Sandbox Code Playgroud)

fad*_*den 5

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

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

要在渲染视频时抓取快照,您可以将视频帧渲染到SurfaceTexture,SurfaceTexture在您的应用程序流程中提供生产者和消费者.然后,您可以使用GLES渲染纹理以进行显示,也可以选择抓取glReadPixels()快照的像素.

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

另请参阅Android 系统级图形架构文档.