IOS Swift读取PCM缓冲区

时间:2016-08-26 09:07:17

标签: ios swift core-audio audio-recording pcm

我有一个Android项目,用于读取short[]数组,其中包含来自麦克风缓冲区的PCM数据,用于实时分析。我需要将此功能转换为iOS Swift。在Android中,它非常简单,看起来像这样..

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解决方案。这对我来说已经很先进和过时了。

现在我可以通过AVFoundation将PCM数据读取到CAF文件

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 个答案:

答案 0 :(得分:3)

如果您不介意浮点样本和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()
}