Я работаю над приложением камеры, которое позволяет пользователям снимать фотографии и видео (со звуком). В ходе тестирования я понял, что если пользователь разговаривает по FaceTime и пытается использовать камеру, она перестает работать. Видеопоток зависает и выдает ошибки времени выполнения, подобные следующим:
AVError(_nsError: Error Domain=AVFoundationErrorDomain Code=-11800 «Операция не может быть завершена» UserInfo = {NSLocalizedFailureReason=Произошла неизвестная ошибка (561017449), NSLocalizedDescription=Операция не может быть завершена, NUnderlyingError=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(), и это тоже ничего не изменило.
@soundflix, как ты думаешь, что мне следует опубликовать, чтобы это могло помочь? В моей функции startVideoRecording() единственная разница между тем, медленная она или нет, заключается в вызове captureSession.addInput(audioInput). Если я закомментирую это, я получу плавную запись, как только пользователь нажмет кнопку (конечно, без звука). Если я оставлю этот метод включенным, между нажатием и началом записи произойдет примерно секундная задержка.





В итоге я решил эту проблему, используя два AVCaptureSession. У меня всегда работает видеопоток, и только когда пользователь нажимает кнопку записи, я запускаю аудио.
Таким образом, запись происходит мгновенно, а проблемы с микрофоном, когда запись не ведется, исчезают, поскольку сеанс не запущен, поэтому микрофон не активен.
В качестве бонуса теперь я также могу управлять тактильной обратной связью по элементам управления, потому что AVCaptureSession, управляющий микрофоном, не работает!
Вероятно, вам придется показать больше кода, чтобы получить ответы.