【问题标题】:How to take snapshot of surfaceview?如何拍摄surfaceview的快照?
【发布时间】:2015-02-13 16:10:44
【问题描述】:

我正在使用 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  

【问题讨论】:

  • 尝试使用清单标志 android:hardwareAccelerated 看看是否有帮助。

标签: android surfaceview


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 在纹理视图中渲染视频时,我们有名为“暂停”和“PinchZoom”的选项。当视频暂停并缩放视频时,视图会延伸到极限,但图像不会延伸。我是在 Nexus、Samsung s4 和 MicroMax 中测试了相同的功能。除了这些型号 SamSung S2 和 S3 都是在 jellybean 4.1.2 版本中运行的设备之外,它工作正常。
  • 在 Textureview 中渲染视频时,我们有一个选项称为“快照”。每当我拍摄快照时,glReadPixels() 在棒棒糖 5.0 版本中返回 0。
  • TextureView 有developer.android.com/reference/android/view/…,它为您提供位图中内容的副本。使用它,而不是glReadPixels()
猜你喜欢
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 2018-12-03
相关资源
最近更新 更多