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