3

如何.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 ?

我怎样才能做到这一点 ?

4

3 回答 3

7

这最初由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); }
 }
}

}

最初在这里回答

于 2011-09-28T16:57:11.177 回答
0

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

于 2011-11-11T16:23:29.297 回答
0
  • 从文件源创建一个AudioInputStreamAudioSystem.getAudioInputStream(File) (您可以使用它)。
  • 使用流中的 AudioFormatgetFormat()来确定需要从流中读取的字节数和位置。
    • 文件位置(字节)= 时间(秒)/采样率 * 采样大小(位)* 8 * 波形文件的通道
  • 基于原始创建一个新的 AudioInputStream,它只从原始读取您想要的数据。为此,您可以跳过原始流中所需的字节,创建一个固定端点长度的包装器,然后使用 AudioSystem.getAudioInputStream(AudioFormat, AudioInputStream)。还有其他方法可以做到这一点,这可能会更好。
  • 使用 AudioSystem.write() 方法写出新文件。

您可能还想查看Tritonus及其 AudioOutputStream,它可能会使事情变得更容易。

于 2011-09-18T23:51:02.603 回答