使用TextureView渲染Camera画面「第二章,Android音视频编码那点破事」

本文详细介绍了如何在Android中使用TextureView结合OpenGL ES进行Camera预览画面的渲染,包括TextureView的接口定义、数据处理流程、EGL环境初始化、帧数据的缓冲与绘制、屏幕纹理的管理以及画面裁剪等关键步骤。通过这些步骤,最终实现在屏幕上显示Camera预览画面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第二章,使用TextureView渲染Camera画面


  上一章我们讲到了使用SurfaceTexture作为Camera数据的缓冲区,这仅仅是把帧数据缓冲到了纹理上,并没有把它绘制出来,所以这一章我们来实现这个功能。

  按照惯例,还是先来个脑图,以便很好的了解这部分的结构。


Render

Render

  首先来看看Render接口,其中定义了一系列方法:

  • onFrameAvailable(): 在SurfaceTexture.OnFrameAvailableListener的同名回调方法中调用,通知Render摄像头的SurfaceTexture有新的数据生成,可以准备进行处理了,这里是绘制到屏幕。
  • draw():把帧数据绘制到屏幕上。
  • start(texture: SurfaceTexture, width: Int, height: Int):接收一个SurfaceTexture,把它绑定到OpenGL环境上即可进行屏幕绘制。
  • stop():停止渲染。
  • release():并且释放资源。
  • setFilter(filter: BaseFrameBufferTexture):设置一个渲染滤镜(待实现)
  • getFrameBuffer(): Int:获取屏幕纹理的frameBuffer,设置了滤镜后会返回滤镜的frameBuffer
  • getFrameBufferTexture(): Int:获取屏幕纹理的id,设置了滤镜后会返回滤镜的纹理id。
interface Render {
    fun onFrameAvailable(): Render
    fun draw()
    fun start(texture: SurfaceTexture, width: Int, height: Int)
    fun start(texture: SurfaceTexture, width: Int, height: Int, runnable: Runnable?)
    fun stop()
    fun release()
    /**
     * After render completed
     */
    fun afterRender(runnable: Runnable)

    fun setFilter(filter: BaseFrameBufferTexture)
    fun getFrameBuffer(): Int
    fun getFrameBufferTexture(): Int
}

  由于Render需要知道Camera的纹理中是否有数据,所以需要接收Camera SurfaceTexture的回调。在这个项目中,Render是被CameraPreviewPresenter管理的,所以我们对上一章讲到的CameraPreviewPresenter进行扩展。

  我们可以看到,这里实现了SurfaceTexture.OnFrameAvailableListener接口,并且在CameraWrapper.open的时候传给了CameraWrapper``,在这个类内部又会把接口设置给SurfaceTexture,当这个缓冲区中有数据时,就会回调这个接口中的方法来通知我们进行处理。

  于此同时,我么也初始化了一个DefaultRenderImpl对象,这个对象接收上面我们讲到的回调通知,用来把SurfaceTexture缓冲区中的数据绘制到屏幕。

  数据入口我们有了,合适开始预览呢。当TextureView初始化完成时,我们调用startPreview(screenTexture: SurfaceTexture, width: Int, height: Int)方法,来通知CameraWrapper把帧数据绘制(缓冲)到CameraSurfaceTexture中。并且Render接收TextureViewSurfaceTexture缓冲区,包括宽高,在内部初始化完成后开始渲染。

  • Tip:这里会有两个SurfaceTexture,一个时我们自己初始化给Camera
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值