前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS CoreAudio AudioStreamBasicDescription 音频格式概念简介

iOS CoreAudio AudioStreamBasicDescription 音频格式概念简介

作者头像
JoeyBlue
发布2021-09-07 14:52:58
1.3K0
发布2021-09-07 14:52:58
举报
文章被收录于专栏:代码手工艺人代码手工艺人

AudioStreamBasicDescription 简称 ASBDASBD 是 CoreAudio 用来指定线性PCM格式,或者使用 CBR 编码的等大小声道的格式。如果使用的是 VBR,或者使用非等大小的 CBR,需要对每个packet独立设置 AudioStreamPacketDescription进行描述。

在分析 ASBD 每个字段之前,我们先来搞懂几个概念:

  • Audio Stream: 一个 audio stream 表示一个声音的连续数据,比如一首歌
  • Channel:声道,一个声道是一个独立的音轨,单声道音频流只有一个 channel,立体声音频流有两个 channel
  • Sample:采样,一个采样对应一个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 之间的关系如下图:

Image.png
Image.png

然后来看一下 AudioStreamBasicDescription 的各个属性:

代码语言:javascript
复制
struct AudioStreamBasicDescription
{
    Float64             mSampleRate;
    AudioFormatID       mFormatID;
    AudioFormatFlags    mFormatFlags;
    UInt32              mBytesPerPacket;
    UInt32              mFramesPerPacket;
    UInt32              mBytesPerFrame;
    UInt32              mChannelsPerFrame;
    UInt32              mBitsPerChannel;
    UInt32              mReserved;
};
  • mSampleRate, The number of sample frames per second of the data in the stream,注意这里说的是每秒钟的 frame 的个数,注意不是 sample 的个数
  • mFormatID,stream 里的数据类型
  • mFormatFlags,mFormatID对应的格式 flags
  • mBytesPerPacket,每个packet 的大小,单位是 byte
  • mFramesPerPacket,每个packet 包含多少 frames(参考上文,线性PCM下,这里是1)
  • mBytesPerFrame, 每个frame占多少 bytes
  • mChannelsPerFrame,每个frame包含几个channel 的数据
  • mBitsPerChannel,一个frame里的一个channel数据站多少bits,其实就是每个sample的大小,除以8 就是占的字节数
  • mReserved,填充字段

根据上面的,我们可以得到这样的关系:

代码语言:javascript
复制
mBytesPerPacket = mFramesPerPacket * mBytesPerFrame
mBytesPerFrame = mChannelsPerFrame * mBitsPerChannel / 8

那么我们应该这么计算 一个 packet 的duration

代码语言:javascript
复制
duration = (1 / mSampleRate) * mFramesPerPacket

Ref:

AudioStreamBasicDescription

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-012,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档