将带有音频的arraylist转换为.wav文件(Java)

时间:2014-06-18 09:37:42

标签: java audio arraylist wav

这是我的问题,有人给了我一个功能,如果我理解的话,将一些声音样本放入arraylist。

我想创建一个包含此音轨的.wav文件,我真的不知道该怎么做。

以下是代码,因为我可能根本不理解它......

public class Track {



private ArrayList<Sample> sounds;
private     AudioFormat audioFormat;
            TargetDataLine targetDataLine;
public Track()
{
    this.sounds = new ArrayList <Sample>();  
}
/*** Sort the sample on the track by ascending start time ***/
public void sortTrack() {
    Collections.sort(sounds);
}

/**
 * Add a sample to the track.
 * @param fic location to the audio file.
 * @param sT set the start time in ms of the sound on the track.
 */
public void addSound(String fic, long sT) {     
    sounds.add(new Sample(fic, sT));
}

/**
 * Delete a sample to the track.
 * @param fic location to the audio file.
 * @param sT set the start time in ms of the sound on the track.
 */
public void deleteSound(String fic, long sT) {      
    int i;
    for ( i = 0; i < sounds.size() &&(
    sounds.get(i).getAudioFile().getName() == fic &&
    sounds.get(i).getStartTime() == sT); ++i) {}
    if (i < sounds.size()) sounds.remove(i);
}

以下是在上面的代码中导入的示例。

    public Sample (String fileLocation, long sT) {

try{
    audioFile = new File(fileLocation);
    istream = AudioSystem.getAudioInputStream(audioFile);
    format = istream.getFormat();
    startTime = sT;
    timeLenght = (audioFile.length() / (format.getFrameSize() * format.getFrameRate() )) * 1000;
}
catch (UnsupportedAudioFileException e){
    e.printStackTrace();
       } catch (IOException e) {
    e.printStackTrace();
   }    
    }

1 个答案:

答案 0 :(得分:0)

在我看来,这不是一个好的Java源代码,因为有很多无用的操作可以使用一些特定的java工具自动化。

显然,你有一个巨大的课程,代表了一个特定专辑的独特轨道;当然,这张专辑细分为不同的样本。通过一些提示来详细描述方法,以改进您的代码:

  • sortTrack()方法用于根据 Sample 类中定义的特定排序条件对数据进行排序。在这种情况下,您应该使用特定的数据结构来授予您自动排序的所有数据。我建议使用 TreeSet ,但是这种数据结构需要包含在其中的元素必须实现Comparable interface。 这样,在每次插入操作时,您将始终根据您定义的条件(根据您发布的代码,使用其开始时间对每个样本进行排序)对数据进行排序;
  • addSound()方法将指定的Sample实例附加到样本列表中(如果要切换到TreeSet,方法的实现不会更改);
  • deleteSound()方法尝试从样本列表中删除应具有特定名称(fic参数)和特定开始时间(sT参数)的样本。它是如何工作的?它循环直到找到具有指定样本名称和开始时间的对象,或者如果到达列表末尾(注意,for循环是空的,因为您需要做的就是继续并增加,直到其中一个条件为假)。但是这种东西真的很糟糕,因为你应该使用提供ArrayList类的 remove 方法(或者通常每个类都是Collection interface的子类。 在这种情况下,您需要修复Sample类中的equals()方法,以便定义两个Sample何时相等。