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

时间:2013-03-14 13:31:58

标签: java audio wav

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

也许使用AudioInputStream

编辑:因为看起来如果没有第三方库,就不可能轻松实现重新采样的第三方库吗?

5 个答案:

答案 0 :(得分:4)

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

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

Jave有一个名为

的方法
public void setSamplingRate(java.lang.Integer bitRate)

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

答案 1 :(得分:3)

它可能,快速和肮脏。只需要在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);
    }
}

}

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

答案 2 :(得分:1)

无论您是否希望提高音频质量,无论您是否需要使用原始样本创建新的.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。请记住使用旧值进行计算,但输出新值。

答案 3 :(得分:0)

否...您可以尝试编写新的wav文件,其中新的样本按相邻样本的平均值计算。原油,但也许就足够了。

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

答案 4 :(得分:0)

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

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

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

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

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