当前位置:   article > 正文

Android Camera API 1打开相机失败

Android Camera API 1打开相机失败

        目前Camera API 1使用的比较少了,一般代码如下。遇到的问题是camera1接口无法打开相机,cam2接口打开正常。最后排查结果是 sensor的 frameRate 配置不对。

  1. Camera camera;
  2. CameraPreview mPreview;
  3. @SuppressLint("MissingPermission")
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.cam_1_layout);
  8. mPreview = findViewById(R.id.camera_1_preview);
  9. try {
  10. camera = Camera.open(0);
  11. mPreview.setCamera(camera);
  12. } catch (Exception e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
  17. private Camera mCamera;
  18. public CameraPreview(Context context, AttributeSet attrs) {
  19. super(context, attrs);
  20. }
  21. public CameraPreview(Context context, AttributeSet attrs, int defStyleAttr) {
  22. super(context, attrs, defStyleAttr);
  23. }
  24. public CameraPreview(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
  25. super(context, attrs, defStyleAttr, defStyleRes);
  26. }
  27. public void setCamera(Camera camera) {
  28. mCamera = camera;
  29. }
  30. @Override
  31. public void surfaceCreated(SurfaceHolder holder) {
  32. try {
  33. mCamera.setPreviewDisplay(holder);
  34. mCamera.startPreview();
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. @Override
  40. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  41. // 相机预览尺寸变化时,调整相机参数
  42. if (mCamera != null) {
  43. Camera.Parameters parameters = mCamera.getParameters();
  44. parameters.setPreviewSize(width, height);
  45. mCamera.setParameters(parameters);
  46. }
  47. }
  48. @Override
  49. public void surfaceDestroyed(SurfaceHolder holder) {
  50. // 停止相机预览并释放资源
  51. if (mCamera != null) {
  52. mCamera.stopPreview();
  53. mCamera.release();
  54. mCamera = null;
  55. }
  56. }

    log显示是  Camera.open(0); 时异常,预览分辨率不对导致。跟踪代码,Cam初始化时

CameraService::connectHelper 函数中执行 client->initialize,client 对应到不同api创建不同的对象。api1下的Camera2Client::initialize 流程中有 mParameters.initialize 步骤,在 Parameters::initialize 中执行 getFilteredSizes 进行过滤操作

  1. //过滤预览size
  2. res = getFilteredSizes(maxPreviewSize, &availablePreviewSizes);
  3. if (res != OK) return res;
  4. res = getFilteredSizes(videoSizeUpperBound, &availableVideoSizes);
  5. if (res != OK) return res;
  6. status_t Parameters::getFilteredSizes(Size limit, Vector<Size> *sizes) {
  7. if (info == NULL) {
  8. ALOGE("%s: Static metadata is not initialized", __FUNCTION__);
  9. return NO_INIT;
  10. }
  11. if (sizes == NULL) {
  12. ALOGE("%s: Input size is null", __FUNCTION__);
  13. return BAD_VALUE;
  14. }
  15. sizes->clear();
  16. Vector<StreamConfiguration> scs = getStreamConfigurations();
  17. for (size_t i=0; i < scs.size(); i++) {
  18. const StreamConfiguration &sc = scs[i];
  19. if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT &&
  20. sc.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
  21. sc.width <= limit.width && sc.height <= limit.height) {
  22. int64_t minFrameDuration = getMinFrameDurationNs(
  23. {sc.width, sc.height}, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED);
  24. if (minFrameDuration > MAX_PREVIEW_RECORD_DURATION_NS) {
  25. // Filter slow sizes from preview/record
  26. continue;
  27. }
  28. sizes->push({sc.width, sc.height});
  29. }
  30. }
  31. if (sizes->isEmpty()) {
  32. ALOGE("generated preview size list is empty!!");
  33. return BAD_VALUE;
  34. }
  35. return OK;
  36. }

这里获取 sensor 配置支持的 ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS 数值,与平台默认 MAX_PREVIEW_RECORD_DURATION_NS 值比较。这里比较是每一帧的时间,单位是ns,值越大,说明帧率越低。MAX_PREVIEW_RECORD_DURATION_NS 由系统默认设置,一般平台帧率30,MAX_PREVIEW_RECORD_DURATION_NS  = 1/30 * 1000 000 000 (ns)。sensor 配置帧率一般在 sensor.xml 中,标签是 <frameRate> ,根据不同SIZE会配置不同frameRate的值。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/420902
推荐阅读
相关标签
  

闽ICP备14008679号