Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.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
Ios 设置'device.activeVideoMinFrameDuration'和'device.activeVideoMaxFrameDuration'不';我什么也不做_Ios_Swift_Iphone_Swiftui - Fatal编程技术网

Ios 设置'device.activeVideoMinFrameDuration'和'device.activeVideoMaxFrameDuration'不';我什么也不做

Ios 设置'device.activeVideoMinFrameDuration'和'device.activeVideoMaxFrameDuration'不';我什么也不做,ios,swift,iphone,swiftui,Ios,Swift,Iphone,Swiftui,我正在制作一个定制的摄像头应用程序,我想以60fps的速度获取摄像头输入(我不太关心质量),并在UIView中显示 到目前为止,我掌握的情况如下: struct CustomCameraView: UIViewRepresentable { func makeUIView(context: Context) -> some UIView { let previewView = UIImageView() func configureCameraFor

我正在制作一个定制的摄像头应用程序,我想以60fps的速度获取摄像头输入(我不太关心质量),并在UIView中显示

到目前为止,我掌握的情况如下:

struct CustomCameraView: UIViewRepresentable {
    func makeUIView(context: Context) -> some UIView {
        let previewView = UIImageView()
        func configureCameraForHighestFrameRate(device: AVCaptureDevice) {
            do {
                try device.lockForConfiguration()                
                let fr = CMTimeMake(value: 1, timescale: 60)
                device.activeVideoMinFrameDuration = fr
                device.activeVideoMaxFrameDuration = fr                
                device.unlockForConfiguration()
            } catch {
                print("error setting frame rate")
            }
        }
        
        func setupLivePreview() {
            videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
            videoPreviewLayer.videoGravity = .resizeAspect
            videoPreviewLayer.connection?.videoOrientation = .portrait
            previewView.layer.addSublayer(videoPreviewLayer)
            captureSession.commitConfiguration()
            DispatchQueue.global(qos: .userInitiated).async {
                captureSession.startRunning()
                DispatchQueue.main.async {
                    videoPreviewLayer.frame = previewView.bounds
                }
            }
        }
                
        var captureSession: AVCaptureSession!
        var videoPreviewLayer: AVCaptureVideoPreviewLayer!
        
        captureSession = AVCaptureSession()
        captureSession.beginConfiguration()        
        guard let backCamera = AVCaptureDevice.default(for: AVMediaType.video) else {
            print("Unable to access back camera!")
            return UIImageView()
        }        
        configureCameraForHighestFrameRate(device: backCamera)
        do {
            let input = try AVCaptureDeviceInput(device: backCamera)
            print("max frame duration on input",
input.device.activeVideoMaxFrameDuration)
            
            if captureSession.canAddInput(input) {
                captureSession.addInput(input)
                setupLivePreview()
            }
        }
        catch let error  {
            print("Error Unable to initialize back camera:  \(error.localizedDescription)")
        }
        
        return previewView
    }

    func updateUIView(_ uiView: UIViewType, context: Context) {}
}

非常简单,我访问相机,设置其
activeVideoMinFrameDuration
activeVideoMaxFrameDuration
s,然后使用
AVCaptureVideoPreviewLayer
替换
UIImageView
CALayer

我尝试将
CMTime
时间刻度更改为
30
20
10
,甚至
1
,但没有任何效果。我该怎么办

我没有收到任何错误,以下是我的系统信息:

  • iPhone11Pro
  • XCode版本12.0.1(12A7300)
  • iOS 14.0.1
结果是错误的:

直接配置捕获设备的activeFormat属性会将捕获会话的预设更改为inputPriority

这不是真的,我必须将捕获会话的预设设置为
.inputPriority
,才能进行捕获设备的配置。因此,添加这一行解决了问题:

captureSession.sessionPreset = .inputPriority
我在苹果开发者论坛上发表了一篇文章,希望他们能看一看