IOS快速读取PCM缓冲区
我有一个Android项目,可以从麦克风缓冲区读取带有PCM数据的IOS快速读取PCM缓冲区,ios,swift,core-audio,audio-recording,pcm,Ios,Swift,Core Audio,Audio Recording,Pcm,我有一个Android项目,可以从麦克风缓冲区读取带有PCM数据的short[]阵列,用于实时分析。我需要将此功能转换为iOS Swift。在安卓系统中,它非常简单,看起来像这样 import android.media.AudioFormat; import android.media.AudioRecord; ... AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, someSampleRate
short[]
阵列,用于实时分析。我需要将此功能转换为iOS Swift。在安卓系统中,它非常简单,看起来像这样
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[]
(这就是我要找的)
文件:
我对斯威夫特和iOS很陌生。我读过很多关于AudioToolkit,…Core之类的文档。我只找到了C++/Obj-C和桥接Swift头解决方案。这对我来说是太先进和过时了
现在我可以用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()
但这不是我想要的(或者?)。是否有一种优雅的方式来实现上述androidread
功能?我需要从麦克风缓冲区获取一个样本阵列。还是我需要读取记录的CAF文件
非常感谢!请帮助我简单的解释或代码示例。iOS术语还不是我的;-) 如果您不介意浮点采样和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()
}
我在这里发布了一个关于使用Swift 2中的RemoteIO音频单元阅读音频样本的简短要点:非常感谢您的帮助。我见过buffer.int16ChannelData是由API提供的,但当我调用它时,我得到了EXC_BAD_访问错误。我想这是零。有没有办法配置inputNode来提供这些信息?它是nil,因为输入总线只提供浮点数据。如果你想要一种不同的格式,我想你可以通过附加一个
AVAudioOutputNode
和所需的格式并在上面安装点击来实现。我是否需要连接AVAudioOutputNode
和AVAudioOutputNode
来转换输入float
数据?如何在AVAudioInputNode
上安装tap?对不起,我不习惯TapOnBus方法和Apple API。