Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1844499
  • 博文数量: 274
  • 博客积分: 2366
  • 博客等级: 大尉
  • 技术积分: 1880
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-22 09:37
文章分类

全部博文(274)

文章存档

2022年(1)

2020年(10)

2019年(7)

2018年(18)

2017年(26)

2016年(32)

2015年(43)

2014年(30)

2013年(44)

2012年(36)

2011年(17)

2010年(10)

分类: LINUX

2013-03-20 17:33:04

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

分类: Audio 30人阅读 评论(0)  举报

首先简单介绍下,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) |
给主人留下些什么吧!~~