2009-10-02 2 views
6

У меня очень большой WAV-файл размером около 100 МБ. Я хотел бы использовать Java для чтения этого wav-файла и разделить его на более мелкие куски на каждые 2 секунды аудио.Как разбить wav-файл на более мелкие куски с помощью Java?

Возможно ли это сделать на Java? Не могли бы вы предложить мне API, с которым я могу его достичь?

Спасибо заранее, Snehal

+0

Hi. Я читаю WAV-файл, и я также хочу разбить его на более мелкие куски и передать его, чтобы узнать частоту в каждом фрагменте. Я совершенно новый в Java Sound, так что вы можете помочь мне с этим. Я добавлю часть своего кода в следующий комментарий. Заранее спасибо – Learner

+0

final float [] floatBuffer = DTMF.generateDTMFTone (символ); Строка read = "D: /RecordAudio31.wav"; InputStream in = new FileInputStream (read); // создание аудиопотока из входного потока AudioStream audioStream = новый AudioStream (in); final AudioFormat format = новый AudioFormat (44100, 16, 1, true, false); final AudioInputStream inputStream = новый AudioInputStream (audioStream, format, floatBuffer.length); final AudioDispatcher dispatcher = новый AudioDispatcher (inputStream, stepSize, 0); dispatcher.addAudioProcessor (goertzelAudioProcessor); новый Thread (dispatcher) .start(); – Learner

+0

Я понял. В любом случае спасибо. – Learner

ответ

4

Вы можете использовать AudioInputStream и его AudioFileFormat элемент (который содержит AudioFormat экземпляр), чтобы знать, что писать (формат, частота дискретизации), вы можете использовать AudioSystem писать.

Основываясь на частоте дискретизации формата, вы можете узнать, сколько байтов аудио составляет 2 секунды, и перейдите к циклу чтения, что многие байты из AudioInputStream, записывая их в новый файл.

+0

Через AudioFileFormat я мог узнать, что частота дискретизации равна 8000. Какова связь между частотой дискретизации и количеством байтов, которые она занимает? Я новичок в обработке аудио, извините за мое незнание – Snehal

+2

Помимо частоты дискретизации (f) вам также нужны бит на выборку (бит/с) и количество каналов (n), также предоставляемых AudioFormat. За одну секунду аудио вам понадобится bps * n * f/8 байтов. – eljenso

+0

Спасибо Elijenso. Я мог узнать количество байтов, необходимое на 2 секунды аудио. Теперь я пытаюсь написать прочитанные байты, используя метод записи AudioSystem. Однако одним из входных аргументов является AudioInputStream. Я не могу создать этот объект на основе прочитанных байтов. Любые указатели были бы действительно полезны. Благодаря! – Snehal

0

Если вы не заботитесь о долговечности своего кода, Quicktime For Java - хорошая ставка для СМИ. Он работает на Windows и Mac и будет читать и записывать практически любой аудио (и видео) формат. Недостатком является то, что Apple не поддерживала его в течение многих лет, поэтому пока она работает, вы инвестируете в умирающую технологию.

1

Вы также можете найти specification for a wav file, который действительно простой и простой. Затем двоичный файл читает файл и сохраняет его снова в меньших битах.

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

+1

Вам также необходимо знать, как отформатировать заголовок для меньших фрагментов, учитывая формат большего фрагмента. Не «простая» задача, но это тоже не слишком сложно.Определенно, нужно заглядывать в спецификации. –

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