切割波形文件

时间:2011-09-18 16:20:54

标签: java audio javasound

如何使用java剪切.wave文件?

我想要的是:

当用户按下标有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 个答案:

答案 0 :(得分:5)

最初由Martin Dow

回答
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); }
 }
}

}

最初回答HERE

答案 1 :(得分:0)

  • 从文件来源创建AudioInputStream(您可以使用AudioSystem.getAudioInputStream(File))。
  • 使用流getFormat()中的AudioFormat确定您需要从流中读取的字节数和位置。
    • 文件位置(字节)=时间(秒)/采样率*样本大小(位)* 8 *波形文件的通道
  • 根据原始文件创建一个新的AudioInputStream,它只从原始文件中读取您想要的数据。您可以通过跳过原始流中所需的字节,创建一个修复端点长度的包装器,然后使用AudioSystem.getAudioInputStream(AudioFormat,AudioInputStream)来完成此操作。还有其他方法可以做到这一点,这可能会更好。
  • 使用AudioSystem.write()方法写出新文件。

您可能还想查看Tritonus及其AudioOutputStream,它可能会让事情变得更轻松。

答案 2 :(得分:0)

有一个api可以帮助您实现目标http://code.google.com/p/musicg-sound-api/