使用AVAudioUnitSampler时,我在iPhone(iOS 11)上遇到了一个奇怪的问题.
假设我有一个用钢琴声音初始化的AVAudioUnitSampler.因此,每次连接或断开耳机时,我都会听到钢琴声音加上正弦波音,声音越大,连接/断开耳机的次数越多.
因此,对我而言,每次耳机插入/拔出时都会感觉到,新的音频单元采样器将内部连接到声音输出(并且,由于它是未初始化的,因此仅产生正弦波音调).
以下类已经显示了该问题.请注意,我正在使用AudioKit来处理MIDI信号并触发采样器(虽然在这一端,一切似乎工作正常,即.startNote()并stopNote()正确调用):
class MidiController: NSObject, AKMIDIListener {
var midi = AKMIDI()
var engine = AVAudioEngine()
var samplerUnit = AVAudioUnitSampler()
override public init() {
super.init()
NotificationCenter.default.addObserver(
self,
selector: #selector(handleRouteChange),
name: .AVAudioSessionRouteChange,
object: nil)
midi.openInput()
midi.addListener(self)
engine.attach(samplerUnit)
engine.connect(samplerUnit, to: engine.outputNode)
startEngine()
}
func startEngine() {
if (!engine.isRunning) {
do {
try self.engine.start()
} catch {
fatalError("couldn't start engine.")
}
}
}
@objc func handleRouteChange(notification: NSNotification) {
let deadlineTime = DispatchTime.now() + …Run Code Online (Sandbox Code Playgroud) 我刚刚将xCode更新到最新版本,并在尝试构建时遇到错误.
"使用Swift 4.0编译的模块无法在Swift 3.2.2中导入:/Users/james/Documents/MyApp/Pods/AudioKit/iOS/AudioKit.framework/Modules/AudioKit.swiftmodule/x86_64.swiftmodule"
在我升级最新的xCode之前它正在工作.
我正在尝试扩展 AKNode 和 AKToggelable,此错误出现在 Project-Swift.h 文件中
有什么方法可以做到这一点?
我的班级是
class AKCustom: AKNode, AKToggleable, AKComponent, AKInput {
public typealias AKAudioUnitType = AKBalancerDeplikeAudioUnit
public static let ComponentDescription = AudioComponentDescription(mixer: "dpba")
private var internalAU: AKAudioUnitType?
open dynamic var isStarted: Bool {
return internalAU?.isPlaying() ?? false
}
public init( _ input: AKNode? = nil) {
_Self.register()
super.init()
AVAudioUnit._instantiate(with: _Self.ComponentDescription) { [weak self] avAudioUnit in
self?.avAudioNode = avAudioUnit
self?.internalAU = avAudioUnit.auAudioUnit as? AKAudioUnitType
input?.connect(to: self!)
}
}
open func start() {
internalAU?.start()
}
open func stop() …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用内置麦克风录制音频并通过远程扬声器同时播放。我使用 AudioKit 的方式如下:
import UIKit
import AudioKit
class ViewController: UIViewController {
let session = AVAudioSession.sharedInstance()
let mic = AKMicrophone()
let reverb = AKReverb()
override func viewDidLoad() {
super.viewDidLoad()
mic >>> reverb
AudioKit.output = reverb
AKSettings.ioBufferDuration = 0.002
}
@IBAction func buttonWasPressed() {
printDevices()
try! AudioKit.start()
printDevices()
}
@IBAction func buttonWasReleased() {
try! AudioKit.stop()
}
func printDevices() {
// List of output devices:
if let outputs = AudioKit.outputDevices {
print("Outputs:")
dump(outputs)
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,即使在执行后连接蓝牙扬声器,AudioKit.start()唯一可用的输出设备也是内置接收器(因此,无法更改AudioKit.output属性)。
另一个问题 …
我已经开始尝试使用AudioKit - 可爱的框架,但是我遇到了一些我无法追踪的崩溃.
为了开始,我想构建一个音序器,我在这个媒体帖子中跟随了这个例子:https://medium.com/@oleary.audio/building-a-midi-sequence-in-swift-bed5f5c2bb7d并且还添加了一些使用回调工具(如此处所述:AudioKit ios AKSamplerMetronome)帮助可视化在音序器中播放的当前步骤的代码.
当我在应用程序中时,一切运行正常,但是如果我退出并在后台退出应用程序并重新进入,则随机(每4-5次尝试一次)崩溃,堆栈跟踪我不明白(请参阅下面)

我不确定是什么导致这个,或者可能调用我在调试器中看到的AKMIDIInstrument.enableMIDI函数.任何提示都非常感谢.
编辑:我必须补充说,这只发生在物理设备上,我无法在模拟器中重现它.
编辑2:我也尝试将回调乐器的回调函数移到视图控制器之外,并设置一个委托来更改视图,认为视图控制器的生命周期可能会以某种方式影响它,但问题仍然存在.
这是我的代码的简化版本供参考:
class AudioCore {
static let sharedInstance = AudioCore()
let osc = AKOscillatorBank()
let sequencer = AKSequencer()
let callbackTrack:AKMusicTrack?
let soundTrack:AKMusicTrack?
let callbackInstrument = AKCallbackInstrument()
let midi = AKMIDI()
init() {
let midiNode = AKMIDINode(node: osc)
AudioKit.output = midiNode
do {
try AudioKit.start()
}
catch {
AKLog("Audio kit failed to start")
}
if let track = sequencer.newTrack(){
callbackTrack = track
callbackTrack?.setMIDIOutput(callbackInstrument.midiIn)
} else { …Run Code Online (Sandbox Code Playgroud) 使用 AudioKit,我正在尝试构建一个应用程序来分析麦克风的输入并将传入的声音分成 3 个频率范围(低、中、高)及其振幅。
这是我的代码:
class ViewController: UIViewController {
var mic: AKMicrophone!
var amplitude: AKAmplitudeTracker!
var fftTap: AKFFTTap?
var timer: Timer!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
mic = AKMicrophone()
fftTap = AKFFTTap.init(mic)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
do {
try AudioKit.start()
} catch {
AKLog("AudioKit did not start!")
}
mic.start()
timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true, block: { (timer) in
for i in 0...256 …Run Code Online (Sandbox Code Playgroud) 我们的项目遇到异常:
2019-08-08 10:18:28.703708-0600 AppName[99385:5069475] *** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: !destNodeMixerConns.empty() && !isDestNodeConnectedToIONode'
*** First throw call stack:
(
0 CoreFoundation 0x000000010ee2e8db __exceptionPreprocess + 331
1 libobjc.A.dylib 0x000000010e21bac5 objc_exception_throw + 48
2 CoreFoundation 0x000000010ee2e662 +[NSException raise:format:arguments:] + 98
3 AVFAudio 0x0000000111b94dbc _Z19AVAE_RaiseExceptionP8NSStringz + 156
4 AVFAudio 0x0000000111bf3937 _Z11_AVAE_CheckPKciS0_S0_b + 295
5 AVFAudio 0x0000000111b8cb8f _ZN18AVAudioEngineGraph8_ConnectEP19AVAudioNodeImplBaseS1_jjP13AVAudioFormat + 1031
6 AVFAudio 0x0000000111bfb598 _ZN17AVAudioEngineImpl7ConnectEP11AVAudioNodeS1_mmP13AVAudioFormat + 194
7 AVFAudio 0x0000000111bfb5ff -[AVAudioEngine connect:to:format:] + 83
8 AppName 0x000000010a424c10 $s8AudioKitAAC6outputAA6AKNodeCSgvWZTf4dd_n …Run Code Online (Sandbox Code Playgroud) 所有最近的 iPhone 都有 2 个以上的麦克风。是否可以同时从所有麦克风录音?如果可能,最好的 iOS 音频库是什么(AudioKit、EzAudio、AudioUnits、CoreAudio)?AudioKit 和 EzAudio 中没有提到这个功能。
AudioKit 包括一个很好的工具来跟踪信号幅度: AKAmplitudeTracker
这个跟踪器可以用一个 thresholdCallback 初始化,我想回调应该在达到阈值时触发。
我正在使用MicrophoneAnalysis 示例,但找不到触发回调的方法。
这是我的代码:
var mic: AKMicrophone!
var trackerAmplitude: AKAmplitudeTracker!
var silence: AKBooster!
AKSettings.audioInputEnabled = true
mic = AKMicrophone()
trackerAmplitude = AKAmplitudeTracker(mic, halfPowerPoint: 10, threshold: 0.01, thresholdCallback: { (success) in
print("thresholdCallback: \(success)")
})
trackerAmplitude.start()
silence = AKBooster(trackerAmplitude, gain: 0)
AudioKit.output = silence
Run Code Online (Sandbox Code Playgroud)
我尝试使用halfPowerPoint和threshold值,但即使值很低,我也找不到打印任何东西的方法:/
而当我打印时trackerAmplitude.amplitude,我的值高于0.01
有什么我想念的吗?
当我使用 XCode 14 在 iOS 14 设备上运行代码时,出现此错误。
dyld: Symbol not found: _$s7SwiftUI15GraphicsContextV4fill_4with5styleyAA4PathV_AC7ShadingVAA9FillStyleVtF
Referenced from: ******
Expected in: /System/Library/Frameworks/SwiftUI.framework/SwiftUI
dyld: launch, loading dependent libraries
DYLD_LIBRARY_PATH=/usr/lib/system/introspection
DYLD_INSERT_LIBRARIES=/Developer/usr/lib/libBacktraceRecording.dylib:/Developer/usr/lib/libMainThreadChecker.dylib:/usr/lib/libMTLCapture.dylib:/Developer/Library/PrivateFrameworks/DTDDISupport.framework/libViewDebuggerSupport.dylib
Run Code Online (Sandbox Code Playgroud)
当我在 iOS 15 或 iOS 16 设备上运行相同的代码时,我没有收到任何错误。
我该如何解决这个问题?
编辑:删除 AudioKit 和 AudioKitUI swift 包可以解决该问题。AudioKit 开发人员需要研究这一点。