设置 `device.activeVideoMinFrameDuration` 和 `device.activeVideoMaxFrameDuration` 没有任何作用
Setting `device.activeVideoMinFrameDuration` and `device.activeVideoMaxFrameDuration` doesn't do anything
我正在制作一个自定义的相机应用程序,我想以 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
,然后我使用 AVCaptureVideoPreviewLayer
替换 UIImageView
的 CALayer
.
我尝试将 CMTime
的 timescale
更改为 30
、20
、10
,甚至 1
,但它没有有什么作用。我该怎么办?
我没有收到任何错误,这是我的系统信息:
- iPhone 11 专业版
- XCode 版本 12.0.1 (12A7300)
- iOS 14.0.1
原来Apple's documentation是错误的:
Directly configuring a capture device’s activeFormat property changes the capture session’s preset to inputPriority.
这不是真的,我必须将捕获会话的预设设置为 .inputPriority
才能对捕获的设备进行配置。所以添加这一行解决了问题:
captureSession.sessionPreset = .inputPriority
我在 Apple 开发者论坛上做了 a post,希望他们能看一看。
我正在制作一个自定义的相机应用程序,我想以 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
,然后我使用 AVCaptureVideoPreviewLayer
替换 UIImageView
的 CALayer
.
我尝试将 CMTime
的 timescale
更改为 30
、20
、10
,甚至 1
,但它没有有什么作用。我该怎么办?
我没有收到任何错误,这是我的系统信息:
- iPhone 11 专业版
- XCode 版本 12.0.1 (12A7300)
- iOS 14.0.1
原来Apple's documentation是错误的:
Directly configuring a capture device’s activeFormat property changes the capture session’s preset to inputPriority.
这不是真的,我必须将捕获会话的预设设置为 .inputPriority
才能对捕获的设备进行配置。所以添加这一行解决了问题:
captureSession.sessionPreset = .inputPriority
我在 Apple 开发者论坛上做了 a post,希望他们能看一看。