【发布时间】:2018-10-28 07:05:32
【问题描述】:
我努力使以下场景按预期工作(代码将在下面提供)。
记录我的麦克风输入并将
AVAudioPCMBuffer存储在内存中,这是通过AVAudioPCMBuffer扩展方法copy(from buffer: AVAudioPCMBuffer, readOffset: AVAudioFrameCount = default, frames: AVAudioFrameCount = default)完成的。 我确实在录制结束时获得了缓冲区。当记录结束时,将缓冲区传递给
AKPlayer并播放。这是一个代码 sn-p 来演示我的工作(我知道它不是完整的应用程序代码,如果需要我可以分享它):
.
private var player: AKPlayer = AKPlayer()
self.player.buffering = .always
// in the record complete callbak:
self.player.buffer = self.bufferRecorder?.pcmBuffer
self.player.volume = 1
self.player.play()
- 请注意,电镀器连接到混音器,混音器最终连接到 AudioKit 输出。
当我检查和调试应用程序时,我可以看到缓冲区的长度正确,并且我的所有输出/输入设置都使用相同的处理格式(采样率、通道、比特率等)以及记录的缓冲区,但是我的应用仍然在这条线上崩溃:
2018-10-28 08:40:32.625001+0200 BeatmanApp[71037:6731884] [avae] AVAEInternal.h:70:_AVAE_Check:
required condition is false: [AVAudioPlayerNode.mm:665:ScheduleBuffer: (_outputFormat.channelCount == buffer.format.channelCount)]
当我调试并浏览 AudioKit 代码时,我可以看到断线位于方法上的 AKPlayer+Playback.swift 上 line 162 上:playerNode.scheduleBuffer
更多可能有用的信息:
- 记录的缓冲区长度为 16 秒。
- 当我尝试在 tap 方法中将缓冲区直接传递到播放器节点时,它似乎工作正常,我确实听到了从麦克风到扬声器的延迟,但它确实播放了。
- 我在调用 play 方法之前尝试在播放器上调用 prepare,没有帮助
谢谢!
【问题讨论】:
标签: ios swift avfoundation avaudioplayer audiokit