onCameraFrame接口是个很有意思也很强大的接口,在微信小程序还没有正式的宣告AR相关能力时我已经让团队基于此功能做了些尝试了。但是在使用过程中还是有诸多不便。所以谈谈我的一点想法和小建议。
这个接口的推出,我相信产品团队是出于目前诸多的AR/视频需求而开发出来的,但是从这两个场景来看这个接口直接用起来不太方便:
采样频率不可控,目前貌似是30FPS。但是这30FPS每帧都把数据扔出来的话,直接在这个事件中接到数据然后去做些相关的业务逻辑。。。。。。根本处理不过来啊。实际的应用场景我相信大家都需要降低频率来处理数据,像我就是先写个环形缓冲区,然后再按照我实际的业务逻辑测试好速度跳帧把数据插入到环形缓冲区。最后随时需要取数据的时候,去环形缓冲区里面拿。所以,从这个角度来说,我希望这个接口提供以下两个功能以便使用起来更加灵活:
能够提供相关的参数配置使得能够按照预先设定的频率输出数据
能够提供一个接口在调用请求的时候再返回最新的当前帧数据
onCameraFrame给出的是RGBA的数据,这玩意儿数据量太大用起来也不方便,尤其是要把数据再传回服务器端处理的或者需要做些裁剪缩放的动作就呵呵了。。。别说用Canvas,用那玩意儿的性能会活活拖死你。所以建议提供以下相关接口功能以便使用起来更加灵活:
对于onCameraFrame的数据,能够有参数配置使得得到jpg或者png的数据
提供一些原生功能对于得到的图像数据进行缩放、裁剪
当然,并不是说onCameraFrame现在的功能不可用。。。。用倒是可以用。。。我们做的一个用摄像头获取数据然后回传后台服务器进行分析判断的测试小程序,如果简单自行小心翼翼的跳帧然后再放到canvas里进行裁剪缩放最后传输到服务器。。。这时间简直是无法忍受的(若干秒)
后来我们加入环形缓冲区,自己用JS来进行图像的压缩裁剪什么的再传输,才成功的把整体处理时间压缩到300~400ms。
所以,我相信如果官方能够提供原生的采样速率控制或者按需请求数据,以及原生的图像缩放裁剪功能。那么对于AR/即时视频处理类的小程序将会得到速度上质的飞跃。
-------------------------------9月5日 追加-------------------------
随便搜一下onCameraFrame关键字就能找到我这里提到的几个同类问题贴:
https://developers.weixin.qq.com/community/develop/doc/000eeab7238bc8cba6f8840045bc00?highLine=onCameraFrame (真机无法调试onCameraFrame,我猜测也是频率过高造成,当然,仅仅只是猜测)
https://developers.weixin.qq.com/community/develop/doc/0008229fccc948215bc8a8bba56800?highLine=onCameraFrame (8月9日 Keep的回复其实也是格式的问题)