javaSE播放声音原理

一、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格式存储。


本文转自:http://www.yesky.com/SoftChannel/72342371961929728/20030618/1708754.shtml


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值