SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS 是啥意思?

Posted

技术标签:

【中文标题】SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS 是啥意思?【英文标题】:What does SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS means?SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS 是什么意思? 【发布时间】:2010-08-19 19:05:39 【问题描述】:

我正在尝试使用 onPreviewFrame() 回调显示过滤后的相机预览。

问题是当我删除这一行时: mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

要隐藏预览,应用会崩溃。日志内容如下: 08-19 15:57:51.042: 错误/CameraService(59): registerBuffers 失败,状态为 -38

这是什么意思?这在任何地方都有记录吗?

我正在使用 SDK APIDemos 中的 CameraPreview:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html

【问题讨论】:

【参考方案1】:

SURFACE_TYPE_PUSH_BUFFERS 为 SurfaceView 生成多个缓冲区。组件在操作系统代码深处锁定(填充数据)和推送(显示数据)这些缓冲区。特别是OpenMax(相机硬件设备接口)是使用“graphic buffers”="push buffers"来填充数据和显示数据。具体来说,相机硬件可以直接填充推送缓冲区,而图形硬件可以直接显示推送缓冲区(它们共享这些缓冲区)。结论:操作系统强制你创建一个带有推送缓冲区的 SurfaceView。然后它可以使用相机设备的缓冲区。

【讨论】:

【参考方案2】:

在Google's Camera guide 你可以找到一个简短的提及。根据指南,SURFACE_TYPE_PUSH_BUFFERS 是 3.0 之前的设备所必需的已弃用设置。

查看“创建预览类”部分的代码示例,在构造函数的底部显示:

// deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

如果您还没有仔细阅读the camera guide,这是一个好主意,它包含一些不在相机类的 API 文档中的重要内容。

【讨论】:

【参考方案3】:

这是什么意思?

说明你没有通过SurfaceHolder正确配置SurfaceView

这是否记录在任何地方?

什么是“这个”?这是SurfaceViewSurfaceHolderSURFACE_TYPE_PUSH_BUFFERSCamera 的文档。

如果您真正的问题是“Camera 需要 SURFACE_TYPE_PUSH_BUFFERS 的记录在哪里”,我怀疑这是未记录的。您使用SURFACE_TYPE_PUSH_BUFFERS 进行相机预览和视频播放,也许还有其他情况。

【讨论】:

感谢关注我尝试使用其他表面类型来隐藏视图,因为我不想显示原始相机预览,而是我自己处理的流,就像这个应用程序 androidtapp.com/camera-illusion 一样。所以,我不知道我是否必须使用 SURFACE_TYPE_PUSH_BUFFERS,正如这个线程中提到的:groups.google.com/group/android-developers/msg/5eee66acae3f7c1f 如果您知道其他可能对此有用的资源(开源应用程序、书籍等),请分享。

以上是关于SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章