Как объединить / объединить два файла WAV в один файл WAV? - PullRequest
3 голосов
/ 05 апреля 2010

Как я могу объединить два файла WAV, используя Java?

Я пытался это , но это не сработало правильно, есть ли другой способ сделать это?

Ответы [ 2 ]

12 голосов
/ 07 ноября 2010

Если вы работаете с байтами файла wav напрямую, вы можете использовать ту же стратегию на любом языке программирования. В этом примере я предполагаю, что два исходных файла имеют одинаковый битрейт / numchannels и имеют одинаковую длину / размер. (если нет, то, вероятно, вы можете отредактировать их до начала слияния).

Сначала ознакомьтесь со спецификацией wav, я нашел хороший на веб-сайте курса stanford :

Общая длина заголовка составляет 44 или 46 байт.

Если вы хотите объединить два файла (т.е. воспроизвести один wav, а затем другой в одном файле):

  1. выясните, в каком формате находятся ваши файлы wav
  2. отсекает первые 44/46 байтов, которые являются заголовками, остальная часть файла - данные
  3. создайте новый файл и вставьте в него один из заголовков.

    новый wav-файл = {header} = {44/46} байт

  4. добавить две части данных из исходных файлов

    новый wav-файл = {заголовок + данные1 + данные2} = {44/46 + размер (данные1) + размер (данные2)} длина байта

  5. изменить заголовок в двух местах, чтобы отразить длину нового файла.

    а. изменить байты 4 + 4 (т.е. 4 байта, начиная со смещения 4). Новое значение должно быть шестнадцатеричным числом, представляющим размер нового файла wav в байтах {44/46 + размер (данные1) + размер (данные2)} - 8 байтов.

    б. измените байты 40 + 4 или 42 + 4 (4 байта, начиная со смещения 40 или 42, в зависимости от того, есть ли у вас 44-байтовый заголовок или 46-байтовый заголовок). Новое значение должно быть шестнадцатеричным числом, представляющим общий размер нового файла WAV. т.е. {44/46 + размер (данные1) + размер (данные2)}

Если вы хотите вместо этого объединить или смешать два файла (чтобы они оба воспроизводились одновременно):

  1. вам не придется редактировать заголовок, если оба файла имеют одинаковую длину.
  2. начиная с байта 44/46, вам придется редактировать каждый семпл, чтобы он соответствовал значению в data1 + значение в data2. Так, например, если ваш SampleRate был 8 бит, вы бы изменили 1 байт, если ваша частота дискретизации была 16 бит, вы бы изменили 2 байта. остальная часть файла представляет собой сэмплы размером 1/2 байта, в которых хранится значение int, представляющее форму волны звука в то время.

    а. Для каждой из оставшихся выборок в файле возьмите шестнадцатибайтную шестнадцатеричную строку и получите значение int из обоих файлов data1 и data2.

    б. сложите целые числа в 1/2 байта вместе преобразовать результат обратно в шестнадцатеричное и использовать это значение в выходном файле.

    с. Обычно вы должны разделить это число на 2, чтобы получить среднее значение, которое соответствует исходному 1/2-байтному блоку семплов. Я получал искажение, когда я пробовал это в objc (вероятно, относящемся к подписанным или неподписанным целым числам) и просто пропустил часть деления, так как это, вероятно, будет проблемой, если вы объединяете очень громкие звуки вместе. т.е. когда data1 + data2 больше 1/2 байта, звук будет обрезаться. Здесь обсуждалась проблема отсечения здесь , и вы можете попробовать один из этих методов отсечения.

2 голосов
/ 07 апреля 2010

Слияние подразумевает смешивание, но это звучит так, как будто вы имеете в виду здесь конкатенацию.

Чтобы выполнить конкатенацию с молчанием в середине, вам нужно вставить несколько кадров молчания в файл.Фрейм без вывода сообщений - это тот, в котором каждый канал имеет «0» - если вы используете подписанные сэмплы, то это буквально 0, для беззнаковых - maxvalue / 2.

В каждом кадре будет один сэмпл для каждого канала.,Таким образом, чтобы сгенерировать одну секунду тишины в формате CD, вы должны вставить 44100 (Гц) * 2 (количество каналов в кадре) = 88200 16-битных целочисленных значений со значением 0 каждый.Я не уверен, как получить доступ к необработанному файлу, абстрагированному аудио абстракциями Java, но это данные для вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...