一、在Android和PC之间传递和接收音频数据,首先要保证音频数据的格式要一致,java中提供AudioFormat类构造音频格式,以下是作者所用的构造函数:
public AudioFormat(float sampleRate,
int sampleSizeInBits,
int channels,
boolean signed,
boolean bigEndian)
-
构造具有线性 PCM 编码和给定参数的
AudioFormat
。将帧大小设置为包含每个声道一个样本所需的字节数,将帧速率设置为样本速率。-
参数:
-
sampleRate
- 每秒的样本数 -
sampleSizeInBits
- 每个样本中的位数 -
channels
- 声道数(单声道 1 个,立体声 2 个) -
signed
- 指示数据是有符号的,还是无符号的 -
bigEndian
- 指示是否以 big-endian 字节顺序存储单个样本中的数据(false
意味着 little-endian)。
-
二、在这个构造函数中,其他参数都好理解,只有bigEndian和littleEndian字节存储的顺序不懂,上网查了下,给出解释:
来自:http://blog.youkuaiyun.com/sunshine1314/article/details/2309655
谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?
其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。
用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:
Big Endian
低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Little Endian
低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
目前大多数操作系统,如windows、linux都是使用Little-endian存储字节,Mac,OS使用Big-endian存储字节;所有的网络协议都是使用big-endian来传输数据的,当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。
三、作者在Android和Windows7系统的PC之间进行语音对讲时,使用big-endian无法听到讲话内容,而使用little-endian则是成功的,具体原因还没有理解透彻,待以后慢慢学习。
AudioFormat format = new AudioFormat(8000, 16, 1, true, false);