2016-08-26 7 views
2

私はライブ分析のためにマイクバッファーからのPCMデータでshort[]アレイを読み取るAndroidプロジェクトを持っています。この機能をiOS Swiftに変換する必要があります。 Androidのでは、それは非常に単純であり、このようになります。..IOSスウィフトリードPCMバッファー

import android.media.AudioFormat; 
import android.media.AudioRecord; 
... 
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, someSampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, AudioRecord.getMinBufferSize(...)); 
recorder.startRecording(); 

後、私は(それは私が探しているものです)

recorder.read(data, offset, length); //data is short[] 

ドキュメントバッファを読んで:https://developer.android.com/reference/android/media/AudioRecord.html

私はSwiftとiOSの新機能です。私はAudioToolkitに関する多くのドキュメントを読んだことがあります。私が見つけたのはC++/Obj-CとBridging Swift Headerのソリューションでした。それはずっと先進的であり、私のために時代遅れです。

今の私は

settings = [ 
     AVLinearPCMBitDepthKey: 16 as NSNumber, 
     AVFormatIDKey: Int(kAudioFormatLinearPCM), 
     AVLinearPCMIsBigEndianKey: 0 as NSNumber, 
     AVLinearPCMIsFloatKey: 0 as NSNumber, 
     AVSampleRateKey: 12000.0, 
     AVNumberOfChannelsKey: 1 as NSNumber, 
     ] 
... 
recorder = try AVAudioRecorder(URL: someURL, settings: settings) 
recorder.delegate = self 
recorder.record() 

AVFoundation

とCAF-ファイルへのPCM-データを読み取ることができますしかし、それは私が探しているものではないのです(または?)。上記のアンドロイド read機能を実現するエレガントな方法はありますか?私は、マイクロホンのバッファからサンプル配列を取得する必要があります。または、記録されたCAFファイルの読書をする必要がありますか?

ありがとうございます!簡単な説明やコード例で私を助けてください。 IOS用語では、ポイントサンプルと48kHzのフローティング気にしない場合、あなたはすぐにそうようにマイクからの音声データを取得することができ、まだ;-)

+1

私は読書に短い要旨を掲載しましたここでSwift 2のRemoteIO Audio Unitを使用したオーディオサンプル:https://gist.github.com/hotpaw2/ba815fc23b5d642705f2b1dedfaf0107 – hotpaw2

答えて

2

鉱山ではありません。

let engine = AVAudioEngine() // instance variable 

func setup() {   
    let input = engine.inputNode! 
    let bus = 0 

    input.installTapOnBus(bus, bufferSize: 512, format: input.inputFormatForBus(bus)) { (buffer, time) -> Void in 
     let samples = buffer.floatChannelData[0] 
     // audio callback, samples in samples[0]...samples[buffer.frameLength-1] 
    } 

    try! engine.start() 
} 
+0

ありがとうございました。私はbuffer.int16ChannelData APIによって提供されて見たことがあるが、私はそれを呼び出すと、EXC_BAD_ACCESSエラーが発生します。私はこれがゼロだと思う。これらの情報を提供するためにinputNodeを設定する方法はありますか? – Robin

+1

入力バスはフロート・データのみを供給するため、nilです。別のフォーマットが必要な場合は、希望するフォーマットの 'AVAudioOutputNode'をアタッチし、それにタップをインストールすることで、これを行うことができます。 –

+0

'AVAudioInputNode'を' AVAudioOutputNode'と接続して 'float'データを変換する必要がありますか? 'AVAudioInputNode'にタップをインストールするには?申し訳ありませんが、私はTapOnBusの方法論とApple APIに慣れていません。 – Robin