Попытка перехватить голос и преобразовать его в байт [] - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть приложение чата, и я пытаюсь отправить голос после преобразования его в байт []. В моем пользовательском интерфейсе есть кнопка с OnTouchListener, и на самом деле это просто sh для разговора.

Я пробовал приведенное ниже решение, которое я видел в аналогичном вопросе, но я никогда не вылезал пока l oop .

public void captureAudio() throws IOException {

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

    ParcelFileDescriptor[] descriptors = ParcelFileDescriptor.createPipe();
    ParcelFileDescriptor parcelRead = new ParcelFileDescriptor(descriptors[0]);
    ParcelFileDescriptor parcelWrite = new ParcelFileDescriptor(descriptors[1]);

    InputStream inputStream = new ParcelFileDescriptor.AutoCloseInputStream(parcelRead);

    try {
            recorder = new MediaRecorder();
            recorder.setAudioSource(AudioSource.MIC);
            recorder.setOutputFormat(OutputFormat.AMR_NB);
            recorder.setAudioEncoder(AudioEncoder.AMR_NB);
            recorder.setOutputFile(parcelWrite.getFileDescriptor());
            recorder.prepare();

            recorder.start();
            isRecording = true;

    }catch (Exception e){
        e.printStackTrace();
    }

    RecordingListener listener=new RecordingListener() {
        @Override
        public void onChange(boolean isRecording) throws IOException {
            if(!isRecording)
            inputStream.close();
        }
    };

    listener.onChange(isRecording);

    Log.d(TAG, " recording " + isRecording);
    int read;
    byte[] data = new byte[200];

    while ((read = inputStream.read(data, 0, data.length)) != -1) {
        Log.d(TAG, "read speech " + read);

        byteArrayOutputStream.write(data, 0, read);
    }
    Log.d(TAG, "byte array " + byteArrayOutputStream);

    String dataToSend = android.util.Base64.encodeToString(byteArrayOutputStream.toByteArray()
            , android.util.Base64.DEFAULT);

    sendMessage(dataToSend);

    byteArrayOutputStream.flush();
}

public void stopCapturingAudio() throws IOException {

    isRecording=false;
    Log.d(TAG, "stopped recording ");
    try {
        recorder.stop();

        Log.d(TAG, " recording " + isRecording);
        recorder.reset();
        recorder.release();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

При нажатии кнопки вызывается captureAudio();, а когда она отпущена, вызывается stopCapturingAudio();. Это как InputStream не закрывается. Я даже добавил слушателя к логическому isRecording, но все же не заставил его работать.

...