Отмена фазы обработки в WAV — файле создает WAV-файл без звука

#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:

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