您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

Android无预览采集视频

时间:02-09来源:作者:点击数:

声明摄像头权限

代码

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val camera = Camera.open()
        camera.setPreviewTexture(SurfaceTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES))
        camera.setPreviewCallback { data, camera ->
            println("摄像头正在采集图像")
        }
        camera.startPreview()
    }
}

运行App的时候如果是Android6.0以上系统,则手动到设置里给权限,懒得搞动态申请了。

此时运行App,会发现只打印了一次“摄像头正在采集图像”,需要把Camera设置为成员变量,免得被垃圾回收器回收,如下:

class MainActivity : AppCompatActivity() {

    private val camera = Camera.open()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        camera.setPreviewTexture(SurfaceTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES))
        camera.setPreviewCallback { data, camera ->
            println("摄像头正在采集图像")
        }
        camera.startPreview()
    }

}

此时运行App,会发现打印了4次“摄像头正在采集图像”,不知所以的话会让人头疼,其实SurfaceTexture对象也是没有强引用的,所以也会被垃圾回收器回收,所以需要我们设置为成员变量,以免被回收,代码如下:

class MainActivity : AppCompatActivity() {

    private val camera = Camera.open()
    private val surfaceTexture = SurfaceTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        camera.setPreviewTexture(surfaceTexture)
        camera.setPreviewCallback { data, camera ->
            println("摄像头正在采集图像")
        }
        camera.startPreview()
    }

}

OK,这次就正常了,就是这么简单的代码,我们实现了摄像头的无预览采集,预览回调中的data即采集到的图像数据。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门