0

オーディオ ファイルを特定の部分にカットしようとしています。カットする秒数と延長する長さを指定します。

以下のコードを見つけましたが、秒が int として指定されているため、正確ではありません。

このコードを操作して、wav ファイルをミリ秒単位の精度でカットできるように手伝ってくれる人はいますか?

(つまり、10 秒の長さのオーディオ ファイルがあり、5.32 秒から 5.55 秒の間にカットしたい)

https://stackoverflow.com/a/7547123/5213329

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

  public static void println(Object o) {
    System.out.println(o);
  }

  public static void print(Object o) {
    System.out.print(o);
  }

}
4

1 に答える 1

1

多くの場合、wav の形式は毎秒 44100 フレームの規模です。ステレオ、16 ビット エンコーディング (CD 品質) では、4 * 44100 バイト/秒、つまり 176,400 バイト/秒が得られます。フレームは 1/44100 秒、つまり 0.02 ミリ秒 (私の計算が正しければ) しか消費しないため、1 秒未満のミリ秒単位での作業は問題になりません。

入力を int ではなく float または double にするだけです。

startSecond または secondsToCopy のいずれかで乗算する場所では、フレーム境界を参照するために、答えを 4 の倍数 (またはフレームあたりのバイト数が何であれ) に丸める必要がある可能性が高くなります。

于 2016-05-24T21:53:17.547 に答える