前言
在研究android音频架,音频驱动等的时候,就有涉及到dump音频数据debug,重采样,downmixer,位深转换的处理,那这些的操作原理以及相关算法是如何实现的呢?
带着这个问题,开始探讨音频数据的如下几个问题
- 音频数据的特征,与存储等基本概念
- 音频数据的dump方法
- 重采样
- downmix
- 存储位深转换
- 参考文章列表
位深的装换
声道数的装换
1. 音频数据的特征,与存储等基本概念
PCM的一些计算
一个PCM文件的大小(dataSize),存储位深(byteCount*8),采样率,PCM时长(duration)之间的关系:
dataSize=channalCount *byteCount *sampleRate *duration
如果考虑帧数帧的大小,文件帧数(frameCount),帧长度(frameSize) 计算关系如下:
frameCount = sampleRate * duration
frameCount = dataSize / (channelCount*byteCount)
frameSize = dataSize/frameCount = channelCount*byteCount
不过以上考虑帧长度的时候,需要注意是考量的PCM文件,如果是WAVE等格式,帧长度还需要考虑每一帧的填充帧头信息(headerInfo)大小
PCM的存储格式
属于左右声道交叉存储
常用的存储位深,就是8,16, 32位,分别对应的样本空间大小如下:
样本大小 —— 数据格式 —— 最小值 ——最大值
8位PCM —— unsigned int ——0—— 225
16位PCM —— int—— -32767 —— 32767
存储方式
大端存储
一种是将高序列字节存储在起始地址,这称为小端(little-endian)字节序
小端存储
一种是将低序字节存储在起始地址(小地址),这称为小端(little-endian)字节序
代码检查:
short test = 0x1234;
printf("test: %x, base: %x, high:%x \n",test,*(char*)(&test),*((char*)(&test)+1));
//test: 1234, base: 34, high:12
printf("test addr:%p ,base:%p,high :%p \n",&test,(