我目前正在尝试使用AudioQueueInputCallback将麦克风数据写入文件中。我的代码回调如下所示:
func myAQInputCallback(inUserData: UnsafeMutableRawPointer?,
inQueue: AudioQueueRef,
inBuffer: AudioQueueBufferRef,
inStartTime: UnsafePointer<AudioTimeStamp>,
inNumPackets: UInt32,
inPacketDesc: UnsafePointer<AudioStreamPacketDescription>?) {
var error: OSStatus
var recorder = inUserData!.load(as: MyRecorder.self)
// Is this neccessary?
var tmpInOutNumPackets = inNumPackets
if inNumPackets > 0 {
error = AudioFileWritePackets(recorder.recordFile!,
false,
inBuffer.pointee.mAudioDataByteSize,
inPacketDesc,
recorder.recordPacket,
&tmpInOutNumPackets,
inBuffer.pointee.mAudioData)
checkError(error, msg: "Couldn't write packet to audio file.")
recorder.recordPacket += Int64(inNumPackets)
}
if recorder.running {
error = AudioQueueEnqueueBuffer(inQueue, inBuffer, 0, nil)
checkError(error, msg: "Couldn't enqueue buffer.")
}
}其中MyRecorder是一个struct,如下所示:
struct MyRecorder {
var recordFile: AudioFileID?
var recordPacket: Int64
var running: Bool
}代码在AudioFileWritePackets调用时失败(使用errorCode: 1885563711 - 'kcp')。这里的失败是什么原因呢?
我很乐意提供更多的信息,但目前我不知道哪些代码在这里有帮助。
另外,正如您所看到的,我正在创建函数参数inNumPackets的临时副本,因为否则AudioFileWritePackets将不接受&inNumPackets作为参数(因为它是一个不可变的let-constant)。
发布于 2017-03-04 04:10:53
该错误实际上是'pck?'或kAudioFileInvalidPacketOffsetError,它被描述为
当写入VBR格式时,数据包偏移量超过文件的结尾,或在写入VBR格式时不在文件末尾,或者生成数据包表时读取损坏的数据包大小。
问题可能与以下事实有关:您没有使用写入的数据包的实际数量,这是在tmpInOutNumPackets返回AudioFileWritePackets后发现的。
所以试试
recorder.recordPacket += Int64(tmpInOutNumPackets)而不是。
https://stackoverflow.com/questions/42590225
复制相似问题