gpt4 book ai didi

ios - swift 将 Int16 写入 AVAudioPCMBuffer

转载 作者:行者123 更新时间:2023-11-28 15:28:49 30 4
gpt4 key购买 nike

我在 swift 中有一个数据对象,它是一个 Int16 对象数组。出于某种原因,使用“.pcmFormatInt16”对我的 AVAudioPCMBuffer 格式不起作用并且没有产生声音或内存错误。最终,通过将 Int16 转换为 float 并将其放入我的 AVAudioPCMBuffer 的两个 channel ,我能够从扬声器中播放白噪声/静电。我有一种接近答案的感觉,因为每当我对着麦克风讲话时,我都会听到不同频率的静电。我认为问题在于我没有将转换后的 Int16 转换为缓冲区 floatChannelData。

这是我的代码:

 for ch in 0..<2 {
for i in 0..<audio.count {

var val = Float( Int16(audio[i]) ) / Float(Int16.max)

if( val > 1 ){
val = 1;
}
if( val < -1 ){
val = -1;
}


self.buffer.floatChannelData![ch][i+self.bufferCount] = val
self.bufferCount+=1
}
}
self.audioFilePlayer.scheduleBuffer(self.buffer, at:nil, options: .interruptsAtLoop, completionHandler: {
print("played sum")
self.bufferCount=0
})

最佳答案

一个典型的多 channel PCM 缓冲器在每个样本的基础上都有 channel 交错,虽然我不熟悉快速音频,但我发现在这里看到给定缓冲器数据结构维度的 channel 令人耳目一新

...当我看到您的 guard 检查将 val > 1 设置为 val = 1 等时,一个标志升起...其他地方不需要,因为这些边界检查没有实际意义,因为数据很好地按原样放置

...我猜你的输入 audio[] 是 signed int 16 因为你的 val > 1 和 val < -1 ?如果为真,则除以 max int float 是错误的,因为您将失去一半的动态范围 ...

我建议你仔细看看你的

var val = Float( Int16(audio[i]) ) / Float(Int16.max)

让我们检查音频 [] 中的整数范围

2^16 == 65536//如果无符号则值范围从 0 到 (2^16 - 1) 即 0 到 65535

2^15 == 32768//如果有符号则值的范围从 -32768 到 (2^15 - 1) 即 -32768 到 32767

请告诉输入缓冲区 audio[] 是否已签名...有时它有助于识别输入数据的 max_seen 和 min_seen 值...这样做并告诉我们您输入的最大值和最小值音频[]

现在让我们关注您想要的输出缓冲区 self.buffer.floatChannelData ...因为您说的是它的 16 位 float ...这里的有效范围是多少? -1 < 有效值 < 1 ?

一旦您告诉我们这些基本问题的答案,我们就可以继续

关于ios - swift 将 Int16 写入 AVAudioPCMBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44937554/

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