Параметры записи аудио, используя AVFoundation на swift4

swift
xcode
ios

#1

Подскажите оптимальные параметры для создания аудиозаписи в iOS AVFoundation и отправки на сервер, с последующим воспроизведением. Есть 2 крайних варианта, первый максимально занимает место на сервере, но и звучит хорошо, второй простой и выдает запись плохого качества, но занимает очень мало места.
Вариант 1й:

        AVFormatIDKey: kAudioFormatAppleLossless,
        AVEncoderAudioQualityKey: AVAudioQuality.max.rawValue,
        AVEncoderBitRateKey: 32000,
        AVNumberOfChannelsKey: 2,
        AVSampleRateKey: 44100.0

Вариант 2й:

        AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
        AVSampleRateKey: 12000.0,
        AVNumberOfChannelsKey: 1 as NSNumber,
        AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue

#2

Смотря для каких целей будете использовать в дальнейшем. Если вы записываете с микрофона то можете смело сокращать кол-во каналов до 1, т.к. записывается моно сигнал, это в 2 раза уменьшит размер записи.


#3

Запись будет идти со встроенного микрофона телефона или гарнитуры, в основном по сценарию, когда телефон лежит на столе, а человек сидит рядом, до 0,5 метра. А прослушивание в наушниках приемущественно и в машине через кабель или bluetoth. То есть качество должно быть приличным, на уровне качества звука в Подкастах. Может вы знаете подходящий вариант настроек для этих задач? И где можно почитать на эту тему, кроме документации Apple?


#4

Частоту лучше не использовать ниже 22кГц - сильно ухудшает качество. Попробуйте AVSampleRateKey: 22000.0 не ниже и остальное играйтесь битрейтом.


#6

Спасибо. А какой вариант AVFormatIDKey выбрать лучше? Lossles или mpeg4AAC или еще какой?


#7

Мне кажется Lossles излишнее качество для ваших задач.


#8

Для вашей задачи оптимальные настройки будут следующими:
AVFormatIDKey: Int(kAudioFormatMPEG4AAC), - используется сжатие (как mp3)
AVNumberOfChannelsKey : 1, - т.к. звук записывается с микрофона в монофоническом режиме
AVSampleRateKey: 44100.0
AVEncoderAudioQualityKey: AVAudioQuality.max.rawValue, - на размер не влияет, влияет на потребляемые ресурсы при сжатии, поэтому можно выставить максимальное качество сжатия
AVEncoderBitRateKey: 6400, - это скорость потока данных, этот единственный параметр, который влияет на размер конечного файла. С ним можно поиграться. Но значение в 64 кбпс для моно сигнала будет для большинства пользователей оптимальным.

10 минут записи с такими параметрами буду занимать около 5 мб.
Если вы на слух отличите качество записи от указанного вами в 1ом варианте (макс. качества) - то попробуйте поменять битрейт на 12800.


#9

Спасибо за совет, буду пробовать.


#10

Вы не знаете каких-нибудь программных способов сделать запись аудио более чистой, без посторонних шумов? Короче говоря, как сделать максимально приятное звучание записанного аудио? Может есть какие-нибудь библиотеки?


#11

Здравствуйте! Для начала попробуйте установить режим аудиосессии Measurement. https://developer.apple.com/documentation/avfoundation/avaudiosession/mode/1616608-measurement Он дает более чистый звук, в нем не задействована внутренняя постобработка звука.


#12

Спасибо. Изучу этот режим


#13

Подскажите, пожалуйста:
сейчас имею вот такой вид аудиосессии

func setSessionRecord() {
    let session = AVAudioSession.sharedInstance()
    do {
        try session.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker)
        
    } catch {
        print("could not set session category")
        print(error.localizedDescription)
    }
    
    do {
        try session.setActive(true)
    } catch {
        print("could not make session active")
        print(error.localizedDescription)
    }
}

Пытаюсь поставить

try session.setCategory(AVAudioSession.Category.playAndRecord, mode: .measurement, options: .defaultToSpeaker)

Но появляется ошибка в этой сроке Type 'AVAudioSession' has no member 'Category'
Как правильно реализовать?


#14

У вас последняя версия Хкод? Бывало такое у меня в подсах для firestore когда пытался использовать метод по документации , а он как раз выдавал сообщение, что такого метода для этого класса нет (wtf). Оказалось, что просто не обновлял SDK и этот метод добавили недавно - вот и ответ. Может версия Хкода старая?


#15

Xcode 9.2, не самая последняя, но и не такая уж и старая. Подскажите, как тогда мне реализовать правильно опцию mode для AVAudioSession, без обновления до последней версии?


#16

попробуйте обновиться до 9.4, это последняя версия из 9.


#17

тут я не подскажу, потому что по последней документации эпла именно такой пример и такой метод у класса AVAudioSession - и подсказка говорит, что этого метода у этого класса у вас нет…(сам с аудио в коде не работал пока). Самое простое - это обновиться и использовать актуальные методы.


#18

проверил в Xcode 10.1 и 9.4.1

9.4.1
AVAudioSessionCategoryPlayAndRecord

10.1
AVAudioSession.Category

обновление SDK, но по сути это одна и таже запись, т.е. в вашем варианте все верно написано и менять не нужно


#19

Я бы и не трогал, просто по совету @Lexxander хотел использовать режим measurement, может это даст какое-нибудь улучшение в качестве при записи аудио