2016-05-23 30 views
-2

Ich versuche, eine Audiodatei in einen bestimmten Abschnitt zu schneiden, die Sekunde, in der geschnitten werden soll, und wie lange es zu erweitern ist.Java - AudioInputStream - Schneiden einer WAV-Datei

Ich fand den Code unten, aber da Sekunden als Int angegeben sind, ist es nicht präzise.

Kann mir jemand helfen, diesen Code zu manipulieren, damit ich eine WAV-Datei auf die Genauigkeit einer Millisekunde schneiden kann?

(dh ich habe eine 10 Sekunden lange Audiodatei und ich möchte es zwischen 5,32 Sekunden schneiden und 5,55 Sekunden)

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

Sie müssen es zur Arbeit bringen das ist kein funktionierendes Programm – gpasch

+0

* "Kann mir jemand helfen .." * Stack Overflow ist kein Helpdesk. Wenn Sie einen vernünftigen Versuch machen können und dies im Code zeigen, dann fragen Sie eine * spezifische * Frage, es könnte besser gehen. –

Antwort

0

Das Format eines wav ist oft auf der Skala von 44100 Bildern pro Sekunde. Stereo, 16-Bit-Codierung (CD-Qualität) ergibt 4 * 44100 Bytes pro Sekunde oder 176.400 Bytes pro Sekunde. Ein Frame verbraucht nur 1/44100stel Sekunde oder .02 Millisekunden (wenn meine Mathematik korrekt ist), so sollte das Arbeiten mit Millisekundenbruchteilen von Sekunden kein Problem sein.

Machen Sie einfach Ihre Eingaben schwebt oder verdoppelt anstelle von Ints.

An Stellen, an denen Sie entweder mit startSecond oder secondsToCopy multiplizieren, müssen Sie Ihre Antwort wahrscheinlich auf ein Vielfaches von 4 runden (oder wie groß die Anzahl der Bytes pro Frame ist), um auf eine Rahmengrenze zu verweisen.