Очень тихие аудиосэмплы от AVCaptureMultiCamSession после отключения наушников Lightning - PullRequest
2 голосов
/ 28 января 2020

Я столкнулся с проблемой с некоторым кодом захвата видео и аудио AVFoundation, которая возникает только при изменении AVCaptureSession() на AVCaptureMultiCamSession() без других изменений кода.

Он воспроизводится только с перерывами, и шаги :

  1. Загрузите приложение и запишите сеанс без подключения внешнего микрофона c
  2. Подключите пару наушников Apple Lightning
  3. Начните запись видео и аудио - звук поступает из mi c на наушники Lightning, как и ожидалось
  4. Отключите наушники Apple Lightning
  5. Вход mi c переключается на встроенный mi c на устройстве однако средний уровень мощности аудиосэмплов, поступающих через AVCaptureAudioDataOutputSampleBufferDelegate, теперь намного тише, примерно на 25-30 дБ.

Этот график иллюстрирует то, что наблюдается, глядя на значения AVCaptureAudioChannel.averagePowerLevel из внутри AVCaptureAudioDataOutputSampleBufferDelegate.captureOutput(AVCaptureOutput, didOutput: CMSampleBuffer, from: AVCaptureConnection):

Change in average power level

Проблема воспроизводится только периодически, т. е. иногда после отключения наушников Lightning появляется уровень встроенный ми c полностью нормально. Эта проблема возникает только при создании экземпляра AVCaptureMultiCamSession вместо AVCaptureSession, остальная часть кода остается неизменной.

В приложении отсутствует обработка изменений в маршрутизации звука. Он использует аудиоустройство по умолчанию, так что переключение на встроенный mi c все обрабатывается AVFoundation. Код для настройки захвата звука:

guard let audioDevice = AVCaptureDevice.default(for: .audio) else {
    fatalError("could not create default audio device")
}
let audioIn = try! AVCaptureDeviceInput(device: audioDevice)
if self.session.canAddInput(audioIn) {
    self.session.addInput(audioIn)
}
let audioOut = AVCaptureAudioDataOutput()
let audioCaptureQueue = DispatchQueue(label: "com.test.capturepipeline.audio", attributes: [])
audioOut.setSampleBufferDelegate(self, queue: audioCaptureQueue)
if self.session.canAddOutput(audioOut) {
    self.session.addOutput(audioOut)
}
self.audioConnection = audioOut.connection(with: .audio)
if let aSettings = audioOut.recommendedAudioSettingsForAssetWriter(writingTo: .mov) {
    self.audioCompressionSettings = aSettings as? [String: Any]
}

Одна из теорий заключается в том, что это ошибка с формированием луча звука, которую AVFoundation настраивает внутри. Странно, как звук все еще там, но просто очень тихо. Может быть, во взвешенной обработке AVFoundation аудиосэмплов от нескольких встроенных микрофонов, выполненных для формирования луча, каким-то образом отсутствуют некоторые аудиоданные, что приводит к очень тихому окончательному сигналу?

Возможно, кто-то еще сталкивался с подобными проблемами с AVCaptureMultiCamSession? Это новое в iOS 13 и поддерживается только на довольно новом оборудовании.

Есть идеи?

Спасибо!

...