Androoid 视频、图像采集时相机预览时的效率改善问题

曾经试图在GPUImage这个工程基础之上来开发一个项目,由于这个开源工程很知名,start非常多,就毫不犹豫地将这个工程拿来用了。谁知功能完成进入测试阶段之后,才暴露出各种问题和坑点。

        第一个坑点是当一个渲染管道叠加了两个以上的滤镜的时候,稍微低端一点的手机已经在相机预览的时候已经卡得不行了。

第二个坑点是,录制的过程中会概率性的包EGL_BAG_SURFACE错误,然后预览界面就定住了。由于这个问题是OpenGL ES 报错,修复起来还是比较麻烦的。

       下面就解决第一个坑点作一些总结:

       要在界面上显示相机的预览画面,先要拿到camera 输出的预览图像数据。

       而拿到相机的预览数据有两种方法:

       第一种是利用 camera.setPreviewCallback()方法,在回调的方法中可以拿到相机的yuv数据,然后将yuv转为RGB数据,得到一张bitmap。然后将bitmap绘制到UI的预览区域。

       GpuImage就是利用这种方案。这种方案的弊端在呀,要获得callback的yuv数据,必须在camera.setPreviewCallback()调用camera.setPreviewTexture方法,将预览数据先输入到一个surfaceTexture中,即使这个surfaceTexture不用显示在界面上。这就产生了一个冗余的数据处理过程。

      其实如果善于利用camera.setPreviewTexture()方法,camera.setPreviewCallback()是用不着的,而且SurfaceTexture 默认是GPU运算,它的直接可以接受yuv格式的纹理,少了一个转RGB的过程。另外,SurfaceTexture可以更方便地与openGL es API 配合。

       只是,在编写shader时,注意,SurfaceTexture的纹理类型和 openGL 绘图时的 fragment shader 中接收预览数据的sample2D 类型都应该是 external_OES的,具体可以参考我写的这个Demo

      欢迎关注我的CSDN和github帐号!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cc_coders

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值