是应用程序呀,不是Applet。

解决方案 »

  1.   

    不是applet的话,用java的JMF具体考虑实现
      

  2.   

    什么格式的声音格式?
    如果Java Sound 支持的话,使用 javax.sound 。
    MP3 /OGG 有开源的库支持。
      

  3.   

    我用的是javax.sound.*,播放一遍的程序可以运行(用缓冲区,读一帧,写一帧),但是改用clip剪辑时,不仅没能实现循环,甚至连播放都不能实现了。求高手帮忙。我把我写的源然码发一下。
      

  4.   

    这个是仅能播放一遍的。package newtest;import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.Clip;
    import javax.sound.sampled.DataLine;
    import javax.sound.sampled.LineUnavailableException;
    import javax.sound.sampled.SourceDataLine;public class SoundTest2 {
    byte [] audioData=new byte[1024];
    boolean flag=false;
    AudioInputStream ais;
    SourceDataLine line;//音源(即需要把本地或网络上的音频读进此处,注意:声音的播方是在将声加入到此处之后,然后再写向声卡)
    Clip clip;
    AudioFormat baseFormat;
    DataLine.Info info;
    File file;

    public SoundTest2(){
    try {
    playMusice();
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    public void playMusice() throws FileNotFoundException{
    try{
    file=new File("D:/myEclipse/Genuitec/Workspace/GoBang/bin/sound/test.wav");
    ais=AudioSystem.getAudioInputStream(file);
    }catch(Exception e){
    e.printStackTrace();
    }
    if(ais!=null){
    baseFormat=ais.getFormat();
    info=new DataLine.Info(SourceDataLine.class ,baseFormat);
    try {
    line=(SourceDataLine)AudioSystem.getLine(info);
    line.open(baseFormat);
    } catch (LineUnavailableException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();


    }
    if(line==null)
    return;
    line.start();//允许开始执行数行的I/O,在此这前所做的所有操作,只是为SourceDataLint获得了一个音频输入流,但是其还未真正的开始进行流的输入。
    int inByte=0;
    while(inByte!=-1){
    try{
    inByte=ais.read(audioData, 0, 1024);//将音频流读入到缓冲区中
    System.out.print(inByte+"\t");
    }catch(IOException ioe){
    ioe.printStackTrace();
    }
    try{
    if(inByte>0){
    line.write(audioData, 0, inByte);//将缓冲区中的内容写出到音频器中,暂解。
    }
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    line.drain();
    line.stop();
    line.close();
    }

    public void start(){
    while(true){
    try {
    playMusice();
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }

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

  5.   

    这个是想让它进行循环的,但是程序一闪即逝,没声音,循环播放就更谈不上。
    package newtest;import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.Clip;
    import javax.sound.sampled.DataLine;
    import javax.sound.sampled.LineUnavailableException;
    import javax.sound.sampled.UnsupportedAudioFileException;import sun.audio.AudioStream;public class AudioLooperTest {
    File file;
    InputStream in;
    AudioInputStream currentSound;
    AudioFormat format;//帧格式
    int frameLength ,frameSize;//分别是帧长度(帧总数),帧大小(每帧的大小)
    DataLine.Info info;
    Clip clip;
    URL url;
    byte audioData[]=new byte[1024];

    public AudioLooperTest(){
    try{
    url=AudioLooperTest.class.getResource("test.wav");
    //in=new FileInputStream("D:/myEclipse/Genuitec/Workspace/GoBang/bin/sound/backSound.wav");
    //currentSound=AudioSystem.getAudioInputStream(in);
    //file=new File("D:/myEclipse/Genuitec/Workspace/GoBang/bin/sound/backSound.wav");
    currentSound=AudioSystem.getAudioInputStream(url);//30~33分别是两种获取音频输入流的方式,都可以
    format=currentSound.getFormat();
    frameLength=(int)currentSound.getFrameLength();
    frameSize=format.getFrameSize();
    info=new DataLine.Info(Clip.class, format ,frameLength*frameSize);
    //info=new DataLine.Info(Clip.class, format);
    clip=(Clip)AudioSystem.getLine(info);
    System.out.println("preparing......");
    clip.open(currentSound);//至此完成音频的装载,这里是把音频全部装入clip
    System.out.println("open......");
    System.out.println(clip.getFramePosition());
    System.out.println(clip.getMicrosecondPosition());
    System.out.println(clip.getBufferSize());
    System.out.println(frameLength);
    System.out.println(frameSize);
    //clip.open(format, audioData, 0, 1024);
    clip.start(); //System.out.println("start......");
    //clip.loop(Clip.LOOP_CONTINUOUSLY);
    //clip.drain();
    //clip.stop();
    //clip.close();
    } 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();
    }
    } /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    new AudioLooperTest(); }} 
      

  6.   

    不会用javax.sound而是用jmf找到的一个可以循环播放的例子,代码贴到下面
    需要你先安装JMF,可以到CSDN我的资源那里找到,将jmf.jar加到工程的lib当中
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.FileDialog;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;import javax.media.ControllerClosedEvent;
    import javax.media.ControllerEvent;
    import javax.media.ControllerListener;
    import javax.media.EndOfMediaEvent;
    import javax.media.Manager;
    import javax.media.MediaLocator;
    import javax.media.NoPlayerException;
    import javax.media.Player;
    import javax.media.PrefetchCompleteEvent;
    import javax.media.RealizeCompleteEvent;
    import javax.media.Time;
    import javax.swing.JCheckBoxMenuItem;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;/**
     * 循环播放声音的实例
     * @author ioe_gaoyong
     *
     */
    public class MediaPlayer extends JFrame implements ActionListener,ControllerListener, ItemListener{ Player player; Component vc, cc; boolean first = true, loop = false; String currentDirectory; MediaPlayer(String title) { super(title); addWindowListener (new WindowAdapter() { public void windowClosing(WindowEvent e) { // 用户点击窗口系统菜单的关闭按钮 // 调用dispose以执行windowClosed dispose(); } public void windowClosed(WindowEvent e) { if (player != null)
    player.close(); System.exit(0); } }); JMenu m = new JMenu("文件"); JMenuItem mi = new JMenuItem("打开"); mi.addActionListener(this); m.add(mi); m.addSeparator(); JCheckBoxMenuItem cbmi = new JCheckBoxMenuItem("循环", false); cbmi.addItemListener(this); m.add(cbmi); m.addSeparator(); mi = new JMenuItem("退出"); mi.addActionListener(this); m.add(mi); JMenuBar mb = new JMenuBar(); mb.add(m); setJMenuBar(mb); setSize(200, 200); setVisible(true); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("退出")) { // 调用dispose以便执行windowClosed dispose(); return; }

    //利用FileDialog来帮助完成选择文件
    //FileDialog貌似是平台相关的一个实现,是AWT的组件
    FileDialog fd = new FileDialog(this, "打开媒体文件", FileDialog.LOAD); fd.setDirectory(currentDirectory); fd.show(); // 如果用户放弃选择文件,则返回 if (fd.getFile() == null)
    return; currentDirectory = fd.getDirectory(); if (player != null) player.close(); try { player = Manager.createPlayer(new MediaLocator ("file:" + fd.getDirectory() + fd.getFile())); } catch (java.io.IOException e2) { System.out.println(e2); return; } catch (NoPlayerException e2) { System.out.println("不能找到播放器."); return; } if (player == null) { System.out.println("无法创建播放器."); return; } first = false; setTitle(fd.getFile()); player.addControllerListener(this); player.prefetch(); } public void controllerUpdate(ControllerEvent e) { // 调用player.close()时ControllerClosedEvent事件出现。 // 如果存在视觉部件,则该部件应该拆除(为一致起见, // 我们对控制面板部件也执行同样的操作) if (e instanceof ControllerClosedEvent) { if (vc != null) { remove(vc); vc = null; } if (cc != null) { remove(cc); cc = null; } return; } if (e instanceof EndOfMediaEvent) { if (loop) { player.setMediaTime(new Time(0)); player.start(); } return; } if (e instanceof PrefetchCompleteEvent) { player.start(); return; } if (e instanceof RealizeCompleteEvent) { vc = player.getVisualComponent(); if (vc != null) add(vc); cc = player.getControlPanelComponent(); if (cc != null) add(cc, BorderLayout.SOUTH); pack(); } } public void itemStateChanged(ItemEvent e) { loop = !loop;//设置是否循环 } public void paint(Graphics g) { if (first) { int w = getSize().width; int h = getSize().height; g.setColor(Color.blue); g.fillRect(0, 0, w, h); Font f = new Font("DialogInput", Font.BOLD, 16); g.setFont(f); FontMetrics fm = g.getFontMetrics(); int swidth = fm.stringWidth("*** 欢迎 ***"); g.setColor(Color.white); g.drawString("*** 欢迎 ***", (w - swidth) / 2, (h + getInsets().top) / 2); } // 调用超类Frame的paint()方法,该paint()方法将调用Frame包含的各个容器 // 和部件(包括控制面板部件)的paint()方法。 super.paint(g); } // 不执行背景清除操作,以免控制面板部件闪烁 public void update(Graphics g) { paint(g); } public static void main(String[] args) { new MediaPlayer("媒体播放器1.0"); }}