record voice in a Queue and send it to the server

后端 未结 1 852
甜味超标
甜味超标 2021-01-14 05:55

I am developing voice application.

I need a buffer queue of some sort so that i record continuosly in a thread , place the buffers full of bytes into the queue and

1条回答
  •  孤街浪徒
    2021-01-14 06:20

    When you place a byte[] into the queue, you need to then create a new buffer. Otherwise the next recording will overwrite the same buffer. Just move the initialization of bData into the loop:

    Queue qArray = new LinkedList();
    recordingThread = new Thread(new Runnable() {
    
        @Override
        public void run() {
            while (isRecording) {
                bData = new byte[BufferElements];
                recorder.read(bData, 0, BufferElements);
                qArray.add(bData);
                if (AudioRecord.ERROR_INVALID_OPERATION != 0) {
                    SendAudio();
                }
            }
        }
    }, "AudioRecorder Thread");
    recordingThread.start();
    

    You should also add logic to limit the size of the queue. If the queue overflows, you will still lose data, but at least you won't crash with an out-of-memory error.

    EDIT Here's a modified version of the recording loop that does proper error checking. It uses a Queue instead of a Queue:

    public void run() {
        bData = ByteBuffer.allocate(BufferElements);
        while (isRecording && !isInterrupted()) {
            int result = recorder.read(bData, 0, BufferElements);
            if (result > 0) {
                qArray.add(bData);
                SendAudio();
                bData = ByteBuffer.allocate(BufferElements);
            } else if (result == AudioRecord.ERROR_INVALID_OPERATION) {
                Log.e("Recording", "Invalid operation error");
                break;
            } else if (result == AudioRecord.ERROR_BAD_VALUE) {
                Log.e("Recording", "Bad value error");
                break;
            } else if (result == AudioRecord.ERROR) {
                Log.e("Recording", "Unknown error");
                break;
            }
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                break;
            }
        }
    }
    

    Of course, somewhere you'll need to call recorder.startRecording() or you won't get any data.

    0 讨论(0)
提交回复
热议问题