携手创作,共同成长!这是我参加「日新计划 8 月更文应战」的第30天,点击查看活动概况
本文主要学习在Audio Unit是怎么限定音频流的格局
主要内容:
- 音频流的认识
- 音频流的运用
1、 音频流认识
阐明:
- audio stream
- 音频流是声响的连续数据系列
- packet
- 包是一个或多个相邻帧的调集
- 包含了给定音频数据格局的最小有意义的帧的调集,是能够测量时间的最小数据单位
- 在LPCM中一个packet只有一个frame,如果是紧缩格局,能够有多个frame
- channel
- 声道是单声道音频的离散声道,单声道流有一个声道,立体声流有两个声道
- sample
- 采样是音频流中单个声道的数据
- 留意,这儿的采样是指整个声道中的采样数据,而frame中的采样仅仅其间的一部分
- frame
- frame是相同时间的重合的sample的调集
- 比方立体声文件每个frame都有两个sample,一个用于左声道,一个用于右声道
留意:
- 一般来说咱们设置的只要一个packet,便是运用稳定比特率CBR格局
- 始终将ASBD的字段初始化为零
- 采样率在以正常速度播放流时,就代表了帧率,每秒流过的帧数
- 还有一个字段mReserved,表示强制8字节对齐,有必要设置为0,一般不写也行,可是也要知道,不要认为除了上面的就没有其他的了
- 防止应用程序的采样率和音频硬件采样率的转化
参考链接: iOS音频流格局要求
2、 设置音频流格局
示意图:
位置:
- 咱们在要害的地方设置音频流格局,之后在非要害的地方体系会协助咱们设置,体系是在音频单元衔接后会主动设置流格局,就主动的将流数据从一个单元传递到另一个单元,无需咱们操心
- 音频输入和输出硬件是具有体系给定的音频流格局,这些格局便是线性PCM帧数据,并且是交错的(留意这儿是硬件本身的流格局)
方式:
- 体系在处理音频输入和输出时,是会帮咱们将这些格局强制放在I/O单元的朝外侧
- 咱们担任在I/O单元的向内侧建立音频流格局
- 也便是说长途I/O单元会帮咱们进行格局转化,只需要咱们给这个音频单元设置好音频流格局,他在输出音频的时候就会主动转化了
- 这儿的转化也是经过Format conversion Unit完成的
- 中心与其他的单元进行交互咱们也能够设置音频流格局
留意:
- 朝外侧能够理解为input element地点的Input scope是朝外侧,output element地点的output scope也是朝外侧
- 可是咱们最好不要设置音频流格局,直接进行格局传达。由于采样率转化也会耗费性能
- 而且只要有或许,咱们就尽或许的运用硬件的采样率,这样在履行操作时,无需进行采样率转化,这最大极限的降低了性能耗费
- 音频单元衔接的一个要害特性是衔接音频数据流格局从来源音频单元的output传达到方针音频单元的Input
- 这儿强调的是流格局传达是经过音频单元的衔接,传达方向只能从源单元的输出到方针单元的输入进行
- 使用格局传达,能够最大极限的减少咱们编写的代码量
3、 详细完成
代码:
阐明:
- AudioStreamBasicDescription是来设置音频流格局的
- 配置ASBD指定LPCM格局
- 指定具有相同巨细通道的稳定比特率CBR格局
- 可变比特率VBR音频,和信道巨细不等的CBR音频,每个packet有必要专门由另外的ASBD来设置
- 音频流传入的是媒体帧,所以设置音频流的描绘,也便是给媒体帧设置规范。
参数阐明:
- 一个packet有多少个帧数据 — mFramesPerPacket
- 一个packet有多少个字节 — mBytesPerPacket
- 一个PCM有几个声道 — mChannelsPerFrame
- 一个PCM有几个字节 — mBytesPerFrame
- 每个声道的量化精度,也便是采样位数 — mBitsPerChannel
- mBytesPerFrame = mBitsPerChannel/8