AVAudioSinkNode 没有信号
AVAudioSinkNode Giving No Signal
上下文:我正在尝试进行实时语音聊天。
我整个星期都在玩 AVAudioSinkNode,所以我可以录制音频,但是出于某种原因,每当我尝试它时,audioBufferList 总是充满零。现在我正在 Swift 游乐场测试它。这是我的代码:
let engine = AVAudioEngine()
let sinkNode = AVAudioSinkNode { (timestep, frames, audioBufferList) -> OSStatus in
let ptr = audioBufferList.pointee.mBuffers.mData?.assumingMemoryBound(to: Float.self)
var monoSamples = [Float]()
monoSamples.append(contentsOf: UnsafeBufferPointer(start: ptr, count: Int(frames)))
for frame in 0..<frames {
print("sink: " + String(monoSamples[Int(frame)]))
}
return noErr
}
engine.attach(sinkNode)
engine.connect(engine.inputNode, to: sinkNode, format: nil)
do {
try engine.start()
CFRunLoopRunInMode(.defaultMode, CFTimeInterval(duration), false)
engine.stop()
} catch {
print("Could not start engine: \(error)")
}
那么这是结果输出:
...
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
Program ended with exit code: 0
我查看了一些类似的问题,但似乎很少有人遇到我的问题。我研究过使用水龙头,但据我所知,这些水龙头不适合像我这样的实时应用程序。
谁能指出我正确的方向?
玩过你的例子后,我可以确认它按预期工作。然而,最初情况并非如此,因为我将我的 Dante Virtual Soundcard 选择为系统范围的音频输入。
将音频输入设置为麦克风后,数字开始反映实际音频信号。
因此,请尝试将您的音频输入设置为您确定可以产生音频的内容。
编辑
正如我们发现的另一种可能失败的方式是未为 XCode 设置使用麦克风的权限。
这些可以使用 System Preferences -> Security & Privacy -> Microphone -> XCode
设置
上下文:我正在尝试进行实时语音聊天。
我整个星期都在玩 AVAudioSinkNode,所以我可以录制音频,但是出于某种原因,每当我尝试它时,audioBufferList 总是充满零。现在我正在 Swift 游乐场测试它。这是我的代码:
let engine = AVAudioEngine()
let sinkNode = AVAudioSinkNode { (timestep, frames, audioBufferList) -> OSStatus in
let ptr = audioBufferList.pointee.mBuffers.mData?.assumingMemoryBound(to: Float.self)
var monoSamples = [Float]()
monoSamples.append(contentsOf: UnsafeBufferPointer(start: ptr, count: Int(frames)))
for frame in 0..<frames {
print("sink: " + String(monoSamples[Int(frame)]))
}
return noErr
}
engine.attach(sinkNode)
engine.connect(engine.inputNode, to: sinkNode, format: nil)
do {
try engine.start()
CFRunLoopRunInMode(.defaultMode, CFTimeInterval(duration), false)
engine.stop()
} catch {
print("Could not start engine: \(error)")
}
那么这是结果输出:
...
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
sink: 0.0
Program ended with exit code: 0
我查看了一些类似的问题,但似乎很少有人遇到我的问题。我研究过使用水龙头,但据我所知,这些水龙头不适合像我这样的实时应用程序。
谁能指出我正确的方向?
玩过你的例子后,我可以确认它按预期工作。然而,最初情况并非如此,因为我将我的 Dante Virtual Soundcard 选择为系统范围的音频输入。
将音频输入设置为麦克风后,数字开始反映实际音频信号。
因此,请尝试将您的音频输入设置为您确定可以产生音频的内容。
编辑
正如我们发现的另一种可能失败的方式是未为 XCode 设置使用麦克风的权限。
这些可以使用 System Preferences -> Security & Privacy -> Microphone -> XCode