AVAudioPCMBuffer - чтение (в буфер: AVAudioPCMBuffer) сбой памяти? (переполнение буфера)

Следующий код работает для аудиофайлов небольшой продолжительности на всех моих устройствах (iPhone, Apple Watch, Simulator):

let file = try! AVAudioFile(forReading: url!) let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: file.fileFormat.sampleRate, channels: file.fileFormat.channelCount, interleaved: false) let buf = AVAudioPCMBuffer(pcmFormat: format!, frameCapacity: UInt32(file.length)) try! file.read(into: buf!)

Сбой происходит в try! file.read(into: buf!) Однако попытка прочитать, например, 5-минутный аудиофайл вызывает сбой на моих Apple Watch (хотя работает на симуляторе Apple Watch). С Program ended with exit code: 0.

Глядя на инструменты отладки, очевидно, что этот процесс гораздо более утомительный для Apple Watch, чем для iPhone. Я пытался запустить его в разных потоках, в фоновом режиме и т. д., но безрезультатно.

Я знаю, что могу отправить буфер на iPhone для обработки, однако я хотел бы посмотреть (даже если это займет немного больше времени), смогу ли я прочитать буфер строго с часов.


person devone    schedule 19.08.2017    source источник


Ответы (1)


5 минут монофонического звука LPCM float32 с частотой 44,1 кГц составляют 5 * 60 * 44100 * 4 байта или около 53 МБ. В два раза больше для стерео. Я не знаю, каковы пределы памяти часов, но я думаю, что вы их превышаете.

person Rhythmic Fistman    schedule 20.08.2017
comment
Да, на самом деле это 2-канальный звук, в отладчике часы используют около 70-80 МБ памяти, а затем падают. Можно ли как-то уменьшить нагрузку на Apple Watch? - person devone; 20.08.2017
comment
Что ты пытаешься сделать? Вам действительно нужно загрузить 5 минут аудио сразу? Или распаковать? - person Rhythmic Fistman; 20.08.2017
comment
Я загружаю буфер в — readFile.arrayValues ​​= Array(UnsafeBufferPointer(start: buf!.floatChannelData?[0], count:Int(buf!.frameLength))) оттуда я обрабатываю точки для создания звуковой волны. Я должен сделать это так, потому что более простые способы сделать это недоступны в фреймворках watchOS. - person devone; 20.08.2017
comment
Не все аудиосэмплы должны присутствовать в памяти одновременно, чтобы отрисовать прилично выглядящую форму сигнала, вы можете обрабатывать аудиофайл небольшими частями. - person Rhythmic Fistman; 20.08.2017