AVAudioFile
built-in to iOS (and OS X), is very convenient and will also do format conversions for you:
import AVFoundation
// ...
let url = NSBundle.mainBundle().URLForResource("your audio file", withExtension: "wav")
let file = try! AVAudioFile(forReading: url!)
let format = AVAudioFormat(commonFormat: .PCMFormatFloat32, sampleRate: file.fileFormat.sampleRate, channels: 1, interleaved: false)
let buf = AVAudioPCMBuffer(PCMFormat: format, frameCapacity: 1024)
try! file.readIntoBuffer(buf)
// this makes a copy, you might not want that
let floatArray = Array(UnsafeBufferPointer(start: buf.floatChannelData[0], count:Int(buf.frameLength)))
print("floatArray (floatArray)
")
Sadly, for doubles it doesn't seem to be enough to substitute .PCMFormatFloat32
with .PCMFormatFloat64
because AVAudioPCMBuffer
doesn't have a float64ChannelData
method.
update because I don't know swift well
You can avoid copying the array by working with the UnsafeBufferPointer
, which is a perfectly good collection type:
let floatArray = UnsafeBufferPointer(start: buf.floatChannelData[0], count:Int(buf.frameLength))
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…