`
wuce7758
  • 浏览: 182247 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
  • YTT1121: 有网络拓扑发现的源代码么?能不能发我一份学习一下,现在我正要做 ...
    java拓扑图
  • YTT1121: 大神,有网络拓扑发现的源代码么?或者您会编写么?我需要做科研改 ...
    java拓扑图
  • YTT1121: 大神,有网络拓扑发现的源代码么?或者您会编写么?我需要做科研改 ...
    java拓扑图
  • poettang: 求代码分享学习,谢谢!膜拜大神!258026921@qq.co ...
    java拓扑图
  • oiqio: 87836238@qq.com,感谢楼主,来一份~
    java拓扑图

高效的Java音乐播放类

阅读更多

Java音频播放,因为必须依赖到本地环境,所以JAVA在音频处理方面优势不大,或者说打从Java体系开发时就没太多的考虑音频播放因素,要知道最早的Java 1.1版本中,没有后来的javax.sound包,音频只能通过Applet包调取……

  遗憾的是,在图形程序开发中,我们的程序却又难免要使用到背景音乐、效果音等配合图像操作,哎,这实在是Sun大神给我们开的一个不打不小的玩笑。万幸后来Sun大神开眼,提供了javax.sound包,才解救我们于水深火热当中~

 但是继之而来的问题是,在javax.sound包的使用中,如同Java多媒体工具类的通病般,并没有提供十分完善的释放机制。如果我们做Windows开发,调用MediaPlayer反复N次可能没也什么大碍,但在Java中,如果音频程序反复运行的话,极容易出现内存累计损耗的情况,以至于最后抛出一个java.lang.OutOfMemoryError,然后……程序就挂了,用户就傻了,我们就疯了……

这已经是“是可忍孰不可忍”的问题了,有鉴于此,所以在本人的Loonframework框架开发中,二次整合了sound下的相关方法,力求以最简单的代码,做出最完善的音频控制类。在Loonframework-game还没有大成的现在,先摘录一部分方法,以供各位看官——拍砖!

对应网络资源调用,在Loonframework中建立了自己的uri用类,基本内容如下:
(其中StreamHelper为Loonframework自己的流媒体控制类,getHttpStream方法请自行替换。)

package org.loon.framework.game.net;

import org.loon.framework.game.helper.StreamHelper;

/** *//**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * Description:Loonframework专用uri(统一资源标识符)
 * </p>
 * <p>
 * Copyright: Copyright (c) 2007
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * 
 * 
@author chenpeng
 * @email:ceponline@yahoo.com.cn
 * 
@version 0.1
 
*/

public class URI ...{

    
//传输协议类型
    public static final int _L_URI_HTTP = 1;

    
public static final int _L_URI_UDP = 2;

    
private String _uri;

    
private int _type;

    
/** *//**
     * 析构函数,用于注入uri和type
     * 
     * 
@param uri
     * 
@param type
     
*/

    
public URI(String uri, int type) ...{
        _uri 
= new String(uri);
        _type 
= type;
    }


    
/** *//**
     * 析构函数,用于注入uri
     * 
     * 
@param uri
     
*/

    
public URI(String uri) ...{
        _uri 
= new String(uri);
        _type 
= URI._L_URI_HTTP;
    }


    
/** *//**
     * 返回uri所在位置资源的byte数组。
     * 
     * 
@return
     
*/

    
public byte[] getData() ...{
        
if (_uri == null...{
            
return null;
        }

        
return StreamHelper.getHttpStream(_uri);
    }


    
public String getURI() ...{
        
return _uri;
    }


    
public int getType() ...{
        
return _type;
    }


}


在Loonframework框架中,定制了一个基础的SoundData类,用以统一管理音频数据源。

package org.loon.framework.game.sound;

import org.loon.framework.game.helper.StreamHelper;
import org.loon.framework.game.net.URI;

/** *//**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * Description:用以获得并缓存声音文件数据(更进一步内容操作请见Loonframework-game框架)
 * </p>
 * <p>
 * Copyright: Copyright (c) 2007
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * 
 * 
@author chenpeng
 * @email:ceponline@yahoo.com.cn
 * 
@version 0.1
 
*/

public class SoundData ...{

    
private byte[] _data;

    
private boolean _loop;

    
private int _type;

    
public static final int _L_SOUNDTYPE_MIDI = 1;

    
public static final int _L_SOUNDTYPE_WAV = 2;

    
/** *//**
     * 析构函数,用以注入uri,type,loop
     * 
     * 
@param uri
     * 
@param type
     * 
@param loop
     
*/

    
public SoundData(URI uri, int type, boolean loop) ...{
        
if (uri != null...{
            _data 
= uri.getData();
        }

        _type 
= type;
        _loop 
= loop;
    }

    
    
/** *//**
     * 析构函数,用以注入data,type,loop
     * 
     * 
@param data
     * 
@param type
     * 
@param loop
     
*/

    
public SoundData(byte[] data, int type, boolean loop) ...{

        
if (data != null && data.length > 0...{
            _data 
= new byte[data.length];
            
// 直接copy byte数组
            System.arraycopy(data, 0, _data, 0, _data.length);
        }

        _type 
= type;
        _loop 
= loop;
    }

    
    
/** *//**
     * 析构函数,用以注入限定位置的resName,type,loop
     * 
@param resName
     * 
@param type
     * 
@param loop
     
*/

    
public SoundData(String resName, int type, boolean loop) ...{
        
this(StreamHelper.GetDataSource(resName),type,loop);
    }


    
public byte[] getData() ...{
        
return _data;
    }


    
public boolean getLoop() ...{
        
return _loop;
    }


    
public void setLoop(boolean loop) ...{
        _loop 
= loop;
    }


    
public int getType() ...{
        
return _type;
    }


}


Loonframework将音频播放相关方法,封装与SoundPlay之中,程序员可以不必理会javax.sound内部细节,而直接调用SoundPlay完成相关操作。

package org.loon.framework.game.sound;

import java.io.ByteArrayInputStream;

import javax.sound.midi.MetaEventListener;
import javax.sound.midi.MetaMessage;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;

import org.loon.framework.game.net.URI;

/** *//**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * Description:用以进行声音文件操作(仅为Loonframework中部分方法,更详细请参见Loonframework-game框架)
 * </p>
 * <p>
 * Copyright: Copyright (c) 2007
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * 
 * 
@author chenpeng
 * @email:ceponline@yahoo.com.cn
 * 
@version 0.1
 
*/

public class SoundPlay implements MetaEventListener, Runnable ...{

    
private int _sleepTime;

    
private Clip _audio;

    
private Sequencer _midi;

    
private boolean _loop;

    
private int _soundType;

    
private boolean _playing;

    
private Thread _thread = null;

    
private boolean _isRun = false;

    
/** *//**
     * 析构函数,初始化SoundPlay
     * 
     
*/

    
public SoundPlay() ...{

        _loop 
= false;
        _soundType 
= 0;
        _sleepTime 
= 1000;
        _playing 
= false;

    }


    
// 载入声音文件
    public boolean load(SoundData data) ...{
        reset();
        
if (data == null || data.getData() == null...{
            
return false;
        }

        
return init(data.getData(), data.getType(), data.getLoop());
    }


    
/** *//**
     * 直接播放url文件
     * 
     * 
@param uri
     * 
@param ftype
     * 
@param loop
     * 
@return
     
*/

    
public boolean load(URI uri, int ftype, boolean loop) ...</sp
分享到:
评论

相关推荐

    java 音乐播放器包含源代码

    Java音乐播放器是一种基于Java编程语言开发的软件,它能够解析和播放音频文件。这个播放器需要JMF(Java Media Framework)插件的支持,JMF是Sun Microsystems开发的一个开源框架,用于处理各种多媒体数据,包括音频...

    Java mp3 格式音乐的播放插件

    这个插件或库使得开发者能够轻松地集成音乐播放功能,无需依赖操作系统原生的媒体播放器。在Java平台上,由于它自身的跨平台特性,这种插件尤为重要,因为它允许在不同的操作系统(如Windows、Linux、Mac OS等)上...

    Java,android,音乐播放器

    这个应用结合了Java作为后端处理语言以及Android作为前端平台,为用户提供了一个方便、高效的音乐播放体验。以下将详细介绍相关知识点。 1. **Java基础知识**: - **面向对象编程**:Java是基于面向对象编程的,它...

    java mp3 音乐播放器

    Java MP3音乐播放器是一种基于Java编程语言开发的软件,用于播放MP3音频格式的音乐。这个项目不依赖于Java Foundation Classes (JFC)中的Java Media Framework (JMF),而是选择了第三方的Java库来实现MP3播放功能。...

    java 音乐盒系统源码

    Java音乐盒系统选择了SQLServer2005作为其数据库管理系统,支持高效的数据查询和存储。通过SQL语句,系统能快速检索音乐信息,如歌手、专辑、歌曲名等,并提供排序、过滤等功能。 4. **Eclipse集成开发环境** 开发...

    纯Java音乐共享平台

    【纯Java音乐共享平台】是一个由个人开发的项目,它完全基于Java编程语言,利用Swing库构建用户界面,同时结合多线程和Socket网络通信技术来实现音乐资源的共享功能。这个平台允许用户在客户端与服务器之间进行交互...

    JAVA版MP3音乐播放器+源代码(初学者)

    在Java中,实现音乐播放通常涉及到以下几个关键知识点: 1. **Java基础**:首先,你需要掌握Java的基本语法,包括类、对象、方法、变量等概念,这是编写任何Java程序的基础。 2. **Java IO流**:音乐文件的读取...

    JAVA 上传音乐

    在Java编程语言中,上传音乐涉及的主要知识点是IO流(Input/Output Stream)的使用,特别是对于大文件如音乐的高效处理。IO流是Java中处理数据传输的核心机制,允许程序读取或写入数据到各种来源,如硬盘、网络、...

    java编写炫酷界面音乐播放器

    如果是可执行的jar文件,用户只需双击即可运行,享受由Java带来的高效且美观的音乐播放体验。 总的来说,这款Java编写的炫酷界面音乐播放器展示了Java在GUI应用开发方面的强大能力,同时也提供了学习和借鉴的实例,...

    java实现坦克大战源码+图片+音乐

    Java的javax.sound包提供了音频播放的支持,开发者可以使用它来加载和播放音乐文件,增强游戏的沉浸感。 6. **文件组织结构**:项目文件结构如`KeJiJie.iml`可能是IntelliJ IDEA的项目配置文件,`src`通常存放源...

    Java实现音乐播放器【碉堡版】源码

    这个"碉堡版"的Java音乐播放器源码是一个很好的学习资源,可以帮助开发者深入理解Java编程,尤其是多媒体处理、GUI设计和多线程等方面的知识。通过研究和分析源码,可以提升自己的Java编程技能和实际项目开发经验。

    AudioCore-Java音频转码和播放依赖包|AudioCore.zip

    总之,AudioCore凭借其对FFmpeg的高效封装,为Java开发者提供了便捷的音频转码和播放解决方案。无论是在服务器端处理大量音频文件,还是在客户端提供流畅的播放体验,AudioCore都是值得信赖的工具。开发者可以通过...

    JAVA版音乐播放器源代码

    【JAVA版音乐播放器源代码】是一个项目,它涵盖了服务器端、客户端以及数据库的实现,目的是为了构建一个功能完备的音乐播放平台。这个平台允许用户进行登录和注册操作,通过在客户端与服务器端之间建立通信,实现了...

    Java 开发的android音乐播放器,界面优美。性能稳定。

    总结,这个“Java开发的Android音乐播放器”项目展示了Java在移动开发中的强大功能,以及如何通过良好的设计和编程实践来创建一个高质量的本地音乐播放应用。对于学习Android开发的初学者来说,这样的项目是一个很好...

    java的MP3播放插件

    测试和调试是开发过程中不可或缺的环节,以确保音乐播放的稳定性和兼容性。 总之,Java MP3播放插件结合Java Media Framework,为开发者提供了一种在Java环境中构建功能完善的音乐播放器的方法。通过学习和掌握相关...

    简约的java音乐播放器

    **简约的Java音乐播放器** Java音乐播放器是一款基于Java编程语言开发的音频播放软件,其设计...开发者可能还需要关注性能优化、用户体验设计以及跨平台兼容性等问题,以提供一个高效且易于使用的音乐播放解决方案。

    java写的音乐播放器(含源码)

    Java编写的音乐播放器,如"YoYoPlayer"或简称为"java Player",是一种用Java编程语言实现的多媒体应用程序,旨在为用户提供便捷、高效的音乐播放体验。在本项目中,开发者模仿了知名的TTPlayer的界面设计,为用户...

    JAVA 版MPEG播放器(Java音乐播放器)

    1. **Java基础知识**:理解面向对象编程概念、类、对象、继承、封装等。Java的跨平台特性使得该播放器可以在各种操作系统上运行。 2. **Java GUI设计**:使用Swing或JavaFX创建用户界面,包括播放、暂停、停止、...

    仿千千静听 YOYOPlayer java 音乐播放器

    YOYOPlayer的开发人员通过Java技术,为用户提供了跨平台的音乐播放体验,同时也为开发者提供了一个学习和研究Java多媒体编程的实例。用户可以通过查看源代码,了解如何利用Java进行音频处理和播放控制,而开发者则...

Global site tag (gtag.js) - Google Analytics