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)"".

Что я здесь не так делаю?

0 ответов

Другие вопросы по тегам