Android AudioRecord支持的采样率

时间:2011-11-07 22:15:48

标签: android audio android-audiorecord

我正在试图弄清楚运行Android 2.2及更高版本的手机支持的采样率。我们想以低于44.1kHz的速率进行采样,而不必重采样 我知道所有手机都支持44100Hz,但是想知道是否有一张桌子显示哪些采样率对特定手机有效。我见过Android的文档( http://developer.android.com/reference/android/media/AudioRecord.html)但它没有多大帮助 有没有人找到这些抽样率的列表?

7 个答案:

答案 0 :(得分:56)

最初的海报可能已经很久了,但我会发布这个以防其他人发现这个问题。

不幸的是,根据我的经验,每台设备都可以支持不同的采样率。了解设备支持的采样率的唯一可靠方法是通过检查AudioRecord的结果来单独测试它们.getMinBufferSize()是非负的(这意味着存在错误),并返回有效的最小缓冲区大小。

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

        }
    }
}

答案 1 :(得分:15)

Android具有AudioManager.getProperty()功能,可以获取最小缓冲区大小并获得音频录制和播放的首选采样率。但是,当然是, 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);

虽然这是一个迟到的答案,但我认为这可能有用。

答案 2 :(得分:13)

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

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

此外,@ Yahma和@Tom建议的这两种策略在这个特定的手机上都失败了,因为可以从不支持的配置中获得正的最小缓冲区大小,更糟糕的是,我被迫重置手机尝试使用从生成假定有效的(非异常提升)AudioRecordAudioTrack实例的参数初始化的AudioRecord类后,再次使音频堆栈工作。

我坦率地担心我在向野外发布声音应用时遇到的问题。在我们的案例中,如果我们希望在这个特定的手机型号上重复使用我们的算法(期望44.1kHz的录制速率),我们将被迫引入昂贵的采样率转换层。

:(

答案 3 :(得分:3)

我有一部手机(Acer Z3),我在测试11025赫兹时从AudioRecord.getMinBufferSize(...)返回一个正缓冲区大小。但是,如果我随后运行

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

我可以看到这个采样率实际上并不代表有效的配置(正如12月5日的用户1222021所指出的那样)。所以我的解决方案是运行两个测试以找到有效的采样率。

答案 4 :(得分:2)

我想提供一个替代Yahma的答案。

我同意他/她的命题,即必须对其进行测试(尽管可能会因模型而不是设备而异),但使用getMinBufferSize对我来说似乎有点间接。

为了测试是否支持所需的采样率,我建议尝试使用所需的采样率构建AudioTrack实例 - 如果不支持指定的采样率,您将获得表单的例外:

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

答案 5 :(得分:0)

    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中使用高采样率来获得更好的音质。 Reference

答案 6 :(得分:0)

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