резка волнового файла - PullRequest
       4

резка волнового файла

3 голосов
/ 18 сентября 2011

Как я могу вырезать файл .wave, используя java?

Что я хочу:

, когда пользователь нажимает кнопку с надписью cut, это должно обрезать звук из предыдущегоmark (в наносекундах) к текущей позиции в наносекундах. (метка позиционируется на текущую позицию в наносекундах после обрезки звука) После того, как я получу этот фрагмент аудио, я хочу сохранить этот фрагмент аудиофайла.

// obtain an audio stream 
long mark = 0; // initially set to zero
//get the current position in nanoseconds
// after that how to proceed ?
// another method ?

Какя могу это сделать?

Ответы [ 3 ]

5 голосов
/ 28 сентября 2011

На это изначально ответил Мартин Доу

import java.io.*;
import javax.sound.sampled.*;

class AudioFileProcessor {

public static void main(String[] args) {
  copyAudio("/tmp/uke.wav", "/tmp/uke-shortened.wav", 2, 1);
}

public static void copyAudio(String sourceFileName, String destinationFileName, int startSecond, int secondsToCopy) {
AudioInputStream inputStream = null;
AudioInputStream shortenedStream = null;
try {
  File file = new File(sourceFileName);
  AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file);
  AudioFormat format = fileFormat.getFormat();
  inputStream = AudioSystem.getAudioInputStream(file);
  int bytesPerSecond = format.getFrameSize() * (int)format.getFrameRate();
  inputStream.skip(startSecond * bytesPerSecond);
  long framesOfAudioToCopy = secondsToCopy * (int)format.getFrameRate();
  shortenedStream = new AudioInputStream(inputStream, format, framesOfAudioToCopy);
  File destinationFile = new File(destinationFileName);
  AudioSystem.write(shortenedStream, fileFormat.getType(), destinationFile);
} catch (Exception e) {
  println(e);
} finally {
  if (inputStream != null) try { inputStream.close(); } catch (Exception e) { println(e); }
  if (shortenedStream != null) try { shortenedStream.close(); } catch (Exception e) { println(e); }
 }
}

}

Первоначально ответил ЗДЕСЬ

0 голосов
/ 11 ноября 2011

есть API, который может помочь вам в достижении вашей цели http://code.google.com/p/musicg-sound-api/

0 голосов
/ 19 сентября 2011
  • Создайте AudioInputStream из источника файла (вы можете использовать AudioSystem.getAudioInputStream(File) для этого).
  • Используйте AudioFormat из потока getFormat(), чтобы определить количество байтов, которое нужно прочитать из потока, и позиции.
    • Положение файла (в байтах) = время (секунды) / частота дискретизации * размер выборки (биты) * 8 * каналы для волновых файлов
  • Создайте новый AudioInputStream на основе оригинала, который считывает только те данные, которые вы хотите получить из оригинала. Вы можете сделать это, пропустив нужные байты в исходном потоке, создав обертку, которая фиксирует длину конечной точки, а затем используя AudioSystem.getAudioInputStream (AudioFormat, AudioInputStream). Есть и другие способы сделать это, которые могут быть лучше.
  • Используйте метод AudioSystem.write () для записи нового файла.

Возможно, вы захотите взглянуть на Tritonus и его AudioOutputStream, это может упростить ситуацию.

...