讲师中心 微信公众号
AI工具推荐 视频效率加速

Java如何改变音频采样率 Java Sound API进行音频重采样【实例】

云萱姑娘_3997

云萱姑娘_3997

发布时间:2026-02-08 01:03:36

|

968人浏览过

|

来源于php中文网

原创

Java标准库javax.sound.sampled API本身不提供重采样功能,无法直接改变音频采样率;AudioSystem.getAudioInputStream()仅支持兼容格式的无损转换,绝不会执行插值重采样。

java如何改变音频采样率 java sound api进行音频重采样【实例】

Java 标准库的 javax.sound.sampled API **本身不提供重采样(resampling)功能**,无法直接调用某个方法把 44.1 kHz 的音频改成 16 kHz。你看到的“用 Java Sound API 重采样”,实际是自己实现或借助第三方库完成的——标准 API 只负责读、写、播放、格式转换(如 PCM 位深/通道数调整),但不改变采样率。

为什么 AudioSystem.getAudioInputStream() 不能重采样?

AudioSystem.getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream) 看似支持目标格式,但它只在源格式与目标格式的 encoding、sampleSizeInBits、channels、frameSize、frameRate 兼容时做无损转换;若仅改 sampleRate,它会抛出 IllegalArgumentException 或静默失败(取决于底层混音器支持情况),**绝不会执行插值重采样**。

常见错误现象:

  • 传入不同 sampleRate 的 AudioFormat,却没报错 → 实际未生效,输出仍是原采样率
  • 用 AudioSystem.write() 写出文件后用 ffprobe 检查,发现采样率未变
  • 手动构造新 AudioFormat 并包装 AudioInputStream,但播放时变调/加速/卡顿

用 TarsosDSP 实现简单线性重采样(推荐入门)

TarsosDSP 是轻量、纯 Java、MIT 协议的音频处理库,内置 ResampleAudioInputStream,支持任意整数倍和非整数倍重采样(使用线性插值),无需 JNI。

立即学习“Java免费学习笔记(深入)”;

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载

实操建议:

  • Maven 引入:
    <dependency>
        <groupId>be.tarsos.dsp</groupId>
        <artifactId>TarsosDSP</artifactId>
        <version>2.5</version>
    </dependency>
  • 输入必须是 PCM(LINEAR)编码,且 sampleSizeInBits 为 16 或 8;如为 ALAW / ULAW,需先用 AudioSystem.getAudioInputStream(AudioFormat, AudioInputStream) 解码成 PCM
  • 重采样后的流仍为 PCM,可直接写入 WAV/RAW,但注意:WAV 头中的采样率字段需同步更新(AudioSystem.write() 会自动处理)

示例:将 44100 Hz → 16000 Hz

AudioInputStream original = AudioSystem.getAudioInputStream(new File("input.wav"));
AudioFormat format = original.getFormat();
AudioFormat resampledFormat = new AudioFormat(
    format.getEncoding(),
    16000, // new sample rate
    format.getSampleSizeInBits(),
    format.getChannels(),
    format.getFrameSize(),
    16000, // frame rate must match sample rate for PCM
    format.isBigEndian()
);
AudioInputStream resampled = new ResampleAudioInputStream(resampledFormat, original, 16000);
AudioSystem.write(resampled, AudioFileFormat.Type.WAVE, new File("output_16k.wav"));

自研最近邻/线性重采样的关键点(不依赖库)

如果必须纯 JDK、无外部依赖,可手动读取 PCM 数据并重采样。核心是理解“采样点映射”:

  • 假设原采样率 srIn = 44100,目标 srOut = 16000,则缩放因子 ratio = (double) srIn / srOut ≈ 2.75625
  • 第 n 个输出样本对应输入位置 n * ratio;用 floor(最近邻)或双线性插值(更平滑)计算该位置的 PCM 值
  • 16-bit PCM 需按小端/大端解析 byte[] → short[] → 插值 → 再转回 byte[]
  • 务必用 AudioFormat 的 isBigEndian() 和 getSampleSizeInBits() 正确解析原始字节,否则声音失真

容易踩的坑:

  • 忽略声道交错(interleaved):双声道数据是 LRLRLR,不是 LL…RR…,插值时需按通道分别处理或保持交错结构
  • 未对齐帧边界:AudioInputStream.read() 返回的字节数可能不是完整帧(frameSize 的整数倍),需缓存未消费字节
  • 浮点精度累积误差:长期运行后 n * ratio 偏移越来越大,应改用增量式步进(pos += ratio)并定期取整校准

重采样不是格式转换,它本质是信号重建——哪怕只改一个参数,也涉及抗混叠、插值核选择、相位响应等细节。TarsosDSP 默认线性插值够用,但语音识别前预处理若要求高保真,就得换 Lanczos 或用 FFmpeg 的 libswresample(通过 JNA 调用)。别被“Java Sound API”这个名字带偏了,它真不管这事。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

4120

2025.09.15

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

389

2026.05.09

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4248

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

804

2025.10.23

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

20

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

0

2026.10.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

120

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn