ios – 无法在AudioFileStreamOpen的AudioFileStream_PacketsProc回调中使用AudioConverterFillComplexBuffer将mp3转换为PCM

前端之家收集整理的这篇文章主要介绍了ios – 无法在AudioFileStreamOpen的AudioFileStream_PacketsProc回调中使用AudioConverterFillComplexBuffer将mp3转换为PCM前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
AudioFileStreamOpen中有一个AudioFileStream_PacketsProc回调,它使用AudioConverterFillComplexBuffer处理将音频包转换为PCM.我遇到的问题是AudioConverterFillComplexBuffer被调用后,我得到了一个-50 OSStatus(paramErr).以下是AudioConverterFillComplexBuffer中使用了哪些参数以及它们的使用方法
  1. audioConverterRef = AudioConverterRef()
  2.  
  3. // AudioConvertInfo is a struct that contains information
  4. // for the converter regarding the number of packets and
  5. // which audiobuffer is being allocated
  6. convertInfo? = AudioConvertInfo(done: false,numberOfPackets: numberPackets,audioBuffer: buffer,packetDescriptions: packetDescriptions)
  7.  
  8. var framesToDecode: UInt32 = pcmBufferTotalFrameCount! - end
  9.  
  10. var localPcmAudioBuffer = AudioBuffer()
  11. localPcmAudioBuffer.mData = pcmAudioBuffer!.mData.advancedBy(Int(end * pcmBufferFrameSizeInBytes!))
  12.  
  13. var localPcmBufferList = AudioBufferList(mNumberBuffers: 1,mBuffers: AudioBuffer(mNumberChannels: 0,mDataByteSize: 0,mData: nil))
  14. localPcmAudioBuffer = localPcmBufferList.mBuffers
  15. localPcmAudioBuffer.mData = pcmAudioBuffer!.mData.advancedBy(Int(end * pcmBufferFrameSizeInBytes!))
  16. localPcmAudioBuffer.mDataByteSize = framesToDecode * pcmBufferFrameSizeInBytes!;
  17. localPcmAudioBuffer.mNumberChannels = pcmAudioBuffer!.mNumberChannels
  18.  
  19. var localPcmBufferList = AudioBufferList(mNumberBuffers: 1,mData: nil))
  20. localPcmAudioBuffer = localPcmBufferList.mBuffers
  21.  
  22. AudioConverterFillComplexBuffer(audioConverterRef,AudioConverter_Callback,&convertInfo,&framesToDecode,&localPcmBufferList,nil)

是否可能导致param错误

如果需要,这是回调的完整方法

  1. func handleAudioPackets(inputData: UnsafePointer<Void>,numberBytes: UInt32,numberPackets: UInt32,packetDescriptions: UnsafeMutablePointer<AudioStreamPacketDescription>) {
  2. if currentlyReadingEntry == nil {
  3. print("currentlyReadingEntry = nil")
  4. return
  5. }
  6. if currentlyReadingEntry.parsedHeader == false {
  7. print("currentlyReadingEntry.parsedHeader == false")
  8. return
  9. }
  10.  
  11. if disposedWasRequested == true {
  12. print("disposedWasRequested == true")
  13. return
  14. }
  15.  
  16. guard let audioConverterRef = audioConverterRef else {
  17. return
  18. }
  19.  
  20. if seekToTimeWasRequested == true && currentlyReadingEntry.calculatedBitRate() > 0.0 {
  21. wakeupPlaybackThread()
  22. print("seekToTimeWasRequested == true && currentlyReadingEntry.calculatedBitRate() > 0.0")
  23. return
  24. }
  25.  
  26. discontinuous = false
  27.  
  28. var buffer = AudioBuffer()
  29. buffer.mNumberChannels = audioConverterAudioStreamBasicDescription.mChannelsPerFrame
  30. buffer.mDataByteSize = numberBytes
  31. buffer.mData = UnsafeMutablePointer<Void>(inputData)
  32.  
  33.  
  34. convertInfo? = AudioConvertInfo(done: false,packetDescriptions: packetDescriptions)
  35.  
  36.  
  37. if packetDescriptions != nil && currentlyReadingEntry.processedPacketsCount < maxCompressedBacketsForBitrateCalculation {
  38. let count: Int = min(Int(numberPackets),Int(maxCompressedBacketsForBitrateCalculation - currentlyReadingEntry.processedPacketsCount!))
  39. for var i = 0;i < count;++i{
  40. let packetSize: Int32 = Int32(packetDescriptions[i].mDataByteSize)
  41. OSAtomicAdd32(packetSize,&currentlyReadingEntry.processedPacketsSizeTotal!)
  42. OSAtomicIncrement32(&currentlyReadingEntry.processedPacketsCount!)
  43. }
  44. }
  45. while true {
  46. OSSpinLockLock(&pcmBufferSpinLock)
  47. var used: UInt32 = pcmBufferUsedFrameCount!
  48. var start: UInt32 = pcmBufferFrameStartIndex!
  49. var end = (pcmBufferFrameStartIndex! + pcmBufferUsedFrameCount!) % pcmBufferTotalFrameCount!
  50. var framesLeftInsideBuffer = pcmBufferTotalFrameCount! - used
  51. OSSpinLockUnlock(&pcmBufferSpinLock)
  52.  
  53. if framesLeftInsideBuffer == 0 {
  54. pthread_mutex_lock(&playerMutex)
  55. while true {
  56. OSSpinLockLock(&pcmBufferSpinLock)
  57. used = pcmBufferUsedFrameCount!
  58. start = pcmBufferFrameStartIndex!
  59. end = (pcmBufferFrameStartIndex! + pcmBufferUsedFrameCount!) % pcmBufferTotalFrameCount!
  60. framesLeftInsideBuffer = pcmBufferTotalFrameCount! - used
  61. OSSpinLockUnlock(&pcmBufferSpinLock)
  62.  
  63. if framesLeftInsideBuffer > 0 {
  64. break
  65. }
  66.  
  67. if (disposedWasRequested == true
  68. || internalState == SSPlayerInternalState.Disposed) {
  69. pthread_mutex_unlock(&playerMutex)
  70. return
  71. }
  72.  
  73. if (seekToTimeWasRequested == true && currentlyPlayingEntry.calculatedBitRate() > 0.0)
  74. {
  75. pthread_mutex_unlock(&playerMutex)
  76. wakeupPlaybackThread()
  77. return;
  78. }
  79.  
  80. waiting = true
  81. pthread_cond_wait(&playerThreadReadyCondition,&playerMutex)
  82. waiting = false
  83. }
  84. pthread_mutex_unlock(&playerMutex)
  85. }
  86. var localPcmAudioBuffer = AudioBuffer()
  87. var localPcmBufferList = AudioBufferList(mNumberBuffers: 1,mData: nil))
  88. localPcmAudioBuffer = localPcmBufferList.mBuffers
  89.  
  90. if end >= start {
  91. var framesAdded: UInt32 = 0
  92. var framesToDecode: UInt32 = pcmBufferTotalFrameCount! - end
  93. localPcmAudioBuffer.mData = pcmAudioBuffer!.mData.advancedBy(Int(end * pcmBufferFrameSizeInBytes!))
  94. localPcmAudioBuffer.mDataByteSize = framesToDecode * pcmBufferFrameSizeInBytes!;
  95. localPcmAudioBuffer.mNumberChannels = pcmAudioBuffer!.mNumberChannels
  96.  
  97. AudioConverterFillComplexBuffer(audioConverterRef,nil)
  98.  
  99. framesAdded = framesToDecode
  100.  
  101. if status == 100 {
  102. OSSpinLockLock(&pcmBufferSpinLock)
  103. let newCount = pcmBufferUsedFrameCount! + framesAdded
  104. pcmBufferUsedFrameCount = newCount
  105. OSSpinLockUnlock(&pcmBufferSpinLock);
  106.  
  107. OSSpinLockLock(&currentlyReadingEntry!.spinLock!)
  108. let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded)
  109. currentlyReadingEntry!.framesQueued! = newFramesAddedCount
  110. OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!)
  111. return
  112. } else if status != 0 {
  113. print("error")
  114. return
  115. }
  116. framesToDecode = start
  117.  
  118. if framesToDecode == 0 {
  119.  
  120. OSSpinLockLock(&pcmBufferSpinLock)
  121. let newCount = pcmBufferUsedFrameCount! + framesAdded
  122. pcmBufferUsedFrameCount = newCount
  123. OSSpinLockUnlock(&pcmBufferSpinLock);
  124.  
  125. OSSpinLockLock(&currentlyReadingEntry!.spinLock!)
  126. let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded)
  127. currentlyReadingEntry!.framesQueued! = newFramesAddedCount
  128. OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!)
  129. continue
  130. }
  131.  
  132. localPcmAudioBuffer.mData = pcmAudioBuffer!.mData
  133. localPcmAudioBuffer.mDataByteSize = framesToDecode * pcmBufferFrameSizeInBytes!
  134. localPcmAudioBuffer.mNumberChannels = pcmAudioBuffer!.mNumberChannels
  135.  
  136. AudioConverterFillComplexBuffer(audioConverterRef,nil)
  137. let decodedFramesAdded = framesAdded + framesToDecode
  138. framesAdded = decodedFramesAdded
  139.  
  140. if status == 100 {
  141. OSSpinLockLock(&pcmBufferSpinLock)
  142. let newCount = pcmBufferUsedFrameCount! + framesAdded
  143. pcmBufferUsedFrameCount = newCount
  144. OSSpinLockUnlock(&pcmBufferSpinLock);
  145.  
  146. OSSpinLockLock(&currentlyReadingEntry!.spinLock!)
  147. let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded)
  148. currentlyReadingEntry!.framesQueued! = newFramesAddedCount
  149. OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!)
  150. return
  151. } else if status == 0 {
  152. OSSpinLockLock(&pcmBufferSpinLock)
  153. let newCount = pcmBufferUsedFrameCount! + framesAdded
  154. pcmBufferUsedFrameCount = newCount
  155. OSSpinLockUnlock(&pcmBufferSpinLock);
  156.  
  157. OSSpinLockLock(&currentlyReadingEntry!.spinLock!)
  158. let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded)
  159. currentlyReadingEntry!.framesQueued! = newFramesAddedCount
  160. OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!)
  161. continue
  162. } else if status != 0 {
  163. print("error")
  164. return
  165. } else {
  166. var framesAdded: UInt32 = 0
  167. var framesToDecode: UInt32 = start - end
  168. localPcmAudioBuffer.mData = pcmAudioBuffer!.mData.advancedBy(Int(end * pcmBufferFrameSizeInBytes!))
  169. localPcmAudioBuffer.mDataByteSize = framesToDecode * pcmBufferFrameSizeInBytes!;
  170. localPcmAudioBuffer.mNumberChannels = pcmAudioBuffer!.mNumberChannels
  171.  
  172. var convertInfoo: UnsafePointer<Void> = unsafeBitCast(convertInfo,UnsafePointer<Void>.self)
  173.  
  174. status = AudioConverterFillComplexBuffer(audioConverterRef,&convertInfoo,nil)
  175.  
  176. framesAdded = framesToDecode
  177.  
  178. if status == 100 {
  179. OSSpinLockLock(&pcmBufferSpinLock)
  180. let newCount = pcmBufferUsedFrameCount! + framesAdded
  181. pcmBufferUsedFrameCount = newCount
  182. OSSpinLockUnlock(&pcmBufferSpinLock);
  183.  
  184. OSSpinLockLock(&currentlyReadingEntry!.spinLock!)
  185. let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded)
  186. currentlyReadingEntry!.framesQueued! = newFramesAddedCount
  187. OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!)
  188. return
  189. } else if status == 0 {
  190. OSSpinLockLock(&pcmBufferSpinLock)
  191. let newCount = pcmBufferUsedFrameCount! + framesAdded
  192. pcmBufferUsedFrameCount = newCount
  193. OSSpinLockUnlock(&pcmBufferSpinLock);
  194.  
  195. OSSpinLockLock(&currentlyReadingEntry!.spinLock!)
  196. let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded)
  197. currentlyReadingEntry!.framesQueued! = newFramesAddedCount
  198. OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!)
  199. continue
  200. } else if status != 0 {
  201. print("error")
  202. return
  203. }
  204.  
  205. }
  206. }
  207. }
  208. }

解决方法

Hej @ 3254523,我有一些答案可能的解决方案给你.我希望以正确的方式指导你,尽管我不是这个专业的专家.所以,问题是确定配置:
  1. 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.尝试以下列方式更改值(如第二个链接所示):

  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相关文章