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.尝试以下列方式更改值(如第二个链接所示):
如果仍然不工作,我们必须专注于正确地进行更正,因此,您可以在AudioConverterFillComplexBuffer中找到-50 OSStatus的解决方案,但不能在swift中: