首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >播放.mid文件的javax.sound.midi库不起作用

播放.mid文件的javax.sound.midi库不起作用
EN

Stack Overflow用户
提问于 2019-08-26 21:57:36
回答 1查看 107关注 0票数 0

我使用下面的代码从我的本地系统播放一个.mid文件。此代码在无限循环中运行,并且不播放.mid文件。但是,不会返回任何错误。

我也试过设置断点,但是没有得到任何线索。

代码语言:javascript
复制
import javax.sound.midi.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class MidiPlayer {

   public static void main(String[] args) {
     try {
        Sequencer sequencer = MidiSystem.getSequencer();
        if (sequencer == null)
            throw new MidiUnavailableException();
        sequencer.open();
        FileInputStream is = new FileInputStream("music.mid");
        Sequence Seq = MidiSystem.getSequence(is);
        sequencer.setSequence(Seq);
        sequencer.start();
     } catch (Exception e) {
         e.printStackTrace();
    }

}

如果你也能分享一些用于播放.wma文件和.avi文件的java应用程序接口,那将是非常有帮助的。因为我需要编写代码来播放所有这3种类型的媒体文件,即.mid、.wma和.avi

EN

回答 1

Stack Overflow用户

发布于 2019-08-27 01:22:13

我不知道你为什么听不到音乐。这个程序对我很有效。确保它是有效的midi文件。至于“循环”…

启动Sequencer将创建一个新线程。在线程完成之前,JVM不会退出。

终止它的最简单方法是关闭Sequencer:

代码语言:javascript
复制
sequencer.close();

但是,如果您立即执行此操作,程序将退出而不播放音乐文件,因为sequencer.start()会立即返回,而音乐将在后台线程上播放。

因此,您需要等待音乐播放完成:

代码语言:javascript
复制
sequencer.start();

long length = sequencer.getMicrosecondLength();
Thread.sleep(length / 1000 + 1000);

sequencer.close();

睡眠时间是故意近似的。我忽略了小数秒,并添加了一整秒,以考虑到播放开始的可能延迟。有比这更准确的方法,但这可能是最简单的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57659347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档