无法在 Swift 中播放从 iOS 版本 17.2 AvAudioEngine 获取缓冲区音频数据

问题描述 投票:0回答:1

我想从麦克风获取音频。使用 AvAudioEngine 并以 Swift 语言通过套接字发送,我在 iOS 版本 15.3 中获取缓冲区数据并通过套接字发送,并且播放了即将到来的缓冲区音频数据,但是当我尝试 iOS 17.3 版本时,我获取缓冲区数据并通过套接字发送,但是它不能横向播放,我正在分享下面的代码为什么我无法播放即将推出的 iOS 17.3 版本的音频

func setupAudioEngine() {
    
  let audioEngine = AVAudioEngine()

  let inputNode = audioEngine.inputNode
  let inputFormat = inputNode.inputFormat(forBus: 0)
    
    let hardwareSampleRate = audioEngine.inputNode.inputFormat(forBus: 0).sampleRate
    print(audioEngine.inputNode.inputFormat(forBus: 0).settings)
    print(inputNode.inputFormat(forBus: 0).formatDescription)
    
    let outputFormat = AVAudioFormat(commonFormat: AVAudioCommonFormat.pcmFormatInt16,
                               sampleRate: hardwareSampleRate,
                               channels: 1,
                               interleaved: false)

    let converter = AVAudioConverter(from: inputFormat, to: outputFormat!)!
    
    DispatchQueue.global(qos: .background).async { [weak self] in
        guard let self = self else { return }
        do {
            self.socket.setIPv4Enabled(true)
            self.socket.setIPv6Enabled(false)
            try self.socket.connect(toHost:"232.10.10.100" ?? "", onPort: 3434 ?? 0)
            try self.socket.beginReceiving()
            print("Socket started")
        } catch {
            print("Socket Started Error: \(error)")
        }
    }
    

  inputNode.installTap(onBus: 0, bufferSize: 1024, format: inputFormat) {
    (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
    do {
      let inputBlock: AVAudioConverterInputBlock = { _, outStatus in
        outStatus.pointee = AVAudioConverterInputStatus.haveData
        return buffer
      }
      let frameCapacity =
        AVAudioFrameCount(outputFormat!.sampleRate) * buffer.frameLength
        / AVAudioFrameCount(buffer.format.sampleRate)
      let outputBuffer = AVAudioPCMBuffer(
        pcmFormat: outputFormat!,
        frameCapacity: frameCapacity
      )!
      var error: NSError?
      converter.convert(to: outputBuffer, error: &error, withInputFrom: inputBlock)
        
        let data = Data(buffer: UnsafeBufferPointer(start: outputBuffer.int16ChannelData![0], count: Int(outputBuffer.frameLength)))

        print(data)
        
        DispatchQueue.global(qos: .background).async { [weak self] in
            guard let self = self else { return }
            do {
                self.socket.send(data, withTimeout: 0, tag: 0)
                
            } catch {
                print("Socket send Error: \(error)")
            }
        }


    } catch {
      print(error)
    }
  }
    audioEngine.prepare()
    do {
        try audioEngine.start()
        print("Audio player started")
    } catch {
        print("Can't start the engine: \(error)")
    }
    
}
swift avaudioplayer avaudiosession avaudioengine
1个回答
0
投票

很可能格式不同。这里最常见的错误是采样率,在某些情况下为 44.1kHz,在其他情况下为 48kHz(还有一些其他选项,低至 8kHz,但这些是最常见的)。一般来说,这是由于硬件而不是软件的差异造成的。我敢打赌,您的 15.3 手机是一款较旧的手机,麦克风采样率为 44.1kHz,而您的 17.3 手机是一款较新的手机,麦克风采样率为 48kHz。

© www.soinside.com 2019 - 2024. All rights reserved.