播放音乐的示例


//过程:将音频读入内存,再从内存中放到音频设备,从而产生音乐

package com.playAudio;

import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;

public class PlayMusic {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		AePlayWave aePlayWave=new AePlayWave("111.wav");
		
		Thread thread=new Thread(aePlayWave);
		thread.start();
	}

}

//播放声音的类
class AePlayWave extends Thread {

	private String filename;
	public AePlayWave(String wavfile) {
		filename = wavfile;

	}

	public void run() {

		File soundFile = new File(filename);
		
		AudioInputStream audioInputStream = null;
		try {
			audioInputStream = AudioSystem.getAudioInputStream(soundFile);
		} catch (Exception e1) {
			e1.printStackTrace();
			return;
		}
		
		//AudioFormat是指定声音流中数据的特定排列的类。 
		//通过检查以音频格式存储的信息,您可以发现如何解释二进制声音数据中的位。
		AudioFormat format = audioInputStream.getFormat();
		//SourceDataLine接口提供了一种将音频数据写入数据线的缓冲区的方法。
		SourceDataLine auline = null;
		//根据指定的信息构建数据行的信息对象
		DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);

		try {
			auline = (SourceDataLine) AudioSystem.getLine(info);
			auline.open(format);
		} catch (Exception e) {
			e.printStackTrace();
			return;
		}

		auline.start();
		int nBytesRead = 0;
		//这是缓冲作用
		byte[] abData = new byte[512];

		try {
			while (nBytesRead != -1) {
				nBytesRead = audioInputStream.read(abData, 0, abData.length);
				if (nBytesRead >= 0)
					auline.write(abData, 0, nBytesRead);
			}
		} catch (IOException e) {
			e.printStackTrace();
			return;
		} finally {
			auline.drain();
			auline.close();
		}

	}

	
}



猜你喜欢

转载自blog.csdn.net/noreaday/article/details/79561302