1. 程式人生 > >使用javax.sound實現簡單的音訊播放

使用javax.sound實現簡單的音訊播放

/**
* @see
* @author Al_assad [email protected]
* @date 2016年11月17日 下午6:27:59
* @version V1.0  
* Description: 簡易音訊播放器(只支援AU,RA,WAV)
* 			   在不使用JMF的情況下快速實現音訊播放
* 
*/
import javax.sound.sampled.*;
import java.io.*;

public class MusicPlayer {
	private String musicPath; //音訊檔案
	private volatile boolean run = true;  //記錄音訊是否播放
	private Thread mainThread;   //播放音訊的任務執行緒
	
	private AudioInputStream audioStream;
	private AudioFormat audioFormat;
	private SourceDataLine sourceDataLine;
	
	public MusicPlayer(String musicPath) {
		this.musicPath = musicPath;
		prefetch();
	}
	
	//資料準備
	private void prefetch(){
		try{
		//獲取音訊輸入流
	    audioStream = AudioSystem.getAudioInputStream(new File(musicPath));
		//獲取音訊的編碼物件
		audioFormat = audioStream.getFormat();
		//包裝音訊資訊
		DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,
				audioFormat,AudioSystem.NOT_SPECIFIED);
		//使用包裝音訊資訊後的Info類建立源資料行,充當混頻器的源
		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();
		}
		
	}
	//解構函式:關閉音訊讀取流和資料行
	protected void finalize() throws Throwable{
		super.finalize();
		sourceDataLine.drain();
		sourceDataLine.close();
		audioStream.close();
	}
	
	//播放音訊:通過loop引數設定是否迴圈播放
	private void playMusic(boolean loop)throws InterruptedException {
		try{
				if(loop){
					while(true){
						playMusic();
					}
				}else{
					playMusic();
					//清空資料行並關閉
					sourceDataLine.drain();
					sourceDataLine.close();
					audioStream.close();
				}
			
		}catch(IOException ex){
			ex.printStackTrace();
		}
		
		
	}
	private void playMusic(){
		try{
			synchronized(this){
				run = true;
			}
			//通過資料行讀取音訊資料流,傳送到混音器;
			//資料流傳輸過程: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();
		}
	}
	//繼續播放音樂
	private void continueMusic(){
		synchronized(this){
			 run = true;
			 notifyAll();
		}
	}
	
	
	//外部呼叫控制方法:生成音訊主執行緒;
	public void start(boolean loop){
		mainThread = new Thread(new Runnable(){
			public void run(){
				try {
					playMusic(loop);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		mainThread.start();
	}
	
	//外部呼叫控制方法:暫停音訊執行緒
	public void stop(){
		new Thread(new Runnable(){
			public void run(){
				stopMusic();
				
			}
		}).start();
	}
	//外部呼叫控制方法:繼續音訊執行緒
	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");   //建立音樂播放器
        
        player.start(true);                                        //以開始以迴圈的形式播放,player(false)為不迴圈播放
        
        TimeUnit.SECONDS.sleep(5);
        
        player.stop();                        //暫停播放音訊
        
        TimeUnit.SECONDS.sleep(4);
        
        player.continues();                //繼續開始播放音訊
        
    }

 }
原始碼github:https://github.com/Al-assad/Java-Gadgets/tree/master/SimpleMusicPlayer

相關推薦

使用javax.sound實現簡單音訊播放

/** * @see * @author Al_assad [email protected] * @date 2016年11月17日 下午6:27:59 * @version V1.0 * Description: 簡易音訊播放器(只支援AU,RA,WAV)

Android實現簡單音樂播放器(MediaPlayer)

工程內容 實現一個簡單的音樂播放器,要求功能有: 播放、暫停功能;進度條顯示播放進度功能拖動進度條改變進度功能;後臺播放功能;停止功能;退出功能; 程式碼實現 匯入歌曲到手機SD卡的Music目錄中,這裡我匯入了4首歌曲:仙劍六裡面的《誓言成暉》、《劍客不能說》、《鏡

Android如何實現簡單音樂播放器的程式碼

想必大家在學Android的音樂播放器時肯定會遇到很多困難,不怕,在這裡我給大家分享一個很簡單的音樂播放器,絕對會對你的學習有所幫助。本例子不難,但是也確能給你帶來柳暗花明又一村的感覺。閒話少說,馬上來看看這個播放器有

Android 實現簡單媒體播放器功能

一、概述: 因為播放視訊需要很大的記憶體,所以必須使用surfaceview , surfaceview 裡實現了雙緩衝的功能, ——————————————————————— 有需求者請加qq:136137465,非誠勿擾 (java 架構師全套教程

iOS音訊播放 (六):簡單音訊播放實現

在前幾篇中我分別講到了AudioSession、AudioFileStream、AudioFile、AudioQueue,這些類的功能已經涵蓋了第一篇中所提到的音訊播放所需要的步驟: 讀取MP3檔案 NSFileHandle解析取樣率、位元速率、時長等資訊,分離MP3中的音訊幀 AudioFileStr

使用Service組件實現簡單的音樂播放器功能 --Android基礎

area direct start 獲取 點擊 btn src c函數 extern 1、本例利用Service實現簡單的音樂播放功能,下面是效果圖。(點擊開始播放開啟服務,音樂播放,點擊“停止播放”關閉服務,音樂停止播放。) 2、核心代碼:

[SimplePlayer] 實現一個簡單播放

false rip 音頻 class sam 文件中 多線程處理 設備 pos 簡單的播放器需要實現一個最基本的功能:播放視頻文件。 實現這個功能需要包含以下幾個步驟: 從視頻文件中提取視頻圖像 在屏幕上顯示視頻圖像 視頻幀的同步,也就是保證視頻圖像在合適的時間在屏幕

【遊戲開發】實現簡單對話方塊及音樂播放

//Windows視窗標頭檔案 #include <Windows.h> //PlaySound函式包含的標頭檔案 #pragma comment(lib,"winmm.lib") //主函式 int WINAPI WinMain(HINSTANCE hInstance,HINSTA

[轉]javaCV開發詳解之5:錄製音訊(錄製麥克風)到本地檔案/流媒體伺服器(基於javax.sound、javaCV-FFMPEG)

本文轉載自部落格:https://blog.csdn.net/eguid_1/article/details/52702385 ------------------------------------------------------------------------------------

android平臺下基於ffmpeg和ANativeWindow實現簡單的視訊播放

音視訊實踐學習 android全平臺編譯ffmpeg以及x264與fdk-aac實踐 ubuntu下使用nginx和nginx-rtmp-module配置直播推流伺服器 android全平臺編譯ffmpeg合併為單個庫實踐 android-studio使用c

ffmpeg簡易播放器的實現-音訊播放

基於FFmpeg和SDL實現的簡易視訊播放器,主要分為讀取視訊檔案解碼和呼叫SDL顯示兩大部分。詳細流程可參考程式碼註釋。 本篇實驗筆記主要參考如下兩篇文章: [1]. 最簡單的基於FFMPEG+SDL的視訊播放器ver2(採用SDL2.0) [2]. An ffmpeg and SDL Tutorial

簡單實現Android視訊播放器倍速、清晰度切換、m3u8下載

簡單的前提是使用開源庫 在庫的基礎上新增相對應的功能, 以 JiaoZiVideoPlayer 為例 ,本身自帶的播放引擎是MediaPlayer,也就是Android自帶的播放器,有很多不完善的地方,倍速切換隻支援5.0以上,否則報 NoClassDefFoundError 錯誤

QT+Opencv實現簡單的視訊播放及抓拍

原理很簡單,採用opencv庫cvQueryFrame函式獲取一幀,然後將該幀影象在QLabel顯示出來。為實現連續播放,採用定時器。 #ifndef CAMERA_H #define CAMERA_H #include <QtWidgets/QWidget&g

簡單的基於FFMPEG+SDL的音訊播放器 ver2 (採用SDL2 0)

                =====================================================最簡單的基於FFmpeg的音訊播放器系列文章列表:=====================================================簡介之前做過一個

樹梅派應用23:QT+樹莓派實現一個簡單播放

說起樹莓派,買了也有一段時間了,但是始終都沒有做出什麼好玩的裝置出來,恰好最近在學C++,看到樹莓派放在牆角吃了一年多灰,為何不利用它來學一下程式設計呢? 先給我的工作臺來個特寫: 說幹就幹,在經歷了一番折騰以後,先準備所需的器材和必要的零部件,在這裡我簡單的羅列一下:先是

SurfaceView+MediaPlayer 實現簡單的視訊播放

一、實現原理由於MediaPlayer沒有播放視訊的介面,所以需要通過SurfaceView顯示視訊。SurfaceView相當於一個容器,可以把內嵌的MediaPlayer的視訊資料顯示出來。二、實現步驟1、佈局檔案中新增SurfaceView控制元件2、通過Surface

[6] ffmpeg + SDL2 實現的視訊播放器「視音訊同步」

日期:2016.10.8 作者:isshe github:github.com/isshe 郵箱:[email protected] 平臺:ubuntu16.04 64bit

簡單的視音訊播放示例9:SDL2播放PCM

最簡單的視音訊播放示例系列文章列表: ===================================================== 本文記錄SDL播放音訊的技術。在這裡使用的版本是SDL2。實際上SDL本身並不提供視音訊播放的功能,它只

Android 超簡單音樂播放器(十)歌詞的實現

關於歌詞 有下面這些: 歌詞的獲取 歌詞的解析 自定義View 歌詞的獲取 歌詞的獲取分為兩種,一種是從本地一種是通過網路上提供的API獲取。我選擇的是歌詞迷的API http://api.geci.me/en/latest/ 說實話,這

[4] ffmpeg + SDL2 實現的有雜音的音訊播放

日期:2016.10.4 作者:isshe github:github.com/isshe 郵箱:[email protected] 平臺:ubuntu16.04 64bit 前言 ffmpeg將資料解碼成pcm。 SDL