AVAudioEngine 录制麦克风输入似乎在播放音乐时停止
AVAudioEngine recording microphone input seems to stop upon playing music
我正在录制麦克风输入以将其与 Shazam 目录中的歌曲相匹配。这行得通,但是如果我 start()
AVAudioEngine
然后会发生一些事情,比如音乐开始通过 MPMusicPlayerController.applicationMusicPlayer.play()
播放,似乎音频引擎停止或被中断。麦克风录音关闭,因此 SHSessionDelegate
永远找不到匹配项或因错误而失败,所以我的 UI 卡住了,显示它正在听,但它不再听了。发生这种情况时有没有办法通知我,以便我可以更新 UI 来处理取消?
private lazy var shazamAudioEngine = AVAudioEngine()
private lazy var shazamSession: SHSession = {
let session = SHSession()
session.delegate = self
return session
}()
...
try? AVAudioSession.sharedInstance().setCategory(.record)
//Create an audio format for our buffers based on the format of the input, with a single channel (mono)
let audioFormat = AVAudioFormat(standardFormatWithSampleRate: shazamAudioEngine.inputNode.outputFormat(forBus: 0).sampleRate, channels: 1)
//Install a "tap" in the audio engine's input so that we can send buffers from the microphone to the session
shazamAudioEngine.inputNode.installTap(onBus: 0, bufferSize: 2048, format: audioFormat) { [weak self] buffer, when in
//Whenever a new buffer comes in, we send it over to the session for recognition
self?.shazamSession.matchStreamingBuffer(buffer, at: when)
}
do {
try shazamAudioEngine.start()
} catch {
...
}
在我的测试中,isRunning
跟踪此状态,因此当您开始播放音乐并且麦克风停止录制时,它会从 true
变为 false
。不幸的是,KVO 无法观察到 属性,所以我所做的是设置一个重复的 Timer
来检测它是否更改以处理取消,确保 invalidate()
计时器在其他状态时发生变化。
audioEngineRunningTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { [weak self] timer in
//the audio engine stops running when you start playing music for example, so handle cancelation here
if self?.shazamAudioEngine.isRunning == false {
//...
}
}
我正在录制麦克风输入以将其与 Shazam 目录中的歌曲相匹配。这行得通,但是如果我 start()
AVAudioEngine
然后会发生一些事情,比如音乐开始通过 MPMusicPlayerController.applicationMusicPlayer.play()
播放,似乎音频引擎停止或被中断。麦克风录音关闭,因此 SHSessionDelegate
永远找不到匹配项或因错误而失败,所以我的 UI 卡住了,显示它正在听,但它不再听了。发生这种情况时有没有办法通知我,以便我可以更新 UI 来处理取消?
private lazy var shazamAudioEngine = AVAudioEngine()
private lazy var shazamSession: SHSession = {
let session = SHSession()
session.delegate = self
return session
}()
...
try? AVAudioSession.sharedInstance().setCategory(.record)
//Create an audio format for our buffers based on the format of the input, with a single channel (mono)
let audioFormat = AVAudioFormat(standardFormatWithSampleRate: shazamAudioEngine.inputNode.outputFormat(forBus: 0).sampleRate, channels: 1)
//Install a "tap" in the audio engine's input so that we can send buffers from the microphone to the session
shazamAudioEngine.inputNode.installTap(onBus: 0, bufferSize: 2048, format: audioFormat) { [weak self] buffer, when in
//Whenever a new buffer comes in, we send it over to the session for recognition
self?.shazamSession.matchStreamingBuffer(buffer, at: when)
}
do {
try shazamAudioEngine.start()
} catch {
...
}
在我的测试中,isRunning
跟踪此状态,因此当您开始播放音乐并且麦克风停止录制时,它会从 true
变为 false
。不幸的是,KVO 无法观察到 属性,所以我所做的是设置一个重复的 Timer
来检测它是否更改以处理取消,确保 invalidate()
计时器在其他状态时发生变化。
audioEngineRunningTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { [weak self] timer in
//the audio engine stops running when you start playing music for example, so handle cancelation here
if self?.shazamAudioEngine.isRunning == false {
//...
}
}