3

音声アプリを開発しています。

スレッドで継続的に記録し、バイトでいっぱいのバッファーをキューに入れ、サーバーに送信し、キューから次のバッファーを取得するために、ある種のバッファーキューが必要です。

記録コードは次のとおりです。

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

記録中のデータを見逃したくありません。

どんな助けでも大歓迎です。ありがとう

4

1 に答える 1

3

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>の代わりに a を使用します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()ないと、データを取得できません。

于 2012-11-20T16:30:18.970 に答える