我想用SWIFT中的AudioKit做一个简单的"录制用户的麦克风--应用效果--保存到wav文件"链.

以下是我正在try 使用的代码.相反,我得到的是通过耳机(应用了音调效果)听到输出,但输出文件是空的.我做错了什么?

import AudioKit
import AVFoundation
import SoundpipeAudioKit

class AudioRecorder: ObservableObject {
  
    let engine = AudioEngine()
    var recoder: NodeRecorder?

    private(set) lazy var outputFileURL: URL = {
        let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
        return documentsPath.appendingPathComponent("recording.wav")
    }()

    func startRecording() {
        do {
            try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker])
            try AVAudioSession.sharedInstance().setActive(true)
        } catch {
            print("Failed to set up recording session.")
            return
        }

        guard let input = engine.input else {
            print("No audio input found")
            return
        }

        do {
            recorder = try NodeRecorder(node: input, fileDirectoryURL: outputFileURL)
        } catch let err {
            fatalError("\(err)")
        }
        let pitchShifter = PitchShifter(input)
        engine.output = pitchShifter

        do {
            try engine.start()
        } catch {
            print("Unable to start audio engine: \(error.localizedDescription)")
            return
        }
    }

    func stopRecording() {
        engine.stop()
        do {
            try AVAudioSession.sharedInstance().setActive(false)
        } catch {
            print("Failed to stop recording session.")
        }
    }
}

推荐答案

try 更改以下内容以使其正常工作:

  1. var recoder: NodeRecorder?号线 更改为var recorder: NodeRecorder?//缺少r

  2. return documentsPath.appendingPathComponent("recording.wav")行更改为return documentsPath // NodeRecorder需要一个目录,而不是fileDirectoryURL中的文件

  3. 在添加录音机之前,先将pitchShifter添加到录音机中,因为您要录制转换后的音频.

  4. 分两个不同的步骤录制并保存到.waf.NodeRecorder记录到一个临时的.caf文件,然后您可以移动或编码并发送.

  5. NodeRecorder有一些内置的文件管理,小心shouldCleanupRecordings:,因为它的默认值为true

-

let pitchShifter = PitchShifter(input)

do {
    recorder = try NodeRecorder(node: pitchShifter, fileDirectoryURL: outputFileURL, shouldCleanupRecordings:false)
} catch let err {
    fatalError("\(err)")
}
engine.output = pitchShifter

此外,请查看AudioKit的食谱,这个例子将会有所帮助:https://github.com/AudioKit/Cookbook/blob/main/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/MiniApps/Recorder.swift

Swift相关问答推荐

如何使用快速宏用来自函数的关联值来初始化枚举?

对多个项目的数组进行排序

我在SwiftUI中的动画无法正常工作

是否可以循环遍历SWIFT子类并访问它们的静态变量S?

同时具有每个文本的标识符的文本组的可扩展性标识符

SwiftData/PersistentModel.swft:540:致命错误:不支持的关系密钥路径ReferenceWritableKeyPath

调度组是否阻止iOS中的主线程?

如何增加 NSStatusBar 图像大小?

如何绑定环境变量ios17

Swift iOS:确定贝塞尔曲线路径是否与 UIView 框架相交?

为什么 SwiftUI 中 ForEach 的这个 Select 不起作用?

需要将 json 映射到 Swift 中的模型

在 struct 中的序列和非序列泛型函数之间进行 Select

为什么 NumberFormatter 在 Swift 中将 19,999,999,999,999,999 格式化为 20,000,000,000,000,000?

按钮图像不会立即刷新

如何 for each 用户制作一个单独的按钮,以便在按下它时切换 isFollowingUser Bool 并更改为关注?

Swift 函数 vs 惰性变量 vs 计算(computed)属性 - 区别?

更新我的 pod 导致 GoogleDataTransport Umbrella 标头出现错误

不能从非开放类继承 swift

如何在 iOS 上的 Swift 中获取 sharedApplication?