gpt4 book ai didi

ios - iOS AudioUnit播放crack啪声问题(swift)

转载 作者:行者123 更新时间:2023-12-03 20:45:41 25 4
gpt4 key购买 nike

我正在尝试播放来自iOS中的android设备的UDP的字节。我正在使用TPCircularBuffer播放字节。我的代码如下:

let success = initCircularBuffer(&circularBuffer, 1024)
if success {
print("Circular buffer init was successful")
} else {
print("Circular buffer init not successful")
}



func udpReceive() {
receivingQueue.async {
repeat {
do {
let datagram = try self.tcpClient?.receive()
let byteData = datagram?["data"] as? Data
let dataLength = datagram?["length"] as? Int
self.dataLength = dataLength!

let _ = TPCircularBufferProduceBytes(&self.circularBuffer, byteData!.bytes, UInt32(dataLength! * MemoryLayout<UInt8>.stride * 2))

} catch {
fatalError(error.localizedDescription)
}
} while true
}


}

func consumeBuffer() -> UnsafeMutableRawPointer? {
self.availableBytes = 0
let tail = TPCircularBufferTail(&self.circularBuffer, &self.availableBytes)
return tail
}

我们正在以16K采样率进行记录,并从android端通过UDP发送到IOS,从那里开始我们使用AudioUnit播放字节,但问题是 ling啪声和声音中的剪切声音。

播放回调代码:
func performPlayback(
_ ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>,
inTimeStamp: UnsafePointer<AudioTimeStamp>,
inBufNumber: UInt32,
inNumberFrames: UInt32,
ioData: UnsafeMutablePointer<AudioBufferList>
) -> OSStatus {

var buffer = ioData[0].mBuffers

let bufferTail = consumeBuffer()

memcpy(buffer.mData, bufferTail, min(self.dataLength, Int(availableBytes)))
buffer.mDataByteSize = UInt32(min(self.dataLength, Int(availableBytes)))


TPCircularBufferConsume(&self.circularBuffer, UInt32(min(self.dataLength, Int(availableBytes))))

return noErr
}

UDP每个样本向我们发送1280个字节。我们认为问题是BUFFER SIZE设置不正确。谁能指导我如何设置适当的缓冲区大小。确实,这将是极大的帮助。我知道@Gruntcakes作为voip工程师 https://stackoverflow.com/a/57136561/12020007的工作。我还研究了@ hotpaw2的工作,并查看 https://stackoverflow.com/a/58545845/12020007来检查是否存在线程问题。任何帮助将不胜感激。

最佳答案

音频单元回调应仅返回请求的帧数(样本),如inNumberFrames参数所示。您的代码似乎正在将一些不同数量的样本复制到AudioBufferList中,这将不起作用,因为iOS音频单元只会将请求数量的帧发送到音频输出。

您可以在“音频 session ”配置中建议首选的缓冲区持续时间,但这仅是建议。 iOS可以自由地忽略此建议,并使用与设备的音频硬件,系统 Activity 和当前电源状态更好地匹配的inNumberFrames。

不要忘记预填充循环缓冲区,以解决网络(UDP)传输时间中的最大预期抖动。也许测量网络数据包到数据包的延迟抖动,并计算其统计数据(最小值,最大值,标准差)。等等

如果您的UDP缓冲区的大小不是2的幂,或者包含的采样率不是iOS硬件采样率,那么您还必须考虑小数缓冲区并在安全缓冲开销中重新采样抖动。

关于ios - iOS AudioUnit播放crack啪声问题(swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58805739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com