Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IOS快速读取PCM缓冲区_Ios_Swift_Core Audio_Audio Recording_Pcm - Fatal编程技术网

IOS快速读取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

我有一个Android项目,可以从麦克风缓冲区读取带有PCM数据的
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()
但这不是我想要的(或者?)。是否有一种优雅的方式来实现上述android
read
功能?我需要从麦克风缓冲区获取一个样本阵列。还是我需要读取记录的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。