- 人的耳朵能够听到的范围,是20Hz到20000Hz.就是指物体每秒中振动20-20000次。
PCM16LE双声道数据中左声道和右声道的采样值是间隔存储的。每个采样值占用2Byte空间。
采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH),而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位(左声道)和低八位(右声道)分别代表两个声道。
音频中的大小端:
采样精度(Bit Depth) 比如底下图中的16bits,8位代表2的8次方–256,16 位则代表2的16次方–64K。简单来理解就是每次采样时候,某个点的值的取值范围。就好像钢琴上的半音比我的破葫芦丝上的声音精度要好一个道理。显卡上说的位宽也是一样的,每一位能表示的颜色范围。
音频混音的原理: 量化的语音信号的叠加等价于空气中声波的叠加。
音频音量的调节,雷大牛的博客里直接除以2,音量衰减一半。
时域采样定理,H.奈奎斯特。
一个frame就是1个采样点的字节数*声道。为啥搞个frame出来?因为对于多声道的话,用1个采样点的字节数表示不全,因为播放的时候肯定是多个声道的数据都要播出来才行。所以为了方便,就说1秒钟有多少个frame,这样就能抛开声道数,把意思表示全了。
采样率,比如192KHZ 就是说1s在1s的模拟信号上(比如正弦波)取192K个点。每个点即每个采样,就是一帧(frame)。
如图
则每秒的数据量为192000×16×2(双声道) = 6144000 (bit/s)= 6144K Kbps(即图中的Bit rate,中文即比特率)
换算成字节为6144000 / 8 = 768000 (byte/s)
而文件大小为:210.0 MB (210,036,298 bytes)
那么声音长度 = 210,036,298/768000 ≈ 273.48s 约等于 4m 33.48s
和图中文件信息对应一致(这个地方计算没去除wav 42字节的文件头大小,妈蛋,也有说44的)。
附张图,马上就理解了
13.香农采样定理,又称奈奎斯特采样定理,是信息论,特别是通讯与信号处理学科中的一个重要基本结论。1924年奈奎斯特(Nyquist)就推导出在理想低通信道的最高大码元传输速率的公式:理想低通信道的最高大码元传输速率=2W*log2N (其中W是理想低通信道的带宽,N是电平强度).
为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍。 f s≥2f max.
14.立体声:声音有方位感,空间感。
15.Gains.cpp里头计算音量的那个应该根据的是韦伯定律(林学森的书里说的)。
16.
struct audio_patch {audio_patch_handle_t id; /* patch unique ID */unsigned int num_sources; /* number of sources in following array */struct audio_port_config sources[AUDIO_PATCH_PORTS_MAX];unsigned int num_sinks; /* number of sinks in following array */struct audio_port_config sinks[AUDIO_PATCH_PORTS_MAX];
};
source和sink相对,一个出一个入。
整个audio_patch结构体,看上去包含多个source和多个sink.但是尴尬的是在AudioPolicyManager中的createAudioPatch中:
// only one source per audio patch supported for nowif (patch->num_sources > 1) {return INVALID_OPERATION;}
目前,7.0为止,还只支持一个source。但是它没说sink哦!也就是说,不支持多对多,但是支持一对一和一对多。