Swift中的音频队列服务不会调用回调函数

时间:2019-07-31 21:04:07

标签: swift audiotoolbox audioqueueservices

我一直在尝试录制来自iOS麦克风的音频,并使用音频队列服务将其保存到音频缓冲区。但是,音频流没有调用输入回调函数(AudioQueueInputCallback),同时也没有抛出任何错误代码,因此我无法处理音频。

class AudioBuffer: NSObject {

    var audioStreamFormat: AudioStreamBasicDescription!
    var inQueue: AudioQueueRef? = nil
    var audioBuffer: AudioQueueBuffer!

    struct BufferRecordSettings {
        let format: AudioFormatID = kAudioFormatLinearPCM
        let formatFlags: UInt32 = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked
        let sampleRate: Double = 16000.0
        let numChannels: UInt32 = 1
    }

    var recordSettings = BufferRecordSettings()

    // My callback function    
    private let audioQueueInputCallback: AudioQueueInputCallback = {
        userData, queue, bufferRef, startTimeRef, numPackets, packetDescriptions in
        print("Finished")
    }

    override init() {
        super.init()
        setUpAudio()
    }

    func setUpAudio() {
        audioStreamFormat = AudioStreamBasicDescription(
            mSampleRate: self.recordSettings.sampleRate,
            mFormatID: self.recordSettings.format,
            mFormatFlags: self.recordSettings.formatFlags,
            mBytesPerPacket: 2 * self.recordSettings.numChannels,
            mFramesPerPacket: 1,
            mBytesPerFrame: 2 * self.recordSettings.numChannels,
            mChannelsPerFrame: self.recordSettings.numChannels,
            mBitsPerChannel: 16,
            mReserved: 0)

        // Create audio queue object
        let status = AudioQueueNewInput(&audioStreamFormat, audioQueueInputCallback, nil, nil, nil, 0, &inQueue)

        if (status == 0) {
            print("Setup successful")
            isReady = true
        }
    }

    public func startRecording() {
        let status = AudioQueueStart(inQueue!, nil)
        if (status == 0) {
            recordingTime = CACurrentMediaTime()
            isRecording = true

            if (!recordingStarted) {
                elapsed = 0
                recordingStarted = true 
                print("Recording started...")     
            }
            else {
                print("Failed to start recording")
            }
        }     
    }

    public func stopRecording() {
        else {
            let status = AudioQueueStop(inQueue!, true)
            if (status == 0) {
                isRecording = false
                recordingStarted = false
                print("Stopped.")
            } else {
                print("Failed to stop.")
            }
        }
    }
}

在上面的代码中,当调用startRecording()然后使用stopRecording()停止时,“ finished”不会输出到控制台(指示代码未进入回调),这是唯一的输出:“设置成功”。

有关更多信息,我正在iPhone 7模拟器上运行此代码。

0 个答案:

没有答案