纯java代码对音频采样率进行转换(JDK rt包)
转换成指定采样率(含文件头)
void reSamplingAndSave(byte[] data) throws IOException, UnsupportedAudioFileException {WaveFileReader reader = new WaveFileReader();AudioInputStream audioIn = reader.getAudioInputStream(new ByteArrayInputStream(data));AudioFormat srcFormat = audioIn.getFormat();int targetSampleRate = 16000; //指定采样率AudioFormat dstFormat = new AudioFormat(srcFormat.getEncoding(),targetSampleRate,srcFormat.getSampleSizeInBits(),srcFormat.getChannels(),srcFormat.getFrameSize(),srcFormat.getFrameRate(),srcFormat.isBigEndian());AudioInputStream convertedIn = AudioSystem.getAudioInputStream(dstFormat, audioIn);String fileName = System.getenv("TEMP").concat(File.separator).concat(System.currentTimeMillis()+".wav");File file= new File(fileName);WaveFileWriter writer = new WaveFileWriter();writer.write(convertedIn, AudioFileFormat.Type.WAVE, file);
}
使用方法读取文件流:
byte[] bytes = Files.readAllBytes(Paths.get("e:\\asset\\nZLWKJjQ.wav"));
重采样,不保留文件头(通常用于语音识别):
byte[] reSampling(byte[] data) throws IOException, UnsupportedAudioFileException {AudioInputStream audioIn = AudioSystem.getAudioInputStream(new ByteArrayInputStream(data));AudioFormat srcFormat = audioIn.getFormat();int targetSampleRate = 16000;AudioFormat dstFormat = new AudioFormat(srcFormat.getEncoding(),targetSampleRate,srcFormat.getSampleSizeInBits(),srcFormat.getChannels(),srcFormat.getFrameSize(),srcFormat.getFrameRate(),srcFormat.isBigEndian());AudioInputStream convertedIn = AudioSystem.getAudioInputStream(dstFormat, audioIn);int numReads = -1;int BUFF_SIZE = targetSampleRate/2;byte [] buff = new byte[BUFF_SIZE];ByteArrayOutputStream outputStream = new ByteArrayOutputStream();while ((numReads = convertedIn.read(buff)) !=-1){System.out.println("读入字节数:"+ numReads);outputStream.write(buff);}return outputStream.toByteArray();}
重采样2(不含文件头):
public static final int SAMPLE_RATE = 16000;// 16-bit audio
private static final int BYTES_PER_SAMPLE = 2;
// 16-bit audio
private static final int BITS_PER_SAMPLE = 16;
private static final double MAX_16_BIT = 32768;
private static final int SAMPLE_BUFFER_SIZE = 4096;private static final int MONO = 1;
private static final int STEREO = 2;
private static final boolean LITTLE_ENDIAN = false;
private static final boolean BIG_ENDIAN = true;
private static final boolean SIGNED = true;
private static final boolean UNSIGNED = false;
private static AudioFormat dstFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,SAMPLE_RATE,BITS_PER_SAMPLE,MONO,BYTES_PER_SAMPLE,8000,LITTLE_ENDIAN);
public static byte[] reSamplingPCM(byte[] data) {try(AudioInputStream audioIn = AudioSystem.getAudioInputStream(new ByteArrayInputStream(data));AudioInputStream convertedStream = AudioSystem.getAudioInputStream(dstFormat, audioIn);ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {if (audioIn.getFormat().matches(dstFormat)) {return data;}int numReads = -1;int BUFF_SIZE = SAMPLE_RATE / 2;byte[] buff = new byte[BUFF_SIZE];while ((numReads = convertedStream.read(buff)) != -1) {log.info("read {} byte(s)", numReads);outputStream.write(buff);}return outputStream.toByteArray();} catch (UnsupportedAudioFileException |IOException e) {log.error("occurs errors when re-sampling the audio stream:{}",e);throw new RuntimeException("occurs errors when re-sampling the audio stream:{}",e);}
}
参考来源:
https://stackoverflow.com/questions/15410725/java-resample-wav-soundfile-without-third-party-library
https://www.codota.com/web/assistant/code/rs/5c7689a149efcb00014e68b2#L54
纯java代码对音频采样率进行转换(JDK rt包)相关推荐
- 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置
经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...
- Android --- 使用纯java代码实现相对布局(通俗易懂)
java布局 java代码布局和xml布局的区别 1.Java纯布局更加的灵活,比如自定义控件或一些特殊要求时,使用java代码布局 2.常用的xml布局是所见即所得的编写方式,以及xml本身拥有一些 ...
- springMVC纯java代码配置(一)- 数据源与事务管理(转载的哦)
原文地址:http://my.oschina.net/devleon/blog/530803?fromerr=9Z8ZFdbf 摘要 自Spring3.0开 始,Spring正式将JavaConfig ...
- java编写流星_纯Java代码实现流星划过天空
废话不多说了,直接给大家贴java代码了. import java.awt.Color; import java.awt.Graphics; import java.awt.image.Buffere ...
- 【iText5 生成PDF】纯Java代码实现生成PDF(自定义表格、文本水印、单元格样式)
工作中遇到需要生成PDF.最终选择了iText.其他也有通过html再生成.感觉不太适合就用了代码实现. 使用iText 5.5.13.1版本.纯Java代码实现 1.自定义表格合并指定行列完成数据填 ...
- 用纯Java代码根据IP获取windows和linux的MAC物理地址
一.环境介绍 1.最近在使用struts2和JSP开发web网页时,碰到一个问题,我需要在后台根据ip获取访问服务器的物理地址,然后进行其他业务处理,但是我发现我在后台没有对应的接口或函数能够满足我. ...
- 在Android中用纯Java代码布局
感谢大佬:https://www.jianshu.com/p/7aedea560f16 在Android中用纯Java代码布局 本文的完成了参考了一篇国外的教程,在此表示感谢. Android中的界面 ...
- java flv转mp3_如何使用java代码进行视频格式的转换(FLV)
一,前言 在给网页添加视频播放功能后,发现上传的视频有各种格式,那么就需要将他么转换成FLV,以很好的支持在线视频播放. 二,准备 drv43260.dll,ffmpeg.exe,mencoder.e ...
- Android Studio编写运行测试纯java代码可带main()函数
问题 小伙伴们在做安卓项目的时候,是不是有时候会忘记某些api的使用方法,不太确定他们的结果是怎样的,需要写一些测试代码,验证看看我们的写法是否正确.刚开始的时候我是在页面上写一个Button,添加点 ...
最新文章
- android 按住拖动gallery防止马上加载数据导致gallery卡的方法
- 【做题】TCSRM601 Div1 500 WinterAndSnowmen——按位考虑dp
- SpringBoot开发接口
- Windows server 2016 搭建RDS服务
- 模板:Link Cut Tree(LCT)
- 【GIT 基础篇六】分支管理(创建与合并)
- 水滴石穿C语言之声明的语法
- LR 报错误: C interpreter run time error: Error -- Unresolved symbol : vuser_end解决方法
- svn执行Cleanup总是提示cleanup failed的解决方法
- FPI厂商SoleraNetworks被Blue Coat收购
- 2021年西式面点师(中级)报名考试及西式面点师(中级)证考试
- 怎么用计算机批改试卷,试卷弄横线_在电脑上出试卷时答题的横线怎么打_淘题吧...
- java数据结构运动会分数统计,数据结构实验报告(运动会分数统计系)..doc
- 宇视阿宇摄像机夜间效果好吗?画面可以看清楚吗?
- 不复制项目,idea中同一个项目同时启动多个端口进行访问
- 鞋为什么会臭?14个方法巧除鞋臭脚臭
- 网络安全工程师的职业前景如何?
- GAE 博客——B3log Solo 0.2.1 发布了!
- Baidu、Google、Soso等搜索引擎网站登录入口
- 如何创作一款商业级的安卓独立应用
热门文章
- [机器学习算法]决策树和CART树
- 如何在word中批量修改图片大小
- 服务器渲染与客户端渲染
- 下拉框丿html宙斯,无限级别js联动下拉框类
- 第十三届蓝桥杯(web组),第五题【页面布局】制作网站首页
- 基于系统日志分析进行异常检测
- sleep与select函数
- qq for linux安装教程,Ubuntu 12.04安装QQ for Linux
- HTML(3)HTML文档头部信息
- 如何升级wsl?将已安装的wsl1系统无损升级为wsl2! _φ(❐_❐✧ windows教程