首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioFileWritePackets失败(错误代码: 1885563711 - 'kcp')

AudioFileWritePackets失败(错误代码: 1885563711 - 'kcp')
EN

Stack Overflow用户
提问于 2017-03-03 23:36:28
回答 1查看 404关注 0票数 1

我目前正在尝试使用AudioQueueInputCallback将麦克风数据写入文件中。我的代码回调如下所示:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
struct MyRecorder {
    var recordFile: AudioFileID?
    var recordPacket: Int64
    var running: Bool
}

代码在AudioFileWritePackets调用时失败(使用errorCode: 1885563711 - 'kcp')。这里的失败是什么原因呢?

我很乐意提供更多的信息,但目前我不知道哪些代码在这里有帮助。

另外,正如您所看到的,我正在创建函数参数inNumPackets的临时副本,因为否则AudioFileWritePackets将不接受&inNumPackets作为参数(因为它是一个不可变的let-constant)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-04 04:10:53

该错误实际上是'pck?'kAudioFileInvalidPacketOffsetError,它被描述为

当写入VBR格式时,数据包偏移量超过文件的结尾,或在写入VBR格式时不在文件末尾,或者生成数据包表时读取损坏的数据包大小。

问题可能与以下事实有关:您没有使用写入的数据包的实际数量,这是在tmpInOutNumPackets返回AudioFileWritePackets后发现的。

所以试试

代码语言:javascript
复制
recorder.recordPacket += Int64(tmpInOutNumPackets)

而不是。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42590225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档