我正在试图弄清楚运行Android 2.2及更高版本的手机支持的采样率。我们想以低于44.1kHz的速率进行采样,而不必重采样 我知道所有手机都支持44100Hz,但是想知道是否有一张桌子显示哪些采样率对特定手机有效。我见过Android的文档( http://developer.android.com/reference/android/media/AudioRecord.html)但它没有多大帮助 有没有人找到这些抽样率的列表?
答案 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建议的这两种策略在这个特定的手机上都失败了,因为可以从不支持的配置中获得正的最小缓冲区大小,更糟糕的是,我被迫重置手机尝试使用从生成假定有效的(非异常提升)AudioRecord
或AudioTrack
实例的参数初始化的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