Я работаю над приложением для камеры, которое позволяет пользователям снимать фотографии и видео (со звуком). В ходе тестирования я понял, что если пользователь разговаривает по FaceTime и пытается использовать камеру, она перестает работать. Видеопоток зависает и выдает ошибки выполнения, подобные следующим:
Код: Выделить всё
AVError(_nsError: Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedFailureReason=An unknown error occurred (561017449), NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x300723240 {Error Domain=NSOSStatusErrorDomain Code=561017449 "(null)" UserInfo={AVErrorFourCharCode='!pri'}}})
Покопавшись, я обнаружил, что преступник пытается активировать микрофон на моем AVCaptureSession вот так:
Код: Выделить всё
if let audioDevice = AVCaptureDevice.default(for: .audio),
let audioDeviceInput = try? AVCaptureDeviceInput(device: audioDevice),
session.canAddInput(audioDeviceInput) {
session.addInput(audioDeviceInput)
}
Изменение казалось простым: удалите этот фрагмент кода из логики настройки AVCaptureSession и просто переместите его вправо, прежде чем пользователь попытается записать видео. Проблема в том, что если я сделаю это, камера будет работать так, как ожидалось, но между нажатием кнопки пользователем и началом записи видео будет значительная задержка, подача изображения с камеры даже отключится на секунду. Если код настройки микрофона выполнен, когда я настраиваю AVCaptureSession, никакой задержки, когда пользователь нажимает кнопку записи, не происходит.
Я пытался запустить это код внутри (и снаружи) DispatchQueue, который я использую для обработки всей логики камеры, и ничего не изменилось. Я также пытался добавить его между session.beginConfiguration() и session.commitConfiguration() и тоже ничего не изменил.
Подробнее здесь:
https://stackoverflow.com/questions/784 ... cord-video