无法使用AudioFileStreamOpen的AudioFileStream_PacketsProccallback中的AudioConverterFillComplexBuffer将MP3转换成PCM

我有一个AudioFileStream_PacketsProccallback设置在一个AudioFileStreamOpen处理转换audio数据包到PCM使用AudioConverterFillComplexBuffer 。 我遇到的问题是我调用AudioConverterFillComplexBuffer后得到一个-50 OSStatus(paramErr)。 下面是在AudioConverterFillComplexBuffer中使用的参数的一个片段,以及它们是如何制作的:

  audioConverterRef = AudioConverterRef() // AudioConvertInfo is a struct that contains information // for the converter regarding the number of packets and // which audiobuffer is being allocated convertInfo? = AudioConvertInfo(done: false, numberOfPackets: numberPackets, audioBuffer: buffer, packetDescriptions: packetDescriptions) var framesToDecode: UInt32 = pcmBufferTotalFrameCount! - end var localPcmAudioBuffer = AudioBuffer() localPcmAudioBuffer.mData = pcmAudioBuffer!.mData.advancedBy(Int(end * pcmBufferFrameSizeInBytes!)) var localPcmBufferList = AudioBufferList(mNumberBuffers: 1, mBuffers: AudioBuffer(mNumberChannels: 0, mDataByteSize: 0, mData: nil)) localPcmAudioBuffer = localPcmBufferList.mBuffers localPcmAudioBuffer.mData = pcmAudioBuffer!.mData.advancedBy(Int(end * pcmBufferFrameSizeInBytes!)) localPcmAudioBuffer.mDataByteSize = framesToDecode * pcmBufferFrameSizeInBytes!; localPcmAudioBuffer.mNumberChannels = pcmAudioBuffer!.mNumberChannels var localPcmBufferList = AudioBufferList(mNumberBuffers: 1, mBuffers: AudioBuffer(mNumberChannels: 0, mDataByteSize: 0, mData: nil)) localPcmAudioBuffer = localPcmBufferList.mBuffers AudioConverterFillComplexBuffer(audioConverterRef, AudioConverter_Callback, &convertInfo, &framesToDecode, &localPcmBufferList, nil) 

是否可能导致param错误?

如果需要,以下是callback的完整方法:

 func handleAudioPackets(inputData: UnsafePointer<Void>, numberBytes: UInt32, numberPackets: UInt32, packetDescriptions: UnsafeMutablePointer<AudioStreamPacketDescription>) { if currentlyReadingEntry == nil { print("currentlyReadingEntry = nil") return } if currentlyReadingEntry.parsedHeader == false { print("currentlyReadingEntry.parsedHeader == false") return } if disposedWasRequested == true { print("disposedWasRequested == true") return } guard let audioConverterRef = audioConverterRef else { return } if seekToTimeWasRequested == true && currentlyReadingEntry.calculatedBitRate() > 0.0 { wakeupPlaybackThread() print("seekToTimeWasRequested == true && currentlyReadingEntry.calculatedBitRate() > 0.0") return } discontinuous = false var buffer = AudioBuffer() buffer.mNumberChannels = audioConverterAudioStreamBasicDescription.mChannelsPerFrame buffer.mDataByteSize = numberBytes buffer.mData = UnsafeMutablePointer<Void>(inputData) convertInfo? = AudioConvertInfo(done: false, numberOfPackets: numberPackets, audioBuffer: buffer, packetDescriptions: packetDescriptions) if packetDescriptions != nil && currentlyReadingEntry.processedPacketsCount < maxCompressedBacketsForBitrateCalculation { let count: Int = min(Int(numberPackets), Int(maxCompressedBacketsForBitrateCalculation - currentlyReadingEntry.processedPacketsCount!)) for var i = 0;i < count;++i{ let packetSize: Int32 = Int32(packetDescriptions[i].mDataByteSize) OSAtomicAdd32(packetSize, &currentlyReadingEntry.processedPacketsSizeTotal!) OSAtomicIncrement32(&currentlyReadingEntry.processedPacketsCount!) } } while true { OSSpinLockLock(&pcmBufferSpinLock) var used: UInt32 = pcmBufferUsedFrameCount! var start: UInt32 = pcmBufferFrameStartIndex! var end = (pcmBufferFrameStartIndex! + pcmBufferUsedFrameCount!) % pcmBufferTotalFrameCount! var framesLeftInsideBuffer = pcmBufferTotalFrameCount! - used OSSpinLockUnlock(&pcmBufferSpinLock) if framesLeftInsideBuffer == 0 { pthread_mutex_lock(&playerMutex) while true { OSSpinLockLock(&pcmBufferSpinLock) used = pcmBufferUsedFrameCount! start = pcmBufferFrameStartIndex! end = (pcmBufferFrameStartIndex! + pcmBufferUsedFrameCount!) % pcmBufferTotalFrameCount! framesLeftInsideBuffer = pcmBufferTotalFrameCount! - used OSSpinLockUnlock(&pcmBufferSpinLock) if framesLeftInsideBuffer > 0 { break } if (disposedWasRequested == true || internalState == SSPlayerInternalState.Disposed) { pthread_mutex_unlock(&playerMutex) return } if (seekToTimeWasRequested == true && currentlyPlayingEntry.calculatedBitRate() > 0.0) { pthread_mutex_unlock(&playerMutex) wakeupPlaybackThread() return; } waiting = true pthread_cond_wait(&playerThreadReadyCondition, &playerMutex) waiting = false } pthread_mutex_unlock(&playerMutex) } var localPcmAudioBuffer = AudioBuffer() var localPcmBufferList = AudioBufferList(mNumberBuffers: 1, mBuffers: AudioBuffer(mNumberChannels: 0, mDataByteSize: 0, mData: nil)) localPcmAudioBuffer = localPcmBufferList.mBuffers if end >= start { var framesAdded: UInt32 = 0 var framesToDecode: UInt32 = pcmBufferTotalFrameCount! - end localPcmAudioBuffer.mData = pcmAudioBuffer!.mData.advancedBy(Int(end * pcmBufferFrameSizeInBytes!)) localPcmAudioBuffer.mDataByteSize = framesToDecode * pcmBufferFrameSizeInBytes!; localPcmAudioBuffer.mNumberChannels = pcmAudioBuffer!.mNumberChannels AudioConverterFillComplexBuffer(audioConverterRef, AudioConverter_Callback, &convertInfo, &framesToDecode, &localPcmBufferList, nil) framesAdded = framesToDecode if status == 100 { OSSpinLockLock(&pcmBufferSpinLock) let newCount = pcmBufferUsedFrameCount! + framesAdded pcmBufferUsedFrameCount = newCount OSSpinLockUnlock(&pcmBufferSpinLock); OSSpinLockLock(&currentlyReadingEntry!.spinLock!) let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) currentlyReadingEntry!.framesQueued! = newFramesAddedCount OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!) return } else if status != 0 { print("error") return } framesToDecode = start if framesToDecode == 0 { OSSpinLockLock(&pcmBufferSpinLock) let newCount = pcmBufferUsedFrameCount! + framesAdded pcmBufferUsedFrameCount = newCount OSSpinLockUnlock(&pcmBufferSpinLock); OSSpinLockLock(&currentlyReadingEntry!.spinLock!) let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) currentlyReadingEntry!.framesQueued! = newFramesAddedCount OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!) continue } localPcmAudioBuffer.mData = pcmAudioBuffer!.mData localPcmAudioBuffer.mDataByteSize = framesToDecode * pcmBufferFrameSizeInBytes! localPcmAudioBuffer.mNumberChannels = pcmAudioBuffer!.mNumberChannels AudioConverterFillComplexBuffer(audioConverterRef, AudioConverter_Callback, &convertInfo, &framesToDecode, &localPcmBufferList, nil) let decodedFramesAdded = framesAdded + framesToDecode framesAdded = decodedFramesAdded if status == 100 { OSSpinLockLock(&pcmBufferSpinLock) let newCount = pcmBufferUsedFrameCount! + framesAdded pcmBufferUsedFrameCount = newCount OSSpinLockUnlock(&pcmBufferSpinLock); OSSpinLockLock(&currentlyReadingEntry!.spinLock!) let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) currentlyReadingEntry!.framesQueued! = newFramesAddedCount OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!) return } else if status == 0 { OSSpinLockLock(&pcmBufferSpinLock) let newCount = pcmBufferUsedFrameCount! + framesAdded pcmBufferUsedFrameCount = newCount OSSpinLockUnlock(&pcmBufferSpinLock); OSSpinLockLock(&currentlyReadingEntry!.spinLock!) let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) currentlyReadingEntry!.framesQueued! = newFramesAddedCount OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!) continue } else if status != 0 { print("error") return } else { var framesAdded: UInt32 = 0 var framesToDecode: UInt32 = start - end localPcmAudioBuffer.mData = pcmAudioBuffer!.mData.advancedBy(Int(end * pcmBufferFrameSizeInBytes!)) localPcmAudioBuffer.mDataByteSize = framesToDecode * pcmBufferFrameSizeInBytes!; localPcmAudioBuffer.mNumberChannels = pcmAudioBuffer!.mNumberChannels var convertInfoo: UnsafePointer<Void> = unsafeBitCast(convertInfo, UnsafePointer<Void>.self) status = AudioConverterFillComplexBuffer(audioConverterRef, AudioConverter_Callback, &convertInfoo, &framesToDecode, &localPcmBufferList, nil) framesAdded = framesToDecode if status == 100 { OSSpinLockLock(&pcmBufferSpinLock) let newCount = pcmBufferUsedFrameCount! + framesAdded pcmBufferUsedFrameCount = newCount OSSpinLockUnlock(&pcmBufferSpinLock); OSSpinLockLock(&currentlyReadingEntry!.spinLock!) let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) currentlyReadingEntry!.framesQueued! = newFramesAddedCount OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!) return } else if status == 0 { OSSpinLockLock(&pcmBufferSpinLock) let newCount = pcmBufferUsedFrameCount! + framesAdded pcmBufferUsedFrameCount = newCount OSSpinLockUnlock(&pcmBufferSpinLock); OSSpinLockLock(&currentlyReadingEntry!.spinLock!) let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) currentlyReadingEntry!.framesQueued! = newFramesAddedCount OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!) continue } else if status != 0 { print("error") return } } } } } 

Hej @ 3254523,我有一些可能的解决scheme给你的答案。 尽pipe我不擅长这个专业,但我希望能以正确的方式指导你。 所以,问题是肯定的configuration:

 AudioBufferList 

这里的链接探讨了这个与AudioBufferList相关的-50 OSStatus的提示: http : //lists.apple.com/archives/coreaudio-api/2012/Apr/msg00041.html https://forums.developer.apple&#x3002; COM /线程/ 6313

现在,我们必须专注于解决scheme。 看看你的AudioBufferList ,你没有分配任何值,但mNumberBuffers是1.尝试按照以下方式更改值(如第二个链接所示):

 var localPcmBufferList = AudioBufferList(mNumberBuffers: 2, mBuffers: AudioBuffer(mNumberChannels: 2, mDataByteSize: UInt32(buffer.count), mData: &buffer)) 

如果还没有工作,我们必须集中纠正它,因此在这里你可以findAudioConverterFillComplexBuffer -50 OSStatus的解决scheme,虽然不是在迅速:

AudioConverterFillComplexBuffer返回-50(paramErr)

iPhone:AudioBufferList init和release