javax.sound的简单使用。

写在前边

考研的日子还是比较无聊的,天天做着同样的事情。现在的日子爱情也比较挫败,一句话,失落期。

所以,这个日志的内容也是相当无聊的情况下写的,如果你发现什么纰漏,请无私指正,谢谢。

昨天在QQ群上有人问题使用APPLET播放WAV的事情,自己还真没有使用java 写过多媒体处理,在网上找了一下相关的文章,有提到JMF框架的,于是找来安装一下,没有深入的研究JMF,初步觉得,使用方便,但是同时也给运行环境增加额外的负担。

 然后看到《用Java实现音频播放》这篇文章,文章没有作者信息,但是可以在天极找到原文。如有需要可以根据下边的链接找到文章。

用Java实现音频播放

文章对javax.sound包的结构作了深入的讲解,而且为MP3解码提供的解决方案。最后介绍了一个简单播放器的开发,因为篇幅,作者没有把完整的代码送上,我仿照作者的思路,写了个简单的播放WAV文件的代码,撇开复杂的线程,目的在展示播放WAV文件的实现代码上。绵薄的功夫而已。

源代码

 

package  test;

import  java.awt.event.ActionEvent;
import  java.awt.event.ActionListener;
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.LineUnavailableException;
import  javax.sound.sampled.SourceDataLine;
import  javax.sound.sampled.UnsupportedAudioFileException;
import  javax.swing.JButton;
import  javax.swing.JFileChooser;
import  javax.swing.JFrame;
import  javax.swing.filechooser.FileFilter;


/**
 * 
@author Administrator
 *
 
*/

public   class  WavPlayer  extends  JFrame  {
    
/**
     * 
     
*/

    
private AudioInputStream ais;
    
private String fileUrl="WindowsDing.wav";
    
//文件过滤器
    private class MyFilter  extends FileFilter{

        @Override
        
public boolean accept(File arg0) {
            
// TODO Auto-generated method stub
            if(arg0.getName().endsWith(".wav" )|| arg0.isDirectory())
                
return true;
            
return false;
        }


        @Override
        
public String getDescription() {
            
// TODO Auto-generated method stub
            return "波形文件(.wav)";
        }

        
    }

    
    
    WavPlayer()
{
        
super();
        setSize(
150,150);
        JButton startBut
=new JButton("播放");
        startBut.addActionListener(
new ActionListener(){

            
public void actionPerformed(ActionEvent arg0) {
                
// TODO Auto-generated method stub
                JFileChooser jfc= new JFileChooser();
                jfc.setFileFilter(
new MyFilter());
                
if(jfc.showOpenDialog(null)==JFileChooser.APPROVE_OPTION)
                    fileUrl
=jfc.getSelectedFile().getAbsolutePath();
                
else
                    
return;
                
                
try {
                    ais
=AudioSystem.getAudioInputStream(new File(fileUrl));
                    AudioFormat af
=ais.getFormat();
                    SourceDataLine sdl
=null;
                    DataLine.Info info
=new DataLine.Info(SourceDataLine.class,af);
                    sdl
=(SourceDataLine) AudioSystem.getLine(info);
                    sdl.open(af);
                    sdl.start();
                    
                    
//play
                    
                    
int nByte=0;
                    
byte[] buffer=new byte[128];
                    
while(nByte!=-1){
                        nByte
=ais.read(buffer,0,128);
                        
if(nByte>=0){
                            
int oByte=sdl.write(buffer, 0, nByte);
                            System.out.println(oByte);
                        }

                    }

                    sdl.stop();
                    
                }
 catch (UnsupportedAudioFileException e) {
                    
// TODO Auto-generated catch block
                    e.printStackTrace();
                }
 catch (IOException e) {
                    
// TODO Auto-generated catch block
                    e.printStackTrace();
                }
 catch (LineUnavailableException e) {
                    
// TODO Auto-generated catch block
                    e.printStackTrace();
                }

                
            }

            
        }
);
        
this.getContentPane().add(startBut);
        setVisible(
true);
    }

    
    
public static void main(String[] args){
        
new WavPlayer();
    }

}

 

需要指出的

需要指出的一点是,

                    DataLine.Info info=new DataLine.Info(SourceDataLine.class,af);
                    sdl
=(SourceDataLine) AudioSystem.getLine(info);
                    sdl.open(af);
                    sdl.start();

sourceDataLine在被写入前需要被打开" sdl.start();" 这点作者没有说明。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值