playCycle(String s)这个是单曲重复播放;play(String s)这个是单曲播放.
/******* part one start *******/
//获取媒体文件流
AudioInputStream ais = AudioSystem.getAudioInputStream(new File(fileurl));
//获取文件格式
AudioFormat aif = ais.getFormat();
//这个类不知道是什么,没用过,今天这一节应该是对媒体流处理的一个类
SourceDataLine sdl = null;
//这个貌似通过媒体格式,获取媒体文件的信息
DataLine.Info info = new DataLine.Info(SourceDataLine.class,aif);
//通过媒体文件的信息初始化处理媒体文件的类
sdl = (SourceDataLine)AudioSystem.getLine(info);
//媒体工具类 打开媒体流
sdl.open(aif);
//媒体工具(播放器)开启
sdl.start();
/******* part one end *******/
/******* part two start ********/
int nByte = 0;
//媒体工具类(播放器类)对媒体流进行写入处理,此时应该会有音乐响起吧
while(nByte != -1){
if(nByte = 0){
int oByte = sdl.write(buffer, 0, nByte);
//System.out.println(oByte);
}
//媒体流结束,并关闭这个媒体工具类
sdl.stop();
/******* part two end********/
//给你个例子
import java.io.*;
import javax.sound.sampled.*;
import javax.swing.*;
public class Au extends JFrame
{
public static void main(String[] args) throws Exception
Au w=new Au();
w.loop();
void loop() throws Exception
//将f指定为声音文件的文件名,声音文件只能是WAVE、AU、AIFF、AIFC、SND格式的
final String f="s.wav";
Clip c=AudioSystem.getClip();
c.open(AudioSystem.getAudioInputStream(new File(f)));
c.loop(Clip.LOOP_CONTINUOUSLY);
Au()
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
packagelogin;
importjava.io.File;
importjava.io.IOException;
importjavax.sound.sampled.AudioFormat;
importjavax.sound.sampled.AudioInputStream;
importjavax.sound.sampled.AudioSystem;
importjavax.sound.sampled.DataLine;
importjavax.sound.sampled.FloatControl;
importjavax.sound.sampled.LineUnavailableException;
importjavax.sound.sampled.SourceDataLine;
importjavax.sound.sampled.UnsupportedAudioFileException;
publicclasstestviodeextendsThread{
privateStringfilename;
privatePositioncurPosition;
enumPosition{
LEFT,RIGHT,NORMAL
};
publictestviode(Stringwavfile){
filename=wavfile;
curPosition=Position.NORMAL;
publictestviode(Stringwavfile,Positionp){
curPosition=p;
publicvoidrun(){
FilesoundFile=newFile(filename);
if(!soundFile.exists()){
System.err.println("Wavefilenotfound:"+filename);
return;
AudioInputStreamaudioInputStream=null;
try{
audioInputStream=AudioSystem.getAudioInputStream(soundFile);
}catch(UnsupportedAudioFileExceptione1){
e1.printStackTrace();
}catch(IOExceptione1){
AudioFormatformat=audioInputStream.getFormat();
SourceDataLineauline=null;
DataLine.Infoinfo=newDataLine.Info(SourceDataLine.class,format);
auline=(SourceDataLine)AudioSystem.getLine(info);
auline.open(format);
}catch(LineUnavailableExceptione){
e.printStackTrace();
}catch(Exceptione){
if(auline.isControlSupported(FloatControl.Type.PAN)){
FloatControlpan=(FloatControl)auline
.getControl(FloatControl.Type.PAN);
if(curPosition==Position.RIGHT)
pan.setValue(1.0f);
elseif(curPosition==Position.LEFT)
pan.setValue(-1.0f);
auline.start();
intnBytesRead=0;
byte[]abData=newbyte[EXTERNAL_BUFFER_SIZE];
while(nBytesRead!=-1){
nBytesRead=audioInputStream.read(abData,0,abData.length);
if(nBytesRead=0)
auline.write(abData,0,nBytesRead);
}catch(IOExceptione){
}finally{
auline.drain();
auline.close();
}}
可以看看下面:
Java对多媒体的支持
其它语言相比较,如果说Java对图形和文本媒体的支持并不占明显优势的话,那么Java对图像与声音媒体的支持真可谓是技高一筹,显示图像与播放声音就如同显示一行文本一样方便.同时,正由于在Java动画中灵活的运用图像和声音媒体,才使得Web页面更具魅力.
正如上一节所介绍的,Graphics类中确实提供了不少绘制图形的方法,但如果用它们在applet运行过程中实时地绘制一幅较复杂的图形(例如一条活泼可爱的小狗),就好比是在用斧头和木块去制造航天飞机.所以呢,对于复杂图形,大部分都事先用专用的绘图软件绘制好,或者是用其它截取图像的工具(如扫描仪、视效卡等)获取图像的数据信息,再将它们按一定的格式存入图像文件.applet运行时,只要找到图像文件存贮的位置,将它装载到内存里,然后在适当的时机将它显示在屏幕上就可以了.
①图像文件的装载
Java目前所支持的图像文件格式只有两种,它们分别是GIF和JPEG格式(带有.GIF、.JPG、.JPEG后缀名的文件).所以呢若是其它格式的图像文件,就先要将它们转换为这两种格式.能转换图像格式的软件有很多,如PhotoStyler等.
Applet类中提供了getImage( )方法用来将准备好的图像文件装载到applet中,但我们必须首先指明图像文件所存贮的位置.由于Java语言是面向网络应用的,所以呢文件的存贮位置并不局限于本地机器的磁盘目录,而大部分情况是直接存取网络中Web服务器上的图像文件,因而,Java采用URL(Universal Resource Location,统一资源定位器)来定位图像文件的网络位置.所以呢,Java专门提供了URL类来管理URL信息(关于该类的详细介绍见下一章).
表示一个URL信息可分为两种形式:
一种称为绝对URL形式,它指明了网络资源的全路径名.如:
绝对URL:""
另一种称为相对URL形式,分别由基准URL(即base URL)再加上相对于基准URL下的相对URL这两部分组成,例如上面的例子可表示为:
基准URL:""
相对URL:"images/m1.gif"
现在,我们可以来看一下getImage( )方法的调用格式了:
Image getImage(URL url)
Image getImage(URL url, String name)
我们可以发现,这两种调用格式的返回值都是Image对象.确实,Java特别提供了java.awt.Image类来管理与图像文件有关的信息,所以呢执行与图像文件有关的操作时不要忘了import这个类.getImage( )方法的第一种调用格式只需一个URL对象作为参数,这便是绝对URL.而后一种格式则带有两个参数,第一个参数给出的URL对象是基准URL,第二个参数是字符串类型,它描述了相对于基准URL下的路径和文件名信息,所以呢这两个参数的内容综合在一起就构成了一个绝对URL.例如,下面两种写法所返回的结果是一样的:
Image img=getImage(new URL("");
Image img=getImage(new URL(""),"images/m1.gif");
表面看来,好象第一种调用格式较方便一些,但实际上第二种调用格式用得更普遍,因为这种格式更具灵活性.原来,Applet类中提供了两个方法来帮助我们方便地获取基准URL对象,它们的调用格式如下:
URL getDocumentBase( )
URL getCodeBase( )
其中getDocumentBase( )方法返回的基准URL对象代表了包含该applet的HTML文件所处的目录,例如该文件贮存在""中,则该方法就返回""路径.而getCodeBase( )方法返回的基准URL对象代表了该applet文件(.class文件)所处的目录.它是根据HTML文件的"APPLET"标记中的CODEBASE属性值计算出来的,若该属性没有设置,则同样返回该HTML文件所处的目录.
好了,现在我们应该可以感受到基准URL的灵活性了吧.只要我们写下语句:
Image img = getImage(getDocumentBase( ),"images/m1.gif");
那么即使整个imgsample目录移到别处任何地方,也可以正确装载图像文件,而采用对于绝对URL形式则需要重新修改applet代码并重新编译.
getImage( )方法仅仅是将图像文件从网络上装载进来,交由Image对象管理.那我们样把得到的Image对象中的图像显示在屏幕上呢?这又要回到我们的老朋友Graphics类来了,因为Graphics类提供了一个drawImage( )方法,它能完成将Image对象中的图像示在屏幕的特定位置上,就象显示文本一样方便.drawImage( )方法的调用格式如下:
boolean drawImage(Image img, int x, int y, ImageObserver observer)
其中img参数就是要显示的Image对象.x和y参数是该图像左上角的坐标值.observer参数则是一个ImageObserver接口(interface),它用来跟踪图像文件装载是否已经完成的情况,通常我们都将该参数置为this,即传递本对象的引用去实现这个接口.
除了将图像文件照原样输出以外,drawImage( )方法的另外一种调用格式还能指定图像显示的区域大小:
boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
这种格式比第一种格式多了两个参数width和height,即表示图像显示的宽度和高度.若实际图像的宽度和高度与这两个参数值不一样时,Java系统会自动将它进行缩放,以适合我们所定的矩形区域.
有时,我们为了不使图像因缩放而变形失真,可以将原图的宽和高均按相同的比例进行缩小或放大.那么怎样知道原图的大小呢?只需调用Image类中的两个方法就可以分别得到原图的宽度和高度.它们的调用格式如下:
int getWidth(ImageObserver observer)
int getHeight(ImageObserver observer)
同drawImage( )方法一样,我们通常用this作为observer的参数值.
import java.awt.Graphics;
import java.awt.Image;
public class Images extends java.applet.Applet{
Image img;
public void init(){
img=getImage(getCodeBase(),"man.gif");
public void paint(Graphics g){
int w=img.getWidth(this);
int h=img.getHeight(this);
对声音媒体的直接支持可以说是Java的一大特色,尤其是在动画中配上声音效果,就可以使人在视觉上和听觉上均得到美的享受,那才叫过瘾.Java中播放声音文件与显示图像文件一样方便,同样只需要先将声音文件装载进来,然后播放就行了.
声音文件准备好以后,就可以考虑将它装载进来并播放.在Applet类中提供的play( )方法可以将声音文件的装载与播放一并完成,其调用格式如下:
void play(URL url)
void play(URL url, String name)
可见,play( )方法的调用格式与getImage( )方法是完全一样的,也采用URL来定位声音文件.例如,某声音文件audio.au与applet文件存放在同一目录下,可以这样写:
play(getCodeBase( ),"audio.au");
一旦play( )方法装载了该声音文件,就立即播放.如果找不到指定URL下的声音文件,play( )方法不返回出错信息,只是听不到想听的声音而已.
由于play( )方法只能将声音播放一遍,若想循环播放某声音作为背景音乐,就需要用到功能更强大的AudioClip类,它能更有效地管理声音的播放操作.因为它被定义在java.applet程序包中,所以使用该类的话,不要忘了在程序头部加上:
import java.applet.AudioClip;
为了得到AudioClip对象,我们可以调用Applet类中的getAudioClip( )方法.它能装载指定URL的声音文件,并返回一个AudioClip对象,其调用格式如下:
AudioClip getAudioClip(URL url)
AudioClip getAudioClip(URL url, String name)
如果需要的话,我们还可以在applet中同时装载几个声音文件来一起播放,到时候,这些声音将混合在一起,就象二重奏一样.另外还有一点要说明的是,如果我们使用AudioClip对象的loop( )方法来重复播放背景音乐时,千万不要忘记在适当的时候调用AudioClip对象的stop( )方法来结束放音,否则的话,即使用户离开这一Web页面,该声音也不会停止,这无疑将会惹恼用户.所以呢,一般我们都在applet的stop( )方法中添上停止播放的代码.
例如,下面这段程序将播放两段声音,一段是连续播放的背景音乐,另一段是讲话录音.
public class Audios extends java.applet.Applet{
AudioClip bgmusic,speak;
bgmusic=getAudioClip(getDocumentBase(),"space.au");
speak=getAudioClip(getDocumentBase(),"intro.au");
public void start(){
if(bgmusic!=null)
bgmusic.loop();
if(speak!=null)
speak.play();
public void stop(){
bgmusic.stop(); //关闭背景音乐,切记.
使用Applet播放声音时需首先定义AudioClip对象,GetAudioClip方法能把声音赋予AudioClip对象,如果仅想把声音播放一遍,应调用AudioClip类的play方法,如果想循环把声音剪辑,应选用AudioClip类的loop方法.
(1) 播放声音文件
图像格式各种各样,如BMP、GIF和JPEG等.声音文件也一样,WAV和AU是最常用的两种声音文件.目前Java仅支持AU文件,但Windows环境下常用的却是WAV文件,所以最好能有一个可把WAV文件转换为AU文件的工具.
* 播放声音的AudioClip类
AudioClip类用来在Java Applet内播放声音,该类在java.Applet包中有定义.
下面演示了如何利用AudioClip类播放声音.
装入一个名为Sample.Au的声音文件并播放(SoundDemo.java)
//源程序清单
import java.awt.*;
import java.applet.*
public class SoundDemo extends Applet
public void paint(Graphics g)
AudioClip audioClip=getAudioClip(getCodeBase(),"Sample.AU");
//创建AudioClip对象并用//getAudioClip方法将其初始化.
audioClip.loop();//使用AudioClip类的loop方法循环播放
需把如下的HTML语句放入SoundDemo.HTML文件,为运行该Applet做准备.
<HTML>
<TITLE>SoundDemo Applet</TITLE>
</APPLET>
</HTML>
编译并运行该Applet,屏幕上将显示出一个Applet窗口并伴以音乐.关闭Applet时音乐终止.
以上就是土嘎嘎小编为大家整理的java播放声音的类代码相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!