队列中的声音记录 并将其发送到服务器(record voice in a Queue

2019-07-03 23:39发布

我开发语音应用。

我需要某种形式的缓存队列中,使我在一个线程时间可持续记录,刊登全字节到队列的缓存,并传输到服务器,并且我从队列中的下一个缓冲区。

下面是记录代码:

     Queue<byte[]> qArray = new LinkedList<byte[]>();
     recordingThread = new Thread(new Runnable() {

        @Override
        public void run() {

            bData = new byte[BufferElements];

            while (isRecording) {
                recorder.read(bData, 0, BufferElements);
                qArray.add(bData);
                if (AudioRecord.ERROR_INVALID_OPERATION != 0) {
                    SendAudio();

                }

            }
        }
    }, "AudioRecorder Thread");
    recordingThread.start();

但还是缺了字节[]数据的少数,而把它发送到服务器

这里是发送语音服务器的代码:

           try {
            HttpClient httpclient = new DefaultHttpClient();


            HttpPost httppost = new HttpPost(ServerUrl.url_audio);

            // Json Format
            JSONObject holder = new JSONObject();
            JSONArray jArray = new JSONArray();
            try {

                byte[] tmparr = qArray.poll();
                for (int i = 0; i < tmparr.length; i++) {
                    jArray.put(i, tmparr[i]);
                }

                holder.put("Voice", jArray);

我不想错过它记录任何数据。

任何帮助,将不胜感激很多。 谢谢

Answer 1:

当您将一个byte []到队列中,则需要再创建一个新的缓冲。 否则,下一个记录将覆盖同一缓冲区。 只是移动的初始化bData进入循环:

Queue<byte[]> qArray = new LinkedList<byte[]>();
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();

您还应该添加逻辑来限制队列的大小。 如果队列溢出,你还是会丢失数据,但至少你不会内存不足,错误崩溃。

编辑这里的记录循环,它正确的错误检查的修改版本。 它使用一个Queue<ByteBuffer>代替Queue<byte[]>

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

当然,地方你需要调用recorder.startRecording()或你不会得到任何数据。



文章来源: record voice in a Queue and send it to the server