iOS13崩溃-错误:无法在float转换器('insz')中填充复杂缓冲区

问题描述 投票:3回答:1

我正在使用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)
    }
}

iOS13-iPhone7

它与此日志崩溃

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

iOS13-iPadAir2

我在不崩溃的情况下获得此日志消息(数百个,我假设每个音频帧都出现)

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]: ""

iOS12-iPhone6

我在不崩溃的情况下获得此日志消息(数百个,我假设每个音频帧都出现)

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): ""

是否知道此日志消息来自何处?

ios iphone avfoundation audiounit audiokit
1个回答
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

我希望这会对您有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.