Java中的启动和停止声音
与之类似,我希望在Java应用程序中播放WAV文件-但是,我也希望能够暂停、恢复和重新启动声音。我猜我可以通过暂停然后创建一个新的声音来重新开始,但是我应该如何暂停然后重新开始呢Java中的启动和停止声音,java,audio,javasound,Java,Audio,Javasound,与之类似,我希望在Java应用程序中播放WAV文件-但是,我也希望能够暂停、恢复和重新启动声音。我猜我可以通过暂停然后创建一个新的声音来重新开始,但是我应该如何暂停然后重新开始呢 请注意,我的声音为~15分钟和152.8mb。如果有办法用MP3文件(同样的长度,20.8mb)来播放,那就更好了。要播放WAV文件,请参阅此问题的答案: 对于播放MP3,您可以使用一个相当小的罐子(我认为是100k,可能更小),可以与应用程序捆绑在一起 下面是一个关于如何使用它的相当不错的例子: (来自) /***
请注意,我的声音为~15分钟和152.8mb。如果有办法用MP3文件(同样的长度,20.8mb)来播放,那就更好了。要播放WAV文件,请参阅此问题的答案:
对于播放MP3,您可以使用一个相当小的罐子(我认为是100k,可能更小),可以与应用程序捆绑在一起 下面是一个关于如何使用它的相当不错的例子:
(来自)
/*************************************************************************
*编译:javac-classpath.:jl1.0.jarmp3.java(OSX)
*javac-classpath。;jl1.0.jar MP3.java(Windows)
*执行:java-classpath.:jl1.0.jar MP3 filename.MP3(OS X/Linux)
*java-classpath。;jl1.0.jar MP3 filename.MP3(Windows)
*
*使用JLayer MP3库播放MP3文件。
*
*参考:http://www.javazoom.net/javalayer/sources.html
*
*
*要执行,请从上面的网站或从中获取文件jl1.0.jar
*
* http://www.cs.princeton.edu/introcs/24inout/jl1.0.jar
*
*并将其与此文件MP3.java一起放在您的工作目录中。
*
*************************************************************************/
导入java.io.BufferedInputStream;
导入java.io.FileInputStream;
导入javazoom.jl.player.player;
公共级MP3{
私有字符串文件名;
私人玩家;
//采用MP3文件名的构造函数
公共MP3(字符串文件名){
this.filename=文件名;
}
public void close(){if(player!=null)player.close();}
//将MP3文件播放到声卡
公共游戏{
试一试{
FileInputStream fis=新的FileInputStream(文件名);
BufferedInputStream bis=新的BufferedInputStream(fis);
玩家=新玩家(bis);
}
捕获(例外e){
System.out.println(“播放问题文件”+文件名);
系统输出打印ln(e);
}
//在新线程中运行以在后台播放
新线程(){
公开募捐{
试试{player.play();}
catch(异常e){System.out.println(e);}
}
}.start();
}
//测试客户端
公共静态void main(字符串[]args){
字符串文件名=args[0];
MP3=新的MP3(文件名);
mp3.play();
//当音乐播放时,做任何你喜欢的计算
int N=4000;
双和=0.0;
对于(int i=0;i
与此问题类似,我希望在Java应用程序中播放WAV文件-但是,我还希望能够暂停、恢复和重新启动声音。我猜我可以通过暂停然后创建一个新的声音来重新开始,但是我应该如何暂停然后重新开始呢
javax.sound.sampled.Clip
非常适合这种情况,除了大多数Clip
的实现不会加载超过2秒的16位44.1KHz立体声!因为这个原因,我发展了BigClip
可以处理与可用内存一样大的声音
请注意,我的声音为~15分钟和152.8mb。如果有办法用MP3文件(同样的长度,20.8mb)来实现这一点,那就更好了
当然可以。如……中所述
MP3解码支持
Java声音API在内部不支持许多格式的采样声音。在1.6.024中,Oracle JRE getAudioFileTypes()通常会返回{WAVE,AU,AIFF}。至少一个MP3解码器就在附近。Java媒体框架的mp3plugin.jar支持解码MP3
我目前在DukeBox播放器中使用的是BigClip
&mp3plugin.jar。考虑到1024毫克的内存,它可以轻松加载1812序曲的17:12和波列罗的15:38(我最喜欢的曲目列表中最长的两首曲目)。我提到“两者”,因为它将在播放当前曲目时加载下一首曲目
另外,请注意不要查看提到
sun.audio
包(在两个链接线程中都提到)的代码。这个包和/或它的类可能会在下一个版本中被移动或删除(由Oracle自行决定)&自从Java1.3以来就没有必要了。
/*************************************************************************
* Compilation: javac -classpath .:jl1.0.jar MP3.java (OS X)
* javac -classpath .;jl1.0.jar MP3.java (Windows)
* Execution: java -classpath .:jl1.0.jar MP3 filename.mp3 (OS X / Linux)
* java -classpath .;jl1.0.jar MP3 filename.mp3 (Windows)
*
* Plays an MP3 file using the JLayer MP3 library.
*
* Reference: http://www.javazoom.net/javalayer/sources.html
*
*
* To execute, get the file jl1.0.jar from the website above or from
*
* http://www.cs.princeton.edu/introcs/24inout/jl1.0.jar
*
* and put it in your working directory with this file MP3.java.
*
*************************************************************************/
import java.io.BufferedInputStream;
import java.io.FileInputStream;
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);
}
// run in new thread to play in background
new Thread() {
public void run() {
try { player.play(); }
catch (Exception e) { System.out.println(e); }
}
}.start();
}
// test client
public static void main(String[] args) {
String filename = args[0];
MP3 mp3 = new MP3(filename);
mp3.play();
// do whatever computation you like, while music plays
int N = 4000;
double sum = 0.0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sum += Math.sin(i + j);
}
}
System.out.println(sum);
// when the computation is done, stop playing it
mp3.close();
// play from the beginning
mp3 = new MP3(filename);
mp3.play();
}
}