使用Java分块播放MP3?

9

遗憾的是,Java对MP3的支持不足。我正在开发一个需要接收MP3块并播放它们的应用程序。我以前使用类似这样的Jlayer MP3库:

import javazoom.jl.player.Player;
public class MP3 {
    private String filename;
    private Player player; 

    // constructor that takes the name of an MP3 file
    public MP3(String filename) {
        this.filename = filename;
    }

    public void close() { if (player != null) player.close(); }

    // play the MP3 file to the sound card
    public void play() {
        try {
            FileInputStream fis     = new FileInputStream(filename);
            BufferedInputStream bis = new BufferedInputStream(fis);
            player = new Player(bis);
        }
        catch (Exception e) {
            System.out.println("Problem playing file " + filename);
            System.out.println(e);
        }

        player.play();
}

但我的问题是我只有完整MP3文件的一部分,并且需要在它们到达时播放它们。是否有更好的替代方案?
编辑
发现一个有趣的类似问题:JMF流无法播放MP3 还有:使用JLayer解码MP3文件

3
嗯,你说得对,我从未为桌面应用程序做过那个......只有网页和安卓系统,抱歉 :( 。 如果我找到什么东西,我会在这里发布作为参考。 - GhostDerfel
4
我认为这个值得一试:https://github.com/Hotware/HotSound - GhostDerfel
你有检查过这个网站吗:http://stackoverflow.com/questions/9818155/stream-music-with-java? - eduardohl
我需要手动管理流。不能使用http。 - dynamic
你所说的“chunks”是什么意思?每个“chunk”都是一个独立的MP3文件(带有头信息/标签等),还是只是整个文件中的一部分,将这些部分按顺序添加即可得到原始文件? - AleX
显示剩余4条评论
1个回答

1
创建一个实现InputStream的类,可以接收到数据块,但向播放器提供字节。确保在请求字节时跟踪每个数据块中的位置,然后在用完数据块并开始从下一个数据块提供数据时丢弃该数据块。
由于播放器希望处理InputStream,因此它不会知道任何差异。您可能不需要在类中包装BufferedInputStream,因为您将在自己的类中处理它。

请问您能否在您的回答中添加一个代码演示? - xabush
@avidProgrammer 没有更多关于数据是如何提供的信息,无法确定。 - BillRobertson42
在我的情况下,数据不断写入一个临时文件,而播放器从该文件作为输入流进行播放。这是我关于同样问题提出的一个问题:http://stackoverflow.com/questions/35157247/playing-streamed-mp3-data-repeatedly-with-jlayer - xabush

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接