Swift 3:获取AVAudioPCMBuffer的长度作为TimeInterval?

Swift 3: Get length of AVAudioPCMBuffer as TimeInterval?

我想做的就是标题所说的,但我似乎做不到。我尝试执行以下操作:

func getLength(buffer: AVAudioPCMBuffer) -> TimeInterval {
  let framecount = buffer.frameCapacity
  let bytesperframe = buffer.format.streamDescription.pointee.mBytesPerFrame
  return TimeInterval(bytesperframe * framecount)
}

但这给出的数字似乎不是我想要的。我已经尝试寻找答案,但似乎没有人问这个,所以我可能遗漏了一些明显的东西。有人知道吗?

编辑:我将代码更改为:

func getLength(buffer: AVAudioPCMBuffer) -> TimeInterval {
  let framecount = Float64(buffer.frameCapacity)
  let samplerate = buffer.format.streamDescription.pointee.mSampleRate
  return TimeInterval(framecount / samplerate)
}

这似乎可行,但似乎有点复杂。还有别的办法吗?

您需要使用 frameLength 而不是 frameCapacity

感谢 Rhythmic Fistman 的创意!我现在将代码更改为:

func getLength(buffer: AVAudioPCMBuffer) -> TimeInterval {
  let framecount = Double(buffer.frameLength)
  let samplerate = buffer.format.sampleRate
  return TimeInterval(framecount / samplerate)
}

现在看起来简单多了,而且行得通。希望我做的一切都是对的。