我正在使用AudioKit 4.8这样
class AudioKitWrapper {
/// The main output mixer (after the amplitude tracker)
private let masterMixer: AKMixer
/// The audio input
private var microphone: EZMicrophone?
/// Construction
init() {
// global settings
AKAudioFile.cleanTempDirectory()
AKSettings.defaultToSpeaker = true
AKSettings.enableRouteChangeHandling = true
AKSettings.enableCategoryChangeHandling = true
AKSettings.disableAVAudioSessionCategoryManagement = true
AKSettings.audioInputEnabled = true
AKSettings.playbackWhileMuted = false
#if DEBUG
AKSettings.enableLogging = AppConfig.AudioConfig.debugLogEnabled
#endif
// main mixer
masterMixer = AKMixer()
}
/// Start up audiokit
func startEngine(with audioInput: Bool) throws {
// connect main nodes
AudioKit.output = masterMixer
// input
microphone?.delegate = nil
microphone = nil
if audioInput {
AKSettings.enableEchoCancellation = true
let sizeOfFloat = UInt32(MemoryLayout<Float>.stride)
microphone = EZMicrophone(microphoneDelegate: self,
with: AudioStreamBasicDescription(mSampleRate: Float64(mirgaFactory.getSampleRate()),
mFormatID: kAudioFormatLinearPCM,
mFormatFlags: kLinearPCMFormatFlagIsFloat |
kAudioFormatFlagsNativeEndian |
kAudioFormatFlagIsPacked |
kAudioFormatFlagIsNonInterleaved,
mBytesPerPacket: sizeOfFloat,
mFramesPerPacket: 1,
mBytesPerFrame: sizeOfFloat,
mChannelsPerFrame: 1,
mBitsPerChannel: sizeOfFloat * 8,
mReserved: 0),
startsImmediately: false)
}
// start
try AKSettings.session.setCategory(.playAndRecord, mode: .measurement, options: .defaultToSpeaker)
try AudioKit.start()
microphone?.startFetchingAudio()
Log.d("~~~ AudioKit: started")
}
/// Stop engine
func stopEngine() throws {
try AudioKit.stop()
microphone?.stopFetchingAudio()
Log.d("~~~ AudioKit: stopped")
}
/// Attach output
func attach(audioPlayer: AKAudioPlayer) {
audioPlayer >>> masterMixer
}
/// Reset
func reset() {
masterMixer.detach()
Log.d("~~~ AudioKit: reset")
}
}
/// Handle EZMicrophone input
extension AudioKitWrapper: EZMicrophoneDelegate {
/// Playing state changed
func microphone(_ microphone: EZMicrophone!, changedPlayingState isPlaying: Bool) {
Log.i("playing state - \(isPlaying)")
}
/// Device changed
func microphone(_ microphone: EZMicrophone!, changedDevice device: EZAudioDevice!) {
Log.i("device - \(String(describing: device))")
}
/// Audio stream description
func microphone(_ microphone: EZMicrophone!, hasAudioStreamBasicDescription audioStreamBasicDescription: AudioStreamBasicDescription) {
Log.i("stream - \(audioStreamBasicDescription)")
}
/// Input buffer handling
func microphone(_ microphone: EZMicrophone!,
hasAudioReceived buffer: UnsafeMutablePointer<UnsafeMutablePointer<Float>?>!,
withBufferSize bufferSize: UInt32,
withNumberOfChannels numberOfChannels: UInt32,
atTime timestamp: UnsafePointer<AudioTimeStamp>!) {
writeSamplesIntoCircularBuffer(buffer[0]!, bufferSize, timestamp)
}
}
它与此日志崩溃
2019-10-11 09:37:01.917118+0200 WyntonHost[555:135079] AUBuffer.h:61:GetBufferList: EXCEPTION (-1) [mPtrState == kPtrsInvalid is false]: ""
2019-10-11 09:37:01.938441+0200 WyntonHost[555:135079] AUBuffer.h:61:GetBufferList: EXCEPTION (-1) [mPtrState == kPtrsInvalid is false]: ""
Error: Failed to fill complex buffer in float converter ('insz')
Process finished with exit code 255
我在不崩溃的情况下获得此日志消息(数百个,我假设每个音频帧都出现)
2019-10-11 09:34:07.187762+0200 WyntonHost[376:18541] AUBuffer.h:61:GetBufferList: EXCEPTION (-1) [mPtrState == kPtrsInvalid is false]: ""
2019-10-11 09:34:07.211279+0200 WyntonHost[376:18541] AUBuffer.h:61:GetBufferList: EXCEPTION (-1) [mPtrState == kPtrsInvalid is false]: ""
我在不崩溃的情况下获得此日志消息(数百个,我假设每个音频帧都出现)
2019-10-11 09:31:59.138013+0200 WyntonHost[537:96101] 55: EXCEPTION (-1): ""
2019-10-11 09:31:59.161233+0200 WyntonHost[537:96101] 55: EXCEPTION (-1): ""
是否知道此日志消息来自何处?
您需要更改EZAudioFloatConverter.m中的代码
- (void)convertDataFromAudioBufferList:(AudioBufferList *)audioBufferList
withNumberOfFrames:(UInt32)frames
toFloatBuffers:(float **)buffers
packetDescriptions:(AudioStreamPacketDescription *)packetDescriptions
在此方法下,您应按以下步骤进行更改:
OSStatus status = AudioConverterFillComplexBuffer(self.info->converterRef, EZAudioFloatConverterCallback, audioBufferList, &frames, self.info->floatAudioBufferList, packetDescriptions ? packetDescriptions : self.info->packetDescriptions); if (status > 0 ) { AudioConverterReset(self.info->converterRef); }
我进行了更改,对我来说运行得很好。请参阅链接:
https://github.com/syedhali/EZAudio/issues/379
https://github.com/AudioKit/AudioKit/issues/1873
您也可以下载已更改代码的我的代码:
https://github.com/liunianhuaguoyanxi/EZAudio
我希望这会对您有所帮助。