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

dou*_*e07 4 audio cocoa frame packet audiounit

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

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

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

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

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

Nik*_*man 7

首先,一些定义:

  • 是音频数据,其表示信号的用于在给定时间点的单个信道值的单个样品.
  • 是一组帧,通常意味着是该组用于在给定时间点的所有信道的帧.
  • 缓冲器是一组用于处理传送的帧.

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

  • 为了澄清澄清,根据Core Audio Glossary,*frame*是'一组样本,包含来自音频数据流中每个通道的一个样本'.换句话说,一个框架包含*all*通道的样本,而不仅仅是一个. (2认同)