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

Audiosystem过早停止写入AudioInputStream

晋安国
2023-03-14

由于限制,我需要在第一次启动时下载一个wav文件。

我将该文件托管在服务器foo.bar/foo.wav上。

public static AudioInputStream downloadSound(String link) {
    URL url;
    try {
        url = new URL(link);
        HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
        InputStream is = urlConn.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        AudioInputStream soundInput = AudioSystem.getAudioInputStream(bis);
        // Starting the clip here also works perfectly
        return soundInput;
    } catch (IOException | UnsupportedAudioFileException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}
public void saveSound(AudioInputStream stream, String name) {
    this.createFolderIfNotExist("/sound");
    File soundfile = new File(mainPath + "/sound/" + name); 
    Clip clip;
    try {
        clip = AudioSystem.getClip();
        clip.open(stream);
        clip.start();
        // The Clip starts normally here. ( this block is just for testing purposes)
    } catch (LineUnavailableException | IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        AudioSystem.write(stream, AudioFileFormat.Type.WAVE, soundfile);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我已经检查过了,我在服务器上有完整的文件,我也验证过了,用管道将audioinputstream输入到一个剪辑中,播放它就会播放完整的音频。

现在我的问题是:如何将完整的流写入一个文件,或者我是否必须这样做,这是一种更简单的方法,可以将wav文件下载到特定的位置

共有1个答案

南门嘉
2023-03-14

我已经找到了解决问题的方法,现在我不再从服务器im获取audioInputStream,而是将该流作为普通流处理,并使用java IO的文件编写它。

public static void downloadSoundandSave(String url, String name) {
   Filesystem filesystem = new Filesystem();
    try (InputStream in = URI.create(url).toURL().openStream()) {
        filesystem.createFolderIfNotExist("/sound");
        Files.copy(in, Paths.get(filesystem.getMainPath() + "/sound/" + name));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
 类似资料:
  • 我需要制作一个音频播放器,每当这个子例程运行时,它都会播放一个声音剪辑。在播放新的之前,它还必须停止以前的声音剪辑。 我遇到的问题是,剪辑从来没有注册为运行。检查它是否正在运行的两个if语句都没有使用过。这意味着剪辑只有在完成时才会停止,它们可能会重叠,从而破坏程序。 我会使用剪辑停止();在其他子例程中,但它会告诉我找不到“剪辑”符号。我不知道如何使其可供其他子例程使用。 我唯一能得到剪辑的方法

  • 我正在训练我的第一个转移学习模式(耶!)当验证损失在超过3个时期内没有变化超过0.1时,我很难让模型停止训练。 下面是相关的代码块 下面是一些日志: 问题: 为什么训练没有在第37纪元停止,因为我设置了早期停止回调来监控Valu损失 我可以做更复杂的提前终止回调吗?类似于“如果值”的东西

  • 问题内容: 在我们的Jenkins Pipeline工作中,我们有两个阶段,我想要的是,如果其中任何一个阶段失败,那么停止构建,而不继续进行下一个阶段。 这是其中一个阶段的示例: 该脚本将失败,并且生成结果将更新,但是作业将继续进行到下一个阶段。发生这种情况时,我该如何中止或停止工作? 问题答案: 基本上,这就是该步骤的作用。如果不将结果捕获到变量中,则可以运行: 如果脚本生成非零的退出代码,则将

  • 问题内容: 我正在运行测试,发现直到我按住C键终止程序后,该文件才真正被写入。谁能解释为什么会这样? 我希望它可以同时写入,因此可以在过程中间读取文件。 问题答案: 写到磁盘的速度很慢,因此许多程序将写操作存储到大块中,然后一次写一次。这称为 缓冲 ,当您打开文件时,Python会自动进行 缓冲 。 写入文件时,实际上是在写入内存中的“缓冲区”。填满后,Python会自动将其写入磁盘。您可以通过以

  • 问题内容: 我正在使用YouTube iframe将视频嵌入到我的网站中。 我在同一页面上有多个视频。 我想使用javascript左右单击按钮来停止所有或其中之一。 可能吗? 更新: 我尝试了 Talvi Watia 所说的话并使用: 我越来越: 问题答案: 您可能需要阅读《Youtube JavaScriptAPI参考》文档。 当您将视频嵌入页面时,您需要传递以下参数: 如果您想停止所有视频按

  • 问题内容: 我将Python解释器嵌入到C程序中。但是,可能会发生以下情况:通过运行某些python脚本时,将陷入无限循环或执行时间过长。考虑防止主程序阻塞,我认为我可以在线程中运行解释器。 如何在不杀死整个过程的情况下停止在线程中运行的嵌入式解释器中执行python脚本? 是否可以将异常传递给解释器?我应该将脚本包装在其他可以监听信号的脚本下吗? PS:我可以在一个单独的进程中运行python,