Java 在队列中录制语音<;字节[]>;并将其发送到服务器
我正在开发语音应用程序 我需要某种类型的缓冲队列,以便在线程中连续记录,将充满字节的缓冲区放入队列并传输到服务器,然后从队列中获取下一个缓冲区 以下是录音代码:Java 在队列中录制语音<;字节[]>;并将其发送到服务器,java,android,linked-list,bytearray,bytebuffer,Java,Android,Linked List,Bytearray,Bytebuffer,我正在开发语音应用程序 我需要某种类型的缓冲队列,以便在线程中连续记录,将充满字节的缓冲区放入队列并传输到服务器,然后从队列中获取下一个缓冲区 以下是录音代码: Queue<byte[]> qArray = new LinkedList<byte[]>(); recordingThread = new Thread(new Runnable() { @Override public void run() {
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();
Queue qArray=newlinkedlist();
recordingThread=新线程(new Runnable()){
@凌驾
公开募捐{
bData=新字节[BufferElements];
while(isRecording){
读取(b数据,0,缓冲元素);
qArray.add(bData);
if(AudioRecord.ERROR\u无效\u操作!=0){
SendAudio();
}
}
}
}“录音机线程”);
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);
试试看{
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost-HttpPost=新的HttpPost(ServerUrl.url\u音频);
//Json格式
JSONObject holder=新的JSONObject();
JSONArray jArray=新的JSONArray();
试一试{
字节[]tmparr=qArray.poll();
对于(int i=0;i
我不想错过任何正在录制的数据
非常感谢您的帮助。当您将字节[]放入队列时,您需要创建一个新的缓冲区。否则下一次录制将覆盖相同的缓冲区。只需将
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();
当然,在某个地方,您需要调用recorder.startRecording()
,否则您将无法获得任何数据。在发送音频数据时它不起作用……如果我在发送音频数据时将其移入,它会将所有空值发送到服务器loop@GMRamesh-如果进行调试,从队列中检索的数组是否都是空值?@GMRamesh-IsqArray.poll()
返回null
还是返回一个0值数组?如果返回null
,则意味着没有向其添加缓冲区。如果轮询是在与录制不同的线程上进行的,则可能需要提供一些同步以查看值。还应确保这两段代码是可访问的正在访问同一队列实例。它只返回一个0值数组…这两段代码正在访问同一队列实例only@GMRamesh-好的,我认为问题出在录制循环中。recorder.read(…)
不一定读取任何数据。您可能应该重写该循环以暂停片刻(例如,50毫秒)在调用read
之间。在缓冲区有数据之前,它也不应该对缓冲区进行排队。此外,由于缓冲区可能未满,您可能需要使用一个数据结构来维护字节数的计数。一个ByteBuffer
是一个很好的候选者。您可以在读取循环中将字节填充到缓冲区中,并在读取时填充字节ts已满,将其排队等待传输,然后启动另一个。
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;
}
}
}