2017-08-19 105 views
0

下面的代码工作对我所有的设备(iPhone,Apple关注,模拟器)持续时间短的音频文件:AVAudioPCMBuffer - 读取(进入缓冲区:AVAudioPCMBuffer)内存崩溃? (缓冲区溢出)

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

看着调试工具,显然这个过程对苹果手表的征税要比iPhone多得多。我试图在不同的线程,背景等上运行它无济于事。

我知道我可以将缓冲区发送到iPhone进行处理,但是如果我可以严格从手表读入缓冲区,我希望看到(即使需要更长的时间)。

回答

0

在44.1kHz下5分钟的单声道LPCM float32音频将是5 * 60 * 44100 * 4个字节,或约53MB。双倍于立体声。我不知道手表的内存限制是什么,但我认为你超过了它们。

+0

是的,它实际上是2通道音频,在调试器手表约70-80mb的内存使用量,然后崩溃。无论如何,我可以减轻苹果手表的负担吗? – devone

+0

你想做什么?你真的需要一次加载5分钟的音频吗?还是解压缩? –

+0

我正在加载缓冲区 - readFile.arrayValues = Array(UnsafeBufferPointer(start:buf!.floatChannelData?[0],count:Int(buf!.frameLength)))从那里我处理这些点以创建一个音频波形。我必须这样做,因为更简单的方法在watchOS上不可用框架。 – devone