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
Swift 获取设备音频输出_Swift_Macos_Cocoa_Audio - Fatal编程技术网

Swift 获取设备音频输出

Swift 获取设备音频输出,swift,macos,cocoa,audio,Swift,Macos,Cocoa,Audio,我正在尝试获取我的Mac电脑的主音频输出,并点击它,然后使用语音在上面发送文本 我目前一直在使用的部分是获取我的Mac主声音输出。例如,如果我进入Youtube播放视频,它会将声音输出到我的笔记本电脑扬声器。我正试图利用这个输出 我正在使用 AVAudioEngine.mainMixerNode 但是,我没有得到任何输出。我还尝试了AVAudioEngine.outputNode 以下是我尝试过的: engine = AVAudioEngine() let _ = engine.mainMix

我正在尝试获取我的Mac电脑的主音频输出,并点击它,然后使用语音在上面发送文本

我目前一直在使用的部分是获取我的Mac主声音输出。例如,如果我进入Youtube播放视频,它会将声音输出到我的笔记本电脑扬声器。我正试图利用这个输出

我正在使用

AVAudioEngine.mainMixerNode
但是,我没有得到任何输出。我还尝试了
AVAudioEngine.outputNode

以下是我尝试过的:

engine = AVAudioEngine()
let _ = engine.mainMixerNode
engine.prepare()
do {
    try engine.start()
} catch {
    print("Start Error")
    return
}

do {
    let settings = engine.mainMixerNode.outputFormat(forBus: 0).settings
    print("FileType: \(settings[AVAudioFileTypeKey])") // Returns nil
    self.file = try! AVAudioFile(forWriting: url, settings: settings)
    
    engine.mainMixerNode.installTap(onBus: 0, bufferSize: 1024, format: nil) { // I've tried with a format and without
        (buffer: AVAudioPCMBuffer?, time: AVAudioTime!) -> Void in
        do {
            // Buffer must be empty because the CAF audio length is correct, but there's no sound. It's flat.
            try self.file.write(from: buffer!)
        } catch _{
            print("Problem Writing Buffer")
        }
    }
}
上述代码已设置了
隐私-麦克风使用说明
。(即使我不想轻敲麦克风)

这里的第一个问题是,我不确定输出应该使用什么文件类型。我试过
CAF
,但在
GarageBand
中打开它不会发出声音(虽然有长度) 我尝试将文件重命名为
m4a
wav
,但苹果的
音乐
就是不想播放它

我做错了什么?
非常感谢您的帮助。

不幸的是,像这样访问系统声音输出并不是一件小事(从安全角度来看,这可能是一件好事)

解决方案通常包括设置一个可以播放音频的“假”音频设备,而不是您选择的默认输出设备。例如,黑洞()和更老的SoundFlower()使用的就是这种方法。这两个链接都指向源代码,您可以开始深入挖掘,看看它们是如何实现这一点的——同样,这一点比答案更深入

就您正在探索的
mainMixerNode
而言,尽管名称听起来像是一个系统范围的设备,但它实际上只是控制应用程序声音的混音器。所以,虽然你可以点击它,但它只会让你访问你正在播放的内容。这就是为什么您录制的文件是平面的——除非您正在播放输出,否则它不会被录制