Android AudioRecord支持的采样率

我试图找出运行Android 2.2及更高版本的手机支持哪些采样率。 我们希望以低于44.1kHz的频率进行采样,而不必重新采样。
我知道所有的手机都支持44100Hz,但是想知道是否有一个表格显示了特定手机的采样率是有效的。 我已经看过Android的文档( http://developer.android.com/reference/android/media/AudioRecord.html ),但没有多大帮助。
有没有人find这些采样率列表?

Solutions Collecting From Web of "Android AudioRecord支持的采样率"

原来的海报可能已经很久了,但我会张贴这个以防其他人发现这个问题。

不幸的是,以我的经验,每个设备可以支持不同的采样率。 知道设备支持的采样率的唯一可靠方法是通过检查AudioRecord.getMinBufferSize()的结果是否定的(这意味着有错误)来单独testing它们,并返回有效的最小缓冲区大小。

public void getValidSampleRates() { for (int rate : new int[] {8000, 11025, 16000, 22050, 44100}) { // add the rates you wish to check against int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_CONFIGURATION_DEFAULT, AudioFormat.ENCODING_PCM_16BIT); if (bufferSize > 0) { // buffer size is valid, Sample rate supported } } } 

不幸的是,即使所有的手机都支持据说保证的44.1kHz速率:(

我一直在testing三星GalaxyY(GT-S5360L),如果你从Camcorder源(环境麦克风)录制,唯一支持的速率是8kHz和16kHz。 录音@ 44.1kHz会产生完全的垃圾,而@ 11.025kHz会产生一个音调改变的录音,其持续时间比原始声音稍小。

此外,由@Yahma和@Tom提出的两种策略在这个特定的电话上都失败了,因为从不支持的configuration中可以得到一个肯定的,最小的缓冲区大小,更糟糕的是,我不得不重置电话以获得audio堆栈再次工作后,试图使用一个AudioRecord类初始化的参数,产生一个假设有效,(非exception提高)的AudioTrackAudioRecord实例。

坦率地说,当我发布一个声音应用程序到野外的问题时,我有点担心。 在我们的情况下,如果我们希望在这个特定的手机型号上重复使用我们的algorithm(预计44.1kHz的logging速率),我们将被迫引入昂贵的采样率转换层。

🙁

Android有AudioManager.getProperty()函数来获取最小的缓冲区大小,并获得audiologging和回放的首选采样率。 但是,当然, AudioManager.getProperty()在API级别<17上不可用 。 以下是关于如何使用此API的示例代码示例。

 // To get preferred buffer size and sampling rate. AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); String size = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER); Log.d("Buffer Size and sample rate", "Size :" + size + " & Rate: " + rate); 

虽然它的答案很晚,但我认为这可能是有用的。

我有一个电话(macros基Z3),在testing11025赫兹时,我从AudioRecord.getMinBufferSize(…)返回一个正的缓冲区大小。 但是,如果我随后跑步

 audioRecord = new AudioRecord(...); int state = audioRecord.getState(); if (state != AudioRecord.STATE_INITIALIZED) ... 

我可以看到,这个采样率实际上并不代表一个有效的configuration(正如user1222021在12年6月5日指出的那样)。 所以我的解决scheme是运行两个testing来find一个有效的采样率。

我想提供一个替代耶和华的答案。

我同意他/她的观点,即它必须经过testing(尽pipe可能根据模型而不是设备),但是使用getMinBufferSize对我来说似乎有点间接。

为了testing是否支持所需的采样率,我build议尝试构build一个具有所需采样率的AudioTrack实例 – 如果不支持指定的采样率,将会得到以下格式的exception:

“java.lang.IllegalArgumentException:2756Hz不是支持的采样率”

此方法提供您设备支持的最低audio采样率。

:您可以反转for循环以获得设备支持的最大采样率(不要忘记更改方法名称)。

注2 :尽pipeandroid文档支持高达48000(48khz)的采样率,但我已经添加了所有可能的采样率(如在wikipedia中),因为谁知道新设备可能以更高的采样帧率logging超高清audio。

 private int getMinSupportedSampleRate() { /* * Valid Audio Sample rates * * @see <a * href="http://en.wikipedia.org/wiki/Sampling_%28signal_processing%29" * >Wikipedia</a> */ final int validSampleRates[] = new int[] { 8000, 11025, 16000, 22050, 32000, 37800, 44056, 44100, 47250, 4800, 50000, 50400, 88200, 96000, 176400, 192000, 352800, 2822400, 5644800 }; /* * Selecting default audio input source for recording since * AudioFormat.CHANNEL_CONFIGURATION_DEFAULT is deprecated and selecting * default encoding format. */ for (int i = 0; i < validSampleRates.length; i++) { int result = AudioRecord.getMinBufferSize(validSampleRates[i], AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_DEFAULT); if (result != AudioRecord.ERROR && result != AudioRecord.ERROR_BAD_VALUE && result > 0) { // return the mininum supported audio sample rate return validSampleRates[i]; } } // If none of the sample rates are supported return -1 handle it in // calling method return -1; } 
  public class Bigestnumber extends AsyncTask<String, String, String>{ ProgressDialog pdLoading = new ProgressDialog(MainActivity.this); @Override protected String doInBackground(String... params) { final int validSampleRates[] = new int[]{ 5644800, 2822400, 352800, 192000, 176400, 96000, 88200, 50400, 50000, 48000,47250, 44100, 44056, 37800, 32000, 22050, 16000, 11025, 4800, 8000}; TrueMan = new ArrayList <Integer> (); for (int smaple : validSampleRates){ if(validSampleRate(smaple) == true) { TrueMan.add(smaple); }} return null; } @Override protected void onPostExecute(String result) { Integer largest = Collections.max(TrueMan); System.out.println("Largest " + String.valueOf(largest)); } } public boolean validSampleRate(int sample_rate) { AudioRecord recorder = null; try { int bufferSize = AudioRecord.getMinBufferSize(sample_rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sample_rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); } catch(IllegalArgumentException e) { return false; } finally { if(recorder != null) recorder.release(); } return true; } 

此代码将为您的Android操作系统提供最大支持的采样率。 只需声明ArrayList <Integer> TrueMan; 在你开始上课的时候 然后你可以在AudioTrack和AudioRecord中使用高采样率来获得更好的音质。 参考 。

这里只是一些更新的信息。 我花了一些时间试图获得从麦克风录音与Android 6(4.4 KitKat的罚款)的工作。 显示的错误与4.4中使用错误的采样率/ pcm等设置相同。但是我的问题是,AndroidManifest.xml中的权限已经不足以请求访问麦克风,事实上,现在需要运行时间: https : //developer.android.com/training/permissions/requesting.html