2015-07-17 17 views
14

Tôi có một số gọi lại AudioFileStream_PacketsProc được đặt trong một AudioFileStreamOpen xử lý chuyển đổi gói âm thanh thành PCM bằng cách sử dụng AudioConverterFillComplexBuffer. Vấn đề mà tôi đang gặp phải là tôi nhận được -50 OSStatus (paramErr) sau khi gọi AudioConverterFillComplexBuffer. Dưới đây là một đoạn trích các thông số nào được sử dụng trong AudioConverterFillComplexBuffer và cách chúng được thực hiện:Không thể chuyển đổi mp3 sang PCM bằng AudioConverterFillComplexBuffer trong AudioFileStreamOpen của AudioFileStream_PacketsProc gọi lại

 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) 

Điều gì có thể gây ra lỗi param?

Dưới đây là phương pháp đầy đủ cho các cuộc gọi lại nếu cần thiết:

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 
        } 

       } 
      } 
     } 
    } 
+0

Bạn có một liên kết đến một dự án Runnable, nói trong github? –

Trả lời

5

Hej @ 3.254.523, Tôi có một số câu trả lời với các giải pháp có thể cho bạn. Tôi hy vọng sẽ hướng dẫn bạn đúng cách mặc dù tôi không phải là chuyên gia trong lĩnh vực này. Vì vậy, vấn đề là chắc chắn cấu hình của:

AudioBufferList 

đây các liên kết mà thăm dò các gợi ý này -50 OSStatus liên quan đến AudioBufferList: http://lists.apple.com/archives/coreaudio-api/2012/Apr/msg00041.html https://forums.developer.apple.com/thread/6313

Bây giờ, chúng tôi phải tập trung vào một giải pháp. Nhìn qua bạn AudioBufferList, bạn đã không giao bất kỳ giá trị nhưng mNumberBuffers đó là 1. Cố gắng thay đổi các giá trị theo cách sau (vì nó thể hiện trong liên kết thứ hai):

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

Nếu vẫn là không làm việc, chúng ta phải tập trung để sửa chữa nó đúng cách, do đó ở đây bạn có thể tìm ra giải pháp cho -50 OSStatus trong AudioConverterFillComplexBuffer mặc dù không phải trong nhanh chóng:

AudioConverterFillComplexBuffer return -50 (paramErr)

iPhone: AudioBufferList init and release

+0

Có hữu ích cho bạn không @ 3254523 ??? – juanmajmjr

+0

vẫn đang dùng thử @juanmajmjr – 3254523

+0

Tôi đang gặp phải một lỗi 1768846202 (lỗi đầu vào) bây giờ tôi đặt mNumberBuffers là '1'. đó có thể là gì? – 3254523

Các vấn đề liên quan