最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java程序中添加播放MIDI音樂功能的實(shí)現(xiàn)方法詳解

 更新時(shí)間:2013年05月21日 16:03:41   作者:  
本篇文章是對(duì)在Java程序中添加播放MIDI音樂功能的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
JAVA 在多媒體處理方面的確優(yōu)勢(shì)不大,但是我們?cè)诔绦蛑杏行r(shí)候又需要一些音樂,如果播放的音樂是wav等波形音頻文件,又很大的話,所以背景音樂最好就是MIDI了,可是網(wǎng)上很多播放MIDI的教程都是簡(jiǎn)單的幾句話的例子。
沒有考慮資源的釋放問題,如果程序長(zhǎng)久運(yùn)行的話,就會(huì)出現(xiàn)內(nèi)存越耗越多的情況,最后會(huì)拋出一個(gè) java.lang.OutOfMemoryError.。
在MIDI的播放中,一個(gè)類是比較重要的,那就是 MidiSystem 類,負(fù)責(zé)整個(gè)MIDI播放設(shè)備等的管理,其實(shí)就是 Seqencer,它就是一個(gè)MIDI播放設(shè)置,用于播放MIDI序列的。另外還有一個(gè)類叫 Seqence,它就是MIDI的序列,MIDI的序列可以自己由程序生成,也可以從文件中或者URL中讀取。
復(fù)制代碼 代碼如下:

package test1;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Hashtable;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
public class Test5 implements Runnable{
    private Sequencer midi;
    private String[] names={"1.mid","2.mid","3.mid","4.mid","5.mid"};
    private int i;
    private Map<String,Sequence> map;
    public Test5(){
        initMap();
        new Thread(this).start();
    }
    private void initMap(){
        try {
            map = new Hashtable<String, Sequence>();
            midi = MidiSystem.getSequencer(false);
            midi.open();
            for (String s : names) {
                try {
                    Sequence s1 = MidiSystem.getSequence(new File(s));
                    map.put(s, s1);
                } catch (InvalidMidiDataException ex) {
                    Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } catch (MidiUnavailableException ex) {
            Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
    private void createPlayer(String name){
        try {
            Sequence se=map.get(name);
            midi.setSequence(se);
            midi.start();

        }catch (InvalidMidiDataException ex) {
            Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
    public void run(){
        while(true){
            try {
                System.out.println("換文件了."+(++i));
                String name=names[(int)(Math.random()*names.length)];
                createPlayer(name);
                Thread.sleep(10000);

            } catch (InterruptedException ex) {
                Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    public static void main(String[] args) {
        new Test5();
    }
}

在這里有很重要的一點(diǎn),那就是在程序運(yùn)行的時(shí)候,只要一個(gè) Seqencer 就可以了,我以前在程序里面每次播放的時(shí)候都生成了一個(gè)Seqencer,因?yàn)槟莻€(gè)時(shí)候我想,我都調(diào)用它的 close() 方法了,它還能被打開嗎?其實(shí)它還可以再度被打開的,就是這樣一種思維使得程序最終因內(nèi)存溢出而崩潰。

相關(guān)文章

  • java中double類型運(yùn)算結(jié)果異常的解決方法

    java中double類型運(yùn)算結(jié)果異常的解決方法

    下面小編就為大家?guī)硪黄猨ava中double類型運(yùn)算結(jié)果異常的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • servlet配置方法及其生命周期詳解

    servlet配置方法及其生命周期詳解

    下面小編就為大家?guī)硪黄猻ervlet配置方法及其生命周期詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Mybatis一對(duì)多查詢列表屬性處理示例詳解

    Mybatis一對(duì)多查詢列表屬性處理示例詳解

    使用MyBatis進(jìn)行多表聯(lián)查的關(guān)鍵是構(gòu)建數(shù)據(jù)庫中表的字段和java中對(duì)象的屬性的映射關(guān)系,下面這篇文章主要給大家介紹了關(guān)于Mybatis一對(duì)多查詢列表屬性處理的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • java IO 字節(jié)流詳解及實(shí)例代碼

    java IO 字節(jié)流詳解及實(shí)例代碼

    這篇文章主要介紹了java IO 字節(jié)流詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解

    Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解

    這篇文章主要介紹了Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 關(guān)于List、Map、Stream初始化方式

    關(guān)于List、Map、Stream初始化方式

    這篇文章主要介紹了關(guān)于List、Map、Stream初始化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • MyBatis完成CRUD?詳細(xì)細(xì)節(jié)內(nèi)容剖析

    MyBatis完成CRUD?詳細(xì)細(xì)節(jié)內(nèi)容剖析

    這篇文章主要介紹了MyBatis完成CRUD?詳細(xì)細(xì)節(jié)內(nèi)容剖析,本文通過圖文示例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-05-05
  • springboot靜態(tài)資源的配置方式

    springboot靜態(tài)資源的配置方式

    這篇文章主要介紹了springboot靜態(tài)資源的配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • mybatis框架xml下trim中的prefix與suffix等標(biāo)簽的用法

    mybatis框架xml下trim中的prefix與suffix等標(biāo)簽的用法

    這篇文章主要介紹了mybatis框架xml下trim中的prefix與suffix等標(biāo)簽的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java中BigDecimal類的構(gòu)造詳解及使用

    java中BigDecimal類的構(gòu)造詳解及使用

    這篇文章主要介紹了java中BigDecimal類的構(gòu)造詳解及使用,Java在java.math包中提供的API類BigDecimal,用來對(duì)超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

鹰潭市| 兴和县| 祁门县| 德兴市| 巨鹿县| 河源市| 柘城县| 包头市| 台前县| 乌鲁木齐县| 赞皇县| 闽侯县| 遵义县| 南开区| 牙克石市| 大方县| 保定市| 呼图壁县| 汝南县| 枣阳市| 泌阳县| 喜德县| 甘谷县| 海晏县| 运城市| 垣曲县| 咸宁市| 任丘市| 临沭县| 莲花县| 花垣县| 祁东县| 高密市| 淮北市| 罗田县| 平罗县| 沂南县| 铁岭市| 华容县| 攀枝花市| 唐河县|