声音设备返回的input buffer总是320个字节
分类: Audio2013-02-19 16:44 30人阅读 举报
首先简单介绍下,G711的压缩比,其实比较低2:1的压缩,一般采样的数据都是一次性的读取320字节,至于为什么是320呢?
原因是这样的:
语音帧的最小单位是20ms,也就是在8KHZ 16bit的基础上,一帧语音可以播放20ms,这20ms对应的长度就是320字节,按帧的概念来说,就是最少必须编码一帧的数据,也就是达到最小的语音播放单位.
320个字节是这么算出来的:
8Khz=8000个采样/秒 8采样/毫秒
那么20毫秒就是160个采样,又因为每个采样16bit=2byte,所以160个采样就是320字节。
上面的基础理论明白了不?
因此才代码中我所采用的基本都是一个语音帧的数据,也就是8KHZ,16BIT,320字节,几乎所有的压缩比都是以320为基础点的.
采集语音是采用AudioRecord来进行的:
int samp_rate = 8000 ;
int min = AudioRecord.getMinBufferSize(samp_rate,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);//一个采用占据多少bit,目前设备支持16bit/8bit 2中情况
Log.e(TAG, "min buffer size:"+min);
AudioRecord record = null;
record = new AudioRecord(
MediaRecorder.AudioSource.MIC,//the recording source
samp_rate, //采样频率,一般为8000hz/s
AudioFormat.CHANNEL_CONFIGURATION_MONO, //声音采集通道
AudioFormat.ENCODING_PCM_16BIT,
min);
播放声音采用的是:
AudioTrack:
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_AUDIO);
int samp_rate = 8000 ;
int maxjitter = AudioTrack.getMinBufferSize(samp_rate,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioTrack track = new AudioTrack(AudioManager.STREAM_VOICE_CALL,samp_rate,AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,
maxjitter, AudioTrack.MODE_STREAM);
track.play();
原理几乎一样:
本DEMO是边录音边播放的,中间并没有传说中的杂音.
阅读(1448) | 评论(0) | 转发(0) |