Android AudioRecord支持的采样率

Sum*_*mit 34 audio android android-audiorecord

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

Yah*_*hma 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

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 然而,有些人报告说,即使不支持采样率,它也会返回正值,因此可以通过尝试初始化 AudioRecord 对象来完成额外的检查,如果它认为无法处理该采样率,则会抛出 IllegalArgumentException。 (2认同)

Rea*_*hed 16

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);
Run Code Online (Sandbox Code Playgroud)

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

  • @aladin,来自文档 - PROPERTY_OUTPUT_SAMPLE_RATE是该设备主输出流的本机或最佳输出采样率,以十进制Hz表示.因此,与记录无关. (4认同)
  • `PROPERTY_OUTPUT_SAMPLE_RATE`为您提供播放的最佳采样率,而不是录音.据我所知,没有办法获得Audiorecord的最佳采样率. (2认同)

小智 13

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

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

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

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

:(