Java实现音频播放--JavaSoundAPI编写音频处理程序
Java应用开发中的音频与视频处理技巧

Java应用开发中的音频与视频处理技巧在当今数字化时代,音频与视频处理已经成为了应用开发中的重要技术与需求。
无论是娱乐应用、教育应用还是企业应用,都需要使用到音频与视频技术,以提供更丰富的交互与用户体验。
本文将介绍一些在Java应用开发中常用的音频与视频处理技巧,供读者参考与学习。
一、音频处理技巧1. 音频格式转换在Java应用开发中,常常需要对不同格式的音频文件进行转换。
这时可以使用开源库Apache Commons IO提供的FileUtils类来进行文件操作,再结合开源库Tritonus的代码csutil,使用Java Sound API对音频文件进行读取与转换。
2. 音频剪辑与拼接在一些应用场景中,需要对音频文件进行剪辑与拼接,以满足特定需求。
通过Java Sound API提供的AudioFileFormat与AudioSystem类,可以实现对音频文件的读取、导出和处理。
通过控制音频文件的截取和合并,可以实现剪辑与拼接的效果。
3. 音频数据分析在音频处理中,经常需要对音频数据进行分析,如获取音频的频谱、声波图等信息。
可以使用Java Sound API提供的LineListener接口监听音频数据的采集过程,然后使用开源库JFreeChart生成频谱图、声波图等。
二、视频处理技巧1. 视频格式转换与音频类似,视频文件也有不同的格式。
在Java应用开发中,可以使用开源库Xuggler进行视频格式的转换。
通过使用Xuggler提供的工具类,可以将视频文件转换为不同的格式,以满足特定需求。
2. 视频剪辑与拼接在一些应用场景中,需要对视频文件进行剪辑与拼接,以提供更好的用户体验。
可以使用开源库FFmpeg进行视频的剪辑与拼接。
通过使用FFmpeg提供的命令行工具,可以实现对视频的截取和合并。
3. 视频数据处理与分析在视频处理中,经常需要对视频数据进行处理与分析,以实现特定的功能。
可以使用开源库JavaCV结合FFmpeg进行视频数据的处理与分析。
java 播放声音代码

import java.applet.*;import java.awt.*;import java.awt.event.*;import .*;public class Sound extends Appletimplements ActionListener {String onceFile = "file:/e:/myjava/eg0910/src/1.aif";String loopFile = "file:/e:/myjava/eg0910/src/1.mid";AudioClip onceClip;AudioClip loopClip;Button playOnce;Button stopOnce;Button startLoop;Button stopLoop;boolean looping = false;boolean playing = false;public void init() {try{onceClip= getAudioClip(new URL(onceFile));loopClip = getAudioClip(new URL(loopFile));}catch(MalformedURLException e){}playOnce = new Button("Play aif");stopOnce = new Button("Stop aif");stopOnce.setEnabled(false);playOnce.addActionListener(this);add(playOnce);stopOnce.addActionListener(this) ;add(stopOnce);startLoop = new Button("Loop midi");stopLoop = new Button("Stop Loop");stopLoop.setEnabled(false);startLoop.addActionListener(this);add(startLoop);stopLoop.addActionListener(this);add(stopLoop);}public void stop() {if (playing) {onceClip.stop(); //暂停播放}if (looping) {loopClip.stop(); //暂停循环播放}}public void start() {if (playing){onceClip.play(); //重新开始播放}if (looping) {loopClip.loop(); //重新开始循环播放}}public void actionPerformed(ActionEvent event) {Object source = event.getSource();//响应play Button事件if (source == playOnce) {if (onceClip != null) {playing = true;// Thread t = new Thread(new t1());// t.start();//播放音乐文件onceClip.loop();//play按钮变灰,stop按钮可用stopOnce.setEnabled(true);playOnce.setEnabled(false);showStatus("Playing sound " + onceFile + ".");} else {showStatus("Sound " + onceFile + " not loaded yet.");}return;}//响应stop Button事件if (source == stopOnce) {if (playing) {playing = false;//暂停播放onceClip.stop();//play按钮可用,stop按钮变灰playOnce.setEnabled(true);stopOnce.setEnabled(false);}showStatus("Stopped playing sound " + onceFile + ".");return;}//响应loop Button事件if (source == startLoop) {if (loopClip != null) {looping = true;//开始声音的循环播放loopClip.loop();//loop按钮可用,stop loop按钮变灰stopLoop.setEnabled(true);startLoop.setEnabled(false);showStatus("Playing sound " + loopFile + " continuously.");} else {showStatus("Sound " + loopFile + " not loaded yet.");}return;}//响应stop loop Button事件if (source == stopLoop) {if (looping) {looping = false;//停止声音的循环播放loopClip.stop();//loop按钮变灰,stop loop按钮可用startLoop.setEnabled(true);stopLoop.setEnabled(false);}showStatus("Stopped playing sound " + loopFile + ".");return;}}}。
Java音视频处理应用程序开发技术

Java音视频处理应用程序开发技术近年来,随着多媒体技术的发展和应用范围的扩大,音视频处理技术在各个领域中的应用越来越广泛。
Java作为一种多功能的编程语言,也在音视频处理应用程序的开发中扮演着重要的角色。
本文将介绍Java音视频处理应用程序开发的基本技术原理和开发流程。
一、音视频处理技术概述音视频处理技术主要包括音频处理和视频处理两个方面。
音频处理涉及到音频采集、音频编解码、音频编辑和音频播放等功能;视频处理则包括视频采集、视频编解码、视频编辑和视频播放等功能。
在Java中,通过使用相关的API和库,我们可以实现这些功能。
二、Java音视频处理应用程序开发环境准备在进行Java音视频处理应用程序开发之前,需要准备相关的开发环境。
首先要确保已经安装好Java Development Kit(JDK),以便编译和运行Java程序。
其次,还需要下载并安装一些用于音视频处理的库和工具,如Java Media Framework(JMF)、FFmpeg等。
这些库和工具可以帮助我们处理音视频数据和实现相关的功能。
三、音视频数据处理在开发音视频处理应用程序时,首先需要对音视频数据执行相关的处理操作。
音频数据处理涉及到采集和播放音频数据,以及对音频数据进行编解码和编辑等操作。
视频数据处理则包括采集和播放视频数据,以及对视频数据进行编解码和编辑等操作。
1. 音频数据处理音频数据处理的第一步是音频数据的采集,可以使用Java Sound API来实现。
借助Java Sound API,我们可以通过音频输入设备(例如麦克风)采集音频数据,并将其保存到文件或进行实时处理。
2. 视频数据处理视频数据处理的第一步是视频数据的采集,我们可以利用Java 2D或者JavaFX图像库来获取视频帧。
通过这些库,我们可以从摄像头或者视频文件中获取连续的图像帧,并在屏幕上实时显示。
四、音视频编解码音视频编解码是处理音视频数据的重要环节,通过音视频编解码,可以将音视频数据进行压缩和解压缩,从而减小数据量并提高数据传输的效率。
Java应用开发中的音频和视频处理技术

Java应用开发中的音频和视频处理技术随着互联网和移动设备的快速发展,音频和视频的传输和处理逐渐成为应用开发的重要方向。
在Java开发领域中,有很多技术可以用于音频和视频的处理和应用,本文将探讨其中的一些重要技术和应用场景。
一、音频处理技术在Java应用开发中,音频处理技术主要包括音频文件的解码与编码、音频录制与播放、音频特效处理等方面。
1. 音频文件的解码与编码Java提供了丰富的库和API,使得开发者可以方便地解码和编码音频文件。
常用的音频格式如MP3、WAV等,可以通过Java音频解码器(Java Sound API)进行解码,便于进一步处理和应用。
同样,通过音频编码器,可以将音频数据编码成特定的格式进行存储和传输。
2. 音频录制与播放音频的录制和播放是音频应用中常见的功能,Java中提供了相应的类和接口,比如AudioRecord和AudioTrack,使得开发者可以方便地进行音频的录制和播放操作。
通过音频录制技术,可以实现语音识别、语音合成等应用;而通过音频播放技术,可以实现音乐播放、语音导航等功能。
3. 音频特效处理音频特效处理是提升音频质量和增加音频趣味性的一种方式。
Java 中提供了一些音频特效处理的API,比如混响效果、均衡器效果等。
通过这些技术,可以对音频进行混音、降噪、变声等操作,满足用户对音频效果的个性化需求。
二、视频处理技术在Java应用开发中,视频处理技术主要包括视频编解码、视频录制与播放、视频流处理等方面。
1. 视频编解码视频编解码是视频应用中的核心技术之一。
在Java开发领域中,可以使用FFmpeg等开源库进行视频编解码,这些库支持多种常用的视频格式,比如MP4、AVI等。
通过视频编解码技术,可以将视频数据转化为可供应用使用的格式,实现视频的播放和编辑等功能。
2. 视频录制与播放Java提供了丰富的类和接口,使得开发者可以方便地进行视频的录制和播放。
其中,JFrame类可以用于视频显示窗口的创建和管理,通过Java Media Framework(JMF)可以实现视频的录制和播放操作。
Java与音频处理利用Java实现音频处理技术

Java与音频处理利用Java实现音频处理技术Java与音频处理音频处理在现代多媒体技术中扮演着重要角色。
从音频编辑软件到语音识别系统,音频处理技术有着广泛的应用。
而Java作为一种强大的编程语言,也提供了丰富的库和工具,方便开发人员实现音频处理。
本文将介绍利用Java实现音频处理技术的方法和应用。
一、Java中的音频处理库Java提供了许多音频处理库,让开发者能够方便地对音频进行处理。
其中最常用的是Java Sound API和Java Media Framework(JMF)。
1. Java Sound APIJava Sound API是Java官方提供的标准API,用于实现音频处理功能。
它支持录制、播放、剪切、拼接等基本的音频处理操作。
开发者可以使用Java Sound API读取音频文件,提取音频数据,并对其进行各种处理。
通过该API,开发者可以实现音频格式转换、音频增益控制、音频特效等功能。
2. Java Media Framework(JMF)JMF是一个开放的多媒体框架,提供了处理音频、视频和其他媒体数据的功能。
它建立在Java Sound API的基础上,拓展了更多的媒体处理功能。
JMF支持各种音频格式的解码和编码,还提供了音频合成、混音、降噪等高级音频处理功能。
二、音频处理应用示例利用Java的音频处理库,我们可以实现多种有趣和实用的音频处理应用。
以下是几个示例:1. 音频剪切和拼接通过使用Java Sound API,我们可以将多个音频文件剪切成小片段,并将它们拼接成一个完整的音频文件。
这个功能在音频编辑软件中非常常见,例如将多个音频片段合并为一首歌曲。
2. 音频特效处理利用Java Sound API或JMF的特效处理功能,我们可以实现多种音频特效,如混响、回声、均衡器等。
这些音频特效可以应用于音乐制作、影视后期制作等领域。
3. 语音识别结合Java与其他语音识别库,如CMUSphinx或Google Cloud Speech API,我们可以实现自动语音识别(ASR)系统。
java播放mp3oggapeflac音乐

java播放mp3oggapeflac音乐java播放mp3/ogg/ape/flac音乐博客分类:•游戏音乐好吧,又要说一句了,java真是无所不能。
用java sound api播放wav, aiff, au, snd文件想必大家都已经知道了,这些格式是jdk原生支持的。
本文将介绍如何播放mp3/ogg/ape/flac音乐。
其实都是批发来的,我只是搬运工Σ( ° △ °|||)︴1. 先上代码Java代码1.import java.io.File;2.import java.io.IOException;3.4.import javax.sound.sampled.AudioFormat;5.import javax.sound.sampled.AudioInputStream;6.import javax.sound.sampled.AudioSystem;7.import javax.sound.sampled.DataLine;8.import javax.sound.sampled.SourceDataLine;9.10.public class AudioFilePlayer {11.12.public static void main(String[] args) {13.final AudioFilePlayer player = new AudioFilePlayer ();14.player.play("D:/xiaomi.ogg");15.//player.play("D:/01 - 謎解きはディナーのあとで.mp3");16.//player.play("D:/周杰伦-青花瓷.APE");17.//player.play("D:/周杰伦 - 听妈妈的话.flac");18.}19.20.public void play(String filePath) {21.final File file = new File(filePath);22.23.try {24.final AudioInputStream in = AudioSystem.getAudioIn putStream(file);25.26.final AudioFormat outFormat = getOutFormat(in.getF ormat());27.final info = new (SourceDat aLine.class, outFormat);28.29.final SourceDataLine line = (SourceDataLine) AudioSys tem.getLine(info);30.31.if (line != null) {32.line.open(outFormat);33.line.start();34.stream(AudioSystem.getAudioInputStream(outFormat, in), line);35.line.drain();36.line.stop();37.}38.39.} catch (Exception e) {40.throw new IllegalStateException(e);41.}42.}43.44.private AudioFormat getOutFormat(AudioFormat inFo rmat) {45.final int ch = inFormat.getChannels();46.final float rate = inFormat.getSampleRate();47.return new AudioFormat(AudioFormat.Encoding.PCM_ SIGNED, rate, 16, ch, ch * 2, rate, false);48.}49.50.private void stream(AudioInputStream in, SourceDataL ine line)51.throws IOException {52.final byte[] buffer = new byte[65536];53.for (int n = 0; n != -1; n = in.read(buffer, 0, buffer.length)) {54.line.write(buffer, 0, n);55.}56.}57.}你没有看错,代码其实很简单,就是普通的java sound api,和原来播放wav, aiff, au, snd没什么两样。
Java Sound API心得

Java Sound API是javaSE平台提供底层的(low-level)处理声音接口。
例外,java也提供了简单的实用的高层媒体接口(higher-level) -JMF(Java Media Framework)。
Java Sound API 将需要处理的数字音频分为:simpled-audio和midi,分别提供Package来处理它们:javax.sound.simpledjavax.sound.midi同时SOUND API还提供了第三方的扩展接口:javax.sound.simpled.spijavax.sound.midi.spi*注:spi : service provider interfaceSampled Audio采样音频(simpled-audio)不仅包含从模拟信号采样来的数字音频,还包括电脑合成的。
称作digital-audio更为合适。
为了能够让设备播放采样声音,程序需要处理audio input, output device, audio data buffers。
还有混音处理(mix multiple streams of audio into one stream)。
SOUND API 可以使用3种方式传输声音数据:stream, buffered fashion, in-memory unbuffered fashion。
第三种方式适合数据量不大,能够一次载入的所有数据的情形。
这样,声音的响应较快,循环和随机定位也会很简单。
使用SOUND API播放声音至少需要3样东西:l formatted audio data,l a mixer,l a line.Mixer调音台technically the Mixer itself is also a kind of LineLine音频数据管道。
Clip extends Line将需要播放的音频数据装载进来。
Java应用中的音频与视频处理

Java应用中的音频与视频处理在当今数字化时代,音频与视频处理已成为Java应用中的重要组成部分。
无论是在媒体播放器、语音识别、视频编辑还是在线教育等领域,Java都扮演着关键角色。
本文将探讨Java应用中的音频与视频处理的相关技术和实践。
一、音频处理1.1 音频格式音频文件通常以不同的格式存储,如MP3、WAV、FLAC等。
Java提供了丰富的库和工具,使开发者能够读取、写入和处理各种音频格式。
通过使用Java音频库(javax.sound),我们可以轻松地处理音频文件。
1.2 音频录制与播放Java可以利用javax.sound.sampled包中的类来实现音频的录制与播放功能。
通过使用TargetDataLine类,我们可以从音频设备中读取音频数据,而SourceDataLine类则用于将音频数据输出到设备。
这些类提供了一种简单而有效的方式来处理音频输入和输出。
1.3 音频处理效果音频处理效果是提升音频质量的重要手段之一。
Java中提供了一些开源的库和工具,如javazoom.jl.converter和TarsosDSP等,可以用于添加均衡器、混响、降噪等效果,以改善音频的声音质量和清晰度。
二、视频处理2.1 视频格式与音频类似,视频文件也以不同的格式存储,如MP4、AVI、MKV等。
Java通过使用开源框架FFmpeg,可以对不同的视频格式进行处理。
FFmpeg是一个跨平台的多媒体处理工具,支持压缩、转码、剪辑等功能。
2.2 视频播放与捕捉JavaFX是Java平台下用于构建富应用程序的工具包,它包含了用于视频播放的媒体类。
通过使用JavaFX提供的MediaPlayer类,我们可以加载和播放各种视频格式。
此外,Java还提供了类似于音频处理中的TargetDataLine和SourceDataLine类似的类,如VideoCapture用于捕捉实时视频流。
2.3 视频编辑与特效音频和视频处理往往需要对媒体进行编辑和添加特效。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、JavaSound的体系结构二、JavaSound混频原理三、音频数据与存储格式四、设计音乐播放器五、播放音乐六、支持更多的音频格式━━━━━━━━━━━━━桌面PC的性能日益提高,Java虚拟机的优化技术也不断获得突破,这一切使得用Java处理实时信号成为可能。
本文将通过设计和构造一个支持实时MP3、WAV和Ogg音频格式解码/回放的Java音乐播放器,阐述用JavaSound API编写音频处理程序的思路和一般过程。
JavaSound是一个小巧的低层API,支持数字音频和MIDI数据的记录/回放。
在JDK 1.3.0之前,JavaSound是一个标准的Java扩展API,但从Java 2的1.3.0版开始,JavaSound就被包含到JDK之中。
由于Java有着跨平台(操作系统、硬件平台)的特点,基于JavaSound的音频处理程序(包括本文的程序)能够在任何实现了Java 1.3+的系统上运行,无需加装任何支持软件。
一、JavaSound的体系结构当前JDK的JavaSound API随同Java媒体框架(JMF,Java Media Framework)一起发布,主页在java.sun./products/java-media/jmf/,适合JDK 1.1以及更高的版本。
除了JDK实现的JavaSound API之外,还有一个源代码开放的JavaSound实现是Tritonus,主页在/。
图一描述了JavaSound API的体系结构,虚线表示Sun的JavaSound标准定义的API调用。
上面一根虚线表示我们编写音频处理程序要调用的API,JavaSound API包含在javax.sound.sampled和javax.sound.midi包中。
两根虚线之间的部分就是JavaSound API的具体实现。
图一:JavaSound体系结构就象上面一根虚线表示的API具有统一标准一样,在所有的JavaSound实现中,图一下面一根虚线表示的SPI(服务提供者接口, Service Provider Interface)也是统一的。
SPI的作用是以插件(Plug-In)的形式提供自定义的扩展模块,我们只要提供与SPI兼容的插件扩展模块,就可以在不改变API的情况下扩展音频处理程序的能力。
SPI包含在java.sound.sampled.spi和javax.sound.midi.spi包中。
例如,假设有一个只能播放WAV文件的程序,我们只要增加一个支持MP3文件解码的插件模块,就可以在不改动播放程序的任何一行代码的前提下,为这个播放程序添加播放MP3的能力。
二、JavaSound混频原理图二阐述了JavaSound的混频器原理。
在处理输入音频的应用中,对于来自各种音频输入端口的信号,例如麦克风、CD播放器、磁带播放器,等等,我们可以在它们到达TargetDataLine之前,利用混频器控制输入混频,最后在程序过TargetDataLine 获得数字化的音频输入流。
图二:JavaSound混频器类似地,在处理输出音频的应用中,混频器用来对一系列来自SourceDataLine的数据进行混频处理,经处理后的信号可输出到各种输出端口,例如扬声器、耳机等。
SourceDataLine是一个可写入音频信号数字流的设备,例如,我们可以从一个WAV文件读取容写入到SourceDataLine,然后再通过扬声器输出。
输入到混频器的信号可以来源于剪辑。
剪辑(Clip)是一个包含一段完整音频数据流的设备,或者说,剪辑就是一个缓冲在存中的完整音频数据流。
在一些要求反复播放音乐片段的场合,例如游戏的背景音乐,剪辑是很有用的。
图三描述了JavaSound API中一些常用的类、接口及其关系,所有图三显示的类、接口都通过Line这个基本接口统一起来。
Line接口用来关闭/打开设备、注册事件监听器,以及提供一些用来调整声音效果的对象,例如调整音量大小的对象。
AudioSystem在JavaSound体系中起着一个工厂(Factory)类的作用,提供了一系列的静态方法,我们通过这些静态方法来获取JavaSound系统默认配置的资源(所谓静态方法,就是可以在不创建AudioSystem实例的情况下直接调用的方法)。
图三:常用的JavaSound类顺便说明一下,在当前(JDK 1.4)实现的JavaSound的默认配置中,输入声音来自本地声卡的麦克风,输出声音到本地声卡的扬声器。
应当说当前实现的JavaSound 对端口和混频器的支持还不完善,但对于包括本文音乐播放器在的许多应用来说,默认实现的JavaSound配置已经足够了。
三、音频数据与存储格式取样得到的音频数据——也就是从TargetDataLine输入或从SourceDataLine输出的数据,必须符合音频格式的标准。
音频数据的格式选项由AudioFormat类封装,主要选项包括:编码方式,可以是PCM(Pulse Code Modulation,脉冲编码调制)、MP3等;通道数量;取样率;帧速率;等等。
音频数据可以用多种格式保存到磁盘上。
在JavaSound参考实现中,直接支持的文件格式包括WAV(Windows)、AIFF(主要用于Apple的Macintosh)以及AU(主要用于UNIX),音频文件的格式由AudioFileFormat类指定。
并非所有音频数据格式都可以保存到任意音频文件格式(或从音频文件回放),具体由平台和操作系统的类型决定。
为简单计,本文的播放器只考虑包含PCM Mono 或Stereo数据的WAV文件,这是当前流行的音频数据/文件格式组合,常用于CD音质的音频数据。
压缩的音频数据(例如MP3和Ogg Vorbis)通常有各自特殊的存储格式(如.MP3和.OGG),通常不以WAV/AIFF/AU格式存储。
四、设计音乐播放器我们要编写的音乐播放器(图四)由表一所示的几个类构成。
鉴于构造用户界面往往需要大量的代码,且这些代码通常可以用IDE自动生成,所以下文只对一些关键的GUI元素略作介绍,不再给出完整的代码。
图四:播放器的用户界面播放器的用户界面主要由一个带菜单的JFrame框架、一个名称为filenamesList的JList和几个JButton构成。
框架有一个私有的TestBase成员,其实例在GUIInit()方法的末尾通过pBase = new TestBase()语句初始化。
表一用户界面中的按钮用类似下面的代码创建,其中addBttnIconText()是一个私有方法,它把一个图标放到按钮的文字标签之上。
Java程序的用户界面和Windows界面风格迥异,建议读者使用Java开发工具自带的图标,或者从Java图标库下载(例如http://developer.java.sun./developer/techDocs/hi/repository/)。
JButton playBttn = new JButton();...addBttnIconText(playBttn, "播放", "Play24.gif");playBttn.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(ActionEvent e) {playClick(e);}});当用户点击一个按钮,与该按钮对应的xxxClick()事件句柄函数开始执行。
播放器共有5个按钮,相应的事件句柄也有5个:playClick(“播放”按钮),stopClick(“停止”按钮),pauseClick(“暂停”按钮),prevClick(“后退”按钮),nextClick(“前进”按钮)。
例如,点击“播放”按钮时,playClick()句柄首先获得JList中选中的文件,然后调用TestBase实例中的playFile()辅助方法播放文件。
playClick()句柄的代码如下所示,注意它把音乐文件及其所在目录连接起来的方法是操作系统中立的。
stopClick()和pauseClick()方法分别调用TestBase中的stop()和pause()方法。
prevClick()和nextClick()句柄的任务稍微复杂一点。
首先,它们要调用TestBase中的stop()方法中止当前的播放动作,然后选中JList中当前项目的前一项或后一项,最后调用playClick()播放新选中的音乐文件,如下所示。
五、播放音乐TestBase类包含主要的播放逻辑。
例如,当用户点击“播放”按钮,TestBase类中的play()方法开始执行。
play()方法首先确认播放器当前已被终止播放,而不是暂停播放。
然后它检查这是不是第一次调用play():如果是,则创建一个playerThread线程。
我们用一个独立的线程负责音乐播放,这样,无论播放器正在读取文件、解码,还是正在把音频数据输出到扬声器,用户界面总是可操作的。
启动线程之后,play()方法锁定静态synch同步对象,将stopped标记设置为false,然后通知正在等待的线程(playerThread线程在开始播放音乐文件之前,会等待静态synch对象上的提醒通知)。
playerThread线程启动后,它的run()方法开始运行。
这个线程一直执行while循环,直到threadExit标记变成true为止。
在while循环中,线程首先等待“开始播放”的信号(当用户点击“播放”按钮时),然后播放音乐。
表二列出了描述播放器状态的各个标记及其含义。
public void run() {while (! threadExit) {waitforSignal();if (! stopped)playMusic();}}表二playMusic()方法利用JavaSound API播放当前选中的文件。
首先要通过AudioSystem类获得一个AudioInputStream。
然后,利用AudioInputStream的getFormat()获知音频数据的格式。
在此基础上,我们试图通过getLine()方法获得一个支持该种格式的SourceDataLine。
如果要播放的是WAV文件,现在我们已经有了非压缩的PCM格式的音频数据,可以用line对象开始播放音频。
如果音频数据是压缩格式的,如MP3或Ogg,必须先进行一次转换——把MP3/Ogg解码成PCM。
解码主要包括三个步骤:1、创建一个解压缩结果的定制AudioFormat(PCM编码),但保留和原压缩流一样的取样率、通道信息等。