2017-01-27 3 views
5

Я пишу приложение для записи одноканального звука со встроенным микрофоном на iPhone 6. Приложения работают так, как ожидалось, когда они настроены для записи на 8000 Гц. Вот кодКак записать на низком образце (около 1000 Гц) на iPhone

// Set up audio session 
    let session = AVAudioSession.sharedInstance() 

    // Configure audio session 
    do { 
     try session.setCategory(AVAudioSessionCategoryPlayAndRecord) 

     var recordSettings = [String:AnyObject]() 
     recordSettings[AVFormatIDKey] = Int(kAudioFormatLinearPCM) as AnyObject 

     // Set the sampling rate 
     recordSettings[AVSampleRateKey] = 8000.0 as AnyObject 
     recordSettings[AVNumberOfChannelsKey] = 1 as AnyObject 

     recorder = try AVAudioRecorder(url: outputFileURL, settings: recordSettings) 

     recorder?.delegate = self 
     recorder?.isMeteringEnabled = true 

     recorder?.prepareToRecord() 

     return true 

    } 
    catch { 
     throw Error.AVConfiguration 
    } 

Для снижения требований к хранению, я хотел бы записать на гораздо более низкой частотой дискретизации (в идеале менее 1000 Гц). Если я установил частоту дискретизации до 1000 Гц, приложение записывается с частотой 8000 Гц.

Согласно документации Apple,

Доступный диапазон для частоты дискретизации аппаратных средств зависит от устройства. Обычно он колеблется от 8000 до 48000 герц.

Вопрос ... можно ли использовать AVAudioSession (или другие рамки) для записи звука при низкой частоте дискретизации?

+0

Почему вы не используете другой формат, такой как aac вместо несжатого pcm? Если вы используете кодек, размер файла резко сократится – manishg

+1

Я предполагаю, что вам действительно нужна * без потерь * запись частот в диапазоне ~ 50-500 Гц (приблизительный предел микрофона до предела nyqvist)? В противном случае это довольно плохой способ экономии места. – Krumelur

ответ

6

Запись звука на iPhone производится с помощью аппаратных кодеков, поэтому доступные частоты кадров жестко запрограммированы и не могут быть изменены. Но если вам нужно иметь частоту дискретизации 1 кГц, вы можете записывать ее на частоте 8 кГц, а не просто перевыполнять запись с помощью библиотеки повторной выборки. Лично я предпочитаю использовать ffmpeg для таких задач.

+0

Это правильный ответ, но я бы добавил, что если требуется только повторная выборка, возможно, меньшую библиотеку, такую ​​как libresample или libsoxr, легче интегрировать, чем весь ffmpeg. – Krumelur

5

Я надеюсь, что вы знаете, что самая niquist theorem вы не можете ожидать очень полезных результатов того, что вы пытаетесь достичь.

То есть, кроме Вы ориентируетесь на только на низких частотах. В этом случае вы можете сначала использовать фильтр нижних частот. Это почти невозможно понять голосов с частотами olny ниже 500 Hz. Говорят, что обычно говорят, что требуется 3 kHz, что соответствует частоте дискретизации 6000.

Для приведен пример из , что вы должны были бы ожидать попробовать что-то похожее на:

ffmpeg -i tst.mp3 -ar 1000 tst.wav 

с, например, некоторые вокалы и послушать результат. Вы можете, однако, достичь некоторого приемлемого компромисса с использованием, например, скорость выборки 3000.

Альтернативой было бы сделать некоторые сжатияна лету, как @manishg предложил. Поскольку смартфоны в эти дни могут делать сжатие видео в реальном времени, это должно быть полностью осуществимо с помощью жесткого и программного обеспечения iPhone. Но это совершенно другая вещь, чем снижение частоты отсчетов .

Смежные вопросы