我正在熟悉如何使用AudioUnit来播放声音,并且对数据包和帧的概念感到困惑。我想知道:
-
在AudioUnit上下文中数据包和帧的定义是什么
-
每个数据包使用多个样本和每帧多个数据包的交易
我问这个问题的原因:在我目前看到的所有代码示例中,数据包本质上是一个示例,通常mBytesPerPacket=4用于16位立体声流。mFramesPerPacket通常是1,使帧、包和样本(都是立体样本)具有相同的概念。
我期望数据包和/或帧是样本的缓冲区,即一组256或512个连续样本,驱动器可以指向并线性读取。将帧/包大小减少到一个样本似乎会给负责播放数据的任何驱动程序带来不必要的压力。我错过了什么?
首先是一些定义:
- 帧是音频数据的单个样本,它代表了给定时间点单个通道的信号值。
- 一个数据包是一组帧,通常意味着在给定时间点上所有信道的帧集。
- 一个缓冲区是一组传送来处理的帧。
您不应该混淆数据包和帧,实际上mFramesPerPacket
通常应该设置为1。这并不意味着你的AudioUnit的渲染方法每一帧都会得到一个回调。如果希望控制这种情况发生的频率,则需要将kAudioSessionProperty_PreferredHardwareIOBufferDuration
属性设置为首选缓冲区大小。设置此属性并不能保证您所要求的确切缓冲区大小,但系统将尝试为您提供接近此值的值。