2010-04-05 3 views
2

Как слить два wav-файла с помощью java?Как объединить/объединить два wav-файла в один wav-файл?

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

+2

Как это работает неправильно? Что пошло не так? –

+0

Результат оказался слишком коротким. Вам нужно учитывать, что каждый файл файлов, которые я пытаюсь объединить, занимает 1 секунду или даже меньше. Возможно, это и есть причина. –

+0

Значит, каждый файл длится 1 секунду или меньше? Максимальная длина песни составит 2 секунды? Разве это не твоя работа? –

ответ

11

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

Первый взгляд над Wav specificaiton, я нашел хороший на веб-сайте stanford курса:

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

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

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

    новый WAV файл = {заголовок} = {44/46} байт длиной

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

    новый WAV файл = {заголовок + data1 + data2} = { 44/46 + size (data1) + size (data2)} bytes long

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

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

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

Если вы хотите, чтобы вместо того, чтобы объединить или смешать два файла (так что они оба играют в то же время, в то время):

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

    a. Для каждого из оставшихся образцов в файле захватите шестнадцатеричную строку по 1/2 байта и получите значение int из обоих файлов data1 и data2.

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

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

+0

Привет Thamster, я хочу объединить два wav files.i сделал это, но после их слияния мы можем здесь обе песни, а также с шумовыми шумами, также возникающими. ... помогите мне ... int a = buffer_1 [i]/2; \t \t \t int b = buffer_2 [i]/2; \t \t \t int c = (a + b); \t \t \t datafinal [i] = (byte) c; – sandeep

+0

Спасибо за это решение. Не деление на 2 дал мне искажение для всех, кто может столкнуться с этим в будущем. Я добавляю каждый байт отдельно для 16-битного файла PCM. –

2

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

Чтобы соединиться с тишиной посередине, вам нужно вставить в файл несколько кадров безмолвия. Безмолвный кадр - это тот, где каждый канал имеет «0» - если вы используете подписанные образцы, это буквально 0, для unsigned - maxvalue/2.

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

Смежные вопросы