2016-08-26 128 views
2

我有一个Android项目,通过麦克风缓冲区中的PCM数据读取short[]阵列进行实时分析。我需要将此功能转换为iOS Swift。在Android中是非常简单的,看起来像这样..IOS Swift读取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,Core以及其他的文档。我发现的只是C++/Obj-C和Bridging Swift Header解决方案。这对我来说很先进和过时。

现在我可以读取PCM-数据为CAF-文件与AVFoundation

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() 

但是这不是我要找的(或?)。有没有一种优雅的方式来实现上述的android read功能?我需要从麦克风缓冲区获取样本数组。或者我需要在记录的CAF文件上进行阅读?

非常感谢!请帮助我简单的解释或代码示例。 iOS的术语不是我尚未;-)

+1

我贴一个短要点上阅读在Swift 2中使用RemoteIO Audio Unit进行音频采样:https://gist.github.com/hotpaw2/ba815fc23b5d642705f2b1dedfaf0107 – hotpaw2

回答

2

如果你不介意的浮点样品和48kHz的,你可以快速地从麦克风获取的音频数据,像这样:

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

它是零,因为输入总线只发送浮动数据。如果你想要一种不同的格式,我想你可以通过附加一个具有所需格式的AVAudioOutputNode来完成,并在其上安装tap。 –

+0

我是否需要将'AVAudioInputNode'与'AVAudioOutputNode'连接来转换输入的'float'数据?我如何在“AVAudioInputNode”上安装Tap?对不起,我不习惯TapOnBus方法和Apple API。 – Robin