gpt4 book ai didi

swift - AVAudioPCMBuffer 以编程方式构建,不以立体声播放

转载 作者:搜寻专家 更新时间:2023-10-31 22:47:05 47 4
gpt4 key购买 nike

我正在尝试在 Swift 中以编程方式填充 AVAudioPCMBuffer 以构建节拍器。这是我尝试构建的第一个真正的应用程序,所以它也是我的第一个音频应用程序。现在我正在尝试使用不同的框架和方法来让节拍器准确循环。

我正在尝试构建一个长度为小节/小节的 AVAudioPCMBuffer,以便我可以使用 AVAudioPlayerNode 的 scheduleBuffer 方法的 .Loops 选项。我首先将我的文件(2 ch、44100 Hz、Float32、non-inter、*.wav 和 *.m4a 都有相同的问题)加载到缓冲区中,然后将缓冲区逐帧复制到 barBuffer 中,帧由空帧分隔。下面的循环是我如何完成这个。

如果我安排原始缓冲区播放,它将以立体声播放,但是当我安排 barBuffer 时,我只能得到左声道。正如我所说,我是编程初学者,没有音频编程经验,所以这可能是我对 32 位浮点 channel 或这种数据类型缺乏了解 UnsafePointer<UnsafeMutablePointer<float>> .当我在 swift 中查看 floatChannelData 属性时,描述听起来像是应该复制两个 channel 。

var j = 0
for i in 0..<Int(capacity) {
barBuffer.floatChannelData.memory[j] = buffer.floatChannelData.memory[i]
j += 1
}
j += Int(silenceLengthInSamples)
// loop runs 4 times for 4 beats per bar.

编辑:我删除了明显的错误i += 1 ,感谢 hotpaw2。但是,当播放 barBuffer 时,右声道仍然丢失。

最佳答案

swift 中的不安全指针很难习惯。

floatChannelData.memory[j] 只访问数据的第一个 channel 。要访问其他 channel ,您有几个选择:

使用高级

// Where current channel is at 0

// Get a channel pointer aka UnsafePointer<UnsafeMutablePointer<Float>>
let channelN = floatChannelData.advancedBy( channelNumber )

// Get channel data aka UnsafeMutablePointer<Float>
let channelNData = channelN.memory

// Get first two floats of channel channelNumber
let floatOne = channelNData.memory
let floatTwo = channelNData.advancedBy(1).memory

使用下标

// Get channel data aka UnsafeMutablePointer<Float>
let channelNData = floatChannelData[ channelNumber ]

// Get first two floats of channel channelNumber
let floatOne = channelNData[0]
let floatTwo = channelNData[1]

使用下标更清晰,先行再手动的步骤访问内存是隐式的。


对于您的循环,尝试通过执行以下操作来访问缓冲区的所有 channel :

for i in 0..<Int(capacity) {
for n in 0..<Int(buffer.format.channelCount) {
barBuffer.floatChannelData[n][j] = buffer.floatChannelData[n][i]
}
}

希望这对您有所帮助!

关于swift - AVAudioPCMBuffer 以编程方式构建,不以立体声播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35519745/

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