游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4328|回复: 9

新手请教如何用Clip播放wav音乐

[复制链接]

13

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2004-12-10 18:50:00 | 显示全部楼层 |阅读模式
谢谢

109

主题

1451

帖子

1475

积分

金牌会员

女神

Rank: 6Rank: 6

积分
1475
发表于 2004-12-13 12:54:00 | 显示全部楼层

Re:新手请教如何用Clip播放wav音乐

//这是我写的一个clipplayer类,参考一下看看,不过不能播放长时间的
package ruru;

import java.io.File;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Clip;

//处理声音片段类

public class CClipPlayer{

  /////////////////////////////////////////////////////////////////////
  
  private File MusicFile1 = new File( "sounds/select.wav" );
  private File MusicFile2 = new File( "sounds/select2.wav" );

  private AudioInputStream audioInputStream;
  private AudioFormat audioFormat;
  
  private DataLine.Info        dataLineInfo;
  private Clip clip;
  
  private int ClipIndex;
  
  /////////////////////////////////////////////////////////////////////
  public CClipPlayer() {
  }

  public int getClipIndex()
  {
     return ClipIndex;
  }

  //打开音频流装载音频流
  public void openMusicStream( int ClipIndex )
  {
      try {
        if( ClipIndex == 1 )
        {
          AudioInputStream Stream = AudioSystem.getAudioInputStream( MusicFile1 );
          audioInputStream = AudioSystem.getAudioInputStream( MusicFile1 );
        }else if( ClipIndex == 2 )
        {
          AudioInputStream Stream = AudioSystem.getAudioInputStream( MusicFile2 );
          audioInputStream = AudioSystem.getAudioInputStream( MusicFile2 );
        }

        audioFormat = audioInputStream.getFormat();
      }
      catch (Exception ex) {
          System.out.println( "读取音频流失败" );
      }

      try {

          dataLineInfo = new DataLine.Info( Clip.class, audioFormat );
          clip = ( Clip ) AudioSystem.getLine( dataLineInfo );
          clip.open( audioInputStream );

      }catch(Exception ex){
          System.out.println( "打开音频流失败" );
      }

        
   }

   public void play()
   {
     clip.start();
   }

   public void stop()
   {
     if ( clip != null )
     {
       if ( clip.isRunning() )
       clip.stop();
     }

   }



}

13

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
 楼主| 发表于 2004-12-15 20:20:00 | 显示全部楼层

Re:新手请教如何用Clip播放wav音乐

这正是我想学的,谢谢

13

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
 楼主| 发表于 2004-12-15 20:49:00 | 显示全部楼层

Re:新手请教如何用Clip播放wav音乐

为什么不能播放长时间的呢?时间是怎么限制的?

13

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
 楼主| 发表于 2004-12-15 20:56:00 | 显示全部楼层

Re:新手请教如何用Clip播放wav音乐

为什么我照着你写的去做还是不行呢?就是声音放不出来

109

主题

1451

帖子

1475

积分

金牌会员

女神

Rank: 6Rank: 6

积分
1475
发表于 2004-12-20 20:58:00 | 显示全部楼层

Re: Re:新手请教如何用Clip播放wav音乐

game_kaido: Re:新手请教如何用Clip播放wav音乐

为什么我照着你写的去做还是不行呢?就是声音放不出来

不会吧,上面的程序用clip只能播放5-6秒的音乐。如果要播放长时间的WAV音乐需要用别的方法。

40

主题

89

帖子

95

积分

注册会员

Rank: 2

积分
95
发表于 2004-12-23 19:28:00 | 显示全部楼层

Re:新手请教如何用Clip播放wav音乐

能不能写个播放长时间的啊!

109

主题

1451

帖子

1475

积分

金牌会员

女神

Rank: 6Rank: 6

积分
1475
发表于 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) {
         }

   }

  //////////////////////////////////////////////////////////////////////////


}

109

主题

1451

帖子

1475

积分

金牌会员

女神

Rank: 6Rank: 6

积分
1475
发表于 2005-1-1 14:47:00 | 显示全部楼层

Re:新手请教如何用Clip播放wav音乐

另外还有播放MIDI音乐的
package chobits;

import java.io.*;
import javax.sound.midi.*;

//播放MIDI音乐

public class CMidiPlayer implements MetaEventListener{
  //////////////////////////////////////////////////////////
  private int MidiIndex  = 1;//文件标识
  private int VoiceIndex = 1;

  //序列器
  private Sequence sequence;
  private Sequencer sequencer;
  private Sequence voicesequence;
  private Sequencer voicesequencer;

  private boolean isPlay   = false;
  private boolean isLoop   = false;
  private boolean isPaused = false;

  private static final int END_OF_TRACK_MESSAGE = 47; //磁道信息尾
  /////////////////////////////////////////////////////////////////////////////
  public CMidiPlayer() {
  }
  /////////////////////////////////////////////////////////////////////////////
  public void setMidiIndex( int MidiIndex )
  {
      this.MidiIndex =  MidiIndex;
  }

  public void isPlay( boolean isPlay )
  {
      this.isPlay = isPlay;
  }

  public boolean isPlay()
  {
      return isPlay;
  }
  /////////////////////////////////////////////////////////////////////////
  //打开序列
  public void InitSequence( int midiindex )
  {
    this.MidiIndex = midiindex;
    try{
      switch( MidiIndex)
      { case 1:
          File MidiFile1 = new File( "BGM/bgm_1.mid" );
          sequence = MidiSystem.getSequence( MidiFile1 ); //从MidiStream流取得序列
          break;
        case 2:
          File MidiFile2 = new File( "BGM/bgm_2.mid" );
          sequence = MidiSystem.getSequence( MidiFile2 );
          break;
        case 3:
          File MidiFile3 = new File( "BGM/bgm_3.mid" );
          sequence = MidiSystem.getSequence( MidiFile3 );
          break;
        case 4:
          File MidiFile4 = new File( "BGM/bgm_4.mid" );
          sequence = MidiSystem.getSequence( MidiFile4 );
          break;
      }

      sequencer = MidiSystem.getSequencer();
      sequencer.open();
      sequencer.addMetaEventListener( this );

    }catch( Exception ex ){
      System.out.println( "获取MIDI流或获取序列器失败!" );
    }

  }

  /////////////////////////////////////////////////////////////////////////
  //播放序列
  public void play( boolean isLoop )
  {
    if( sequencer != null && sequence != null && sequencer.isOpen() )
    {
      try {
        sequencer.setSequence( sequence );
        sequencer.start();
        this.isLoop = isLoop;
      }
      catch (Exception ex) {
        System.out.println( "播放MIDI失败!" );
      }
    }
  }

  ///////////////////////////////////////////////////////////////////////////
  public void InitVoice( int voiceindex )
  {
      this.VoiceIndex = voiceindex;

      try{
       switch( VoiceIndex )
       {  case 1:
           break;
          case 2:
           break;
          case 3:
           break;
          case 4:
           break;
       }

      voicesequencer = MidiSystem.getSequencer();
      voicesequencer.open();
      voicesequencer.addMetaEventListener( this );

     }catch(Exception ex){
        System.out.println( "获取MIDI流或获取序列器失败!" );
    }

  }

  public void playVoice()
  {
      if( voicesequencer != null && voicesequence != null
                 && voicesequencer.isOpen() )
      {
        try {
          voicesequencer.setSequence( voicesequence );
          voicesequencer.start();
        }
        catch (Exception ex) {
          System.out.println( "播放MIDI失败!" );
        }
      }
  }

  ///////////////////////////////////////////////////////////////////////////
  public void meta( MetaMessage metaMessage ) {
      //循环播放
      if( metaMessage.getType() == END_OF_TRACK_MESSAGE )
      {
        if( sequencer != null && sequencer.isOpen() && isLoop )
        {
          sequencer.start();
        }
      }
  }

  ///////////////////////////////////////////////////////////////////////////
  public void stop()
  {
      if( sequencer != null && sequencer.isOpen() )
      {
        sequencer.stop();
      }
  }

  ///////////////////////////////////////////////////////////////////////////
  public void close()
  {
      if( sequencer != null && sequencer.isOpen() )
      {
        sequencer.close();
        try {
          this.finalize();
        }
        catch ( Throwable ex ) {
        }
      }
  }

  ///////////////////////////////////////////////////////////////////////////

109

主题

1451

帖子

1475

积分

金牌会员

女神

Rank: 6Rank: 6

积分
1475
发表于 2005-1-1 15:05:00 | 显示全部楼层

Re:新手请教如何用Clip播放wav音乐

还有Javazoom上面的开源项目MP3SPI 和VorbisSPI,可以播放mp3和ogg压缩文件的~~~自己看看吧~~
http://www.javazoom.net/projects.html
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 22:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表