Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在队列中录制语音<;字节[]>;并将其发送到服务器_Java_Android_Linked List_Bytearray_Bytebuffer - Fatal编程技术网

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-Is
qArray.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;
        }
    }
}