使用AudioUnit对数据包和帧大小使用什么值

时间:2011-04-06 04:30:37

标签: cocoa audio frame packet audiounit

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

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

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

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

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

1 个答案:

答案 0 :(得分:7)

首先,一些定义:

  • frame 是音频数据的单个样本,代表给定时间点单个频道的信号值。
  • 数据包是一组帧,通常是指给定时间点所有频道的帧集。
  • 缓冲区是一组交付用于处理的帧。

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