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