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等格式则需要额外插件。
- 需要补充的是,有些音乐文件格式如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;
}
}
}
新手练习,有误请指正。