
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中:
AudioConverterFillComplexBuffer return -50 (paramErr)
iPhone: AudioBufferList init and release
总结以上是内存溢出为你收集整理的ios – 无法在AudioFileStreamOpen的AudioFileStream_PacketsProc回调中使用AudioConverterFillComplexBuffer将mp3转换为PCM全部内容,希望文章能够帮你解决ios – 无法在AudioFileStreamOpen的AudioFileStream_PacketsProc回调中使用AudioConverterFillComplexBuffer将mp3转换为PCM所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)