与this question类似,我想在Java应用程序中播放WAV文件 - 但是,我还希望能够暂停,恢复和重启声音。我猜我可以通过暂停然后只是创建一个新声音来重新启动,但是我怎么会暂停并恢复它?
请注意,我的声音是〜15分钟和152.8mb。如果有一种方法可以使用MP3文件(相同长度,20.8mb),那就更好了。
答案 0 :(得分:2)
要播放WAV文件,请参阅此问题的答案:
Problem with Javas Audio Clips on frequent playback of beep sounds
对于播放MP3,您可以使用JLayer这是一个相当小的jar(我认为可能是100k,可能更小),可以捆绑您的应用程序。
这是一个如何使用它的相当不错的例子:
MP3.java(来自How to play an MP3 file in Java)
/*************************************************************************
* 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();
}
}
答案 1 :(得分:1)
与此问题类似,我想在Java应用程序中播放WAV文件 - 但是,我还希望能够暂停,恢复和重新启动声音。我猜我可以通过暂停然后只是创建一个新声音来重新启动,但是我怎么会暂停并恢复它?
javax.sound.sampled.Clip
是理想的,除了因为Clip
的大多数实现不会加载超过2秒的立体声,16位,44.1KHz声音!出于这个原因,我开发了BigClip。 BigClip
可以处理与可用内存一样大的声音。
请注意,我的声音是〜15分钟和152.8mb。如果有一种方法可以使用MP3文件(相同长度,20.8mb),那就更好了。
当然可以。如JavaSound tag info page ..
中所述MP3解码支持
Java Sound API内部不支持多种格式的采样声音。在1.6.0_24 Oracle JRE中,getAudioFileTypes()通常会返回{WAVE,AU,AIFF}。至少一个MP3解码器就在附近。 Java Media Framework的mp3plugin.jar支持解码MP3。
我目前使用BigClip
&amp; DukeBox播放器中的mp3plugin.jar Jar。给定1024Meg内存,它可以轻松加载 1812 Overture 的17:12,&amp; Bolero 的15:38(我最喜欢的播放列表中最长的两首曲目)。我提到'both',因为它会在播放当前曲目时加载下一首曲目。
另外,请注意查看提及sun.audio
包的代码(在两个链接的线程中都提到)。此软件包和/或它的类可能会在下一个版本中移动或删除(由Oracle自行决定)&amp;自 Java 1.3。