Trying to stream audio from microphone to another phone via multipeer connectivity

前端 未结 1 720

I am trying to stream audio from the microphone to another iPhone via Apples Multipeer Connectivity framework. To do the audio capturing and playback I am using AVAudioEngin

相关标签:
1条回答
  • 2020-12-18 01:46

    Your AVAudioPCMBuffer serialisation/deserialisation is wrong.

    Swift3's casting has changed a lot & seems to require more copying than Swift2.

    Here's how you can convert between [UInt8] and AVAudioPCMBuffers:

    N.B: this code assumes mono float data at 44.1kHz.
    You might want to change that.

    func copyAudioBufferBytes(_ audioBuffer: AVAudioPCMBuffer) -> [UInt8] {
        let srcLeft = audioBuffer.floatChannelData![0]
        let bytesPerFrame = audioBuffer.format.streamDescription.pointee.mBytesPerFrame
        let numBytes = Int(bytesPerFrame * audioBuffer.frameLength)
    
        // initialize bytes to 0 (how to avoid?)
        var audioByteArray = [UInt8](repeating: 0, count: numBytes)
    
        // copy data from buffer
        srcLeft.withMemoryRebound(to: UInt8.self, capacity: numBytes) { srcByteData in
            audioByteArray.withUnsafeMutableBufferPointer {
                $0.baseAddress!.initialize(from: srcByteData, count: numBytes)
            }
        }
    
        return audioByteArray
    }
    
    func bytesToAudioBuffer(_ buf: [UInt8]) -> AVAudioPCMBuffer {
        // format assumption! make this part of your protocol?
        let fmt = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 44100, channels: 1, interleaved: true)
        let frameLength = UInt32(buf.count) / fmt.streamDescription.pointee.mBytesPerFrame
    
        let audioBuffer = AVAudioPCMBuffer(pcmFormat: fmt, frameCapacity: frameLength)
        audioBuffer.frameLength = frameLength
    
        let dstLeft = audioBuffer.floatChannelData![0]
        // for stereo
        // let dstRight = audioBuffer.floatChannelData![1]
    
        buf.withUnsafeBufferPointer {
            let src = UnsafeRawPointer($0.baseAddress!).bindMemory(to: Float.self, capacity: Int(frameLength))
            dstLeft.initialize(from: src, count: Int(frameLength))
        }
    
        return audioBuffer
    }
    
    0 讨论(0)
提交回复
热议问题