我制作了一个符合AVCaptureFileOutputRecordingDelegate
的相机对象。录制视频后,我将使用func capture()
通过代理转移网址。问题在于,由于某些原因,当调用此函数时,视频似乎实际上没有完成录制,因为urlDelegate?.URL
总是调试到nil
,尽管outputURL
有一个值。这显然是同步问题,但我不明白为什么。
我应该如何解决这个问题,更重要的是为什么在使用didFinishRecordingToOutputFileAt
func capture(_ output: AVCaptureFileOutput!, didFinishRecordingToOutputFileAt outputFileURL: URL!, fromConnections connections: [Any]!, error: Error!) {
if error == nil {
urlDelegate?.URL = outputURL
}
}
即便尝试过,仍然没有:
func capture(_ output: AVCaptureFileOutput!, didFinishRecordingToOutputFileAt outputFileURL: URL!, fromConnections connections: [Any]!, error: Error!) {
if error == nil {
DispatchQueue.global(qos: DispatchQoS.userInitiated.qosClass).async {
let url = self.outputURL
DispatchQueue.main.async {
if let completedURL = url {
self.urlDelegate?.URL = completedURL
}
}
}
}
}
答案 0 :(得分:1)
代码中的主要问题是fileoutput method signature错误。您还可以查看其他AVCaptureFileOutputRecordingDelegate方法。
正确的方法签名是:
func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?)
除此之外,您正在访问错误的对象。它应该是outputFileURL
而不是outputURL
,并且它不是可选的,因此无需解包。