利用Java Applet播放声音文件

利用Java Applet播放声音文件,第1张

使用Applet播放声音时需首先定义AudioClip对象 GetAudioClip方法能把声音赋予AudioClip对象 如果仅想把声音播放一遍 应调用AudioClip类的play方法 如果想循环把声音剪辑 应选用AudioClip类的loop方法

图像格式各种仔知逗各样 如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方法将其初始化 g drawstring( Sound Demo! )audioClip loop() //使用AudioClip类的loop方法循环播放  } }

需把如下的HTML语句放入SoundDemo HTML文件 为运行该Applet做准备

<HTML> <TITLE>SoundDemo Applet</TITLE> <APPLET CODE= SoundDemo class WIDTH= HEIGHT= > </APPLET> </HTML>

lishixinzhi/Article/program/Java/hx/201311/27027

对声音媒体的直接支持可以说是Java的一大特色,尤其是在动画中配上声音效果,就可以使人在视觉上和听觉上均得到美铅仔的享受,那才叫过瘾。Java中播放声音文件与显示图像文件一样方便,同样只需要先将声音文件装载进来,然后播放就行了。

Java目前支持的声音文件只有一种格式,那就是SUN公司的AU格式(.AU文件),也称为u-law格式。由于AU格式的声音仅有8KHz的采样频率且不支持立体声效果,所以音质不算太好。唯一的好处就是AU声音文件的尺寸比其它格式小,有利于网上传输。一般,我们较熟悉的大都是WAV格式的声音文件,因此必须先将它们转换为AU格式(可以选用Goldwave软件来进行这种格式转换)。

声音文件准备好以后,就可以考虑将它装载进来并播放。在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)

得到AudioClip对象以后,就可以调用AudioClip类中所提供的各种方法来 *** 作其中的声音数据,这些方法如表4-4所示。

如果getAudioClip( )方法没有找到所指定的声音文件,就会返回null值。所以,在调用表4-4中所列的方法前,应该先检查一下得到的AudioClip对象不是null,因为在null对象上调用上述方法将导致出错。

如果需要的话,我们还可以在applet中同时装载几个声音文件来一起播放,到时候,这些声音将混合在一起,就象二重奏一样。另外还有一点要说明的是,如果我们使用AudioClip对象的loop( )方法来重复播放背景音乐时,千万不要忘记在适当的时候调用AudioClip对象的stop( )方法来结束放音,否则的话,即使用户离开这一Web页面,该声音也不会停止,这无疑将会惹恼用户。因槐仔汪此,一般我们都在applet的stop( )方法中添上停止播放的代码。

例如,下面这段程序将播放两段声音,一段是连续播放的背景音乐,另一段是讲话录音。

import java.applet.AudioClip

public class Audios extends java.applet.Applet{

AudioClip bgmusic,speak

public void init(){

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(){

if(bgmusic!=null)

bgmusic.stop()//关闭背景音乐,切记。

}

}

package com.hongyuan.test

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

public class MusicTest {

public static final String MUSIC_FILE = "相逢一笑.wav"

public static void main(String[] args) throws

LineUnavailableException,

UnsupportedAudioFileException, IOException {

// 获取音频输入流

AudioInputStream audioInputStream =

AudioSystem

.getAudioInputStream(new File(MUSIC_FILE))

//

获取音频编码对象

AudioFormat audioFormat = audioInputStream.getFormat()

// 设置数据输入

DataLine.Info dataLineInfo = new

DataLine.Info(SourceDataLine.class,

audioFormat,

AudioSystem.NOT_SPECIFIED)

SourceDataLine sourceDataLine =

(SourceDataLine)

AudioSystem

.getLine(dataLineInfo)

sourceDataLine.open(audioFormat)

sourceDataLine.start()

/*

* 从输入流中读取数据发送到混音器

*/

int count

byte tempBuffer[]

= new byte[1024]

while ((count = audioInputStream.read(tempBuffer, 0,

tempBuffer.length)) != -1) {

if (count >0)

{

sourceDataLine.write(tempBuffer, 0, count)

}

}

//

清空数据缓冲,并关闭输入

sourceDataLine.drain()

sourceDataLine.close()

}

}

在 applet 中播放声音文件非常简单,一般需要以下步骤:创建一个 AudioClip 对象

装入 .au 声音文件到 AudioClip 对象

一次播放或者不停循环播放声游培扒音

停止播放

下面是相应的代码:import java.applet.*AudioClip ac = getAudioClip(getCodeBase(), soundFile)

ac.play()//play once

ac.stop()//stop playing

解决这个问题的窍门是利用由 Sun 及 其JDK 提供的某些 undocumented 的特征。先看看 Sun JDK 中的文件 classes.zip (使用任何解压工具即可),发现其中不仅包含标准的 Java 包如 java.applet 而且还存在包 sun.audio. (在 sun/audio 的目录下.)

包 sun.audio 中包含了用于播放声音文件所需的所有东西神昌!下面是示例代码:import sun.audio.*//import the sun.audio package

import java.io.*//** add this into your application code as appropriate// Open an input stream to the audio file.

InputStream in = new FileInputStream(Filename)// Create an AudioStream object from the input stream.

AudioStream as = new AudioStream(in)// Use the static class member "player" from class AudioPlayer to play

// clip.

AudioPlayer.player.start(as)// Similarly, to stop the audio.

AudioPlayer.player.stop(as)如果要用一个 URL 做为声音流的源(source),则用下面的代码所示替换输入流来创建声音中团流:AudioStream as = new AudioStream (url.openStream())如果需要持续播放声音文件,则要稍稍复杂一点:// Create audio stream as discussed previously.

// Create AudioData source.

AudioData data = as.getData()// Create ContinuousAudioDataStream.

ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data)// Play audio.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12249333.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存