2016-01-12 11 views
6

scipyのio.wavfile.read関数と同様に、mp3ファイルとwavオーディオファイルをfloatまたはdoubleの配列としてロードしたいとします。私はマイクのデータやオーディオストリームをバッファに書き込むことでこれを行うことができます。しかし、オーディオファイルのすべてのデータを一度に読み込む方法がわかりません。 Swiftのオーディオファイルからfloatの配列を生成するには

- 更新

将来のオーディオ信号データを扱う人のためには、ここにトリックを行う機能です。これは、リズムフィストマンの答えに基づいています。

func loadAudioSignal(audioURL: NSURL) -> (signal: [Float], rate: Double, frameCount: Int) { 
     let file = try! AVAudioFile(forReading: audioURL) 
     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.readIntoBuffer(buf) // You probably want better error handling 
     let floatArray = Array(UnsafeBufferPointer(start: buf.floatChannelData[0], count:Int(buf.frameLength))) 
     return (signal: floatArray, rate: file.fileFormat.sampleRate, frameCount: Int(file.length)) 
    } 
+0

は 'を見てくださいEZAudio':https://github.com/syedhali/EZAudio – dfri

+0

これは素晴らしいライブラリです。ありがとうございます。私はそれをSwiftで私のために働かせるのが難しいです、私は私の質問を更新します。 – Alizaybak

答えて

7

AVAudioFileビルトインのiOS(およびOS X)に、非常に便利であり、またあなたのためのフォーマット変換を行います。

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)\n") 

悲しいことに、十分ではないようダブルスのためにAVAudioPCMBufferfloat64ChannelDataメソッドを持たないため、.PCMFormatFloat32.PCMFormatFloat64に置き換えてください。

更新私は迅速をよく知らないので

あなたは完璧なコレクション型である UnsafeBufferPointer、と協力して、配列のコピーを回避することができ

let floatArray = UnsafeBufferPointer(start: buf.floatChannelData[0], count:Int(buf.frameLength)) 
関連する問題