AudioStreamBasicDescription
简称 ASBD
,ASBD
是 CoreAudio 用来指定线性PCM格式,或者使用 CBR 编码的等大小声道的格式。如果使用的是 VBR,或者使用非等大小的 CBR,需要对每个packet独立设置 AudioStreamPacketDescription
进行描述。
在分析 ASBD 每个字段之前,我们先来搞懂几个概念:
Audio Stream
: 一个 audio stream 表示一个声音的连续数据,比如一首歌Channel
:声道,一个声道是一个独立的音轨,单声道音频流只有一个 channel,立体声音频流有两个 channelSample
:采样,一个采样对应一个channel里的一个具体的数字
Frame
:一个 frame包含一组相同时间的samples集合
,比如一个线性立体声PCM文件每个frame包含两个samples(左声道sample 和 右声道 sample)Packet
: 一个packet包含一个或者多个连续的frame
,在给定的音频数据格式的情况下,一个packet 定义了一个最小有意义的frame集合,也是最小可测量时间的数据单位。对于线性PCM音频这类非压缩格式,一个packet只包含一个frame
。 对于压缩格式,一个packet通常会包含多个frame,比如 AAC 可能会包含1024个frame。 对于某些格式,比如 Ogg,一个packet对应的frame数量可能是变化的,该字段填充0。
一条 AudioStream 和 Channel、Sample、Frame、Packet 之间的关系如下图:
然后来看一下 AudioStreamBasicDescription
的各个属性:
struct AudioStreamBasicDescription
{
Float64 mSampleRate;
AudioFormatID mFormatID;
AudioFormatFlags mFormatFlags;
UInt32 mBytesPerPacket;
UInt32 mFramesPerPacket;
UInt32 mBytesPerFrame;
UInt32 mChannelsPerFrame;
UInt32 mBitsPerChannel;
UInt32 mReserved;
};
mSampleRate
, The number ofsample frames
per second of the data in the stream,注意这里说的是每秒钟的 frame 的个数,注意不是 sample 的个数- mFormatID,stream 里的数据类型
- mFormatFlags,mFormatID对应的格式 flags
mBytesPerPacket
,每个packet 的大小,单位是 bytemFramesPerPacket
,每个packet 包含多少 frames(参考上文,线性PCM下,这里是1)mBytesPerFrame
, 每个frame占多少 bytesmChannelsPerFrame
,每个frame包含几个channel 的数据mBitsPerChannel
,一个frame里的一个channel数据站多少bits,其实就是每个sample的大小,除以8 就是占的字节数- mReserved,填充字段
根据上面的,我们可以得到这样的关系:
代码语言:javascript复制mBytesPerPacket = mFramesPerPacket * mBytesPerFrame
mBytesPerFrame = mChannelsPerFrame * mBitsPerChannel / 8
那么我们应该这么计算 一个 packet 的duration
:
duration = (1 / mSampleRate) * mFramesPerPacket
Ref:
AudioStreamBasicDescription