Как разделить wav-файл на 1-секундные фрагменты с помощью Java?

Ранее у меня был вопрос: Чтение wav-файла в Java

Во-первых, я хочу прочитать wav-файл с помощью Java и получить его байты для обработки в массив.

Во-вторых, я уберу его молчания (это тема другого вопроса).

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

Я попытался прочитать wav-файл с Java с помощью этого API, ответ на мой предыдущий вопрос. Однако с этим API я должен что-то делать для заголовка, или API делает это сам, и как я могу разделить этот wav-файл на 1-секундные фрагменты с помощью Java. Другой API или что-то еще меня устраивает.


person kamaci    schedule 12.05.2011    source источник
comment
формат файла .wav довольно прост. Я выполнил БПФ для файла .wav и сам написал программу чтения .wav, код был довольно небольшим. Сначала вам нужно выяснить кодировку (моно или стерео? 8-битная или 16-битная? количество сэмплов в секунду: 44,1 кГц или 22 кГц? и т. д.), а затем вычислить, сколько семплов вам нужно, чтобы получить один второй.   -  person SyntaxT3rr0r    schedule 12.05.2011
comment
@ SyntaxT3rr0r: формат WAV на самом деле прост, только если файл канонический, что означает 44-байтовый заголовок, за которым следуют образцы. Файл WAV на самом деле является файлом RIFF, и информация заголовка не обязательно должна содержаться в первых 44 байтах (хотя это есть в большинстве файлов WAV).   -  person MusiGenesis    schedule 12.05.2011
comment
@ SyntaxT3rr0r Я задал связанный вопрос здесь: stackoverflow.com/questions/5983457/   -  person kamaci    schedule 12.05.2011


Ответы (1)


API, на который вы ссылаетесь, вернет массив double[], содержащий образцы данных из исходного файла WAV. Все, что вам нужно сделать, это создать группу меньших массивов (каждый длиной в одну секунду) и скопировать из соответствующей позиции в исходном массиве в каждый из меньших массивов (так, чтобы все исходные данные были скопированы в меньшие). Затем просто используйте методы записи вашего API для создания реальных файлов WAV из каждого меньшего массива.

Использование этого API означает, что вам не нужно беспокоиться о заголовках (что хорошо, потому что их легко написать, но потенциально очень сложно прочитать).

Размер каждого меньшего массива зависит от формата оригинала. Если исходный файл WAV является монофоническим с частотой дискретизации 44,1 кГц, то 1-секундный массив будет содержать 44 100 элементов.

person MusiGenesis    schedule 12.05.2011
comment
формат .wav использует дискретные значения для хранения звуков, например, 16 бит/44,1 кГц/стерео. Каким образом API преобразует эти дискретные значения в массив double[]? Мне кажется, что где-то что-то пошло не так :) ОП должен иметь возможность выполнять свое деление, выполняя неразрушающее редактирование, но я почему-то сомневаюсь, что API использует double[] для хранения дискретных ценности можно доверять ;) - person SyntaxT3rr0r; 12.05.2011
comment
@SyntaxT3rr0r: на самом деле для такого API вполне нормально иметь дело с массивами сэмплов с плавающей запятой и целыми (т.е. 32-битными), поскольку он позволяет вам смешивать несколько 16-битных источников, не беспокоясь о переполнении (что было бы огромным проблема, если вы смешивали их в 16-битном буфере). Однако использование для этого 64-битных типов (например, double и long) совершенно бессмысленно, и также странно, что API никак не поддерживает short (16-битное целое число), несмотря на то, что это формат созданный файл WAV. - person MusiGenesis; 12.05.2011
comment
Я задал связанный вопрос здесь: stackoverflow.com/questions/5983457/ - person kamaci; 12.05.2011