声音设备返回的input buffer总是320个字节

来源:互联网 发布:长沙最新cnc编程招聘 编辑:程序博客网 时间:2024/06/11 05:51

首先简单介绍下,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是边录音边播放的,中间并没有传说中的杂音.