现在的位置: 首页 > 综合 > 正文

Android下音频录制以及网络传输的思路及开发方法

2012年02月24日 ⁄ 综合 ⁄ 共 2297字 ⁄ 字号 评论关闭

本文来讲述在Android中使用AudioRecord和AudioTrack来进行音频录制播放,并使用speex进行音频压缩编码,再采用TCP传输思路和方法。

1 开篇

在之前的文章我讨论过视频压缩,网络传输,多播等方案和思路,所以考虑到全面的问题,我在这里开始讨论音频的压缩传输问题了。当然这篇文章也属于从网上总结而来的,里面也有一些自己的思考方式。特别感谢开源项目android-recorder,里面很多代码给我直接的帮助。敬佩。


2
相关知识

本文的相关知识为AudioRecord、AudioTrack、Thread、TCP、Speex等。如果有问题可以单独网上搜索这些关键字。

3
多线程音频读取思路

android-recorder项目中的两个线程处理方法非常好。一个线程启动录制,然后循环调用Read方法,并将数据压倒另外一个线程的数据处理队列中,在另外一个线程的run里面,循环从队列里面取出一条,并写入到文件里面。代码示例如下:
线程1

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51
public void run() {

PcmWriter pcmWriter = new PcmWriter();

pcmWriter.init();
Thread writerThread = new Thread (pcmWriter);

pcmWriter.setRecording(true);

writerThread.start();

synchronized (mutex) {
while (!this.isRecording) {
try {

mutex.wait();
} catch (InterruptedException e) {
throw new IllegalStateException("Wait()
interrupted!"
, e);
}
}
}

android.os.Process

.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);

int bufferRead = 0;
int bufferSize = AudioRecord.getMinBufferSize(frequency,
AudioFormat.CHANNEL_IN_MONO,
audioEncoding);

short[] tempBuffer = new short[bufferSize];

AudioRecord recordInstance = new AudioRecord(

MediaRecorder.AudioSource.MIC,
frequency,
AudioFormat.CHANNEL_IN_MONO,
audioEncoding, bufferSize);


recordInstance.startRecording();

while (this.isRecording) {


bufferRead = recordInstance.read(tempBuffer, 0,
bufferSize);
if (bufferRead == AudioRecord.ERROR_INVALID_OPERATION) {
throw new IllegalStateException(
"read() returned AudioRecord.ERROR_INVALID_OPERATION");
} else if (bufferRead == AudioRecord.ERROR_BAD_VALUE) {
throw new IllegalStateException(
"read() returned AudioRecord.ERROR_BAD_VALUE");
} else if (bufferRead == AudioRecord.ERROR_INVALID_OPERATION) {
throw new IllegalStateException(
"read() returned AudioRecord.ERROR_INVALID_OPERATION");
}


pcmWriter.putData(tempBuffer,
bufferRead);

log.debug("put
data done!"
);

}

recordInstance.stop();

pcmWriter.setRecording(false);
}

线程2

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24
public void run() {

log.error("pcmwriter
thread runing"
);
while (this.isRecording()) {

if(list.size() > 0){

rawData = list.remove(0);
try {
for (int i = 0; i < rawData.size; ++i) {

dataOutputStreamInstance.writeShort(rawData.pcm[i]);
}
} catch (IOException e) {

e.printStackTrace();
}
} else {
try {
Thread.sleep(200);
} catch (InterruptedException e) {

e.printStackTrace();
}
}

}

stop()

抱歉!评论已关闭.