首页 > 解决方案 > 使用空缓冲区调用 AudioQueueInputCallback

问题描述

我尝试使用 iPhone 麦克风录制 PCM 音频,但是当我启动音频队列时,它会在调用回调函数的次数与缓冲区一样多后自行停止。在我的情况下3次。这是我的代码:

class AudioModel {
    private var inQueue: AudioQueueRef!

    init() {
        // Describe PCM format. 8kHz, 16bits, mono
        var inFormat = AudioStreamBasicDescription(mSampleRate: 8000.0, // 8kb
            mFormatID: kAudioFormatLinearPCM,
            mFormatFlags: kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked,
            mBytesPerPacket: 2,
            mFramesPerPacket: 1,
            mBytesPerFrame: 2,
            mChannelsPerFrame: 1,
            mBitsPerChannel: 16,
            mReserved: 0)

        AudioQueueNewInput(&inFormat, audioQueueInputCallback, nil, nil, nil, 0, &inQueue)

        for _ in 0...2 {
            var bufferRef: AudioQueueBufferRef!
            AudioQueueAllocateBuffer(inQueue, 320, &bufferRef)
            AudioQueueEnqueueBuffer(inQueue, bufferRef, 0, nil)
        }
    }

    func startRecord() {
        AudioQueueStart(inQueue, nil)
    }

    func pauseRecord() {
        AudioQueuePause(inQueue)
    }

    private let audioQueueInputCallback: AudioQueueInputCallback = { (inUserData, inAQ, inBuffer, inStartTime, inNumberPacketDescriptions, inPacketDescs) in
        print("AudioQueueInputCallback called")
        print("mAudioDataByteSize: \(inBuffer.pointee.mAudioDataByteSize)")
        var err = AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, nil)
        if err != noErr {
            print("AudioQueueEnqueueBuffer err: \(err)")
            return
        }
    }
}

当我打电话时,startRecord我已经把这个拿出来了,没有别的了

AudioQueueInputCallback called
mAudioDataByteSize: 0
AudioQueueInputCallback called
mAudioDataByteSize: 0
AudioQueueInputCallback called
mAudioDataByteSize: 0

在使用 Audio Queue Services API 开发 2 周后,我仍然觉得有些话不妥。

标签: iosswiftiphoneaudioqueueservices

解决方案


推荐阅读