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
。
这是否记录在任何地方?
什么是“这个”?这是SurfaceView
、SurfaceHolder
、SURFACE_TYPE_PUSH_BUFFERS
和Camera
的文档。
如果您真正的问题是“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 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章