本篇文章将对Camera1和Size相关的参数,逐个进行详细解析。在Camera1源码分析文章里、已阐述过相关源码。并提供了读取和更新Parameters的2个方法如下:
读取Parameters
public static @Nullable Camera.Parameters getCameraParameters(@NonNull Camera camera) { try { return camera.getParameters(); }catch (Exception e){ return null; } }
更新Parameters
public static boolean setCameraParameters(@NonNull Camera camera, @NonNull Camera.Parameters parameters) { try { camera.setParameters(parameters); return true; }catch (Exception e){ return false; } }
本篇文章涉及的具体参数如下:
preview-size-values
picture-size
picture-size-values
2. 如果设置一定要设置 getSupportedPreviewSizes()返回的Size,不然会抛错
2. 如果设置一定要设置 getSupportedPreviewFormats()返回的结果,不然会抛错
Sets the image format for preview pictures. If this is never called, the default format will be ImageFormat.NV21, which uses the NV21 encoding format. Use getSupportedPreviewFormats to get a list of the available preview formats. It is strongly recommended that either ImageFormat.NV21 or ImageFormat.YV12 is used, since they are supported by all camera devices. For YV12, the image buffer that is received is not necessarily tightly packed, as there may be padding at the end of each row of pixel data, as described in ImageFormat.YV12. For camera callback data, it can be assumed that the stride of the Y and UV data is the smallest possible that meets the alignment requirements. That is, if the preview size is width x height, then the following equations describe the buffer index for the beginning of row y for the Y plane and row c for the U and V planes: yStride = (int) ceil(width / 16.0) * 16; uvStride = (int) ceil( (yStride / 2) / 16.0) * 16; ySize = yStride * height; uvSize = uvStride * height / 2; yRowIndex = yStride * y; uRowIndex = ySize + uvSize + uvStride * c; vRowIndex = ySize + uvStride * c; size = ySize + uvSize * 2; Params: pixel_format – the desired preview picture format, defined by one of the ImageFormat constants. (E.g., ImageFormat.NV21 (default), or ImageFormat.YV12) See Also: ImageFormat, getSupportedPreviewFormats
默认为ImageFormat.NV21
3.2 CameraFormat VS PixelFormat// Formats for setPreviewFormat and setPictureFormat. private static final String PIXEL_FORMAT_YUV422SP = "yuv422sp"; private static final String PIXEL_FORMAT_YUV420SP = "yuv420sp"; private static final String PIXEL_FORMAT_YUV422I = "yuv422i-yuyv"; private static final String PIXEL_FORMAT_YUV420P = "yuv420p"; private static final String PIXEL_FORMAT_RGB565 = "rgb565"; private static final String PIXEL_FORMAT_JPEG = "jpeg"; private static final String PIXEL_FORMAT_BAYER_RGGB = "bayer-rggb"; private String cameraFormatForPixelFormat(int pixel_format) { switch(pixel_format) { case ImageFormat.NV16: return PIXEL_FORMAT_YUV422SP; case ImageFormat.NV21: return PIXEL_FORMAT_YUV420SP; case ImageFormat.YUY2: return PIXEL_FORMAT_YUV422I; case ImageFormat.YV12: return PIXEL_FORMAT_YUV420P; case ImageFormat.RGB_565: return PIXEL_FORMAT_RGB565; case ImageFormat.JPEG: return PIXEL_FORMAT_JPEG; default: return null; } } private int pixelFormatForCameraFormat(String format) { if (format == null) return ImageFormat.UNKNOWN; if (format.equals(PIXEL_FORMAT_YUV422SP)) return ImageFormat.NV16; if (format.equals(PIXEL_FORMAT_YUV420SP)) return ImageFormat.NV21; if (format.equals(PIXEL_FORMAT_YUV422I)) return ImageFormat.YUY2; if (format.equals(PIXEL_FORMAT_YUV420P)) return ImageFormat.YV12; if (format.equals(PIXEL_FORMAT_RGB565)) return ImageFormat.RGB_565; if (format.equals(PIXEL_FORMAT_JPEG)) return ImageFormat.JPEG; return ImageFormat.UNKNOWN; }
这里面出现了很多的格式:
YV12 YUY2 NV16 YUV422SP YUV420SP 等等;详细解释请参看:Camera理论知识和基本原理【7】图像表示方式和存储格式。
已废弃,参考【5. preview-fps-range】
5. preview-fps-rangepreview-fps-range通过如下函数设置camera1预览的fps范围:
public void setPreviewFpsRange(int min, int max) { set(KEY_PREVIEW_FPS_RANGE, "" + min + "," + max); }
5.2 举例分析:
- 最大,最小,是个范围
- scale 1000倍数
- 必须是getSupportedPreviewFpsRange 返回的值
- 影响Camera.PreviewCallback-> onPreviewframe的调用频率
通过如下可获取当前preview-range
int[] previewRange = new int[2]; mCameraParameters.getPreviewFpsRange(previewRange);
相机默认会返回[5000, 30000],注意minValue和maxValue不是一致的。这里给出一个范围,实际相机会自动根据摄像头设备捕捉不同场景去自动调节对应的FPS。如果一直不移动,Camera会降低onPreviewframe回掉的频率,即fps会降低。
我们可通过如下函数获取当前设备支持的preview-range-values。然后设置不同的值:
public ListgetSupportedPreviewFpsRange() { String str = get(KEY_PREVIEW_FPS_RANGE + SUPPORTED_VALUES_SUFFIX); return splitRange(str); }
public void setPreviewFpsRange(int min, int max)的参数一定要是相机支持的参数
实际运行调用getSupportedPreviewFpsRange输出具体的值为:
6. picture-sizeSupportedPreviewframeRates = [10000, 10000]
SupportedPreviewframeRates = [15000, 15000]
SupportedPreviewframeRates = [20000, 20000]
SupportedPreviewframeRates = [5000, 30000]
SupportedPreviewframeRates = [30000, 30000]
curPreviewframeRates = [5000, 30000]
类比preview-size
picture-size-values
preview-size
preview-size-values
2. 如果设置一定要设置 getSupportedPictureSizes()返回的Size,不然会抛错
基本和preview-size类似,可互相参考共同了解。
7. picture-format基本和preview-format类似,参看【3】
8. jpeg-thumbnailjpeg-thumbnail-size
jpeg-thumbnail-width
jpeg-thumbnail-height
jpeg-thumbnail-quality
说明:
jpeg-quality和最终生成的jpeg图片质量有关系。 值越小,则对原始图压缩的越厉害。在不同的场景下可综合多方面因素设置不同的jpeg-quality。如:
- 低端机,可适当调低jpeg-quality的值
- 分辨率较低的图片也可适当调低jpeg-quality的值
或许讲阐述:
【Android Camera1】Camera1 Parameters参数详解(二)—— 3A算法 (AF/AE/AWB)
【Android Camera1】Camera1 Parameters参数详解(三)—— zoom,other
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)