3

.waveJavaを使用してファイルを切り取るにはどうすればよいですか?

私が欲しいのは:

ユーザーがラベルの付いたボタンを押すと、オーディオが前の(ナノ秒単位)から現在の位置(ナノ秒単位)に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

これはもともとマーティンダウによって答えられました

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
  • ファイルソースからAudioInputStreamを作成します(これに使用できますAudioSystem.getAudioInputStream(File))。
  • ストリームのAudioFormatを使用して、ストリームgetFormat()から読み取る必要のあるバイト数と位置を決定します。
    • ファイル位置(バイト)=時間(秒)/サンプルレート*サンプルサイズ(ビット)* 8*Waveファイルのチャネル
  • オリジナルから必要なデータのみを読み取るオリジナルに基づいて、新しいAudioInputStreamを作成します。これを行うには、元のストリームで必要なバイトをスキップし、エンドポイントの長さを固定するラッパーを作成してから、AudioSystem.getAudioInputStream(AudioFormat、AudioInputStream)を使用します。これを行う他の方法もありますが、それはより良いかもしれません。
  • AudioSystem.write()メソッドを使用して、新しいファイルを書き出します。

TritonusとそのAudioOutputStreamも確認することをお勧めします。これにより、作業が簡単になる場合があります。

于 2011-09-18T23:51:02.603 に答える
0

目標を達成するのに役立つAPIがありますhttp://code.google.com/p/musicg-sound-api/

于 2011-11-11T16:23:29.297 に答える