4

我正在熟悉如何使用 AudioUnit 播放声音,并且对数据包和帧的概念感到困惑。我想知道:

  • AudioUnit上下文中包和帧的定义是什么

  • 每个数据包使用多个样本和每帧多个数据包的交易是什么

我问的原因:在我目前看到的所有代码示例中,数据包本质上是一个示例,对于 16 位立体声流,通常 mBytesPerPacket=4。而 mFramesPerPacket 通常为 1,制作一个帧、一个数据包和一个样本(都是立体样本),概念相同。

我期望一个数据包和/或一个帧是样本缓冲区,即一组 256 或 512 个连续样本,驱动程序可以指向并线性读取。将帧/数据包大小减少到一个样本似乎会给负责播放数据的任何驱动程序带来不必要的压力。我错过了什么?

4

1 回答 1

6

首先,一些定义:

  • 是音频数据的单个样本,它表示给定时间点单个通道的信号值。
  • 一个数据包是一组帧,通常意味着在给定时间点上所有通道的一组帧。
  • 缓冲区是为处理而交付的一组帧。

您不应该混淆数据包和帧,实际上mFramesPerPacket通常应该设置为 1。这并不意味着您的 AudioUnit 的渲染方法会在每一帧得到回调。如果您想控制这种情况发生的频率,您需要将该kAudioSessionProperty_PreferredHardwareIOBufferDuration属性设置为首选缓冲区大小。设置此属性并不能保证您要求的确切缓冲区大小,但系统会尝试为您提供接近此值的内容。

于 2011-04-06T07:09:31.947 回答