Получите инверсию байтов для звука, чтобы он стал поэтапным по сравнению с исходным звуковым сигналом.

Я хочу устранить звук, одновременно воспроизводя исходный звук и его инверсию. У меня есть массив байтов аудио, но я не могу найти способ инвертировать этот массив байтов. Я хочу сдвинуть фазу на 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();
    }
}

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


person Hammad Khan    schedule 15.01.2019    source источник
comment
Здесь у вас множество концептуальных проблем: 1.) .mp3 не является форматом PCM. ; он сжат. Вы должны передать байты через декомпрессор, чтобы правильно интерпретировать форму волны. 2.) Обратная форма сигнала PCM вычисляется не путем перестановки битов, а путем простого отрицания. 3.) Когда вы добавляете сигнал и его инверсию, вы получаете массив, полный 0. Есть более простые способы создать такой массив. Непонятно, чего вы пытаетесь достичь. 4.) Так же не понятно откуда вы вызываете playMp3().   -  person greeble31    schedule 16.01.2019
comment
Инверсия сигнала PCM вычисляется не путем перестановки битов, а путем простого отрицания. Да, как я могу применить отрицание к массиву байтов. Предположим, у меня есть звук с одним голосом, а затем я беру инверсный сигнал этого аудио, и когда к исходному звуку добавляется другой голос, я воспроизвожу инверсию и оригинал вместе. Так что я слышал только третий голос.   -  person Hammad Khan    schedule 16.01.2019
comment
Я использую функцию playMp3 для воспроизведения обратного массива.   -  person Hammad Khan    schedule 16.01.2019
comment
Этот вариант использования (отмена голоса) имеет гораздо больше смысла. Однако вы должны знать, что большая часть информации фазы отбрасывается во время кодирования .mp3. процесс. Это, вероятно, вызовет проблемы с вашим подходом к отмене. Лучше использовать несжатый формат, например PCM. Я рекомендую вам прочитать об этом и получить очень хорошее представление о PCM и .mp3, прежде чем пытаться решить эту проблему. Когда вы это сделаете, должно стать ясно, что я имею в виду под отрицанием.   -  person greeble31    schedule 16.01.2019
comment
Я провел исследование по сравнению PCM и mp3. И я применил отрицание. Я отредактировал свой вопрос. Звук, который я играю с инверсией, звучит роботизированно и медленно.   -  person Hammad Khan    schedule 19.01.2019