AVAudioConverter Сжатый /PCM преобразование, выбрасывающее OSStatus -50 (kAudio_ParamError)
Я пытаюсь использовать AVAudioConverter для преобразования сжатых аудиоданных (в данном случае mp3, 96 кбит / с, CBR, стерео) в данные PCM (стандартный формат вывода, полученный путем вызова audioEngine.outputNode.outputFormatForBus(0)). Я использую AudioFileStream для получения пакетов. Ранее я использовал AudioQueue для воспроизведения этих пакетов, поэтому они действительны.
Вот где я называю convertToBuffer:
let outputBuffer = AVAudioPCMBuffer(PCMFormat: outputFormat, frameCapacity: outputBufferFrameLength)
outputBuffer.frameLength = outputBufferFrameLength
var error:NSError?
audioConverter.convertToBuffer(outputBuffer, error: &error, withInputFromBlock: { (packetCount:AVAudioPacketCount, inputStatus:UnsafeMutablePointer<AVAudioConverterInputStatus>) -> AVAudioBuffer? in
return self.getAudioConverterInput(packetCount, inputStatus: inputStatus)
})
if let error = error{
print("conv error:", error)
}else{
// TODO: Do stuff with buffer
}
И это функция, которая обрабатывает ввод.
func getAudioConverterInput(packetCount:AVAudioPacketCount, inputStatus:UnsafeMutablePointer<AVAudioConverterInputStatus>) -> AVAudioBuffer?{
if let currentAudioFormat = currentAudioFormat, firstPackets = packets.first{
inputStatus.memory = .HaveData
let buffer = AVAudioCompressedBuffer(format: currentAudioFormat, packetCapacity: packetCount, maximumPacketSize: Int(currentMaximumPacketSize))
var currentPackets:Packets = firstPackets
var currentStartOffset:Int64 = 0
for i in 0..<packetCount{
let currentDescription = currentPackets.packetDescriptions[currentPacket]
memcpy(buffer.data.advancedBy(Int(currentStartOffset)), currentPackets.data.advancedBy(Int(currentDescription.mStartOffset)), Int(currentDescription.mDataByteSize))
buffer.packetDescriptions[Int(i)] = AudioStreamPacketDescription(mStartOffset: currentStartOffset, mVariableFramesInPacket: currentDescription.mVariableFramesInPacket, mDataByteSize: currentDescription.mDataByteSize)
currentStartOffset += Int64(currentDescription.mDataByteSize)
currentPacket+=1
if (currentPackets.numberOfPackets == UInt32(currentPacket)){
currentPacket = 0
packets.removeFirst()
if let firstPackets = packets.first{
currentPackets = firstPackets
}else{
buffer.packetCount = i + 1
return buffer
}
}
}
buffer.packetCount = packetCount
return buffer
}
inputStatus.memory = .NoDataNow
return nil
}
Эта функция вызывается один раз каждый раз, когда я вызываю функцию convertToBuffer(...) с переменной packetCount, установленной в '1'. Выдается ошибка "Ошибка об ошибке: Ошибка Domain=NSOSStatusErrorDomain Code=-50 "(null)"".
Что я здесь не так делаю?