2016-05-23 26 views
-2

私は、オーディオファイルをカットし、特定の部分にカットしようとしています。Java - AudioInputStream - wavファイルを切り取る

私は以下のコードを見つけましたが、秒が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); 
    } 

} 
+0

これは動作するプログラムではありません。これは動作するプログラムではありません – gpasch

+0

* "誰でも助けてくれますか?" *スタックオーバーフローはヘルプデスクではありません。あなたが合理的な試みを行い、コードの中に*具体的な*質問をしたら、それはより良いかもしれません。 –

答えて

0

wavファイルのフォーマットは規模が多いです44100フレーム/秒ステレオ、16ビットエンコーディング(CD品質)は、1秒あたり4 * 44100バイト、または1秒あたり176,400バイトを提供します。フレームは1/44100秒、つまり.02ミリ秒(私の数学が正しい場合)しか消費しないため、1秒のミリ秒単位で作業することは問題ではありません。

intの代わりに入力を浮動または倍増させるだけです。

複数のstartSecondまたはsecondsToCopyを使用する場所では、フレーム境界を参照するために、答えを4の倍数(または1フレームあたりのバイト数)に丸める必要があります。

関連する問題