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)
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)
虽然它的答案很晚,但我认为这可能有用.
小智 13
不幸的是,即使所有手机都支持所谓的44.1kHz保证率:(
我一直在测试三星GalaxyY(GT-S5360L),如果你从Camcorder源(环境麦克风)录制,唯一支持的速率是8kHz和16kHz.录音@ 44.1kHz产生完全垃圾,@ 11.025kHz产生音调改变的录音,持续时间略短于原始声音.
此外,@ Yahma和@Tom建议的两种策略都在这个特定的手机上失败,因为它可能从不支持的配置中获得正的最小缓冲区大小,更糟糕的是,我被迫重置手机以获得在尝试使用AudioRecord从产生所谓的有效(非异常提升)AudioTrack或AudioRecord实例的参数初始化的类之后,音频堆栈再次工作.
我坦率地担心我在向野外发布声音应用程序时遇到的问题.在我们的例子中,如果我们希望在这个特定的手机型号上重复使用我们的算法(期望44.1kHz的记录速率),我们将被迫引入昂贵的采样率转换层.
:(