Ios AVAUDIO转换器压缩/PCM转换状态-50(kAudio_参数错误)

Ios AVAUDIO转换器压缩/PCM转换状态-50(kAudio_参数错误),ios,macos,avfoundation,core-audio,audiotoolbox,Ios,Macos,Avfoundation,Core Audio,Audiotoolbox,我正在尝试使用AVAudioConverter将压缩音频数据(在本例中为mp3、96kbps、CBR、立体声)转换为PCM数据(标准输出格式,通过调用audioEngine.outputNode.outputFormatForBus(0)获得)。我使用音频文件流来获取数据包。我以前使用过AudioQueue来播放这些数据包,所以它们是有效的 这就是我称之为convertToBuffer的地方: let outputBuffer = AVAudioPCMBuffer(PCMFormat: outp

我正在尝试使用AVAudioConverter将压缩音频数据(在本例中为mp3、96kbps、CBR、立体声)转换为PCM数据(标准输出格式,通过调用audioEngine.outputNode.outputFormatForBus(0)获得)。我使用音频文件流来获取数据包。我以前使用过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  
}  
let outputBuffer=AVAudioPCMBuffer(PCMFormat:outputFormat,frameCapacity:outputBufferFrameLength)
outputBuffer.frameLength=outputBufferFrameLength
var错误:N错误?
audioConverter.convertToBuffer(outputBuffer,错误:&error,withInputFromBlock:{(packetCount:AVAudioPacketCount,inputStatus:UnsafeMutablePointer)->AVAudioBuffer?在
返回self.getAudioConverterInput(packetCount,inputStatus:inputStatus)
})  
如果let error=error{
打印(“conv错误:”,错误)
}否则{
//TODO:使用缓冲区做一些事情
}  
这是处理输入的函数

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  
    }  
func getAudioConverterInput(包计数:AvaudioPackageCount,输入状态:UnsafeMutablePointer)->AVAudioBuffer?{
如果让currentAudioFormat=currentAudioFormat,则firstPackets=packets.first{
inputStatus.memory=.HaveData
let buffer=AVAudioCompressedBuffer(格式:currentAudioFormat,packetCapacity:packetCount,maximumPacketSize:Int(currentMaximumPacketSize))
var currentpackes:Packets=firstPackets
var currentStartOffset:Int64=0

对于0中的i..您是否解决了问题。如果是这样,您是否可以发布修复程序。我正在尝试使用objective-c,我也收到了相同的错误-50。不,很遗憾,我没有,对不起。也许您可以,但是您的inputStatus.memory=.HaveData在调用getAudioConverterInput之前在输入块中?您是否解决了问题。如果是这样,您是否可以发布修复程序。我是在objective-c中尝试时,我也得到了相同的错误-50。不,很遗憾我没有,对不起。也许你可以,但是你的inputStatus.memory=.HaveData在调用getAudioConverterInput之前在输入块中?