如何在java应用程序中加入循环播放的声音 是应用程序呀,不是Applet。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不是applet的话,用java的JMF具体考虑实现 什么格式的声音格式?如果Java Sound 支持的话,使用 javax.sound 。MP3 /OGG 有开源的库支持。 我用的是javax.sound.*,播放一遍的程序可以运行(用缓冲区,读一帧,写一帧),但是改用clip剪辑时,不仅没能实现循环,甚至连播放都不能实现了。求高手帮忙。我把我写的源然码发一下。 这个是仅能播放一遍的。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(); }} 这个是想让它进行循环的,但是程序一闪即逝,没声音,循环播放就更谈不上。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(); }} 不会用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"); }} 怎么判断文件是否下载完毕? 有人碰见过对象申请不下来的情况吗?等待中 showConfirmDialog能否改变默认值? apache的ant怎么下载不了? java线程问题:在while循环中执行的内容越多,interupt线程的时间越长(还会继续很多次循环),甚至完全停不下来! 怎么通过java应用程序把一个页面显示出来? 关于权限的问题!! 请问在什么情况下会出现,编译通过,但是运行的时候会出现错误?? 谁有java做的管理软件源代码的下载 一个小问题! RandomAccessFile类的读写 java io
如果Java Sound 支持的话,使用 javax.sound 。
MP3 /OGG 有开源的库支持。
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();
}
}
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(); }}
需要你先安装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"); }}