AudioKit - 记录默认输入(麦克风)而不将其发送到输出

Posted

技术标签:

【中文标题】AudioKit - 记录默认输入(麦克风)而不将其发送到输出【英文标题】:AudioKit - record the default input (microphone) without sending it to output 【发布时间】:2017-11-18 22:21:49 【问题描述】:

这可能是一个非常愚蠢的问题,因为我对 AudioKit 和 ios 音频很陌生。我想要实现的是从我的麦克风录制一个剪辑(或只是一个简单的记录到文件)。

我不希望我的应用程序将输入(来自麦克风)直接发送到输出,我的意思是我希望在录制或使用我的应用程序时将麦克风静音(主要是因为我在调试时收到反馈,我想取消静音它例如,当用户戴着耳机时)。

尝试在我的AppDelegate.swift -> application 函数中使用AKSettings.audioInputEnabledAKSettings.defaultToSpeaker(这是这样做的正确位置吗?)但无法按我的意愿工作。还尝试通过助推器连接麦克风并将增益设置为 0,但随后它记录了空文件。

也许我没有使用正确的术语,所以如果你纠正我,我会很高兴。

这是我的一段代码

AppDelegate.swift

AKSettings.defaultToSpeaker = true
AKSettings.audioInputEnabled = false
try! AKSettings.setSession(category: .playAndRecord)

记录代码(使用clipRecorder,但我猜这个问题也适用于普通记录器):

var mixer: AKMixer?
let length = 4.0
let microphone = AKMicrophone()
/* ... */
let booster = AKBooster(microphone)
booster.gain = 0
self.mixer = AKMixer(booster)
AudioKit.output = self.mixer
AudioKit.start()
/* ... */
self.clipRecorder = AKClipRecorder(node: mixer)
try clipRecorder.recordClip(time: clipRecorder.currentTime, duration: length, tap: nil, completion:  url, something, err in
    /* ... */
 catch 
    print("error")

非常感谢 AudioKit 伙计们,如果不麻烦的话,我也希望能提供更多关于我做错了什么以及为什么做错的解释。

编辑:按照 Aurelius 的要求提供当前代码,问题是如果我将增益设置为 0,我确实听不到麦克风反馈,但所有记录都是完全静音。

AppDelegate.swift

AKSettings.defaultToSpeaker = true
AKSettings.audioInputEnabled = true
try! AKSettings.setSession(category: .playAndRecord)

ViewController.swift

override func viewDidLoad() 
    super.viewDidLoad()
    silence = AKBooster(mic, gain: 0)
    //mixer = AKMixer(silence)
    AudioKit.output = silence
    AudioKit.start()
    clipRecorder = AKClipRecorder(node: silence!)
    clipRecorder?.play()


@IBAction func recordButtonPressed(_ sender: Any) 
    print("perssed")
    do 
        try clipRecorder?.recordClip(time: (clipRecorder?.currentTime)!, duration: 3.0, tap: nil, completion: url,_,_ in
            print("done")
        )
     catch 
        print("error")
    

编辑 2: 好的,经过几个小时与自己的斗争,我发现出了什么问题,而且奥勒留斯确实是对的,这只是事情的顺序。录音机当然需要在静音前配备助推器(增益 = 0),录音机在去扬声器时获得正确的静音值。对于我上面提供的示例,修复非常简单 - ViewController.swift

override func viewDidLoad() 
    super.viewDidLoad()
    silence = AKBooster(mic)
    clipRecorder = AKClipRecorder(node: silence!)
    silence.gain = 0
    AudioKit.output = silence
    AudioKit.start()

    clipRecorder?.play()


@IBAction func recordButtonPressed(_ sender: Any) 
    print("perssed")
    do 
        try clipRecorder?.recordClip(time: (clipRecorder?.currentTime)!, duration: 3.0, tap: nil, completion: url,_,_ in
            print("done")
        )
     catch 
        print("error")
    

【问题讨论】:

【参考方案1】:

我认为您需要将助推器放在您正在录制的节点之后。您想记录常规级别,然后将其发送到增益设置为零的助推器。

【讨论】:

感谢 Aurelius,在应用程序运行的所有其他时间(不仅在录制时),我仍然能听到来自麦克风的反馈。尝试使用助推器的位置,但也不得不更改AudioKit.output = self.mixer, AudioKit.start(),我觉得我做错了什么。 如果助推器的增益为零,我看不出你怎么能听到里面的任何声音。你能分享你的项目吗? 再次感谢 Aurelius,我回家后会提供代码,我现在看到了您编写的本教程,我猜,audiokit.io/examples/MicrophoneAnalysis 如果我理解您在本教程/示例上方的回答应该是我需要对吗?我可以看到它在这里使用了你所说的助推器。 您好 Aurelius,提供的代码,仍然无法获取它录制声音并且没有得到反馈。如果您能帮我解决这个问题,我将不胜感激,谢谢! 好的,找出我做错了什么,为我的问题提供正确的代码 (Edit2),非常感谢 Aurelius。

以上是关于AudioKit - 记录默认输入(麦克风)而不将其发送到输出的主要内容,如果未能解决你的问题,请参考以下文章

Swift:声音输出和麦克风输入 |使用 AudioKit |

AudioKit iOS 设置输入输出设备

在 AudioKit 中过滤音频

试图了解 AudioKit 中 AKFFTTap 的输出

AudioKit 请求访问麦克风

AudioKit (iOS) - 为频率/幅度变化添加观察者