1
        //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秒以下ですべてが機能するため、パフォーマンスの問題であると考えていますが、多くの場合、数秒かかります。バイトの変換とエンコードに最も時間がかかります。
このコードを最適化してパフォーマンスを向上させる方法はありますか? それとも、ラグに対処する方法(おそらくキャッシュを構築する)ですか?

4

0 に答える 0