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