【问题标题】:How to code to play MP3?如何编码播放 MP3?
【发布时间】:2015-03-02 14:17:20
【问题描述】:

我正在编写几行代码,它们交替地每 0.5 秒打印出“tick”和“tock”,然后打印出“done!” 60 秒后。

import javax.sound.sampled.*;

public class Thread0001 {
    public static void main(String args[]) {
        for(int i=0; i<60; i++) {
            try {
                Thread.sleep(500);
                if(i%2 == 0) {
                    System.out.print("tick ");
                    try {
                        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(Thread0001.class.getClass().getResource
                                ("Users/Marshall/Documents/Sources/Elevator.mp3"));
                        Clip clip = AudioSystem.getClip();
                        clip.open(audioInputStream);
                        clip.start();
                    } catch(Exception e) {

                    }
                }
                else
                    System.out.print("tock ");
                if(i == 59) { // when it reaches 60 seconds
                    System.out.println("done!");
                }
            } catch(Exception e) {

            }
        }
    }
}

好吧,一切似乎都很好,但有一件事 - 我还设置了一个代码,以便在每次“滴答”时发出电梯铃声。这段代码似乎不起作用,有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你的jar文件里真的有Users/Marshall/etc文件夹吗?
  • 你放了一个try/catch:尝试删除它并粘贴你得到的错误。
  • 您正在捕获尝试开始跟踪时可能发生的所有异常。您应该打印出异常,它可能有助于您理解问题。
  • @AntonioRagagnin 我不建议删除 try/catch(可能需要它),而不是建议他使用 e.printStackTrace() 发布堆栈跟踪
  • “如何编码播放MP3?”答案在Java Sound info. page。也不要忽略异常。 catch(Exception e) { } 应该是 catch(Exception e) { e.printStackTrace(); }

标签: java mp3 javasound


【解决方案1】:

您需要加载一个库,例如 JavaZoom 提供的库,才能播放 mp3。如果您已经将 JavaFX 用于图形组件,您可能会考虑将其用于播放,因为它的音频现在支持 mp3。

之后,下一个最有可能出现的错误将是“找不到文件”或“格式无效”。前者很可能是由于获取正确的相对地址的技巧。后者很可能是由于以大于 44100 fps 或 16 位编码的精度记录编码的 wav 文件。但是,除非您遵循添加 e.printStackTrace(); 的建议,否则您不会知道可能发生的情况。

您编写的代码应该是相当近似的,最坏的情况可能在十几毫秒内。要改进代码,您可以在循环之外预加载 Clip,然后重新定位到起始帧并调用 play.另一种选择是通过 SourceDataLine 播放,它开始非常快。就目前而言,每次迭代都将文件加载到 RAM 中,然后(仅在完成之后)从 RAM 播放文件。

帧精度(在 1/44100 秒内)是可能的,但我知道的方法需要使用 SourceDataLine 并在连续播放中计算经过的帧。可能是矫枉过正。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2016-11-05
    • 2012-04-11
    • 2013-05-20
    • 1970-01-01
    • 2011-08-21
    • 2017-10-12
    相关资源
    最近更新 更多