Camera2 使用 Surface 输出一帧的图像信息, 我们可以使用 SurfaceView, TextureView, 获取到 Surface, 来作为 Camera2 的预览输出。 可以使用从 MediaRecorder 或者 MediaCodec, 获取到的 Surface 作为录制视频的输出。另外,我们可以获取相机支持的尺寸大小, 但是我们却没有明确告诉 Camera 输出尺寸。
那如何确定 Camera 的输出大小呢?
对于 SurfaceView, TextureView, 根据显示的大小
对于 MediaRecorder, MediaCodec, 根据编码的大小
实际上, 相机作为生产者, 同过 BufferQueue 连接消费者, 而 BufferQueue 里的缓存区一个的大小是由消费者决定的。
在项目中,我要实现,从 Camera 输出数据到 OpenGL, 使用了 SurfaceTexture, 将 Surface 转成了 OpenGL 里的 Texture, 那如何确定大小呢, 是通过给 SurfaceTexture 设置默认缓冲区大小, 这样如果该大小在 Camera 支持范围内, Camera就会输出相应的大小。
TextureView 内部也有个 SurfaceTexture, TextureView 的大小变化后,SurfaceTexture默认缓冲区的大小也会相应的改变。
我们可以给 TextureView 内部的 SurfaceTexture 设置支持的相机输出大小, 这样可能相机的输出大小和 TextureView 的显示大小不同, 相机输出到 TextureView 作为它的内容, 我们可以设置它的 setTransform(), 设置背后的内容显示到 View 上的样子。
更进一步,我们可能动态的改变 TextureView 的大小, 比如可以选择拍摄的比例, 这时候,需要监听 TextureView 大小的改变,重新设置 SurfaceTexture 的默认缓冲区大小,避免随着 TextureView 的大小变化。
昨天终于把相机预览的问题彻底搞明白了,牵扯的东西的确是多,之所以现在解决了是因为,对 Surface 那些东西有了深一点的了解。