Получите инверсию байтов для аудио, чтобы оно перестало исходный аудио сигнал - PullRequest
0 голосов
/ 16 января 2019

Я хочу исключить звук, воспроизводя оригинальное аудио и его инверсию одновременно. У меня есть байтовый массив аудио, но я не могу найти способ взять инверсию этого байтового массива. Я хочу сместить фазу до 180. Так, чтобы она стала обратной к исходному сигналу. Отсюда и тишина.

Я перешел по этой ссылке https://www.tutorialspoint.com/android/android_audio_capture.htm для записи звука. Для преобразования аудио в байты я следовал Как преобразовать видео / аудио файл в байтовый массив и наоборот в android .? этот вопрос. И лучший ответ на этот вопрос Android - Воспроизведение mp3 из байта [] для воспроизведения байтов. Я пошел по ссылке http://programminglinuxblog.blogspot.com/2014/07/how-to-flip-all-bits-in-bytearray-java.html, чтобы получить обратный. Но когда я играю аудио только с обратными байтами, ничего не воспроизводится

byte[] toFlip, flipped;

try {
      toFlip = convertAudioToBytes();
      BitSet set = BitSet.valueOf(toFlip);
      set.flip(0, set.length());
      flipped = set.toByteArray();
      Toast.makeText(MainActivity.this, "Inveresed Successfully", Toast.LENGTH_LONG).show();
       } catch (IOException e) {
          e.printStackTrace();
          Toast.makeText(MainActivity.this, "Inveresed Failed" + e, Toast.LENGTH_LONG).show();
          System.out.println("Inveresed Failed" + e);
          }

public byte[] convertAudioToBytes() throws IOException {

    FileInputStream fis = new FileInputStream(AudioSavePathInDevice);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] b = new byte[1024];

    for (int readNum; (readNum = fis.read(b)) != -1; ) {
        bos.write(b, 0, readNum);
    }

    byte[] bytes = bos.toByteArray();

    return bytes;
}

private void playMp3(byte[] mp3SoundByteArray) {
    try {
        // create temp file that will hold byte array
        File tempMp3 = File.createTempFile("kurchina", "mp3", getCacheDir());
        tempMp3.deleteOnExit();
        FileOutputStream fos = new FileOutputStream(tempMp3);
        fos.write(mp3SoundByteArray);
        fos.close();

        // resetting mediaplayer instance to evade problems
        mediaPlayer.reset();

        // In case you run into issues with threading consider new instance like:
        // MediaPlayer mediaPlayer = new MediaPlayer();

        // Tried passing path directly, but kept getting
        // "Prepare failed.: status=0x1"
        // so using file descriptor instead
        FileInputStream fis = new FileInputStream(tempMp3);
        mediaPlayer.setDataSource(fis.getFD());

        mediaPlayer.prepare();
        mediaPlayer.start();
    } catch (IOException ex) {
        String s = ex.toString();
        ex.printStackTrace();
    }
}

Он должен воспроизводить инверсию при воспроизведении перевернутого байтового массива. Но ничего не играет.

...