3

たくさんのデバイス(Xoom、Xyboardなど)で完全に動作するアプリがありますが、Galaxy10.1のこの行では失敗します

mrec.setAudioSamplingRate(44100);

この行をコメントすると、すべてが順調に機能します。(デフォルトで使用されるレートはわかりません)。

私の推測では、デバイスはこの特定のサンプルレートをサポートしていませんが、サポートされているサンプルレートを確認するために、どのオブジェクトのどのメソッドを検索できるかについてのドキュメントには何も表示されていません。

すべての助けに感謝します。

4

3 に答える 3

14

はい、Androidはそれをチェックするための明示的なメソッドを提供していませんが、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つがサポートされていない場合は、負の値を返します。他のすべての入力を有効として入力すると仮定すると、サンプルレートがサポートされていない場合は、負のバッファーサイズが返されると予想されます。

ただし、サンプリングレートがサポートされていない場合でも正の値を返しているとの報告があったため、AudioRecordオブジェクトを初期化して追加のチェックを行うと、そのサンプリングレートを処理できないと判断した場合にIllegalArgumentExceptionがスローされます。

最後に、それらのいずれも保証されたチェックを提供しませんが、両方を使用すると、サポートされているチェックを取得する可能性が高くなります。

ほとんどの場合、44100と48000は私にとっては機能しますが、もちろん、デバイスごとに異なります。

于 2012-07-19T04:18:25.680 に答える
7

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);

遅い答えですが、これは役に立つかもしれないと思いました。

于 2014-03-11T05:51:43.237 に答える
1

絶対値ではないため、これはバッファサイズをテストとして使用しません。私は自分のASUSMemoPadでこのソリューションをテストしましたが、バッファーサイズテストでは常に正の整数が返され、誤検知が発生します。

最初のメソッドは、合格したサンプルレートをテストし、サンプルレートがデバイスでサポートされているかどうかに応じてtrueまたはfalseを返します。2番目のメソッドは、指定されたリストを反復処理し、有効な最大サンプリングレート(リストの最初の有効なもの)を返します。他のヒューリスティックでは簡単に変更できます。

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; // cannot sample at this rate
    } finally {
        if(recorder != null)
            recorder.release(); // release resources to prevent a memory leak
    }
    return true; // if nothing has been returned yet, then we must be able to sample at this rate!
}

int maxValidSampleRate() {
    int[] sample_rates = new int[]{44100, 16000}; // pad list with other samples rates you want to test for
    for(int sample_rate : sample_rates) {
        if(validSampleRate(sample_rate))
            return sample_rate; // this rate is supported, so return it!
    }
    return -1; // no valid sample rate
}
于 2014-04-17T15:28:02.747 に答える