AudioFileStreamOpen中有一个AudioFileStream_PacketsProc回调,它使用AudioConverterFillComplexBuffer处理将音频包转换为PCM.我遇到的问题是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,mData: nil)) localPcmAudioBuffer = localPcmBufferList.mBuffers AudioConverterFillComplexBuffer(audioConverterRef,AudioConverter_Callback,&convertInfo,&framesToDecode,&localPcmBufferList,nil)
是否可能导致param错误?
如果需要,这是回调的完整方法:
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,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,¤tlyReadingEntry.processedPacketsSizeTotal!) OSAtomicIncrement32(¤tlyReadingEntry.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,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,nil) framesAdded = framesToDecode if status == 100 { OSSpinLockLock(&pcmBufferSpinLock) let newCount = pcmBufferUsedFrameCount! + framesAdded pcmBufferUsedFrameCount = newCount OSSpinLockUnlock(&pcmBufferSpinLock); OSSpinLockLock(¤tlyReadingEntry!.spinLock!) let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) currentlyReadingEntry!.framesQueued! = newFramesAddedCount OSSpinLockUnlock(¤tlyReadingEntry!.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(¤tlyReadingEntry!.spinLock!) let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) currentlyReadingEntry!.framesQueued! = newFramesAddedCount OSSpinLockUnlock(¤tlyReadingEntry!.spinLock!) continue } localPcmAudioBuffer.mData = pcmAudioBuffer!.mData localPcmAudioBuffer.mDataByteSize = framesToDecode * pcmBufferFrameSizeInBytes! localPcmAudioBuffer.mNumberChannels = pcmAudioBuffer!.mNumberChannels AudioConverterFillComplexBuffer(audioConverterRef,nil) let decodedFramesAdded = framesAdded + framesToDecode framesAdded = decodedFramesAdded if status == 100 { OSSpinLockLock(&pcmBufferSpinLock) let newCount = pcmBufferUsedFrameCount! + framesAdded pcmBufferUsedFrameCount = newCount OSSpinLockUnlock(&pcmBufferSpinLock); OSSpinLockLock(¤tlyReadingEntry!.spinLock!) let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) currentlyReadingEntry!.framesQueued! = newFramesAddedCount OSSpinLockUnlock(¤tlyReadingEntry!.spinLock!) return } else if status == 0 { OSSpinLockLock(&pcmBufferSpinLock) let newCount = pcmBufferUsedFrameCount! + framesAdded pcmBufferUsedFrameCount = newCount OSSpinLockUnlock(&pcmBufferSpinLock); OSSpinLockLock(¤tlyReadingEntry!.spinLock!) let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) currentlyReadingEntry!.framesQueued! = newFramesAddedCount OSSpinLockUnlock(¤tlyReadingEntry!.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,&convertInfoo,nil) framesAdded = framesToDecode if status == 100 { OSSpinLockLock(&pcmBufferSpinLock) let newCount = pcmBufferUsedFrameCount! + framesAdded pcmBufferUsedFrameCount = newCount OSSpinLockUnlock(&pcmBufferSpinLock); OSSpinLockLock(¤tlyReadingEntry!.spinLock!) let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) currentlyReadingEntry!.framesQueued! = newFramesAddedCount OSSpinLockUnlock(¤tlyReadingEntry!.spinLock!) return } else if status == 0 { OSSpinLockLock(&pcmBufferSpinLock) let newCount = pcmBufferUsedFrameCount! + framesAdded pcmBufferUsedFrameCount = newCount OSSpinLockUnlock(&pcmBufferSpinLock); OSSpinLockLock(¤tlyReadingEntry!.spinLock!) let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) currentlyReadingEntry!.framesQueued! = newFramesAddedCount OSSpinLockUnlock(¤tlyReadingEntry!.spinLock!) continue } else if status != 0 { print("error") return } } } } }
解决方法
Hej @ 3254523,我有一些答案可能的解决方案给你.我希望以正确的方式指导你,尽管我不是这个专业的专家.所以,问题是确定配置:
AudioBufferList
这里的链接可以探测到这个-50 OSStatus与AudioBufferList有关的提示:
http://lists.apple.com/archives/coreaudio-api/2012/Apr/msg00041.html
https://forums.developer.apple.com/thread/6313
现在,我们必须专注于一个解决方案.查看您的AudioBufferList,您没有分配任何值,但mNumberBuffers是1.尝试以下列方式更改值(如第二个链接所示):
var localPcmBufferList = AudioBufferList(mNumberBuffers: 2,mBuffers: AudioBuffer(mNumberChannels: 2,mDataByteSize: UInt32(buffer.count),mData: &buffer))
如果仍然不工作,我们必须专注于正确地进行更正,因此,您可以在AudioConverterFillComplexBuffer中找到-50 OSStatus的解决方案,但不能在swift中: