Java - AudioInputStream - Обрезка файла WAV

Я пытаюсь разрезать аудиофайл на определенную часть, учитывая секунду, на которую нужно вырезать, и как долго его расширять.

Я нашел код ниже, но так как секунды даны как int, это не точно.

Может кто-нибудь помочь мне манипулировать этим кодом, чтобы позволить мне вырезать WAV-файл с точностью до миллисекунды?

(т.е. у меня есть аудиофайл длиной 10 секунд, и я хочу сократить его до 5,32 секунд и 5,55 секунд)

/questions/32025026/poluchenie-audioinputstream-do-neskolkih-h-bajtov-iz-originala-obrezka-audiofajla/32025037#32025037

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

}

1 ответ

Формат WAV часто находится в масштабе 44100 кадров в секунду. Стерео, 16-битное кодирование (качество CD) дает 4 * 44100 байт в секунду, или 176 400 байт в секунду. Кадр потребляет только 1/44100 секунды или 0,02 миллисекунды (если моя математика верна), поэтому работа с долями секунды в миллисекундах не должна быть проблемой.

Просто сделайте ваши входы плавающими или удваиваются вместо целых.

В местах, где вы умножаете значения с помощью startSecond или secondsToCopy, вам, скорее всего, нужно будет округлить ваш ответ до кратного 4 (или любого количества байтов на количество кадров), чтобы сослаться на границу кадра.

Другие вопросы по тегам