【问题标题】:cutting a wave file切割波形文件
【发布时间】:2011-09-18 16:20:54
【问题描述】:

如何使用 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 ?

我该怎么做?

【问题讨论】:

  • 作为参考,大多数 .wav 文件是 44.1KHz,这意味着每个样本持续时间超过 2000ns。您将无法获得纳秒级精度
  • 你做了什么来解决这个问题?您在寻找现有解决方案方面进行了哪些研究?
  • @Asaf 你可能没看问题。你只看了标题!

标签: java audio javasound


【解决方案1】:

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

【讨论】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 此 API 没有文档
      猜你喜欢
      • 1970-01-01
      • 2015-04-28
      • 2013-11-13
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多