2015-07-17 17 views
14

Ich habe einen AudioFileStream_PacketsProc Rückruf während eines AudioFileStreamOpen eingestellt, die Audiopakete in PCM-Griffe Umwandlung AudioConverterFillComplexBuffer verwenden. Das Problem, das ich habe, ist, dass ich einen -50 OSStatus (paramErr) bekomme, nachdem AudioConverterFillComplexBuffer aufgerufen wird. Unten ist ein Ausschnitt aus, welche Parameter in AudioConverterFillComplexBuffer verwendet wurden und wie sie gemacht wurden:kann nicht mp3 in PCM AudioConverterFillComplexBuffer in AudioFileStreamOpen des AudioFileStream_PacketsProc Rückruf konvertieren

 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) 

Macht das, was möglicherweise die param Fehler verursachen könnte?

Hier ist das vollständige Verfahren für den Rückruf, wenn nötig:

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

Haben Sie einen Link zu einem runnable Projekt haben, sagen in GitHub? –

Antwort

5

Hej @ 3.254.523, ich habe einige Antworten mit möglichen Lösungen für Sie. Ich hoffe, Sie in der richtigen Weise zu führen, obwohl ich kein Experte in diesem Major bin. So ist das Problem für sicher, dass die Konfiguration von:

AudioBufferList 

Hier die Links, die die Hinweise dieser -50 OSStatus zum AudioBufferList verwandte Sonden: http://lists.apple.com/archives/coreaudio-api/2012/Apr/msg00041.html https://forums.developer.apple.com/thread/6313

Jetzt

, wir müssen sich auf Lösungen konzentrieren. Bei Durchsicht Ihres AudioBufferList, Sie haben keinen beliebigen Wert zugewiesen, aber mNumberBuffers die 1. Versuchen ist es, die Werte in der folgenden Art und Weise zu ändern (wie es in dem zweiten Link angezeigt):

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

Wenn immer noch nicht funktioniert, müssen wir es richtig konzentrieren daher hier, zu korrigieren, können Sie die Lösung für das -50 OSStatus in AudioConverterFillComplexBuffer wenn auch nicht in swift finden:

AudioConverterFillComplexBuffer return -50 (paramErr)

iPhone: AudioBufferList init and release

+0

War es nützlich für dich @ 3254523 ??? – juanmajmjr

+0

probiere es noch aus @juanmajmjr – 3254523

+0

Ich bekomme eine 1768846202 (Eingabefehler) jetzt, dass ich die mNumberBuffers als '1 '. Was könnte das sein? – 3254523