2017-03-03 240 views
1

我正在嘗試使用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.") 
    } 
} 

MyRecorderstruct看起來像這樣:

struct MyRecorder { 
    var recordFile: AudioFileID? 
    var recordPacket: Int64 
    var running: Bool 
} 

的代碼失敗在AudioFileWritePackets通話(與錯誤碼:1885563711 - 'kcp')。這裏可能會發生什麼故障?

我很樂意提供進一步的信息,但目前我不知道哪些代碼在這裏有幫助。

而且你可以看到我創建的函數參數inNumPackets的臨時副本,否則AudioFileWritePackets不會接受&inNumPackets作爲參數(因爲它是一個不可改變的let的常數)。

回答

1

即誤差實際上是'pck?'kAudioFileInvalidPacketOffsetError,其被描述爲

分組偏移量是過去的文件的末尾,或者不是在文件的末尾寫入當VBR格式, 或在構建數據包表時讀取了損壞的數據包大小。

的問題可能與你不使用的數據包的實際數目寫的,這是在tmpInOutNumPackets發現後AudioFileWritePackets回報的事實做。

所以儘量

recorder.recordPacket += Int64(tmpInOutNumPackets) 

代替。

+0

謝謝你的回答。這個改變並沒有解決我的問題,但錯誤描述確實幫助了我。我發現,record.recordPacket在一次回調調用後不會改變(就像'struct'是通過值傳遞的 - 即使我使用了'UnsafeMutableRawPointer?')。 [這是一個後續問題。](http://stackoverflow.com/questions/42596246/swift-3-pass-struct-by-reference-via-unsafemutablerawpointer)。 – Herickson

+0

啊哈 - 很好看 –

相關問題