繁体   English   中英

没有第三方库的Java重新采样.wav声音文件

[英]Java resample .wav soundfile without third party library

是否可以在不使用任何第三方库的情况下将java中的.wav文件从22050 khz重新采样到44100 khz?

也许使用AudioInputStream

编辑:因为似乎没有第三方库,很容易,第三方图书馆确实存在什么来完成重新采样?

由于您现在接受第三方图书馆,这是我的建议

有很多第三方库允许你重新采样音频wav文件,对我来说,在我的情况下(我最近使用过)最友好的第三方库是Jave所有你需要做的就是包括jar 。 没有像其他库那样繁琐的安装

Jave有一个名为的方法

public void setSamplingRate(java.lang.Integer bitRate)

这允许您以给定的比特率重新采样音频。

它可能,快速和肮脏。 只需要在javax.sound API中进行一些挖掘:

import java.io.File;

import javax.sound.sampled.AudioFileFormat.Type;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import com.sun.media.sound.WaveFileReader;
import com.sun.media.sound.WaveFileWriter;

public class Resample {

public static void main(String[] argv) {
    try {
        File wavFile = new File("C:\\Temp\\test.wav");
        File dstFile = new File("C:\\Temp\\test_half.wav");
        WaveFileReader reader = new WaveFileReader();
        AudioInputStream audioIn = reader.getAudioInputStream(wavFile);
        AudioFormat srcFormat = audioIn.getFormat();

        AudioFormat dstFormat = new AudioFormat(srcFormat.getEncoding(),
                srcFormat.getSampleRate() / 2,
                srcFormat.getSampleSizeInBits(),
                srcFormat.getChannels(),
                srcFormat.getFrameSize(),
                srcFormat.getFrameRate() / 2,
                srcFormat.isBigEndian());

        AudioInputStream convertedIn = AudioSystem.getAudioInputStream(dstFormat, audioIn);

        WaveFileWriter writer = new WaveFileWriter();
        writer.write(convertedIn, Type.WAVE, dstFile);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

}

这个简短的黑客示例将创建一个副本,其中源中指定的文件的采样率减半。 我认为它非常自我解释。

无论您是否希望提高音频质量,您都需要使用原始样本创建新的.wav文件。 如果要保持原始文件的质量,可以将每个样本写入两次。

然而,有一个相当简单的“改善”质量的算法:读取三个连续的样本,让我们现在将它们命名为a,b和c。 设z是a和b之间的额外输出样本。

设z =(a + b)/ 2。 现在用(a + 2b + c)/ 4替换b。 记得用b的旧值计算z! 现在只将a,z和新b写入输出。

再读一个样本,我们称之为d。 使用(b + c)/ 2计算下一个额外输出样本y。 使用b的旧值。 重新计算c,让它等于(b + 2c + d)/ 4。 将b的新值和y写入输出。

你可以弄清楚猜测,阅读和重复!EOF。 请记住使用旧值计算,但输出新值。

不...您可以尝试编写新的wav文件,其中新样本按相邻样本的平均值计算。 原油,但也许它足以满足您的需求。

如果您接受第三方库, JSSRC似乎是一个不错的选择。 但是,您需要自己构建.jar。

是的,使用AudioInputstream工作。 你可以在这里找到一些示例代码:

http://www.jsresources.org/examples/SampleRateConverter.html

不要担心Tritonius,该信息不再与较新版本的Java相关。 只要您坚持使用* .wav文件,就可以使用本机Java重新采样,无需任何第三方库。

此外,本FAQ中回答了Java中大多数与音频相关的问题。 它可能不是最新的,但大多数信息仍然相关。

http://www.jsresources.org/faq.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM