AVCaptureSession.addInput(_:) работает очень медленно при попытке записи видео

Я работаю над приложением камеры, которое позволяет пользователям снимать фотографии и видео (со звуком). В ходе тестирования я понял, что если пользователь разговаривает по 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 13.05.2024 08:46

@soundflix, как ты думаешь, что мне следует опубликовать, чтобы это могло помочь? В моей функции startVideoRecording() единственная разница между тем, медленная она или нет, заключается в вызове captureSession.addInput(audioInput). Если я закомментирую это, я получу плавную запись, как только пользователь нажмет кнопку (конечно, без звука). Если я оставлю этот метод включенным, между нажатием и началом записи произойдет примерно секундная задержка.

Xavi Moll 15.05.2024 10:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В итоге я решил эту проблему, используя два AVCaptureSession. У меня всегда работает видеопоток, и только когда пользователь нажимает кнопку записи, я запускаю аудио.

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

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

Другие вопросы по теме