使用SampleRateConverter对音频采样率进行转换
SampleRateconverter.java(接近于官方源码)
输入目标采样率,输入文件,输出文件。食用方便;p
比如
SampleRateConverter.main(new String[]{"44100","f:\\temp\\32_bit_float.wav","f:\\temp\\32_bit_float_44.1K.wav"});
SampleRateConverter源码:
/*
* SampleRateConverter.java
*
* This file is part of jsresources.org
*/ /*
* Copyright (c) 1999 - 2003 by Matthias Pfisterer
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/ /*
|<--- this code is formatted to fit into 80 columns --->|
*/ import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.io.File;
import java.io.IOException; /** <titleabbrev>SampleRateConverter</titleabbrev>
<title>Converting the sample rate of audio files</title> <formalpara><title>Purpose</title>
<para>Converts audio files, changing the sample rate of the
audio data.</para>
</formalpara> <formalpara><title>Usage</title>
<para>
<cmdsynopsis>
<command>java SampleRateConverter</command>
<arg choice="plain"><option>-h</option></arg>
</cmdsynopsis>
<cmdsynopsis>
<command>java SampleRateConverter</command>
<arg choice="plain"><replaceable class="parameter">targetsamplerate</replaceable></arg>
<arg choice="plain"><replaceable class="parameter">sourcefile</replaceable></arg>
<arg choice="plain"><replaceable class="parameter">targetfile</replaceable></arg>
</cmdsynopsis>
</para></formalpara> <formalpara><title>Parameters</title>
<variablelist>
<varlistentry>
<term><option>-h</option></term>
<listitem><para>prints usage information</para></listitem>
</varlistentry>
<varlistentry>
<term><replaceable class="parameter">targetsamplerate</replaceable></term>
<listitem><para>the sample rate that should be converted to</para></listitem>
</varlistentry>
<varlistentry>
<term><replaceable class="parameter">sourcefile</replaceable></term>
<listitem><para>the file name of the audio file that should be read to get the audio data to convert</para></listitem>
</varlistentry>
<varlistentry>
<term><replaceable class="parameter">targetfile</replaceable></term>
<listitem><para>the file name of the audio file that the converted audio data should be written to</para></listitem>
</varlistentry>
</variablelist>
</formalpara> <formalpara><title>Bugs, limitations</title>
<para>Sample rate conversion can only be handled natively
by <ulink url="http://www.tritonus.org/">Tritonus</ulink>.
If you want to do sample rate conversion with the
Sun jdk1.3/1.4, you have to install Tritonus' sample rate converter.
It is part of the 'Tritonus miscellaneous' plug-in. See <ulink url
="http://www.tritonus.org/plugins.html">Tritonus Plug-ins</ulink>.
</para>
</formalpara> <formalpara><title>Source code</title>
<para>
<ulink url="SampleRateConverter.java.html">SampleRateConverter.java</ulink>,
<ulink url="AudioCommon.java.html">AudioCommon.java</ulink>
</para>
</formalpara> */
public class SampleRateConverter
{
/** Flag for debugging messages.
* If true, some messages are dumped to the console
* during operation.
*/
private static boolean DEBUG = true; public static void main(String[] args)
throws UnsupportedAudioFileException, IOException
{
if (args.length == 1)
{
if (args[0].equals("-h"))
{
printUsageAndExit();
}
else
{
printUsageAndExit();
}
}
else if (args.length != 3)
{
printUsageAndExit();
}
float fTargetSampleRate = Float.parseFloat(args[0]);
if (DEBUG) { out("target sample rate: " + fTargetSampleRate); }
File sourceFile = new File(args[1]);
File targetFile = new File(args[2]); /* We try to use the same audio file type for the target
file as the source file. So we first have to find
out about the source file's properties.
*/
AudioFileFormat sourceFileFormat = AudioSystem.getAudioFileFormat(sourceFile);
AudioFileFormat.Type targetFileType = sourceFileFormat.getType(); /* Here, we are reading the source file.
*/
AudioInputStream sourceStream = null;
sourceStream = AudioSystem.getAudioInputStream(sourceFile);
if (sourceStream == null)
{
out("cannot open source audio file: " + sourceFile);
System.exit(1);
}
AudioFormat sourceFormat = sourceStream.getFormat();
if (DEBUG) { out("source format: " + sourceFormat); } /* Currently, the only known and working sample rate
converter for Java Sound requires that the encoding
of the source stream is PCM (signed or unsigned).
So as a measure of convenience, we check if this
holds here.
*/
AudioFormat.Encoding encoding = sourceFormat.getEncoding();
//此处与官方不同
if (! (encoding.equals(AudioFormat.Encoding.PCM_SIGNED)
|| encoding.equals(AudioFormat.Encoding.PCM_UNSIGNED)
||encoding.equals(AudioFormat.Encoding.PCM_FLOAT)))
{
out("encoding of source audio data is not PCM; conversion not possible");
System.exit(1);
} /* Since we now know that we are dealing with PCM, we know
that the frame rate is the same as the sample rate.
*/
float fTargetFrameRate = fTargetSampleRate; /* Here, we are constructing the desired format of the
audio data (as the result of the conversion should be).
We take over all values besides the sample/frame rate.
*/ AudioFormat targetFormat = new AudioFormat(
sourceFormat.getEncoding(),
fTargetSampleRate,
sourceFormat.getSampleSizeInBits(),
sourceFormat.getChannels(),
sourceFormat.getFrameSize(),
fTargetFrameRate,
sourceFormat.isBigEndian()); if (DEBUG) { out("desired target format: " + targetFormat); } /* 开始音频转换.
*/
AudioInputStream targetStream = AudioSystem.getAudioInputStream(targetFormat, sourceStream);
if (DEBUG) { out("targetStream: " + targetStream); } /* And finally, we are trying to write the converted audio
data to a new file.
*/
int nWrittenBytes = 0;
nWrittenBytes = AudioSystem.write(targetStream, targetFileType, targetFile);
if (DEBUG) { out("Written bytes: " + nWrittenBytes); }
} private static void printUsageAndExit()
{
out("SampleRateConverter: usage:");
out("\tjava SampleRateConverter -h");
out("\tjava SampleRateConverter <targetsamplerate> <sourcefile> <targetfile>");
System.exit(1);
} private static void out(String strMessage)
{
System.out.println(strMessage);
}
}
笔者在JDK1.8下面测试发现,目标编码还支持PCM_FLOAT(即pcm_f32le) 32位浮点型音频
使用SampleRateConverter对音频采样率进行转换的更多相关文章
- 纯java代码对音频采样率进行转换
转换成16KHz采样率(含文件头) void reSamplingAndSave(byte[] data) throws IOException, UnsupportedAudioFileExcept ...
- 为什么需要超出48K的音频采样率,以及PCM到DSD的演进
网上很多观点说,根据采样定理,48K的音频采样率即可无损的表示音频模拟信号(人耳最多可以听到20K的音频),为何还需要96K, 192K等更高的采样率呢?最先我也有这样的疑问,毕竟采样定理是经过数学家 ...
- javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- 太赞了!Python竟可以轻松实现音频格式无损转换
大家好,我是辰哥 辰哥在平时处理音频格式的时候,需要去下载各种音频处理软件(专业一点的软件还要收费),掌握Python技术的我们,知道Python是万能的(哈哈哈,开个玩笑).今天辰哥就来教大家用Py ...
- 将任意音频格式文件转换成16K采样率16bit的wav文件
此转换需要使用ffmpeg 假设有目录 d:\录音 目录有 张三.m4a, 李四.m4a xxx.m4a(其他任意格式音频触类旁通可以把 *.m4a改成*.*).批量转换成采样率16K,有符号,16b ...
- Unity 利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能
目录 一.FFmpeg简介. 二.FFmpeg常用参数及命令. 三.FFmpeg在Unity 3D中的使用. 1.FFmpeg 录屏. 2.FFmpeg 推流. 3.FFmpeg 其他功能简述. 一. ...
- FFmpeg学习4:音频格式转换
前段时间,在学习试用FFmpeg播放音频的时候总是有杂音,网上的很多教程是基于之前版本的FFmpeg的,而新的FFmepg3中audio增加了平面(planar)格式,而SDL播放音频是不支持平面格式 ...
- (原创)speex与wav格式音频文件的互相转换
我们的司信项目又有了新的需求,就是要做会议室.然而需求却很纠结,要继续按照原来发语音消息那样的形式来实现这个会议的功能,还要实现语音播放的计时,暂停,语音的拼接,还要绘制频谱图等等. 如果是wav,m ...
- C# 使用ffmpeg.exe进行音频转换完整demo
今天在处理微信的开发接口时候,发现微信多媒体上传接口中返回的音频格式是amr.坑人的是现在大部分的web 播放器,不支持amr的格式播放.试了很多方法都不行. 没办法,只要找一个妥协的解决方案:将am ...
随机推荐
- python递归的最大层数?
Python的最大递归层数是可以设置的,默认的在window上的最大递归层数是 998. 可以通过sys.setrecursionlimit()进行设置,但是一般默认不会超过3925-3929这个范围 ...
- dede5.7评论框不显示,文章页表情不显示,解决办法
dede5.7评论框不显示,文章页表情不显示,解决办法 进入dede后台,系统-系统基本参数-其它选项,找到模板引擎禁用标签,去掉里面的php,如图 进入dede模板目录,默认是/templets/d ...
- commons-dbutils使用介绍,commons-dbutils是JDBC的替代品
commons-dbutils是Apache开源组织提供的用于操作数据库的工具包.今天为大家介绍一下该包的常用方法. 对于数据库的操作无外乎增删改查,而增删改本质上可以归为一类,操作方式相同,只是SQ ...
- springmvc文件上传AND jwt身份验证
SpringMVC文件上传 思路:1.首先定义页面,定义多功能表单(enctype=“multipart/form-data”)2.在Controller里面定义一个方法,用参数(MultipartF ...
- Kubernetes 学习20调度器,预选策略及优选函数
一.概述 1.k8s集群中能运行pod资源的其实就是我们所谓的节点,也称为工作节点.master从本质上来讲,他其实是运行整个集群的控制平面组件的比如apiserver,scheal,controlm ...
- AGC 030 B - Tree Burning 结论+枚举
考试 T2,是一个脑筋急转弯. 最暴力的贪心是每次先选左,再选右,再选左..... 然而这么做在一些情况下是错的. 但是,我们发现我们的选法一定是 $LLLLRLRLRLRLR$ 或 $RRRRLRL ...
- qt截图grapWindow,操作系统剪切版QClipBoard实现进程间通信
QPixmap::grapWindow(winID) 存放一个图片QDesktopWidget 获得当前程序所在窗口id pid每个窗口有winID() // 3pixmap scaled 比例缩放 ...
- PHP实现系统编程(一) --- 网络Socket及IO多路复用【网摘】
一直以来,PHP很少用于socket编程,毕竟是一门脚本语言,效率会成为很大的瓶颈,但是不能说PHP就无法用于socket编程,也不能说PHP的socket编程性能就有多么的低,例如知名的一款PHP ...
- 洛谷 P3258 [JLOI2014]松鼠的新家 题解
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- deepin 深度Linux系统 15.11 链接蓝牙鼠标问题
不知道为毛就是搜索不到,好吧只能用老方法,那就是不使用deepin系统自带的面板进行管理 用下面的命令进行安装配置即可 sudo apt install bluetooth blueman bluem ...