Android 获取高清(4K)视频流图片

想拿高清视频流里一帧帧图一定要用camera2,一定要用camera2,一定要用camera2!!!

原先的camera好像最高只支持1080P的预览分辨率,我用华为P20,P9,Mate系列,小米8都试过,调用getSupportPreviewSize方法可以获得本机所支持的预览分辨率集合,然后看了下最高1920x1080,至于其他手机不太清楚。
但是我用的苹果8是可以支持4k预览流输出的,于是乎我就突发奇想用camera2试试,camera2相对而言要复杂很多,我这里就再多说了,给个前辈的链接自己去研究下Android多媒体之Camera2的相关操作谷歌也在github上提供了camera2的demo,自己去搜下,我比较懒就直接把demo复制之后改了一些东西。下面说几点要注意的地方(最好结合goole提供的demo一起看)
第一,选择预览分辨率
demo中是chooseOptimalSize()函数来实现(根据屏幕的分辨率),一开始我就把原来写的逻辑给改了,让预览分辨率变成最高,会导致低端的手机卡卡的。这边不用改,这是预览的大小,并不是帧图的大小,不搭界的。帧图大小在于ImageReader.newInstance(bestSize.getWidth(), bestSize.getHeight(),
ImageFormat.JPEG, /maxImages/1);这个函数中的bestSize.getWidth(),getHeight(),是我业务所需要的,这边你可以改成最高的(map.getOutputSizes(ImageFormat.JPEG)这个函数会给你一个Size数组,自己挑个最高的)

第二, 对焦
因为demo上是拍照,我是直接取视频流,拍照时个点击事件,可以告诉相机什么时候取图,而预览没办法告诉相机什么时候取图,这边我是设置成mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
然后在 process函数中Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);改成这样子,就可以获得对焦的状态,我也是打了Log测试了好久发现,afState为6的时候是模糊状态,afState为2时是相机认为的对焦完成状态,可以进CaptureResult类中看下,CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED = 2被认为对焦好的状态,好了,可以取图了。这边一定要把mState改掉,要不然会一直取图,mImageReader会一直有图片存在,会报maxImages什么什么的错误。我也谷歌了好久,都是说image要close。

我做的项目是有扫码功能,只是把最重要的部分完成了,踩了好多坑,花了好多时间,还有一些小地方没做好,等我做完再贴代码吧。

猜你喜欢

转载自blog.csdn.net/fw920802/article/details/89211175