在队列中记录语音并将其发送到服务器

我正在开发语音应用程序。

我需要一个某种类型的缓冲队列,以便我在一个线程中连续记录,将缓冲区充满字节放入队列并传输到服务器,然后从队列中取出下一个缓冲区。

这是录音代码:

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

但是在将它发送到服务器时,它仍然缺少少量的byte []数据

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

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

我不想错过任何正在录制的数据。

任何帮助将不胜感激。 谢谢

将byte []放入队列时,需要创建一个新缓冲区。 否则,下一次录制将覆盖相同的缓冲区。 只需将bData的初始化移动到循环中:

 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(); 

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

编辑这是录制循环的修改版本,可以进行正确的错误检查。 它使用Queue而不是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; } } } 

当然,在某个地方你需要调用recorder.startRecording()否则你将无法获得任何数据。