繁体   English   中英

如何编码播放MP3?

[英]How to code to play MP3?

我制作了几行代码,每隔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) {

            }
        }
    }
}

好吧,一切似乎都很好,但有一件事 - 我还提出了一个代码,每隔一个“滴答声”发出电梯铃声。 这段代码似乎没有用,所以有人可以帮我解决这个问题吗?

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

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

你写的代码应该是相当近似的,最差的可能是十几个毫秒。 要改进代码,您可以在循环外预加载Clip,只需重新定位到起始帧并调用play。 另一个选择是通过SourceDataLine进行播放,这很快就会启动。 就目前而言,每次迭代都要将文件加载到RAM中,然后(仅在完成后)从RAM中播放文件。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM