|
|
发表于 2005-1-1 14:46:00
|
显示全部楼层
Re:新手请教如何用Clip播放wav音乐
播放长时间的wav文件
package chobits;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.DataLine;
import java.io.File;
import java.io.InputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.io.IOException;
import javax.sound.sampled.LineUnavailableException;
import javax.swing.JFrame;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
//播放音乐的类
public class CMusicPlayer {
/////////////////////////////////////////////////////////////////////////
private int MusicIndex;
private AudioFormat Format;
private byte[] AudioSamples;//音频样本
private InputStream aMusicInputStream;
private AudioFormat MusicStreamFormat;
private File MusicFile1,MusicFile2,MusicFile3,MusicFile4;
private AudioInputStream MusicInputStream;
/////////////////////////////////////////////////////////////////////////
public CMusicPlayer( int MusicIndex ) {
this.MusicIndex = MusicIndex;
try {
switch( MusicIndex )
{
case 1:
MusicFile1 = new File( "BGM/bgm.wav" );
break;
}
MusicInputStream
= AudioSystem.getAudioInputStream( MusicFile1 ); //取得文件的音频输入流
Format = MusicInputStream.getFormat(); //取得音频输入流的格式
AudioSamples = getAudioSamples( MusicInputStream );//取得音频样本
}
catch (UnsupportedAudioFileException ex) {
ex.printStackTrace();
}
catch (IOException ex) {
ex.printStackTrace();
}
aMusicInputStream
= new ByteArrayInputStream( this.getSamples() );
}
public byte[] getSamples(){
return AudioSamples;
}
/////////////////////////////////////////////////////////////////////////////
public byte[] getAudioSamples( AudioInputStream MusicStream )
{
int AudioSampleLengh = ( int )( MusicStream.getFrameLength() *
Format.getFrameSize() );
byte aAudioSamples[] = new byte[ AudioSampleLengh ];
DataInputStream dataInputStream = new DataInputStream( MusicStream );
try{
dataInputStream.readFully( aAudioSamples );
}catch( Exception ex ){
System.out.println( "完全读取样本长度失败!" );
}
return aAudioSamples;
}
//////////////////////////////////////////////////////////////////////////
//播放音乐流
public void play()
{
int bufferSize = Format.getFrameSize() *
Math.round(Format.getSampleRate() / 10);
byte[] buffer = new byte[bufferSize];
SourceDataLine line;
try {
DataLine.Info info =
new DataLine.Info(SourceDataLine.class, Format);
line = (SourceDataLine)AudioSystem.getLine(info);
line.open(Format, bufferSize);
}
catch ( LineUnavailableException ex ) {
ex.printStackTrace();
return;
}
if( !line.isRunning() )
{
line.start();
}
try {
int numBytesRead = 0;
while (numBytesRead != -1) {
numBytesRead =
aMusicInputStream.read(buffer, 0, buffer.length);
if (numBytesRead != -1) {
line.write(buffer, 0, numBytesRead);
}
}
}
catch (IOException ex) {}
line.drain();
line.close();
try {
this.finalize();
}
catch (Throwable ex1) {
}
}
//////////////////////////////////////////////////////////////////////////
}
|
|