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


首先简单介绍下,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是边录音边播放的,中间并没有传说中的杂音.
您遇到的问题是IllegalArgumentException: Null input buffer。这个错误通常是由于在使用Java的ImageIO.read()方法时传入了空的输入缓冲区引起的。\[1\]要解决这个问题,您可以检查您的代码,确保在调用ImageIO.read()方法之前,您已经正确地初始化了输入缓冲区。 另外,引用\[2\]提供了一个工具方法trimnul(),可以用来去除字符串中的空字符。您可以尝试使用这个方法来处理您的输入缓冲区,以确保它不为空。 此外,引用\[3\]提到在使用Gson传递密钥时,Gson会自动将一些字符转换为Unicode转义字符,可能导致服务器解析出来的密钥和内容不匹配。如果您在处理密钥时遇到类似的问题,可以尝试使用GsonBuilder().disableHtmlEscaping().create()来禁用Gson的自动转义功能。 希望这些信息对您有帮助! #### 引用[.reference_title] - *1* [java.lang.IllegalArgumentException: input == null](https://blog.csdn.net/qq_59018687/article/details/129889152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Java -- 报错:java.lang.IllegalArgumentException: Null input buffer & 无效的 “UTF8“ 编码字节顺序: ...](https://blog.csdn.net/weixin_38645718/article/details/109297480)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [AES加密中的异常](https://blog.csdn.net/ly4900/article/details/77519786)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值