当前位置: 首页 > 知识库问答 >
问题:

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

盛承
2023-03-14

这是我的问题,有人给了我一个函数,如果我理解得很好,它会把一些声音样本放入数组列表中。

我想创建一个。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个答案

詹联
2023-03-14

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

显然,你有一个巨大的类,代表了一个特定专辑的独特轨道;当然,这张专辑被细分为不同的样本。下面详细介绍了这些方法,并提供了一些技巧,以改进代码:

  • sortTrack()方法用于根据示例类中定义的特定排序条件对数据进行排序。在这种情况下,您应该使用一个特定的数据结构,允许您保存所有自动排序的数据。我建议使用TreeSet,但这种数据结构需要包含在其中的元素必须实现可比较的接口。这样,在每次插入操作中,您将始终按照您定义的标准对数据进行排序(根据您发布的代码,每个样本都使用其开始时间进行排序)
  • addSound()方法将指定的示例实例追加到示例列表中(如果要切换到树集,则该方法的实现不会更改)
  • deleteSound()方法尝试从样本列表中删除一个样本,该样本应具有特定的名称(fic参数)和特定的开始时间(sT参数)。它是如何工作的?它会循环for,直到找到具有指定样本名称和开始时间的对象,或者如果您到达列表的末尾(请注意,for循环为空,因为您只需继续并递增i,直到其中一个条件为false)。但是这类东西真的很糟糕,因为你应该使用remove方法,它提供ArrayList类(或者通常是集合接口的子类的每个类)。在这种情况下,你需要修复Sample类中的equals()方法,以便定义两个Sample何时相等
 类似资料:
  • 我有音频数据记录从麦克风这样:(ndarray的浮动) 这是我的代码: 但当我播放音频时,它就坏了,只有噪音。。。如何将其转换为。wav音频文件?

  • 我得到以下错误: WindowserRor:[错误2]系统找不到指定的文件

  • 问题内容: 我只想知道在Java或C#中是否有任何库或外部库中的构建允许我获取音频文件并对其进行解析并从中提取文本。 我需要创建一个应用程序,但是我不知道从哪里开始。 问题答案: 以下是您的一些选择: 微软演讲 光明 龙自然讲 狮身人面像4

  • 我想把音频文件转换成base64只使用Javascript。 我们可以使用画布将图像转换为base64。但是我们如何转换音频文件。 任何帮助都将感激不尽。

  • 问题内容: 给定一个包含压缩格式音频数据(例如MP3或OGG)的被叫,我希望创建一个包含输入数据的WAV转换的数组。不幸的是,如果您尝试执行此操作,JavaSound会给您以下错误: 通过将wav写入一个临时文件,然后将其读回,我设法使其正常工作,如下所示: 显然这是不太理想的。有没有更好的办法? 问题答案: 问题是,大多数AudioFileWriters在写入OutputStream时需要提前知

  • 问题内容: 在过去的几天里,尝试使其正常工作时遇到了麻烦。但是我想要的是我们有一个可以通过网络发送原始数据的应用程序。然后,我读入此二进制数据并将其保存到wav(任何音频)文件中。稍后可以查看压缩。 所以有问题的代码: 也尝试过使用上述声明,但是我得到了例外:。因此,我认为正在发生的事情是因为我的流是原始音频数据,并且没有wave报头,所以抛出异常? 该文件确实可以成功写入,但是它都是静态的,是否