Android 2.2以降を実行している携帯電話でサポートされているサンプリングレートを把握しようとしています。44.1kHz未満のレートでサンプリングし、リサンプリングする必要はありません。
すべての電話が44100Hzをサポートしていることは知っていますが、特定の電話で有効なサンプリングレートを示す表があるかどうか疑問に思っていました。 Androidのドキュメント( http://developer.Android.com/reference/Android/media/AudioRecord.html )を見ましたが、あまり役に立ちません。
これらのサンプリングレートのリストを見つけた人はいますか??
元のポスターはおそらくずっと前から移動していますが、他の誰かがこの質問を見つけた場合に備えてこれを投稿します。
残念ながら、私の経験では、各デバイスは異なるサンプルレートをサポートできます。デバイスがサポートするサンプルレートを知る唯一の確実な方法は、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
}
}
}
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);
遅い答えですが、これは役に立つかもしれないと思いました。
残念ながら、すべての電話でさえ、保証された44.1kHzレートをサポートしているわけではありません:(
Samsung GalaxyY(GT-S5360L)をテストしてきましたが、Camcorder
ソース(アンビエンスマイク)から録音する場合、サポートされるレートは8kHzと16kHzのみです。 @ 44.1kHzで録音すると、ガベージガベージが発生し、@ 11.025kHzでピッチを変更した録音では、元の音よりも持続時間がわずかに短くなります。
さらに、サポートされていない構成から正の最小バッファーサイズを受け取ることができるため、@ Yahmaと@Tomによって提案された両方の戦略がこの特定の電話で失敗します。さらに悪いことに、電話をリセットするように強制されました有効と思われる(例外を発生させない)AudioRecord
またはAudioTrack
インスタンスを生成するパラメーターから初期化されたAudioRecord
クラスを使用しようとした後、オーディオスタックが再び機能します。
率直に言って、サウンドアプリを野生にリリースするときに想定している問題を少し心配しています。私たちのケースでは、この特定の電話モデルでアルゴリズムを再利用する(44.1kHzの録音レートを期待する)場合、高価なサンプルレート変換レイヤーの導入を余儀なくされています。
:(
11025 Hzのテスト時にAudioRecord.getMinBufferSize(...)から返される正のバッファーサイズを取得する電話(Acer Z3)があります。ただし、その後実行した場合
audioRecord = new AudioRecord(...);
int state = audioRecord.getState();
if (state != AudioRecord.STATE_INITIALIZED) ...
このサンプリングレートは、実際には有効な構成を表していないことがわかります(12年6月5日にuser1222021が指摘)。したがって、私の解決策は、両方のテストを実行して有効なサンプリングレートを見つけることです。
このメソッドは、デバイスでサポートされている最小オーディオサンプルレートを提供します。
[〜#〜] note [〜#〜]:forループを逆にして、デバイスでサポートされるサンプルレートmaximumを取得できます(変更することを忘れないでくださいメソッド名)。
注2:ただし、Android docは最大48000(48khz)のサンプルレートがサポートされていると言いますが、ウィキペディアのように、デバイスは、より高い(サンプリング)フレームレートでUHDオーディオを記録する場合があります。
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, 48000, 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;
}
ヤマの答えに代わるものを提供したいと思います。
テストする必要があるという彼/彼女の提案に同意します(おそらく、デバイスではなくモデルによって異なります)が、getMinBufferSizeを使用することは少し間接的に思えます。
目的のサンプルレートがサポートされているかどうかをテストするには、目的のサンプルレートでAudioTrackインスタンスを構築することをお勧めします。指定されたサンプルレートがサポートされていない場合、次の形式の例外が発生します:
「Java.lang.IllegalArgumentException:2756Hzはサポートされているサンプルレートではありません」
更新された情報はここにあります。マイクから録音にアクセスして、Android 6(4.4 KitKatで問題ありませんでした)を使用しようとしました。表示されたエラーは、間違った設定を使用したときの4.4しかし、私の問題は、実際にはAndroidManifest.xmlのアクセス許可ではマイクへのアクセスをリクエストするのに十分ではなく、実際に実行時に実行する必要があるということでした。 https:// developer.Android.com/training/permissions/requesting.html
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 OS。最大宣言サンプルレートを提供します。ただ宣言しますArrayList <Integer> TrueMan;
クラスの開始時。その後、AudioTrackおよびAudioRecordで高いサンプルレートを使用して、音質を向上させることができます。 参照 。