Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何延迟相机拍摄的特定帧的拍摄?_Android_Camera - Fatal编程技术网

Android:如何延迟相机拍摄的特定帧的拍摄?

Android:如何延迟相机拍摄的特定帧的拍摄?,android,camera,Android,Camera,我正在开发一个灯光(LED)通信系统,使用Android手机摄像头作为接收器,对摄像头帧进行阈值处理。为此,我使用preview的回调方法onPreviewFrame。 为了更准确,需要每隔几帧延迟一帧的捕获,以便系统将重新同步 我的问题是: 如何延迟单个帧的捕获(而不是预览) 是否可能存在我不知道的摄像头fps速率的内部变化?如果是,我如何限制或更改它们 *要限制相机fps速率,我使用setPreviewFpsRange,setAutoWhiteBalanceLock和setAutoExpos

我正在开发一个灯光(LED)通信系统,使用
Android
手机摄像头作为接收器,对摄像头帧进行阈值处理。为此,我使用preview的回调方法
onPreviewFrame
。 为了更准确,需要每隔几帧延迟一帧的捕获,以便系统将重新同步

我的问题是:

  • 如何延迟单个帧的捕获(而不是预览)
  • 是否可能存在我不知道的摄像头fps速率的内部变化?如果是,我如何限制或更改它们
    *要限制相机fps速率,我使用
    setPreviewFpsRange
    setAutoWhiteBalanceLock
    setAutoExposureLock
    ,您可以尝试在API level 21中添加的较新的android.hardware.camera2包,它取代了不推荐使用的相机类,并对相机功能提供细粒度控制:

    获取CameraManager服务

    CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
    
    String[] cameraIdList = manager.getCameraIdList();
    
    检索设备上可用的摄像头列表

    CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
    
    String[] cameraIdList = manager.getCameraIdList();
    
    反复浏览cameraList以选择具有所需特性的相机

    for(String cameraId:cameraIdList)
    {
        CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
    }
    
    private class CameraCallback extends CameraDevice.StateCallback
    {
        @Override
        public void onOpened(CameraDevice camera)
        {
            CaptureRequest previewRequest = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).build();
    
            CaptureRequest stillCaptureRequest = camera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE).build();
        }
    }
    
    创建带有预览和静态捕获请求的相机回调类

    for(String cameraId:cameraIdList)
    {
        CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
    }
    
    private class CameraCallback extends CameraDevice.StateCallback
    {
        @Override
        public void onOpened(CameraDevice camera)
        {
            CaptureRequest previewRequest = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).build();
    
            CaptureRequest stillCaptureRequest = camera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE).build();
        }
    }
    

    请查看以提高fps的准确性谢谢您的回答。我看不出它是如何帮助我实时控制ftp的:问题的第一部分是独立控制预览和捕获单个帧的时间。通过创建两个单独的请求,您可以随意控制时间。
    stillCaptureRequest
    是否允许我控制FTP?似乎这只会让我要求捕捉“在不久的将来”。但这并不意味着我可以控制准确的速率(比如1/30秒的精度)。还是这样?