啰嗦一堆
最近接触到相机功能,需要拿到相机的预览数据做后续处理,刚开始使用没发现什么大问题,后来才发现midiaserver居然占了我25%的CPU,这还得了,于是赶紧百度。。。卧槽,,,,没有,谷歌呢。。。。还是没有,基本上都是拿源码来说一大堆,表示我这个水平的人还没有达到那种高度,没办法只能自己调了,,,
经过我的测试发现,该服务的占用率主要由两个地方引起:
1.分辨率
myParam.setPictureSize(pictureSize.width, pictureSize.height);
// 设置预浏尺寸
myParam.setPreviewSize(previewSize.width, previewSize.height);
通过我测试时发现,meaiaServer占用率高主要原因是由分辨率引起的,在使用之前,最好是先获取一下自己手机的屏幕分辨率,然后适当的调整,计算出摄像头支持的最优分辨率。我当时的测试机是1280*800但是,我使用了1920*1080的分辨率来设置了预览画面的宽高,具体原因没有了解,但是降低了分辨率后占用率确实下去了。
2.使用setPreviewCallbackWithBuffer
正常的话我推荐使用这个回调来获取数据,比起setPreviewCallback来说,有几大优势
1.可以不用频繁的开辟一个新的buffer来为GC增加压力
2.有自己的回收缓存,所以不用自己再思考怎么来缓存,自接调用就好了,能达到优化性能的目的。
然后,再来讲一下,很多时候其实我们都使用的这个回调,只要注意下这儿就行了
mCamera.addCallbackBuffer(new byte[((previewWidth * previewHeight) * ImageFormat.getBitsPerPixel(ImageFormat.NV21)) / 8]);
在计算的byte[]长度的时候,如果字节数组长度过大,会使CPU占用率提高的,最好是算一下当前帧所需要的字节长度,再设置会好很多,使用width * height *3 应该就是标准的字节长度,具体自己测试一下吧。
总结:
说了一大堆废话,总结一下,目前我了解的就两原因:
1.分辨率,要求不高就调低点吧
2.使用CallbackBuffer时,addCallbackBuffer的长度不要超过原始数据太大,也会导致cpu占用增大。
以上只是我个人的一些理解,说错的地方欢迎指正,也希望能有大佬能补充补充。另外有个自定义的相机拍照预览的小Demo,有需要的同学可以找我。
谢谢