Swift - 无法找出 AudioKit 中的简单 "Mic->Effect->File"链

标签 swift audiokit

我想在 Swift 中使用 AudioKit 做一个简单的“记录用户的麦克风 -> 应用效果 -> 保存到 wav 文件”链。

下面是我尝试使用的代码。相反,我得到的是通过耳机听到输出(应用了音高效果),但输出文件是空的。我做错了什么?

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.")
        }
    }
}

最佳答案

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

  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的Cookbook,这个例子会有所帮助:https://github.com/AudioKit/Cookbook/blob/main/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/MiniApps/Recorder.swift

关于Swift - 无法找出 AudioKit 中的简单 "Mic->Effect->File"链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77738166/

相关文章:

iOS swift : How to create object like UIAlertView that seemingly nils itself out after dismissal

swift - 使用 Swift 从 firebase 数据库读取

ios - 使用 AudioKit 将音频文件作为麦克风输入播放 - 用于 iOS 模拟器听写测试

swift - 如何在 AudioKit 中使用包络重放振荡器?

objective-c - 将 AudioKit 与 Objective-C 结合使用

ios - 点击按钮后更改先前 View 的图像(Swift)

swift - 使用 addSubview 将 UIView 移动到其他 UIView 中

ios - swift 中类似 Tinder 的导航

ios - AudioKit Playground (错误 : 'Module compiled with Swift 3.1 cannot be imported in Swift 3.0.2' )

ios - AudioKit(仍然)缺少用于对音频文件进行排序的时钟