Java Sound API 学习笔记

React useState初始值写法性能优化指南 在React函数组件开发中,状态管理是核心概念之一,其中useState是最基础且高频使用的Hook。其原理是通过Fiber架构在组件生命周期内持久化状态值,而初始化方式的选择直接影响组件渲染性能。当涉及计算密集型操作、本地存储读取或复杂对象初始化时,采用函数式初始值(惰性初始化)能确保计算逻辑仅在首次渲染执行,避免重复计算带来的性能损耗。这与React Fiber节点存储机制和更新策略密切相关,特别在React 18并发模式下能有效减少不必要的计算开销。实际开发中,合理运用这种优化手段可显著提升大数据量场 阅读详情
 
Java Sound API是javaSE平台提供底层的(low-level)处理声音接口。
 
例外,java也提供了简单的实用的高层媒体接口(higher-level) - JMF(Java Media Framework)。
 
Java Sound API 将需要处理的数字音频分为:simpled-audio和midi,
分别提供Package来处理它们:
 
javax.sound.simpled
javax.sound.midi
 
同时SOUND API还提供了第三方的扩展接口:
 
javax.sound.simpled.spi
javax.sound.midi.spi
*注:spi : service provider interface
 
Sampled 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 Line
 
Line
音频数据管道。
 
Clip extends Line
将需要播放的音频数据装载进来。
preloads audio data from a sound file into clips
A Clip is a data line into which audio data can be loaded prior to playback. Because the data is
pre-loaded rather than streamed, the clip's duration is known before playback, and you can choose any
starting position in the media. Clips can be looped, meaning that upon playback, all the data between two
specified loop points will repeat a specified number of times, or indefinitely.
 
SourceDataLine extends Line
accept real-time stream of audio data
feed audio to the Mixer
A SourceDataLine receives audio data for playback. It provides methods for writing data to the
source data line's buffer for playback, and for determining how much data the line is prepared to receive
without blocking.
 
 
TargetDataLine
A TargetDataLine receives audio data from a mixer. Commonly, the mixer has captured audio data
from a port such as a microphone; it might process or mix this captured audio before placing the data in
the target data line's buffer. The TargetDataLine interface provides methods for reading the data
from the target data line's buffer and for determining how much data is currently available for reading.
 
Port extends Line
simple Line
 
Line 接口的继承关系图
 
 
AudioSystem
AudioSystem提供音频资源的访问服务。
通过AudioSystem,可以知道什么样的资源可以被识别。
 
可从AudioSystem获得的资源:
l        Mixers, AudioSystem类可以提供一张已经安装的Mixer列表
l        Lines
l        Format conversions
l        Files and streams
 
Mixer的获得
Mixer.Info
AudioSystem.getMixerInfo():Mixer.Info
可以获得一张Mixer信息列表。
 
每个Mixer.Info包含如下关键信息:
l        Name
l        Version
l        Vendor
l        Description
 
我机器上的Mixer列表,WinXP,JDK_1.4.2
[INFO 0]
INFO.NAME:Java Sound Audio Engine
INFO.VERSION:1.0
INFO.VERDOR:Sun Microsystems
INFO.DESCRIPTION:Software mixer and synthesizer
 
[INFO 1]
INFO.NAME:Microsoft ?ù??????÷
INFO.VERSION:Unknown Version
INFO.VERDOR:Unknown Vendor
INFO.DESCRIPTION:No details available
 
[INFO 2]
INFO.NAME:Realtek AC97 Audio
INFO.VERSION:Unknown Version
INFO.VERDOR:Unknown Vendor
INFO.DESCRIPTION:No details available
 
[INFO 3]
INFO.NAME:Realtek AC97 Audio
INFO.VERSION:5.10
INFO.VERDOR:Unknown Vendor
INFO.DESCRIPTION:Unknown Description
 
获取Mixer
AudioSystem.getMixer( MixerInfo ):Mixer
 
如果只从Mixer.Info提供的信息无法确定需要的Mixer,
不妨创建出所有的Mixer,使用时检查它们的能力,使用合适那个。
 
例如,你可能需要一个Mixer,能够将混音好的数据同时写入一定数目的目标数据管道(TargetDataLine).
使用Mixer.getMaxLines(Line.Info info):int来了解Mixer的输出能力。info就是指定的TargetDataLine
 
获得指定类型Line
2种方法获得Line
l        直接由AudioSystem获得,AudioSystem.getLine( Line.Info ):Line
l        由Mixer获得
 
从AudioSystem直接获得Line
static Line AudioSystem.getLine( Line.Info )
不同于Mixer.Info,Line.Info不是文本信息,而是Line的类信息。
 
Line.Info是抽象类,所以使用它的子类DataLine.Info,Port.Info。
下面是通过Line.Info获得Line的示例:
 
TargetDataLine line;
DataLine.Info info = new DataLine.Info(TargetDataLine.class,
    format); // format is an AudioFormat object
if (!AudioSystem.isLineSupported(info)) {
    // Handle the error.
}
// Obtain and open the line.
try {
    line = (TargetDataLine) AudioSystem.getLine(info);
    line.open(format);
} catch (LineUnavailableException ex) {
    // Handle the error.
    //...
}
 
Port.Info定义一系列静态的Port.Info对象,MICROPHONE,SPEAKER,etc.
 
从Mixer获得Line
getSourceDataLine()
getTargetDataLine()
getLine()
 
AudioSystem对象模型
 
AudioPermission
音频资源访问许可。
 
利用JAVA-SOUND-API播放声音
 
可以使用2种Line来播放声音,Clip,SourceDataLine。
Clip一次载入需要播放的声音资源,而SourceDataLine 以流的方式传输声音数据。
 
使用Clip
当使用getLine()获得Clip后,还要保证其他的程序在你播放前不能获取它,调用open()方法独占它:
void open( AudioInputStream stream );
void open( AudioFormat, byte[] data, int offset, int bufferSize );
 
Clip默认从音频的开头开始播放,除非使用setFramePosition(),setMicroSecondPosition()设定其他位置。
 
Clip.start()播放,Clip.stop()暂停。
 
getLevel(),获得声音高度。
 
isActive(),Clip是否正在播放。
 
 
使用SourceDataLine
 
open(AudioFormat),打开source dataLine,但不指定数据,使用默认的buffer size。
 
open(AudioFormat, bufferSize),指定buffer size.
合理设置buffer size,保证开始载入的延时能够被接受,又尽量减少IO访问。
 
open()之后,调用start()容许SourceDataLine一有数据就开始播放,使用write()不停的输入数据。
 
void write( byte[] b, int offset, int length );
 
SourceDataLine开始播放后,向Mixer传输数据,当Mixer开始向target传输数据时,SourceDataLine产生一个 START 事件。
这是SourceDataLine被认为是活动的(active)。
 
isRunning()表明Line是否start()了。
isActive()表明Line是否开始播放。
 
write()方法向buffer size 中写入数据,如果buffer已满,还剩下一些数据,该方法会阻塞;否则,是不阻塞的。
 
可以使用DataLine.available()知道buffer size还能写入多少数据。
 
事实上,可以另开线程去使用write(),而不用考虑阻塞的问题。
 
drain()方法在所有数据播放完后返回。
 
所有在写完数据后,调用drain(),到它返回时再是否Line。
line.write(b, offset, numBytesToWrite);
//this is the final invocation of write
line.drain();
line.stop();
line.close();
line = null;
 
flush()清空buffer中的剩余数据,Line在stop时才能调用。
 
有如下情形,Line会产生 STOP 事件:
l        调用drain()
l        调用stop()
l        调用flush()
l        输出完旧的数据,而新的数据未到时。
 
STOP事件意味着isActive()返回false.
 
start()调用之后,isRunning()都会返回true,知道stop()被调用。它不是依据 STOP 事件产生返回值的。
 
而isActive()是依据START 和 STOP 事件的。
 
 
监视Line的状态
使用LineListener响应Line的事件。
void Line.addLineListener( LineListener );
 
当调用open(),close(),start(),stop()会产生OPEN,CLOSE,START,STOP事件。
 
多个Line 同步播放
有些Mixer提供方便的同步功能,对一组Lines使用open(),close(),start(),stop(),保证它们的同步。
 
可以使用如下方法,检查Mixer是否支持同步功能:
boolean isSynchronizationSupported( Line[] lines, boolean maintainSync )
第二个参数表明同步精度,是采样同步,还是只是start(),stop()保持同步,并不维护播放过程同步。
 
AudioFormat
音频采样的格式,不是音频文件的格式。
 
l        编码技术,一般都是PCM( pulse code modulation )
l        声道数目(1,单声道;2,双声道;等等)
l        采样频率 sample rate
l        样本的位数 number of bits per sample
l        帧速率 Frame rate
l        Frame Size in bytes
l        Byte Order( big-endian or little-endian )
 
AudioFileFormat:
音频文件格式。
The file type( WAV,AIFF,etc )
The file length in bytes
The length, in frames, of the audio data contained in the file
An AudioFormat that specifies data format of the audio data in the file
 
 
AudioInputStream extends InputStream
无须考虑文件的格式,就能操作Samples。
 
读取音频文件
 
AudioSystem提供2中方法读取音频文件:
l        根据音频文件中音频数据的格式信息
l        使用一个指定了音频数据格式的流
 
使用如下方法获得音频文件中音频数据的格式信息:
static AudioFileFormat getAudioFileFormat(File);
static AudioFileFormat getAudioFileFormat(InputStream);
static AudioFileFormat getAudioFileFormat(URL);
 
利用如下方法获得第二种方法提到的音频数据流:
static AudioInputStream getAudioInputStream(File)
static AudioInputStream getAudioInputStream(InputStream)
static AudioInputStream getAudioInputStream(URL)
 
读取音频文件数据的步骤:
1)    获得AudioInputStream对象
2)    创建一个字节数组,存放一次读入的数据块
3)    不断地从audio流中读入数据,播放或处理数据。
示例代码如下:
int totalFramesRead = 0;
File fileIn = new File(somePathName);
// somePathName is a pre-existing string whose value was
// based on a user selection.
try {
    AudioInputStream audioInputStream =
        AudioSystem.getAudioInputStream(fileIn);
    int bytesPerFrame =
        audioInputStream.getFormat().getFrameSize();
    // Set an arbitrary buffer size of 1024 frames.
    int numBytes = 1024 * bytesPerFrame;
    byte[] audioBytes = new byte[numBytes];
    try {
        int numBytesRead = 0;
        int numFramesRead = 0;
        // Try to read numBytes bytes from the file.
        while ((numBytesRead =
            audioInputStream.read(audioBytes)) != -1) {
        // Calculate the number of frames actually read.
        numFramesRead = numBytesRead / bytesPerFrame;
        totalFramesRead += numFramesRead;
        // Here, do something useful
        // with the audio data that's
        // now in the audioBytes array...
    }
    } catch (Exception ex) {
        // Handle the error...
    }
} catch (Exception e) {
    // Handle the error...
}
 
写音频文件
通过下列方法知道AudioSystem支持哪些音频文件格式写入:
static boolean isFileTypeSupported( AudioFileFormat.Type,AudioInputStream );
 
static AudioFileFormat.Type[] getAudioFileTypes();
 
static AudioFileFormat.Type[] getAudioFileTypes(AudioInputStream);
 
利用AudioSystem.write()方法向文件写入指定格式的音频数据:
static int write( AudioInputStream, AudioFileFormat.Type, File );
 
文件或数据格式转换
“Java Sound Programmer Guide” – chapter 7
Audio File Format Convertion
Audio Data Format Convertion
 
 
PCM
PCM 脉冲编码调制是Pulse Code Modulation的缩写。
PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。
PCM是数字音频中最佳的保真水准,近似看成“无损”编码。
PCM编码的优点是音质好,缺点是数据量大。
 
JAVA SOUND API对于其它编码格式,在播放前都会转换成PCM格式。
 
 
 
DAC:digital-to-analog converter,数模转换器
 
 
Decibel:分贝。pl.decibels
 
PAN:声象,该通道信号在左右音箱之间的立体声位置。
GAIN:增益
REVERB:数字混响。
 
Acoustics:声学
资源
《Java Sound programmer guide》
 
 
Atitit java sound api体系 javadoc与类层级 目录 1. 软件包 javax.sound.sampled 1 1.1. 软件包 javax.sound.sampled 1 Atitit java sound api体系 javadoc与类层级 目录 1. 软件包 javax.sound.sampled 1 1.1. 软件包 javax.sound.sampled 1 1.2. 接口摘要 1 1.3. 类摘要 2 2. 软件包 javax.sound.sampled 的分层结构 4 3. 类分层结构 4 3.1. 接口分层结构 6 ... 阅读详情

相关推荐

java 双声道音频_使用Java Sound API的多声道USB录音?

我试图记录/处理一些音频从三个usb麦克风与Java语音在雪豹(但如果它修复的东西可以切换到Windows)。问题是,当我尝试使用对应于usb麦克风的混音器时,Java Sound告诉我,该线路不被支持。具体来说,它说这个…Available mixers:Java Sound Audio EngineUSBMIC Serial# 041270067Built-in Input Built-in ...

weixin_30610771的博客 608

java sound api_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...

weixin_39973271的博客 1090

28、探索JavaSound API:音频处理的利器

本文深入介绍了 JavaSound API 在音频处理方面的强大功能,包括音频播放、捕获、音量调整等基础操作,并详细讲解了其对 MIDI 的支持以及高级特性如音频转换、多声道音频和实时流处理。适合希望在 Java 平台上实现丰富音频功能的开发者参考学习。

o5p6q的博客 158

java sound

Java Sound API 是 JDK 中用于音频处理的核心库,提供了音频播放、录制、格式转换等功能。和。Java Sound API 提供了强大的音频处理功能,包括音频播放、录制、格式转换和音效处理等。通过Clip和等核心类和接口,开发者可以轻松实现各种音频处理需求。此外,结合第三方库(如 JLayer 或 JavaFX),还可以扩展对 MP3 等格式的支持。

qq_62784677的博客 702

中国30米逐年植被净初级生产力(NPP)数据集(1982年至今CASA模型)

1.3 气温、降水、地表太阳辐射数据 气温和降水数据月度空间插值数据是基于全国2400多个站点的日观测数据,在计算各气象要素月值的基础上,基于Anusplin软件插值生成的1982年以来各月度30米分辨率气温和降水栅格数据,插值过程中引入高程作为协变量。气温单位为℃,降水单位为mm。1.2 土地覆盖数据 土地覆盖数据来源于1985 年-2020年全球30米精细地表覆盖动态监测产品,该数据集包含29个地表覆盖类型,进行拼接、裁剪、重分类和重采样处理,获得8期250米分辨率的植被类型数据。

地球资源数据云的官方博客 2839

UM2 3D 打印机 DIY 实践 (2) 电路篇

涉及到的东西非常多,实际上后面还会讲到。主要部件清单: 主板 mega2560 + Ramps1.4 + LCD12864 各一张 42 x38mm x3,xyz 轴各一台 42 x23mm x1,用在挤出机 泰坦远程挤出机 x1 TMC2225 驱动板 x4, 替代a4988、TMC2208,静音效果好,性价比高 s-250-12v 20A开关电源 x1。功率必须足够大,宁可选大一点的 大功率 MOS 管,25A x1 NTC .

afeiqiang的专栏 3600

java sound api_使用 JAVA SOUND API 播放WAV文件

import java.io.File;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sam...

weixin_39836803的博客 643

Arduino平台软硬件原理及使用——Arduino Uno板卡的使用

Arduino Uno板卡的基本使用

洪博hopes的博客 4172

Java Sound API 学习笔记[转载]

java Sound API是javaSE平台提供底层的(low-level)处理声音接口。 例外,java也提供了简单的实用的高层媒体接口(higher-level) - JMF(Java Media Framework)。 Java Sound API 将需要处理的数字音频分为:simpled-audio和midi,分别提供Package来处理它们: javax

kwli123的专栏 983

保姆级教程:用AdGuard DNS代理实现全设备广告过滤(含Win/Mac/安卓/iOS配置)

本文提供了一份详尽的AdGuard DNS代理配置指南,帮助用户在全设备(Win/Mac/安卓/iOS)上实现广告过滤。通过系统级DNS设置,AdGuard能有效拦截广告、跟踪器和恶意网站,提升隐私保护和浏览效率。教程涵盖原理说明、各平台配置步骤及高级优化技巧,适合不同技术水平的用户。

weixin_42656416的博客 818

java 播放mp3_使用Java Sound API播放MP3

如前所述,Java Sound默认不支持MP3。对于它在任何特定JRE中支持的类型,请检查AudioSystem.getAudioFileTypes()。添加对MP3的支持的一种方法是将基于JMF的mp3plugin.jar1添加到应用程序的运行时类路径中。众所周知,这种联系并不完全可靠。Jar也可以在我的软件共享驱动器上使用。至于你的实际问题,虽然javax.sound.sampled.Clip...

weixin_42715262的博客 734

利用python求解规划问题

利用python中的cvxpy,sympy,scipy这三个库进行规划问题求解,本文中的例题均来自司守奎老师的python数学建模算法与应用

dashbaani的博客 1万+

java获取电脑麦克风_Java的API的声音 - 捕捉麦克风(Java Sound API - capturing microphone)...

问 题我一直在阅读了关于声音api for java的几天,我无法理解它。我体面的程序员,我只是有困难得到我的头周围的api。我一直在试图从我的麦克风捕获音频和实时显示波图。我无法捕获音频,他们在本教程中要做到这一点说,但我似乎无法得到它的工作。任何建议和帮助将非常ap preciated,一个一行行的答案将是理想的。请和谢谢。进口javax.sound.sampled.audioformat中;...

weixin_29802189的博客 2594

Open5GS实战指南:Ubuntu 22.04环境下的5G核心网快速部署

本文提供Open5GS在Ubuntu 22.04环境下部署5G核心网的实战指南,涵盖环境准备、MongoDB配置、核心组件安装、WebUI部署及网络调优等关键步骤。通过详细的安装教程和常见问题解决方案,帮助开发者快速搭建开源5G核心网测试环境。

weixin_29202213的博客 537

数字孪生实战:如何用Blender+Unity快速搭建未来工厂3D模型(附资源包)

本文提供了一套利用Blender进行三维建模,再结合Unity构建虚拟仿真环境的实用方案,旨在帮助中小型制造企业低成本、高效率地搭建未来工厂数字孪生原型系统。文章详细介绍了从数据规划、模型优化到场景构建、逻辑仿真与数据对接的全流程,并附有资源包,助力技术团队快速实现从静态展示到动态交互的数字孪生应用。

weixin_29191669的博客 337

java sound 数据处理_Java Sound API:捕获目标端口的声音输出

我正在编写一个简单的软件,通过LAN传输音频.我已经实现了所有网络部分,但我磕磕绊绊的是使用Java Sound API.我已成功捕获麦克风的音频和线路输入,但我似乎无法从任何目标端口捕获,如扬声器.我的问题是,是否有可能从主目标端口捕获?以下是用于初始化线的代码段.private boolean startCapture(){try{DataLine.Info info = new DataLi...

weixin_30486717的博客 658

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

midi api java,Java Sound API-扫描Midi设备

I'm working on a java project that receives midi events from midi hardware using the javax.sound.midi library. In the documentation, it says that MidiSystem.getMidiDeviceInfo() returns a list of all c...

weixin_29370077的博客 162

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java Sound初探

网上关于java sound的正规资源讲解的非常好,本文不再给出示例,主要提供一些好的资源,并说说我的一些理解,用于形成对java sound的整体认识. 一.几个词汇 TTS:text-to-speech,文本到语音转换 OCR:optical-character-recignition光学字符识别 MIDI:Musical Instrument Digital Interface,乐器数字化...

weixin_34357267的博客 3649

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java 麦克风监控_Java Sound API – 捕获麦克风

我已经阅读了Sound API for Java几天,我无法理解它。我是一个体面的程序员,我只是难以把我的头围绕着API。我一直在尝试从我的麦克风捕获音频,并实时显示一个波形图。我在捕获音频时遇到麻烦,他们在教程中说这样做,但我似乎无法让它工作。任何建议和帮助将不胜感激,一行一行的答案将是理想的。谢谢,麻烦您了。import javax.sound.sampled.AudioFormat;impo...

weixin_35520863的博客 869

java 获取麦克_Java Sound API-捕获麦克风

我已经读了几天的Java声音API了,我无法理解。我是一个体面的程序员,只是很难理解API。我一直在尝试从麦克风捕获音频并实时显示波形图。我在捕捉音频时遇到麻烦,他们在教程中说要这样做,但是我似乎无法使它正常工作。任何建议和帮助将不胜感激,逐行回答将是理想的。谢谢,麻烦您了。import javax.sound.sampled.AudioFormat;import javax.sound.samp...

weixin_31433053的博客 1703

java sound encode,Java中的MP3编码

I need an OpenSource API in Java, which can encode *.wav and *.au formats to MP3 and vice-versa.I have evaluated Java Sound API and LameOnJ, but they do not meet my requirements and are not stable, re...

weixin_35025310的博客 195

Java 音频处理技术

Java Sound包介绍 Java sound API 是JDK种默认提供的,操作简单容易上手。但比较陈旧,受操作系统影响较大,无法满足一些专业场景。比如在 windows 下8路输入的声卡会被识别为4个2路输入的设备,无法协同工作。在这些场景中可以考虑使用下文介绍的 ASIO技术。 包: sampled包 声音采样处理 midi 包 midi 音乐...

weixin_34318272的博客 3342
上一篇: Log4j简述
下一篇: JMF 学习笔记
NetMicrobe
博客等级 码龄22年 27粉丝 79原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值