IOS Swift 读取 PCM Buffer

标签 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、...Core 和其他内容的文档。我找到的只是 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 术语还不是我的 ;-)

最佳答案

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

关于IOS Swift 读取 PCM Buffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39162519/

相关文章:

c# - 如何创建一个项目来为支持 iOS、Android 和 UWP 的 Xamarin Forms 创建 Nuget 包?

iphone - iOS自定义UITableView中的滚动条

xcode - 设置 NSSplitViews 的最小宽度

iphone - AudioQueueOfflineRender问题

iphone - OS X/iOS - 使用 AudioConverterFillComplexBuffer 进行缓冲区的采样率转换

ios - iOS 中音频文件耗时的毫秒(及更高)精度

ios - Cocoa - 在 NSDictionary 中引用一个 KEY

ios - 使用 Xcode 出现错误 "No such module",但框架在那里

Swift 结构扩展添加初始值设定项

Swift 4 解码简单根级别 json 值