AudioRecord - 无效音频缓冲区大小, [英] AudioRecord - Invalid audio buffer size

查看:5186
本文介绍了AudioRecord - 无效音频缓冲区大小,的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用 AudioFormat.ENCODING_PCM_8BIT 为AudioFormat的时候有以下线的问题。当使用 AudioFormat.ENCODING_PCM_16BIT 这些做工精细。

  BUFFERSIZE = AudioRecord.getMinBufferSize(采样率,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_8BIT);
音频=新AudioRecord(MediaRecorder.AudioSource.CAMCORDER,采样率,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_8BIT,缓冲区大小);

logcat的:

  10月3日至26日:03:49.643:E / AndroidRuntime(19949):致命异常:主要
10月3日至26日:03:49.643:E / AndroidRuntime(19949):java.lang.IllegalArgumentException异常:无效的音频缓冲区大小。
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在android.media.AudioRecord.audioBuffSizeCheck(AudioRecord.java:340)
。十月3日至26日:03:49.643:E / AndroidRuntime(19949):在android.media.AudioRecord<&初始化GT;(AudioRecord.java:237)
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在com.kris.test.SoundMeter.runForCamMic(SoundMeter.java:57)
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在com.kris.test.VolumeCalc.run(VolumeCalc.java:89)
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在com.kris.test.StateChecker.micCalibration(StateChecker.java:159)
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在com.kris.test.Settings $ 3.onClick(Settings.java:354)
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在com.android.internal.app.AlertController $ ButtonHandler.handleMessage(AlertController.java:167)
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在android.os.Handler.dispatchMessage(Handler.java:99)
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在android.os.Looper.loop(Looper.java:137)
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在android.app.ActivityThread.main(ActivityThread.java:4921)
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在java.lang.reflect.Method.invokeNative(本机方法)
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在java.lang.reflect.Method.invoke(Method.java:511)
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1027)
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
10月3日至26日:03:49.643:E / AndroidRuntime(19949):在dalvik.system.NativeStart.main(本机方法)


解决方案

AudioRecord.getMinBufferSize 不支持 PCM_8BIT (请参阅<一个href=\"https://www.$c$caurora.org/gitweb/quic/la/?p=platform/frameworks/base.git;a=blob;f=media/java/android/media/AudioRecord.java;h=1be73276e63ac1b0d7af974f507e5f1624daf418;hb=refs/heads/jb_mr1#l477\"相对=nofollow> AudioRecord源$ C ​​$ C),并将返回 ERROR_BAD_VALUE (-2),如果你传递一个 PCM_8BIT 格式吧。

一个解决办法是转而使用 PCM_16BIT 编码。另一种可能性(我还没有验证它是否工作)是要求根据 PCM_16BIT 最小缓冲区大小和构造<$ C时,除以2,返回的大小$ C> AudioRecord 实例。

I have a problem with below lines when using AudioFormat.ENCODING_PCM_8BIT as AudioFormat. When using AudioFormat.ENCODING_PCM_16BIT these work fine.

bufferSize = AudioRecord.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_8BIT); 
audio = new AudioRecord(MediaRecorder.AudioSource.CAMCORDER, sampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_8BIT, bufferSize);

logcat:

03-26 10:03:49.643: E/AndroidRuntime(19949): FATAL EXCEPTION: main
03-26 10:03:49.643: E/AndroidRuntime(19949): java.lang.IllegalArgumentException: Invalid audio buffer size.
03-26 10:03:49.643: E/AndroidRuntime(19949):    at android.media.AudioRecord.audioBuffSizeCheck(AudioRecord.java:340)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at android.media.AudioRecord.<init>(AudioRecord.java:237)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at com.kris.test.SoundMeter.runForCamMic(SoundMeter.java:57)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at com.kris.test.VolumeCalc.run(VolumeCalc.java:89)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at com.kris.test.StateChecker.micCalibration(StateChecker.java:159)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at com.kris.test.Settings$3.onClick(Settings.java:354)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at   android.os.Looper.loop(Looper.java:137)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at android.app.ActivityThread.main(ActivityThread.java:4921)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at java.lang.reflect.Method.invokeNative(Native Method)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at java.lang.reflect.Method.invoke(Method.java:511)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
03-26 10:03:49.643: E/AndroidRuntime(19949):    at dalvik.system.NativeStart.main(Native Method)

解决方案

AudioRecord.getMinBufferSize does not support PCM_8BIT (see the AudioRecord source code), and will return ERROR_BAD_VALUE (-2) if you pass a PCM_8BIT format to it.

One solution would be to switch to using PCM_16BIT encoding. Another possibility (which I haven't verified whether it works) is to ask for a minimum buffer size based on PCM_16BIT and divide the returned size by 2 when constructing the AudioRecord instance.

这篇关于AudioRecord - 无效音频缓冲区大小,的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆