使用javax.sound實(shí)現(xiàn)簡(jiǎn)單音頻播放
本文實(shí)例為大家分享了javax.sound實(shí)現(xiàn)簡(jiǎn)單音頻播放的具體代碼,供大家參考,具體內(nèi)容如下
/**
* @see
* @author Al_assad yulinying_1994@outlook.com
* @date 2016年11月17日 下午6:27:59
* @version V1.0
* Description: 簡(jiǎn)易音頻播放器(只支持AU,RA,WAV)
* 在不使用JMF的情況下快速實(shí)現(xiàn)音頻播放
*
*/
import javax.sound.sampled.*;
import java.io.*;
public class MusicPlayer {
private String musicPath; //音頻文件
private volatile boolean run = true; //記錄音頻是否播放
private Thread mainThread; //播放音頻的任務(wù)線(xiàn)程
private AudioInputStream audioStream;
private AudioFormat audioFormat;
private SourceDataLine sourceDataLine;
public MusicPlayer(String musicPath) {
this.musicPath = musicPath;
prefetch();
}
//數(shù)據(jù)準(zhǔn)備
private void prefetch(){
try{
//獲取音頻輸入流
audioStream = AudioSystem.getAudioInputStream(new File(musicPath));
//獲取音頻的編碼對(duì)象
audioFormat = audioStream.getFormat();
//包裝音頻信息
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,
audioFormat,AudioSystem.NOT_SPECIFIED);
//使用包裝音頻信息后的Info類(lèi)創(chuàng)建源數(shù)據(jù)行,充當(dāng)混頻器的源
sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo);
sourceDataLine.open(audioFormat);
sourceDataLine.start();
}catch(UnsupportedAudioFileException ex){
ex.printStackTrace();
}catch(LineUnavailableException ex){
ex.printStackTrace();
}catch(IOException ex){
ex.printStackTrace();
}
}
//析構(gòu)函數(shù):關(guān)閉音頻讀取流和數(shù)據(jù)行
protected void finalize() throws Throwable{
super.finalize();
sourceDataLine.drain();
sourceDataLine.close();
audioStream.close();
}
//播放音頻:通過(guò)loop參數(shù)設(shè)置是否循環(huán)播放
private void playMusic(boolean loop)throws InterruptedException {
try{
if(loop){
while(true){
playMusic();
}
}else{
playMusic();
//清空數(shù)據(jù)行并關(guān)閉
sourceDataLine.drain();
sourceDataLine.close();
audioStream.close();
}
}catch(IOException ex){
ex.printStackTrace();
}
}
private void playMusic(){
try{
synchronized(this){
run = true;
}
//通過(guò)數(shù)據(jù)行讀取音頻數(shù)據(jù)流,發(fā)送到混音器;
//數(shù)據(jù)流傳輸過(guò)程:AudioInputStream -> SourceDataLine;
audioStream = AudioSystem.getAudioInputStream(new File(musicPath));
int count;
byte tempBuff[] = new byte[1024];
while((count = audioStream.read(tempBuff,0,tempBuff.length)) != -1){
synchronized(this){
while(!run)
wait();
}
sourceDataLine.write(tempBuff,0,count);
}
}catch(UnsupportedAudioFileException ex){
ex.printStackTrace();
}catch(IOException ex){
ex.printStackTrace();
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
//暫停播放音頻
private void stopMusic(){
synchronized(this){
run = false;
notifyAll();
}
}
//繼續(xù)播放音樂(lè)
private void continueMusic(){
synchronized(this){
run = true;
notifyAll();
}
}
//外部調(diào)用控制方法:生成音頻主線(xiàn)程;
public void start(boolean loop){
mainThread = new Thread(new Runnable(){
public void run(){
try {
playMusic(loop);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
mainThread.start();
}
//外部調(diào)用控制方法:暫停音頻線(xiàn)程
public void stop(){
new Thread(new Runnable(){
public void run(){
stopMusic();
}
}).start();
}
//外部調(diào)用控制方法:繼續(xù)音頻線(xiàn)程
public void continues(){
new Thread(new Runnable(){
public void run(){
continueMusic();
}
}).start();
}
//Test
public static void main(String[] args) throws InterruptedException{
MusicPlayer player = new MusicPlayer("bgm/1.wav"); //創(chuàng)建音樂(lè)播放器
player.start(true); //以開(kāi)始以循環(huán)的形式播放,player(false)為不循環(huán)播放
TimeUnit.SECONDS.sleep(5);
player.stop(); //暫停播放音頻
TimeUnit.SECONDS.sleep(4);
player.continues(); //繼續(xù)開(kāi)始播放音頻
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
學(xué)習(xí)spring事務(wù)與消息隊(duì)列
這篇文章主要為大家詳細(xì)介紹了spring事務(wù)與消息隊(duì)列,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
SpringBoot框架RESTful接口設(shè)置跨域允許
這篇文章主要為大家詳細(xì)介紹了SpringBoot框架RESTful接口設(shè)置跨域允許,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
SpringCloud啟動(dòng)eureka server后,沒(méi)報(bào)錯(cuò)卻不能訪(fǎng)問(wèn)管理頁(yè)面(404問(wèn)題)
這篇文章主要介紹了SpringCloud啟動(dòng)eureka server后,沒(méi)報(bào)錯(cuò)卻不能訪(fǎng)問(wèn)管理頁(yè)面(404問(wèn)題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Java虛擬機(jī)最多支持多少個(gè)線(xiàn)程的探討
這篇文章主要介紹了Java虛擬機(jī)最多支持多少個(gè)線(xiàn)程的問(wèn)題,從StackOverflow上摘錄而來(lái),需要的朋友可以參考下2014-04-04
java Swing JFrame框架類(lèi)中setDefaultCloseOperation的參數(shù)含義與用法示例
這篇文章主要介紹了java Swing JFrame框架類(lèi)中setDefaultCloseOperation的參數(shù)含義與用法,結(jié)合實(shí)例形式分析了Swing組件的JFrame框架類(lèi)中setDefaultCloseOperation方法的簡(jiǎn)單使用技巧,需要的朋友可以參考下2017-11-11
Java ZooKeeper分布式鎖實(shí)現(xiàn)圖解
ZooKeeper是一個(gè)分布式的,開(kāi)放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開(kāi)源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等2022-03-03
Java模仿微信實(shí)現(xiàn)零錢(qián)通簡(jiǎn)易功能(兩種版本)
本文主要介紹了使用Java開(kāi)發(fā)零錢(qián)通項(xiàng)目, 模仿微信實(shí)現(xiàn)簡(jiǎn)易功能,可以完成收益入賬,消費(fèi),查看明細(xì),退出系統(tǒng)等功能。文中一共介紹了兩種實(shí)現(xiàn)方法,快來(lái)學(xué)習(xí)吧2021-12-12
Jackson忽略字段實(shí)現(xiàn)對(duì)字段進(jìn)行序列化和反序列化
在使用?Jackson?進(jìn)行序列化和反序列化時(shí),有時(shí)候需要對(duì)某些字段進(jìn)行過(guò)濾,以便在?JSON?數(shù)據(jù)中不包含某些敏感信息,下面就一起來(lái)了解一下Jackson忽略字段實(shí)現(xiàn)對(duì)字段進(jìn)行序列化和反序2023-10-10
SpringBoot集成MyBatis對(duì)管理員的查詢(xún)操作
本文主要介紹了SpringBoot集成MyBatis對(duì)管理員的查詢(xún)操作,實(shí)現(xiàn)增刪改查中的查詢(xún)操作,對(duì)所有的普通管理員進(jìn)行查詢(xún)操作,感興趣的可以了解一下2023-11-11

