#java #android #audio #wav
Вопрос:
Поэтому я генерирую WAV-файл с отменой фазы. Но сгенерированный WAV-файл воспроизводится, но без звука. Использовали несколько плееров и устройств, но звука не было. Сначала я скопировал заголовок в целевой файл. Затем,
Чтение части данных WAV-файла и получение массива аудиоданных
long arrLength = source.length() - Wav_header_size;
byte[] arr = new byte[(int) arrLength];
RandomAccessFile filein;
filein = new RandomAccessFile(source, "rw");
filein.seek(Wav_header_size);
filein.read();
filein.write(arr,0, arr.length);
filein.close();
Получение массивов каналов из аудиоданных
short[] shortAudioArray = new short[arr.length/2];
short[] channelLeft = new short[arr.length/4];
short[] channelRight = new short[arr.length/4];
ByteBuffer.wrap(arr).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shortAudioArray);
for(int i=0, j=0; i< shortAudioArray.length;i =2, j){
if(channelLeft.length>j amp;amp; channelLeft[j]!=0)
channelLeft[j] = shortAudioArray[i];
else
break;
if(channelRight.length>j amp;amp; channelRight[j]!=0)
channelRight[j] = shortAudioArray[i 1];
else
break;
}
Отмена фазы обработки путем отрицания одной фазы и последующего объединения
for(int i =0;i< data2.length;i ) {
data2[i] = (short) -data2[i];
}
for(int i=0,j=0; j< dstAudio.length;i ,j=j 2) {
if(data1.length>i amp;amp; data1[i]!=0)
dstAudio[j] = data1[i];
else
break;
if(data2.length>i amp;amp; data2[i]!=0)
dstAudio[j 1] = data2[i];
else
break;
}
byte[] bytesLast = new byte[dstAudio.length * 2];
ByteBuffer.wrap(bytesLast).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(dstAudio);
Таким образом, создается аудиофайл WAV того же размера, но без звука.
Может ли кто-нибудь, пожалуйста, поправить меня, если я все равно ошибаюсь во всем процессе?
Комментарии:
1. Просто для уточнения, вы пытаетесь создать новый стереофайл, который является фазово-инвертированной версией исходного файла или чем-то совершенно другим?
2. Да, именно так. Подходит ли процесс, который я использую, или мне нужно следовать чему-то другому?
Ответ №1:
Java предоставляет классы, которые обрабатывают форматирование и другие структурные аспекты .файл wav. Я настоятельно рекомендую использовать эти инструменты, а не пытаться писать свои собственные .заголовки wav и тому подобное.
Вы можете прочитать больше об этих инструментах в руководстве Oracle по звуку. В шестом из серии (С использованием файлов и конвертеров форматов) есть подраздел о записи аудиофайлов.
Комментарии:
1. Спасибо. Хорошо, я займусь этим.
2. Но мне действительно нужно, чтобы этот код работал. Так что было бы здорово, если бы кто-нибудь указал мне путь через это.
3. Шаг 1, воспроизведите wav-файл с исходным кодом (есть несколько учебных пособий). Шаг 2, замените свой код (часть, которая создает PCM в байтовой форме) на роль, обычно выполняемую AudioInputStream.
Ответ №2:
Поэтому я решил проблему, манипулируя массивом байтов путем инвертирования битов один за другим, не создавая и не преобразуя их в более короткие массивы.