public interface Clip extends DataLine
The Clip interface represents a special kind of data line whose audio data can be loaded prior to playback, instead of being streamed in real time.
Because the data is pre-loaded and has a known length, you can set a clip to start playing at any position in its audio data. You can also create a loop, so that when the clip is played it will cycle repeatedly. Loops are specified with a starting and ending sample frame, along with the number of times that the loop should be played.
Clips may be obtained from a Mixer that supports lines of this type. Data is loaded into a clip when it is opened.——摘自 jdk_api_1.8文档 的Clip部分
这个音乐播放程序,主要用到clip和AudioSystem来控制文件的输入、文件格式转化和音乐的播放 第一部分:文件的导入与播放- Clip接口表示一种特殊类型的数据流,其音频数据可以在播放之前加载,而不是实时流式传输。(翻自jdk_api_1.8)
我们可以设置数据流clip,实现在音频数据中的任何位置开始播放。
- AudioSystem.getAudioInputStream(File file)方法:从提供的file中获取音频输入流
- 对于java播放的音乐文件格式,据百度,目前jdk自带类库只能实现AU,AIFF,WAV,MIDI,RFM等格式的音频,mp3等格式则需要额外插件。
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class MusicPlayer {
public static final String BGM = "文件路径";//bgm文件路径
static Clip music = null; //声明Clip接口
static File sourceFile = null; //声明文件变量
public static void playMusic(String path){
try {
music = AudioSystem.getClip(); // 获取可用于播放音频文件或音频流的数据流
sourceFile = new File(path);//获取文件
AudioInputStream ais = AudioSystem.getAudioInputStream(sourceFile);//获得指示格式的音频输入流
music.open(ais); //打开数据流
music.start(); //开始播放音乐
} catch (LineUnavailableException e) {
e.printStackTrace();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
第二部分:音乐的关闭
音乐关闭的方式有两种:
第一种
播放可以由clip对象调用start和stop方法启动和停止。这两个方法不会重置媒体位置;也就是不会将播放进度归零。start()方法从最后停止播放的位置继续播放。
若需要重新开始播放时,可在播放前由clip对象调用setframePosition(0)方法 。即设置媒体位置为0。
第二种
可以由clip对象调用close()方法,通过关闭数据流的方式停止播放。这个方法会重置播放进度,再次调用start时,从头开始播放。
public static void closeMusic(){
if (music!=null) //需要判断music是否为null,避免出现空指针异常
music.stop();//暂停音乐
}
第三部分:播放测试
需要说明的是,若该测试程序只调用了playMusic()方法,音乐不会播放。
原因是:该程序执行完了playMusic()方法中的程序后,测试程序就运行完成而终止了,音乐不会继续播放。
public static void main(String[] args) {
MusicPlayer.playMusic(MusicPlayer.BGM); //调用自定义函数播放音乐
Scanner scan = new Scanner(System.in);
while (true){
System.out.println("输入0停止音乐");
if (scan.nextInt() == 0) {
closeMusic(); //调用自定义方法关闭音乐
break;
}
}
}
新手练习,有误请指正。



