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

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

概述AudioFileStreamOpen中有一个AudioFileStream_PacketsProc回调,它使用AudioConverterFillComplexBuffer处理将音频包转换为PCM.我遇到的问题是AudioConverterFillComplexBuffer被调用后,我得到了一个-50 OSStatus(paramErr).以下是AudioConverterFillComplex 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,&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,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(&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,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,&convertInfoo,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                    }                }            }        }    }
解决方法 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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1112426.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存