【Android Camera1】Camera1 Parameters参数详解(一)—— Size (previewpicturethumbnail)

【Android Camera1】Camera1 Parameters参数详解(一)—— Size (previewpicturethumbnail),第1张

【Android Camera1】Camera1 Parameters参数详解(一)—— Size (preview/picture/thumbnail) 1、简介

本篇文章将对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;
        }
    }

本篇文章涉及的具体参数如下:

Key变量名Key变量值KEY_PREVIEW_SIZEpreview-sizeKEY_PREVIEW_FORMATpreview-formatKEY_PREVIEW_frame_RATEpreview-frame-rateKEY_PREVIEW_FPS_RANGEpreview-fps-rangeKEY_PICTURE_SIZEpicture-sizeKEY_PICTURE_FORMATpicture-formatKEY_JPEG_THUMBNAIL_SIZEjpeg-thumbnail-sizeKEY_JPEG_THUMBNAIL_WIDTHjpeg-thumbnail-widthKEY_JPEG_THUMBNAIL_HEIGHTjpeg-thumbnail-heightKEY_JPEG_THUMBNAIL_QUALITYjpeg-thumbnail-qualityKEY_JPEG_QUALITYjpeg-quality 2.preview-size 说明:1. 当前相机预览的preview-size:如1280 * 960。2. 通过设置该key不同的value值可以控制camera预览图的分辨率。3. 相机的输出流和手机竖直成90度夹角,所以width > height相关KEYKEY_PREVIEW_SIZE + SUPPORTED_VALUES_SUFFIX
preview-size-valuesKEY_PICTURE_SIZE
picture-sizeKEY_PICTURE_SIZE + SUPPORTED_VALUES_SUFFIX
picture-size-values方法public Size getPreviewSize()public List getSupportedPreviewSizes()public void setPreviewSize(int width, int height) 注意1. 可以不设置
2. 如果设置一定要设置 getSupportedPreviewSizes()返回的Size,不然会抛错 3.preview-format 说明:1.当前相机预览的图片格式如YV12 YUY2 NV16 YUV422SP YUV420SP相关KEYpicture-format方法public int getPreviewFormat()public void setPreviewFormat(int pixel_format)public List getSupportedPreviewFormats() 注意1. 可以不设置 有默认值
2. 如果设置一定要设置 getSupportedPreviewFormats()返回的结果,不然会抛错 3.1 官方注释
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】图像表示方式和存储格式。

4. preview-frame-rate

已废弃,参考【5. preview-fps-range】

5. preview-fps-range 说明:preview - fps相关KEYpreview-fps-rangepreview-fps-range-values方法public List getSupportedPreviewFpsRange()public void getPreviewFpsRange(int[] range)public void setPreviewFpsRange(int min, int max) 5.1 说明

preview-fps-range通过如下函数设置camera1预览的fps范围:

 
 public void setPreviewFpsRange(int min, int max) {
     set(KEY_PREVIEW_FPS_RANGE, "" + min + "," + max);
 }

分析:

  1. 最大,最小,是个范围
  2. scale 1000倍数
  3. 必须是getSupportedPreviewFpsRange 返回的值
  4. 影响Camera.PreviewCallback-> onPreviewframe的调用频率
5.2 举例

通过如下可获取当前preview-range

int[] previewRange = new int[2];
mCameraParameters.getPreviewFpsRange(previewRange);

相机默认会返回[5000, 30000],注意minValue和maxValue不是一致的。这里给出一个范围,实际相机会自动根据摄像头设备捕捉不同场景去自动调节对应的FPS。如果一直不移动,Camera会降低onPreviewframe回掉的频率,即fps会降低。

我们可通过如下函数获取当前设备支持的preview-range-values。然后设置不同的值:

public List getSupportedPreviewFpsRange() {
    String str = get(KEY_PREVIEW_FPS_RANGE + SUPPORTED_VALUES_SUFFIX);
    return splitRange(str);
}

public void setPreviewFpsRange(int min, int max)的参数一定要是相机支持的参数

实际运行调用getSupportedPreviewFpsRange输出具体的值为:

SupportedPreviewframeRates = [10000, 10000]
SupportedPreviewframeRates = [15000, 15000]
SupportedPreviewframeRates = [20000, 20000]
SupportedPreviewframeRates = [5000, 30000]
SupportedPreviewframeRates = [30000, 30000]
curPreviewframeRates = [5000, 30000]

6. picture-size

类比preview-size

说明:1. 当前相机预览的picture-size:如1440 * 1280。2. 通过设置该key不同的value值可以控制camera capture 拍照结果图的分辨率。3. 相机的输出流和手机竖直成90度夹角,所以width > height相关KEYKEY_PICTURE_SIZE + SUPPORTED_VALUES_SUFFIX
picture-size-valuesKEY_PREVIEW_SIZE
preview-sizeKEY_PREVIEW_SIZE + SUPPORTED_VALUES_SUFFIX
preview-size-values方法public Size getPictureSize()public List getSupportedPictureSizes()public void setPictureSize(int width, int height) 注意1. 可以不设置
2. 如果设置一定要设置 getSupportedPictureSizes()返回的Size,不然会抛错

基本和preview-size类似,可互相参考共同了解。

7. picture-format

基本和preview-format类似,参看【3】

8. jpeg-thumbnail 说明:1. 当前相机capture thumb 缩略图到相关参数设置。2. 通过设置相关key不同的value值可以控制camera capture 缩略图的宽高,图片质量。3. 相机的输出流和手机竖直成90度夹角,所以width > height相关KEYKEY_JPEG_THUMBNAIL_SIZE
jpeg-thumbnail-sizeKEY_JPEG_THUMBNAIL_WIDTH
jpeg-thumbnail-widthKEY_JPEG_THUMBNAIL_HEIGHT
jpeg-thumbnail-heightKEY_JPEG_THUMBNAIL_QUALITY
jpeg-thumbnail-quality方法public Size getJpegThumbnailSize()public void setJpegThumbnailSize(int width, int height)public Size getJpegThumbnailSize()public List getSupportedJpegThumbnailSizes()public void setJpegThumbnailQuality(int quality)public int getJpegThumbnailQuality() 9. jpeg-quality 说明:1. 当前相机capture picture 图片质量。2. value 范围 1 - 100方法public void setJpegQuality(int quality)public int getJpegQuality()影响因素quality越高,图片文件大小越大quality越高,拍照性能越差quality越高,图片质量越清楚

说明:
jpeg-quality和最终生成的jpeg图片质量有关系。 值越小,则对原始图压缩的越厉害。在不同的场景下可综合多方面因素设置不同的jpeg-quality。如:

  • 低端机,可适当调低jpeg-quality的值
  • 分辨率较低的图片也可适当调低jpeg-quality的值

或许讲阐述:
【Android Camera1】Camera1 Parameters参数详解(二)—— 3A算法 (AF/AE/AWB)
【Android Camera1】Camera1 Parameters参数详解(三)—— zoom,other

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5697300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存