AudioFileWritePackets失败(错误代码:1885563711 - 'kcp')
问题描述:
我正在尝试使用AudioQueueInputCallback
将麦克风数据写入文件。我的代码的回调看起来是这样的:AudioFileWritePackets失败(错误代码:1885563711 - 'kcp')
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
通话(与错误码:1885563711 - 'kcp'
)。这里可能会发生什么故障?
我很乐意提供进一步的信息,但目前我不知道哪些代码在这里有帮助。
而且你可以看到我创建的函数参数inNumPackets
的临时副本,否则AudioFileWritePackets
不会接受&inNumPackets
作为参数(因为它是一个不可改变的let
的常数)。
答
即误差实际上是'pck?'
或kAudioFileInvalidPacketOffsetError
,其被描述为
分组偏移量是过去的文件的末尾,或者不是在文件的末尾写入当VBR格式, 或在构建数据包表时读取了损坏的数据包大小。
的问题可能与你不使用的数据包的实际数目写的,这是在tmpInOutNumPackets
发现后AudioFileWritePackets
回报的事实做。
所以尽量
recorder.recordPacket += Int64(tmpInOutNumPackets)
代替。
谢谢你的回答。这个改变并没有解决我的问题,但错误描述确实帮助了我。我发现,record.recordPacket在一次回调调用后不会改变(就像'struct'是通过值传递的 - 即使我使用了'UnsafeMutableRawPointer?')。 [这是一个后续问题。](http://*.com/questions/42596246/swift-3-pass-struct-by-reference-via-unsafemutablerawpointer)。 – Herickson
啊哈 - 很好看 –