我一直在尝试录制来自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模拟器上运行此代码。