在iOS上录制视频的简单方法是设置AVCaptureSession.sessionPreset
。
但这对我不起作用,因为我想控制分档,稳定(电影,标准或无)和ISO等参数。
我找到了我想要的格式并将其分配给activeFormat
,但是当我尝试开始录制时,我收到错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'*** -[AVCaptureMovieFileOutput startRecordingToOutputFileURL:recordingDelegate:] No active/enabled connections'
这是我的初始化代码:
let device = AVCaptureDevice.defaultDevice(
withDeviceType: .builtInWideAngleCamera,
mediaType: AVMediaTypeVideo,
position: .back)!
let session = AVCaptureSession()
session.addInput(try! AVCaptureDeviceInput(device: device))
output = AVCaptureMovieFileOutput()
session.addOutput(output)
device.setFormatWithHighestIso()
session.startRunning()
setFormatWithHighestIso()
定义为:
extension AVCaptureDevice {
var goodVideoFormats: [AVCaptureDeviceFormat] {
return (formats as! [AVCaptureDeviceFormat])
.filter { CMFormatDescriptionGetMediaSubType($0.formatDescription) != 875704422 } // 420f
.filter { $0.autoFocusSystem == .phaseDetection }
}
func setFormatWithHighestIso() {
let format = goodVideoFormats
.filter { $0.maxISO > 1759 }
.filter { $0.height < 1937 }
.first!
try! lockForConfiguration()
defer { unlockForConfiguration() }
activeFormat = format
NSLog("\(format)")
}
}
最后一条日志语句产生:
<AVCaptureDeviceFormat: 0x1702027d0 'vide'/'420f' 2592x1936, { 3- 30 fps}, HRSI:4032x3024, fov:58.986, max zoom:189.00 (upscales @1.56), AF System:2, ISO:22.0-1760.0, SS:0.000005-0.333333, supports wide color>
这确实是我想要的格式,因此setFormatWithHighestIso()
正在按预期工作。请参阅Apple reference。
我尝试过的其他一些事情:
验证连接是否处于活动状态,但不是:
让conn = output.connection(withMediaType:AVMediaTypeVideo)! 验证(conn.isActive)
我还尝试使用其他一些AVCaptureDeviceFormats
,但它们有效:
extension AVCaptureDevice {
func setFormatWithCinematicVS() {
let format = goodVideoFormats
.filter { $0.isVideoStabilizationModeSupported(.cinematic) }
.filter { $0.height == 720 }
.first!
try! lockForConfiguration()
defer { unlockForConfiguration() }
activeFormat = format
}
func setFormatWithStandardVS() {
let format = goodVideoFormats
.filter { $0.isVideoStabilizationModeSupported(.standard) }
.filter { $0.height == 540 }
.first!
try! lockForConfiguration()
defer { unlockForConfiguration() }
activeFormat = format
}
}
只有具有最高ISO的格式不起作用。这种格式有什么特别之处?
我是否需要手动创建AVCaptureConnection?但是已经有了联系;它只是不活跃。
这是在运行iOS 10.3.3的iPhone 7 Plus上。如何通过在不使用会话的情况下设置activeFormat来以特定格式录制视频?
如果我使用sessionPreset而不是分配给activeFormat,它会成功录制视频。
还有其他问题在讨论此错误消息,但这不是他们的欺骗,因为我特别需要在不使用预设的情况下捕获视频。
答案 0 :(得分:0)
解决方案结果是在将AVCaptureDevice添加到会话之前进行配置。而不是:
session.addInput(try! AVCaptureDeviceInput(device: device))
output = AVCaptureMovieFileOutput()
session.addOutput(output)
device.setFormatWithHighestIso()
你应该这样做:
device.setFormatWithHighestIso() // Do this first!
session.addInput(try! AVCaptureDeviceInput(device: device))
output = AVCaptureMovieFileOutput()
session.addOutput(output)
将设备添加到会话时,会以某种方式创建和配置AVCaptureConnection。如果您稍后更改设备的分辨率,配置将不再匹配,因此连接将停用,视频将无法录制。