Сжатый (AAC) звук больше, чем PCM - PullRequest
0 голосов
/ 23 февраля 2019

В конечном итоге я пытаюсь передавать аудио с одного устройства на другое.PCM / WAV слишком велик.Я пытаюсь преобразовать аудио-байтовый поток PCM в MPEG4AAC.Тем не менее, мой сжатый звук на самом деле больше, чем необработанный аудиопоток (т.е. PCM).Даже если я уменьшу битрейт до 32000, сжатый звук будет только около 70% от исходного размера.Мой код выполняется без ошибок, а сжатый звук воспроизводится на принимающем устройстве через AudioQueue.Если кто-то может помочь, я был бы признателен.

let inDescriptionRef = CMSampleBufferGetFormatDescription(sampleBuffer)
        if inDescriptionRef != nil {
            var inDescription = CMAudioFormatDescriptionGetStreamBasicDescription(inDescriptionRef!)!.pointee
            var outDescriptionACC = AudioStreamBasicDescription()
            outDescriptionACC.mSampleRate = (inDescription.mSampleRate)
            outDescriptionACC.mFormatID = kAudioFormatMPEG4AAC//encoding mp3 not supported
            outDescriptionACC.mChannelsPerFrame = (inDescription.mChannelsPerFrame)
            outDescriptionACC.mFormatFlags = 2//kMP4Audio_AAC_LC_ObjectType

            //create these objects once so we don't keep creating them
            if mConverterToAAC == nil {
                mInFormat = AVAudioFormat(streamDescription: &inDescription)!
                mOutFormat = AVAudioFormat(streamDescription: &outDescriptionACC)!
                mConverterToAAC = AVAudioConverter(from: mInFormat, to: mOutFormat)
                mConverterToAAC.bitRate = 92000
            }


            //convert the pcm data to PCMBuffer
            let inBuffer = toPCMBuffer(pcmData)

            //out buffer to hold compressed results
            let outBuffer = AVAudioCompressedBuffer(format: mOutFormat, packetCapacity: 8, maximumPacketSize: mConverterToAAC.maximumOutputPacketSize)

            //closure to get data to convert
            let newBufferAvailable = true
            let inputBlock : AVAudioConverterInputBlock = { inNumPackets, outStatus in
                if newBufferAvailable {
                    outStatus.pointee = AVAudioConverterInputStatus.haveData
                    return inBuffer
                }
                else{
                    outStatus.pointee = AVAudioConverterInputStatus.noDataNow
                    return nil
                }
            }

            //convert PCM to Compressed AAC
            var errorPtr : NSError?
            let convertStatus = mConverterToAAC.convert(to: outBuffer, error: &errorPtr, withInputFrom: inputBlock)
            //print("ConverterStatusToACC=\(convertStatus), Name=\(Utilities().AudioConverterOutputStatusToStr(convertStatus))")
            if errorPtr != nil {
                print("ConverterStatusToACC Error Message=\(errorPtr!)")
            }
            else{
                let accData = Data(bytes: outBuffer.data, count: Int(outBuffer.byteLength))

                pcmDataTotalCount += pcmData.count
                accDataTotalCount += accData.count
                pcmDataCount += pcmData.count
                accDataCount += accData.count
                let timeLapsed = util.getCurrentMillis() - mCurrentTime
                if timeLapsed > 1000 {
                    print("PCM Data=\(pcmDataCount), Compressed Data=\(accDataCount), TimeLapsed=\(timeLapsed)")
                    pcmDataCount = 0
                    accDataCount = 0;
                    mCurrentTime = util.getCurrentMillis()

                    let pcmDataTotalCountSizeWithUnit = ByteCountFormatter.string(fromByteCount: Int64(pcmDataTotalCount), countStyle: .file)
                    let accDataTotalCountSizeWithUnit = ByteCountFormatter.string(fromByteCount: Int64(accDataTotalCount), countStyle: .file)
                    let seconds = (util.getCurrentMillis() - mStartTime) / 1000
                    //print("Total PCM Data=\(pcmDataTotalCountSizeWithUnit), Total Compressed Data=\(accDataTotalCountSizeWithUnit), Total Time=\(seconds)")
                }

                if self.connection.connected {
                    self.connection.sendAudio(pcmData)
                }
            }
        }
        else{
            print("inDescriptionRef is nil")
        }
...