//constructor
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
/////////////
//thread run() method
int N = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
AudioRecord recorder = new AudioRecord(AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10);
recorder.startRecording();
while(!stopped)
{
try {
//if not paused upload audio
if (uploadAudio == true) {
short[][] buffers = new short[256][160];
int ix = 0;
//allocate buffer for audio data
short[] buffer = buffers[ix++ % buffers.length];
//write audio data to track
N = recorder.read(buffer,0,buffer.length);
//create bytes big enough to hold audio data
byte[] bytes2 = new byte[buffer.length * 2];
//convert audio data from short[][] to byte[]
ByteBuffer.wrap(bytes2).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(buffer);
//encode audio data for ulaw
read(bytes2, 0, bytes2.length);
ulaw エンコーダ コードについては、こちらを参照してください。read、maxAbsPcm、およびencodeメソッドを使用しています
//send audio data
//os.write(bytes2,0,bytes2.length);
}
} finally {
}
}
os.close();
}
catch(Throwable x)
{
Log.w("AudioWorker", "Error reading voice AudioWorker", x);
}
finally
{
recorder.stop();
recorder.release();
}
///////////
したがって、これは正常に機能します。オーディオは適切な形式でサーバーに送信され、反対側で再生されます。ただし、音声が頻繁にスキップします。例: 1,2,3,4 と言うと、4 がカットされて再生されます。
これらのメソッドのいくつかの時間を計り、0秒以下ですべてが機能するため、パフォーマンスの問題であると考えていますが、多くの場合、数秒かかります。バイトの変換とエンコードに最も時間がかかります。
このコードを最適化してパフォーマンスを向上させる方法はありますか? それとも、ラグに対処する方法(おそらくキャッシュを構築する)ですか?