如何在java应用程序中播放java如何转换音频文件件

查看:5499|回复:3
向大虾们请教Java怎么实现暂停播放音频文件。
引用:原帖由 梦朝思夕 于
19:20 发表
java.applet
接口 AudioClip
--------------------------------------------------------------------------------
public interface AudioClipAudioClip 接口是用于播放音频剪辑的简单抽象。多个 AudioClip 项能 ... 但是没有暂停的方法呀。
引用:原帖由 梦朝思夕 于
21:08 发表
void stop()
& && && & 停止播放此音频剪辑
停止不是暂停了吗 我的意思是暂停后,点击播放可以继续从暂停的地方继续播放,而不是从头开始播放。
引用:原帖由 梦朝思夕 于
00:27 发表
Java似乎没有提供这个方法,不过可以使用多线程的休眠 3Q,我试下。java应用程序中的声音播放 - CSDN博客
java应用程序中的声音播放
这是一个java内建的不需要外部引入的库文件的用来在java应用程序中播放声音的例子:
已采样的音频(Sampled Audio):已采样音频以声波振幅的时间取样数据序列的形式表示。 javax.sound.sampled包含对该类的支持。支持的文件格式有wav,au,和aiff。样品可从8比特到16比特,采样率可从8kHz到48kHz。
要播放采样音频,需要创建一个SourceDataLine或者Clip的实例, 而这个实例将作为软件音频混合器(audio mixer)的源文件,然后音频样本被加载并发送给混合器(mixer)。混合器会混合各个样本然后发送给声卡的音频输出。
1. 使用SourceDataLine
import java.io.F
import java.io.IOE
import javax.sound.sampled.AudioF
import javax.sound.sampled.AudioInputS
import javax.sound.sampled.AudioS
import javax.sound.sampled.DataL
import javax.sound.sampled.LineUnavailableE
import javax.sound.sampled.SourceDataL
import javax.sound.sampled.UnsupportedAudioFileE
* @author Yusata Infotech
public class play_audio {
public static void main(String[] args) {
AudioInputS
SourceDataLine auline =
System.out.println(&Start&);
file = new File(&d://wavs//beep-1.wav&);
audio = AudioSystem.getAudioInputStream(file);
format = audio.getFormat();
info = (SourceDataLine.class, format);
auline = (SourceDataLine) AudioSystem.getLine(info);
auline.open(format);
auline.start();
int nBytesRead = 0;
byte[] abData = new byte[524288];
while (nBytesRead != -1) {
nBytesRead = audio.read(abData, 0, abData.length);
if (nBytesRead &= 0) {
auline.write(abData, 0, nBytesRead);
} catch (IOException e) {
// System.out.println(e.getMessage());
e.printStackTrace();
} catch (UnsupportedAudioFileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
auline.drain();
auline.close();
auline.drain()和auline.close()用来保证该声音文件播放完毕,如果去掉会出现声音为播放完即结束的情况。
2. 使用Clip
package com.whongshe.
import java.io.*;
import java.net.URL;
import javax.sound.sampled.*;
import javax.swing.*;
// To play sound using Clip, the process need to be alive.
// Hence, we use a Swing application.
public class SoundClipTest extends JFrame {
// Constructor
public SoundClipTest() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle(&Test Sound Clip&);
this.setSize(300, 200);
this.setVisible(true);
// Open an audio input stream.
// URL url = this.getClass().getResource(&hello.wav&);
File file = new File(&bin/com/whongshe/utils/hello.wav&);
// AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
AudioInputStream audioIn = AudioSystem.getAudioInputStream(file);
// Get a sound clip resource.
Clip clip = AudioSystem.getClip();
// Open audio clip and load samples from the audio input stream.
clip.open(audioIn);
clip.start();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (LineUnavailableException e) {
e.printStackTrace();
public static void main(String[] args) {
new SoundClipTest();
通过Clip播放声音的步骤:
1. 从一个声音文件或URL分配一个AudioInputStream管道。
// from a wave File
File soundFile = new File(&eatfood.wav&);
AudioInputStream audioIn = AudioSystem.getAudioInputStream(soundFile);
// from a URL
URL url = new URL(&/eatfood.wav&);
AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
// can read from a disk file and also a file contained inside a JAR (used for distribution)
// recommended
URL url = this.getClass().getClassLoader().getResource(&eatfood.wav&);
AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
2. 通过调用静态方法AudioSystem.getClip();获取一个Clip实例
Clip clip = AudioSystem.getClip();
3. 打开clip,装载从上面得到的AudioInputStream
clip.open(audioIn);
// For small-size file only. Do not use this to open a large file over slow network, as it blocks.
4. 现在可以通过调用start()或者loop()来播放clip
// start()
clip.start();
// play once
clip.loop(0);
// repeat none (play once), can be used in place of start().
clip.loop(5);
// repeat 5 times (play 6 times)
clip.loop(Clip.LOOP_CONTINUOUSLY);
// repeat forever
5. 可通过调用stop()方法来停止播放,或者停止循环播放
if (clip.isRunning()) clip.stop();
以上内容来自
1. /2012/10/play-soundwav-audio-in-java.html
2. http://www3.ntu.edu.sg/home/ehchua/programming/java/J8c_PlayingSound.html
仅供参考学习
感谢原作者的辛苦工作
本文已收录于以下专栏:
相关文章推荐
网上无意中发现的,在这里存一存代码:
可以控制系统的电子声播放音乐
在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必不可少的。在我做过的几个应用中,每个都涉及到音效,所以在这里做个简单的归纳,很多都是引用自《iPhone
Application Pr...
多媒体编程——声音播放
第一部分使用waveOut进行声音播放。
要讲怎么用播放声音,首先我们要有声音数据才能进行播放嘛。所以在将播放之前,我们要先制作好供播放的数据。下面段是扫盲性讲解,已...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)博客分类:
好吧,又要说一句了,java真是无所不能。
用java sound api播放wav, aiff, au, snd文件想必大家都已经知道了,这些格式是jdk原生支持的。
本文将介绍如何播放mp3/ogg/ape/flac音乐。其实都是批发来的,我只是搬运工 Σ( ° △ °|||)︴
1. 先上代码
import java.io.F
import java.io.IOE
import javax.sound.sampled.AudioF
import javax.sound.sampled.AudioInputS
import javax.sound.sampled.AudioS
import javax.sound.sampled.DataL
import javax.sound.sampled.SourceDataL
public class AudioFilePlayer {
public static void main(String[] args) {
final AudioFilePlayer player = new AudioFilePlayer ();
player.play("D:/xiaomi.ogg");
//player.play("D:/01 - 謎解きはディナーのあとで.mp3");
//player.play("D:/周杰伦-青花瓷.APE");
//player.play("D:/周杰伦 - 听妈妈的话.flac");
public void play(String filePath) {
final File file = new File(filePath);
final AudioInputStream in = AudioSystem.getAudioInputStream(file);
final AudioFormat outFormat = getOutFormat(in.getFormat());
info = (SourceDataLine.class, outFormat);
final SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
if (line != null) {
line.open(outFormat);
line.start();
stream(AudioSystem.getAudioInputStream(outFormat, in), line);
line.drain();
line.stop();
} catch (Exception e) {
throw new IllegalStateException(e);
private AudioFormat getOutFormat(AudioFormat inFormat) {
final int ch = inFormat.getChannels();
final float rate = inFormat.getSampleRate();
return new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, rate, 16, ch, ch * 2, rate, false);
private void stream(AudioInputStream in, SourceDataLine line)
throws IOException {
final byte[] buffer = new byte[65536];
for (int n = 0; n != -1; n = in.read(buffer, 0, buffer.length)) {
line.write(buffer, 0, n);
你没有看错,代码其实很简单,就是普通的java sound api,和原来播放wav, aiff, au, snd没什么两样。但是光这样是运行不起来的,需要一些额外的jar包来支持。
2. 一些jar包介绍
id最新版本描述支持格式0.0.17Vorbis解码器ogg1.0.3支持OGG Vorbis格式的SPI封装器1.0.1MP3解码器mp31.9.5mp3的SPI1.3flac解码器和SPIflac0.9.7speex解码器和SPIspx1.7.4Monkey's Audio解码器和SPIape,mac0.3.6tritonus底层库1.0tta解码器和SPIttadsp,可用来绘制音乐播放时的频谱分析2.2.2音乐标签读取库3.1音乐播放器1.3音乐播放器音乐播放器
其中,如果要支持mp3的话,需要javalayer,mp3spi,tritonus_share这3个jar包。
而ogg需要jorbis,vorbisspi,tritonus_share这3个jar包。
ape需要jmac这个jar包。
flac需要jflac这个jar包。
3.maven
如果用maven的话,加入以下dependency就有ogg和mp3的支持了。另外两个ape和flac我还没找到,可能要手工自己编译或者去前面的链接下载编译好的jar包。
&dependency&
&groupId&com.googlecode.soundlibs&/groupId&
&artifactId&tritonus-share&/artifactId&
&version&0.3.7-2&/version&
&/dependency&
&dependency&
&groupId&com.googlecode.soundlibs&/groupId&
&artifactId&mp3spi&/artifactId&
&version&1.9.5-1&/version&
&/dependency&
&dependency&
&groupId&com.googlecode.soundlibs&/groupId&
&artifactId&vorbisspi&/artifactId&
&version&1.0.3-1&/version&
&/dependency&
4. musique
最后我强烈推荐下载musique,下载地址见本文前面的表格。
musique我下载以后吓了一跳,非常牛啊。他把以上一些项目的源码全部复制过来了,还自带所有声音文件供测试Σ( ° △ °)︴。
编译方法也是用maven,然后最后会生成musique-core-0.3-SNAPSHOT.jar,双击运行就是一个音乐播放器。我测试下来他相对jlGui和yoyoplayer的一个优点就是ogg/ape/flac格式全都支持拖进度条任意时间点播放。
附件有我编译好的musique,供不愿编译的懒人下载使用。
5.原理
可以看到,用java播放mp3/ogg/ape/flac音乐没什么难,因为别人都给封装好了。其实这还要归功于java sound api的开放性架构,如果有新的音乐格式,只需要实现新的SPI就可以了。而对用户来说,不必关心这些,代码依旧不变。
6.名词解释
如果深入学习java sound api的话,那就要懂一些术语了,这里记录若干名词。
英文中文本人自己的简单外行解释mixer混频器可以把多个声音混到一起播放reverb混响提供回声效果gain增益放大声音pan声像平衡左声道右声道调节,就是可以控制左右两个耳机或两个喇叭哪个出声音equalizer均衡器10个频段调节,展现不同音效。一般音乐播放器都有sequencer音序器回放MIDI用synthesizer合成器合成音符,由不同的乐器播放
7.参考资料
下载次数: 103
我这里运行不了啊?这个只需要您一个函数就可以??我播放的是mp3"但是光这样是运行不起来的,需要一些额外的jar包来支持。"请确认引入了需要的jar包
请问一下,为什么我得播放ogg的,播几秒钟就停了呢?没深入研究过。 :-| 可以试试换一个ogg看看能不能播放。或者调整音频格式的代码AudioFormat(AudioFormat.Encoding.PCM_SIGNED, rate, 16, ch, ch * 2, rate, false)
浏览: 415811 次
来自: 上海
可以看下这个开源软件,/c ...
运行不了呢……提示错误无法加载主类Baiduwallpaper ...
我把解码的jar添加到类路径后,mp3可以播放,但是flac和 ...
请问楼主现在怎么样了,读了很多源码吗,比如mybatis、sp ...
您好前辈,我按照您的代码,执行也成功了,但是最终SystemP ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'用户名:cping
文章数:228
评论数:184
访问量:692769
注册日期:
阅读量:1297
阅读量:3317
阅读量:584781
阅读量:470271
51CTO推荐博文
& 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.import org.loon.framework.game.helper.StreamH/** *//**&* &p&&* Title: LoonFramework&* &/p&&* &p&&* Description:Loonframework专用uri(统一资源标识符)&* &/p&&* &p&&* Copyright: Copyright (c) 2007&* &/p&&* &p&&* Company: LoonFramework&* &/p&&* &* @author chenpeng&* @email:&* @version 0.1&*/public class URI ...{&&& //传输协议类型&&& public static final int _L_URI_HTTP = 1;&&& public static final int _L_URI_UDP = 2;&&& private String _&&& private int _&&& /** *//**&&&& * 析构函数,用于注入uri和type&&&& * &&&& * @param uri&&&& * @param type&&&& */&&& public URI(String uri, int type) ...{&&&&&&& _uri = new String(uri);&&&&&&& _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 StreamHelper.getHttpStream(_uri);&&& }&&& public String getURI() ...{&&&&&&& return _&&& }&&& public int getType() ...{&&&&&&& return _&&& }}在Loonframework框架中,定制了一个基础的SoundData类,用以统一管理音频数据源。package org.loon.framework.game.import org.loon.framework.game.helper.StreamHimport 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:&* @version 0.1&*/public class SoundData ...{&&& private byte[] _&&& private boolean _&&& private int _&&& 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 =&&&&&&& _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 =&&&&&&& _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 _&&& }&&& public boolean getLoop() ...{&&&&&&& return _&&& }&&& public void setLoop(boolean loop) ...{&&&&&&& _loop =&&& }&&& public int getType() ...{&&&&&&& return _&&& }}Loonframework将音频播放相关方法,封装与SoundPlay之中,程序员可以不必理会javax.sound内部细节,而直接调用SoundPlay完成相关操作。package org.loon.framework.game.import java.io.ByteArrayInputSimport javax.sound.midi.MetaEventLimport javax.sound.midi.MetaMimport javax.sound.midi.MidiSimport javax.sound.midi.Simport javax.sound.midi.Simport javax.sound.sampled.AudioFileFimport javax.sound.sampled.AudioSimport javax.sound.sampled.Cimport javax.sound.sampled.DataLimport 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:&* @version 0.1&*/public class SoundPlay implements MetaEventListener, Runnable ...{&&& private int _sleepT&&& private Clip _&&& private Sequencer _&&& private boolean _&&& private int _soundT&&& private boolean _&&& private Thread _thread =&&& private boolean _isRun =&&& /** *//**&&&& * 析构函数,初始化SoundPlay&&&& * &&&& */&&& public SoundPlay() ...{&&&&&&& _loop =&&&&&&& _soundType = 0;&&&&&&& _sleepTime = 1000;&&&&&&& _playing =&&& }&&& // 载入声音文件&&& public boolean load(SoundData data) ...{&&&&&&& reset();&&&&&&& if (data == null || data.getData() == null) ...{&&&&&&&&&&&&&&&&&& }&&&&&&& 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) ...{&&&&&&& // 刷新数据&&&&&&& reset();&&&&&&& if (uri == null) ...{&&&&&&&&&&&&&&&&&& }&&&&&&& // 获得SoundData&&&&&&& SoundData data = new SoundData(uri, ftype, loop);&&&&&&& if (data == null || data.getData() == null) ...{&&&&&&&&&&&&&&&&&& }&&&&&&& return init(data.getData(), data.getType(), data.getLoop());&&& }&&& /** *//**&&&& * 初始化sound相关数据&&&& * &&&& * @param data&&&& * @param ftype&&&& * @param loop&&&& * @return&&&& */&&& private boolean init(byte[] data, int ftype, boolean loop) ...{&&&&&&& boolean result =&&&&&&& ByteArrayInputStream bis =&&&&&&& try ...{&&&&&&&&&&& bis = new ByteArrayInputStream(data);&&&&&&& } catch (Exception e) ...{&&&&&&&&&&& bis =&&&&&&& }&&&&&&& if (bis == null) ...{&&&&&&&&&&&&&&&&&& }&&&&&&& // 判断类型&&&&&&& switch (ftype) ...{&&&&&&& // MIDI&&&&&&& case SoundData._L_SOUNDTYPE_MIDI:&&&&&&&&&&& // 当MIDI不存在时&&&&&&&&&&& if (_midi == null) ...{&&&&&&&&&&&&&&& try ...{&&&&&&&&&&&&&&&&&&& // 获得Sequencer&&&&&&&&&&&&&&&&&&& _midi = MidiSystem.getSequencer();&&&&&&&&&&&&&&&&&&& _midi.open();&&&&&&&&&&&&&&& } catch (Exception ex) ...{&&&&&&&&&&&&&&&&&&& _midi =&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& if (_midi != null) ...{&&&&&&&&&&&&&&&&&&& _midi.addMetaEventListener(this);&&&&&&&&&&&&&&& }&&&&&&&&&&& }&&&&&&&&&&& // 当MIDI依旧未获得时&&&&&&&&&&& if (_midi != null) ...{&&&&&&&&&&&&&&& // 重新创建Sequence&&&&&&&&&&&&&&& Sequence sc =&&&&&&&&&&&&&&& try ...{&&&&&&&&&&&&&&&&&&& sc = MidiSystem.getSequence(bis);&&&&&&&&&&&&&&& } catch (Exception e) ...{&&&&&&&&&&&&&&&&&&& sc =&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& if (sc != null) ...{&&&&&&&&&&&&&&&&&&& try ...{&&&&&&&&&&&&&&&&&&&&&&& _midi.setSequence(sc);&&&&&&&&&&&&&&&&&&&&&&& // 获得是否循环播放&&&&&&&&&&&&&&&&&&&&&&& _loop =&&&&&&&&&&&&&&&&&&&&&&& // 获得是否载入&&&&&&&&&&&&&&&&&&&&&&& result =&&&&&&&&&&&&&&&&&&& } catch (Exception ee) ...{&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&& // 获得声音类型&&&&&&&&&&&&&&&&&&& _soundType = SoundData._L_SOUNDTYPE_MIDI;&&&&&&&&&&&&&&& }&&&&&&&&&&& }&&&&&&&&&&& try ...{&&&&&&&&&&&&&&& bis.close();&&&&&&&&&&& } catch (Exception ee) ...{&&&&&&&&&&& }&&&&&&&&&&&&&&&&&& // Wav&&&&&&& case SoundData._L_SOUNDTYPE_WAV:&&&&&&&&&&& AudioFileFormat type =&&&&&&&&&&& // 获得Audio&&&&&&&&&&& try ...{&&&&&&&&&&&&&&& type = AudioSystem.getAudioFileFormat(bis);&&&&&&&&&&& } catch (Exception e) ...{&&&&&&&&&&&&&&& type =&&&&&&&&&&& }&&&&&&&&&&& // 关闭流&&&&&&&&&&& try ...{&&&&&&&&&&&&&&& bis.close();&&&&&&&&&&& } catch (Exception ex) ...{&&&&&&&&&&& }&&&&&&&&&&& if (type == null) ...{&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&& // 根据指定信息构造数据行的信息对象&&&&&&&&&&&
di = (Clip.class, type.getFormat());&&&&&&&&&&& // 转为Clip&&&&&&&&&&& try ...{&&&&&&&&&&&&&&& _audio = (Clip) AudioSystem.getLine(di);&&&&&&&&&&& } catch (Exception e) ...{&&&&&&&&&&& }&&&&&&&&&&& // 播放文件&&&&&&&&&&& try ...{&&&&&&&&&&&&&&& _audio.open(type.getFormat(), data, 0, data.length);&&&&&&&&&&&&&&& _loop =&&&&&&&&&&&&&&& result =&&&&&&&&&&& } catch (Exception e) ...{&&&&&&&&&&& }&&&&&&&&&&& // 获得文件类型&&&&&&&&&&& _soundType = SoundData._L_SOUNDTYPE_WAV;&&&&&&&&&&&&&&&&&& }&&&&&&&&&& }&&& public boolean play(SoundData data) ...{&&&&&&& if (!load(data)) ...{&&&&&&&&&&&&&&&&&& }&&&&&&& return play();&&& }&&& public boolean play() ...{&&&&&&& switch (_soundType) ...{&&&&&&& case SoundData._L_SOUNDTYPE_MIDI:&&&&&&&&&&& try ...{&&&&&&&&&&&&&&& _midi.start();&&&&&&&&&&&&&&& _playing =&&&&&&&&&&&&&&& _soundType = SoundData._L_SOUNDTYPE_MIDI;&&&&&&&&&&& } catch (Exception ee) ...{&&&&&&&&&&& }&&&&&&&&&&&&&&&&&& case SoundData._L_SOUNDTYPE_WAV:&&&&&&&&&&& if (_audio != null) ...{&&&&&&&&&&&&&&& if (_loop) ...{&&&&&&&&&&&&&&&&&&& // 设定循环&&&&&&&&&&&&&&&&&&& _audio.setLoopPoints(0, -1);&&&&&&&&&&&&&&&&&&& _audio.setFramePosition(0);&&&&&&&&&&&&&&&&&&& _audio.loop(Clip.LOOP_CONTINUOUSLY);&&&&&&&&&&&&&&& } else ...{&&&&&&&&&&&&&&&&&&& // 强制设定播放位置至0&&&&&&&&&&&&&&&&&&& _audio.setFramePosition(0);&&&&&&&&&&&&&&&&&&& _audio.start();&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& _playing =&&&&&&&&&&& }&&&&&&&&&&&&&&&&&& }&&&&&&& return _&&& }&&& /** *//**&&&& * 自动播放,循环停止后结束。&&&& * &&&& * @param data&&&& * @return&&&& */&&& public boolean AutoPlay(SoundData data) ...{&&&&&&& if (!load(data)) ...{&&&&&&&&&&&&&&&&&& }&&&&&&& return AutoPlay();&&& }&&& /** *//**&&&& * 自动播放,循环停止后结束。&&&& * &&&& * @return&&&& */&&& public boolean AutoPlay() ...{&&&&&&& _isRun =&&&&&&& _thread = new Thread(this);&&&&&&& _thread.start();&&&&&&& return _&&& }&&& /** *//**&&&& * 停止播放&&&& */&&& public void stop() ...{&&&&&&& if (_audio != null && _audio.isActive()) ...{&&&&&&&&&&& try ...{&&&&&&&&&&&&&&& _audio.stop();&&&&&&&&&&& } catch (Exception e) ...{&&&&&&&&&&& }&&&&&&& }&&&&&&& if (_midi != null) ...{&&&&&&&&&&& _midi.stop();&&&&&&& }&&&&&&& _playing =&&&&&&& _isRun =&&& }&&& /** *//**&&&& * 释放数据&&&& * &&&& */&&& public void reset() ...{&&&&&&& stop();&&&&&&& _loop =&&&&&&& _soundType = 0;&&&&&&& if (_midi != null) ...{&&&&&&&&&&& _midi.close();&&&&&&&&&&& _midi =&&&&&&& }&&&&&&& if (_audio != null && _audio.isOpen()) ...{&&&&&&&&&&& _audio.close();&&&&&&&&&&& _audio =&&&&&&& }&&&&&&& _isRun =&&&&&&& _thread =&&& }&&& /** *//**&&&& * 设定MetaMessage&&&& */&&& public void meta(MetaMessage meta) ...{&&&&&&& // 判断是否循环播放MIDI&&&&&&& if (_loop && _soundType == SoundData._L_SOUNDTYPE_MIDI&&&&&&&&&&&&&&& && meta.getType() == 47) ...{&&&&&&&&&&& if (_midi != null && _midi.isOpen()) ...{&&&&&&&&&&&&&&& _midi.setMicrosecondPosition(0);&&&&&&&&&&&&&&& _midi.start();&&&&&&&&&&& }&&&&&&& }&&& }&&& public void run() ...{&&&&&&& while (_isRun) ...{&&&&&&&&&&& play();&&&&&&&&&&& // 因为播放类型唯一,所以只会返回一个_playing结果,以此判定。&&&&&&&&&&& if (_midi != null) ...{&&&&&&&&&&&&&&& _playing = _midi.isRunning();&&&&&&&&&&& }&&&&&&&&&&& if (_audio != null) ...{&&&&&&&&&&&&&&& _playing = _audio.isRunning();&&&&&&&&&&& }&&&&&&&&&&& // 当播放停止&&&&&&&&&&& if (!_playing) ...{&&&&&&&&&&&&&&& // 释放&&&&&&&&&&&&&&& reset();&&&&&&&&&&& }&&&&&&&&&&& try ...{&&&&&&&&&&&&&&& Thread.sleep(_sleepTime);&&&&&&&&&&& } catch (InterruptedException e) ...{&&&&&&&&&&&&&&& e.printStackTrace();&&&&&&&&&&& }&&&&&&& }&&& }&&& public int getSleepTime() ...{&&&&&&& return _sleepT&&& }&&& /** *//**&&&& * 设定AutoPlay线程循环时间。&&&& * &&&& * @param time&&&& */&&& public void setSleepTime(int time) ...{&&&&&&& _sleepTime =&&& }}这时我们需要面对的,仅是封装为实体的SoundData数据和SoundPlay操作,而不必和繁复的javax.sound再打交道。调用方法如下:package org.import org.loon.framework.game.helper.StreamHimport org.loon.framework.game.net.URI;import org.loon.framework.game.sound.SoundDimport org.loon.framework.game.sound.SoundP/** *//**&* &p&Title: LoonFramework&/p&&* &p&Description:SoundPlay播放测试&/p&&* &p&Copyright: Copyright (c) 2007&/p&&* &p&Company: LoonFramework&/p&&* @author chenpeng& &* @email: &* @version 0.1&*/public class SoundPlayTest ...{&&& static void selectPlay(int ftype)...{&&&&&&& SoundData data=&&&&&&& &&&&&&& switch(ftype)...{&&&&&&& //通过loonframework下uri从网络播放音乐&&&&&&& case 0:&&&&&&&&&&& data=new SoundData(new URI("http://looframework.sourceforge.net/midi/谁是大英雄.mid"),SoundData._L_SOUNDTYPE_MIDI,false);&&&&&&&&&&&&&&&&&& //通过本地资源下音乐文件的byte[]对象播放音乐&&&&&&& case 1:&&&&&&&&&&& byte[] bytes=StreamHelper.GetResourceData("/midi/谁是大英雄.mid");&&&&&&&&&&& data=new SoundData(bytes,SoundData._L_SOUNDTYPE_MIDI,false);&&&&&&&&&&&&&&&&&&&&&& //通过音乐文件路径播放音乐&&& &&&&&&& case 2:&&&&&&&&&&& data=new SoundData("C:/谁是大英雄.mid",SoundData._L_SOUNDTYPE_MIDI,false);&&&&&&&&&&&&&&&&&& }&&&&&&& SoundPlay play=new SoundPlay();&&&&&&& //AutoPlay与Play方法的区别在于,AutoPlay播放完毕会自动停止并释放资源,play需手动中止。&&&&&&& //play.play(data);&&&&&&& play.AutoPlay(data);&&& }&&& &&& public static void main(String[]args)...{&&&&&&& selectPlay(2);&&& }&&& }更详细方法,会待Loonframework-game完全公布后,再进行解释。另:由于StreamHelper关联其他Loonframework中方法,暂不给出,inputStream转byte[]可用如下写法://is为获得的inputStream&& ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//用于承接byte[]&&&&&&& byte[] arrayByte =&&&&&&& try ...{&&&&&&&&&&& // 每次传输大小为4096&&&&&&&&&&& byte[] bytes = new byte[4096];&&&&&&&&&&& bytes = new byte[is.available()];&&&&&&&&&&&&&&&&&&&&&& while ((read = is.read(bytes)) &= 0) ...{&&&&&&&&&&&&&&& byteArrayOutputStream.write(bytes, 0, read);&&&&&&&&&&& }&&&&&&&&&&& arrayByte = byteArrayOutputStream.toByteArray();&&&&&&& } catch (IOException e) ...{&&&&&&&&&&&&&&&&&& } finally ...{&&&&&&&&&&& try ...{&&&&&&&&&&&&&&& if (byteArrayOutputStream != null) ...{&&&&&&&&&&&&&&&&&&& byteArrayOutputStream.close();&&&&&&&&&&&&&&&&&&& byteArrayOutputStream =&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& if (is != null) ...{&&&&&&&&&&&&&&&&&&& is.close();&&&&&&&&&&&&&&&&&&& is =&&&&&&&&&&&&&&& }&&&&&&&&&&& } catch (IOException e) ...{&&&&&&&&&&& }&&&&&&& }&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 java音频文件下载 的文章

 

随机推荐