java sound resource

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对音频采样率进行转换的更多相关文章

  1. 纯java代码对音频采样率进行转换

    转换成16KHz采样率(含文件头) void reSamplingAndSave(byte[] data) throws IOException, UnsupportedAudioFileExcept ...

  2. 为什么需要超出48K的音频采样率,以及PCM到DSD的演进

    网上很多观点说,根据采样定理,48K的音频采样率即可无损的表示音频模拟信号(人耳最多可以听到20K的音频),为何还需要96K, 192K等更高的采样率呢?最先我也有这样的疑问,毕竟采样定理是经过数学家 ...

  3. javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  4. 太赞了!Python竟可以轻松实现音频格式无损转换

    大家好,我是辰哥 辰哥在平时处理音频格式的时候,需要去下载各种音频处理软件(专业一点的软件还要收费),掌握Python技术的我们,知道Python是万能的(哈哈哈,开个玩笑).今天辰哥就来教大家用Py ...

  5. 将任意音频格式文件转换成16K采样率16bit的wav文件

    此转换需要使用ffmpeg 假设有目录 d:\录音 目录有 张三.m4a, 李四.m4a xxx.m4a(其他任意格式音频触类旁通可以把 *.m4a改成*.*).批量转换成采样率16K,有符号,16b ...

  6. Unity 利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能

    目录 一.FFmpeg简介. 二.FFmpeg常用参数及命令. 三.FFmpeg在Unity 3D中的使用. 1.FFmpeg 录屏. 2.FFmpeg 推流. 3.FFmpeg 其他功能简述. 一. ...

  7. FFmpeg学习4:音频格式转换

    前段时间,在学习试用FFmpeg播放音频的时候总是有杂音,网上的很多教程是基于之前版本的FFmpeg的,而新的FFmepg3中audio增加了平面(planar)格式,而SDL播放音频是不支持平面格式 ...

  8. (原创)speex与wav格式音频文件的互相转换

    我们的司信项目又有了新的需求,就是要做会议室.然而需求却很纠结,要继续按照原来发语音消息那样的形式来实现这个会议的功能,还要实现语音播放的计时,暂停,语音的拼接,还要绘制频谱图等等. 如果是wav,m ...

  9. C# 使用ffmpeg.exe进行音频转换完整demo

    今天在处理微信的开发接口时候,发现微信多媒体上传接口中返回的音频格式是amr.坑人的是现在大部分的web 播放器,不支持amr的格式播放.试了很多方法都不行. 没办法,只要找一个妥协的解决方案:将am ...

随机推荐

  1. c++的动态绑定和静态绑定及多态的实现原理(摘)

    C++多态的实现原理 为了支持c++的多态性,才用了动态绑定和静态绑定.理解它们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误. 需要理解四个名词:对象的静态类型:对象在声明时采用的类型. ...

  2. memset()函数的使用

    1.概述 memset()函数,称为按字节赋值函数,使用时需要加头文件 #include<cstring>或者#include<string.h>.通常有两个用法: (1)用来 ...

  3. DBUtils框架ResultSetHandler接口学习

    今儿在学习spring框架的时候,让我想起来之前做项目时一直搁置的一个问题,就是DBUtils框架的做数据库操作的使用,当时制作项目的时候就是通过实例打了一遍,由于时间原因也并没有仔细去了解这一方面. ...

  4. include和taglib指令

    1.include指令用来包含另一个静态文件,这个静态文件可以是一个JSP页面.一个Servlet.文本文件.JSP代码. include.jsp <%@ page contentType=&q ...

  5. PHP命令行常用参数说明和使用

    -i 打印phpinfo命令 root@DK:/mnt/hgfs/cpp/php# php -i | grep session -v 输出php版本信息 root@DK:/mnt/hgfs/cpp/p ...

  6. noi.ac #44 链表+树状数组+思维

    \(des\) 给出长度为 \(n\) 的序列,全局变量 \(t\),\(m\) 次询问,询问区间 \([l, r]\) 内出现次数为 \(t\) 的数的个数 \(sol\) 弱化问题:求区间 \([ ...

  7. python 路径引用问题

    文件结构 入口文件· 将当前文件的父级,加入搜索目录里面 import sys import os current_dir = os.path.abspath(os.path.dirname(__fi ...

  8. 数据结构实验之查找六:顺序查找(SDUT 3378)

    (不知道为啥开个数组就 TLE .QAQ) #include <stdio.h> #include <stdlib.h> #include <string.h> / ...

  9. 转载:scala中的implicit

    掌握implicit的用法是阅读Spark源码的基础,也是学习Scala其它的开源框架的关键,implicit 可分为: 隐式参数 隐式转换类型 隐式调用函数 1.隐式参数 当我们在定义方法时,可以把 ...

  10. UOJ#397. 【NOI2018】情报中心 线段树合并 虚树

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ397.com 前言 这真可做吗?只能贺题解啊-- 题解 我们称一条路径的 LCA 为这条路径两端点的 LCA. 我们将相交 ...