Хотите сохранить байтовые данные, поступающие с датчика, в аудиофайл, а затем воспроизвести их в android - PullRequest
0 голосов
/ 26 марта 2020

У меня есть датчик, который улавливает звуки сердца, и моя проблема в том, что я получаю свои данные в байтах, а затем преобразую их в плавающие. Я просто хочу собрать данные и поместить их в аудиофайл, а затем воспроизвести из файлового менеджера. Я перепробовал много способов, но был смущен ни одной из попыток, которые я сделал, сработал. ребята, мне очень нужна ваша помощь. PS .. я пробовал MediaPlayer и не работал. Я буду так благодарен, если кто-то может решить эту проблему. для большей ясности, моя проблема в том, что я получаю данные, которые содержат сигнал о тоне сердца, его ударах и так далее. Я получаю данные с помощью Bluetooth и, когда все готово, я конвертирую данные в числа, плаваю. Я пытаюсь сохранить эти данные в аудиофайл при получении данных, а затем воспроизводить их, когда нажимаю кнопку «Стоп». По сути, это похоже на запись данных в виде аудио, а затем воспроизведение. MediaRecorder API в android позволяет вам делать это, но через телефон mi c, и я не хочу, чтобы mi c. Мои данные готовы, но как создать аудиофайл и скопировать в него данные sh и воспроизвести их

int BufferElements2Rec = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024
    int BytesPerElement = 2; // 2 bytes in 16bit format

    private void startRecording() {

        recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                RECORDER_SAMPLERATE, RECORDER_CHANNELS,
                RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement);


        recorder.startRecording();
        isRecording = true;
        recordingThread = new Thread(new Runnable() {
            public void run() {
                writeAudioDataToFile();
            }
        }, "AudioRecorder Thread");
        recordingThread.start();
    }

    //convert short to byte
    private byte[] short2byte(short[] sData) {
        int shortArrsize = sData.length;
        byte[] bytes = new byte[shortArrsize * 2];
        for (int i = 0; i < shortArrsize; i++) {
            bytes[i * 2] = (byte) (sData[i] & 0x00FF);
            bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
            sData[i] = 0;
        }
        return bytes;

    }

    private void writeAudioDataToFile() {
        // Write the output audio in byte

        String filePath =  getExternalCacheDir().getAbsolutePath();
        filePath+="/audiorecordtest.3gp";
        int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
                RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
        byte sData[] = new byte[bufferSize];

        FileOutputStream os = null;
        try {
            os = new FileOutputStream(filePath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        while (isRecording) {
            // gets the voice output from microphone to byte format

            recorder.read(sData, 0, BufferElements2Rec);
            System.out.println("Short wirting to file" + sData.toString());
            try {
                // // writes the data to file from buffer
                // // stores the voice buffer
                byte bData[] = audioBuffer;
                os.write(bData, 0, BufferElements2Rec * BytesPerElement);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void stopRecording() {
        // stops the recording activity
        if (null != recorder) {
            isRecording = false;
            recorder.stop();
            recorder.release();
            recorder = null;
            recordingThread = null;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...