package 5xstar.sound;
import java.io.File;
import java.applet.AudioClip;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.UnsupportedAudioFileException;
/**
*Java 9后,java.applet.AudioClip不再底层支持,编译和运行都没异常,就是播不出声音,官方也不提供替代
*本工具用javax.sound.sampled.Clip进行打包替代
*五行星软件 微信公众号:学思营 2020-4-24
**/
public class AudioClipCreater
{
final private static class MyAudioClip implements AudioClip{
final private Clip clip;
private MyAudioClip(final Clip clip){
this.clip=clip;
}
//下面实现AudioClip接口
//单纯播放
public void play(){
clip.setFramePosition(0); //把指针移到开始
clip.start();
}
//循环播放
public void loop(){
clip.setFramePosition(0); //把指针移到开始
clip.loop(Clip.LOOP_CONTINUOUSLY);
}
//停止
public void stop(){
clip.stop();
}
}
/**
*通过文件获取已加载音乐的AudioClip
*@audioFile 音乐文件 官方推荐wav和au格式
*@return 已加载音乐的AudioClip
**/
public static AudioClip createAudioClip(final File audioFile){
try{
//获取Clip对象
final Clip clip=AudioSystem.getClip();
//获取音乐输入流
AudioInputStream ais=AudioSystem.getAudioInputStream(audioFile);
//加载音乐
clip.open(ais);
//设置循环播放范围是整个音频
clip.setLoopPoints(0,-1);
//返回clip
return new MyAudioClip(clip);
}catch(UnsupportedAudioFileException e){
e.printStackTrace();
System.err.println("系统不音乐文件:"+audioFile.getAbsolutePath()+"的格式。" );
}catch(Exception e){
e.printStackTrace();
System.err.println("加载音乐文件:"+audioFile.getAbsolutePath()+"时发送系统错误。" );
}
return null;
}
/**
*关闭由上面生成的AudioClip释放资源
*@audioClip AudioClip
**/
public static void closeAudioClip(final AudioClip audioClip){
if(audioClip!=null && audioClip instanceof MyAudioClip){
try{ ((MyAudioClip)audioClip).clip.close();}catch(Exception e){}
}
}
/**
*测试
**/
public static void main(String[] args){
if(args!=null && args.length>0){
AudioClip cp=createAudioClip(new File(args[0]));
if(cp!=null){
cp.loop();
try{Thread.sleep(30000);}catch(Exception e){}
closeAudioClip(cp); //如果close成功,音乐就停止
}
}
}
}