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