在没有第三方库的情况下,Java如何重新采样.wav音频文件?

6

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

也许可以使用AudioInputStream

编辑:由于似乎没有第三方库很容易实现,那么存在什么第三方库可以进行重采样呢?

5个回答

4

既然你现在接受第三方库,这是我的建议

有很多第三方库可以让您对音频wav文件进行重新采样。 对我来说,在我的情况下(我最近使用过),最易于使用的第三方库是Jave,您只需包含jar文件即可,无需像其他库那样繁琐安装。

Jave有一个名为

public void setSamplingRate(java.lang.Integer bitRate)

这个功能可以让你以指定的比特率重新采样音频。


该库尚未准备好在OSX上工作,因为它依赖于本机的ffmpeg可执行Windows和Unix文件。 - hiamex

4
可以做到,而且简单快捷。只需要在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);
    }
}

}

这个简短的示例将创建一个源文件采样率减半的副本。我认为这很容易理解。

7
com.sun包不是官方Java API的一部分。该程序不能保证在各种平台和版本上正常工作。请参阅http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html。 - Jakub Zaverka
对于inputStream,您可以通过使用AudioInputStream audioIn = AudioSystem.getAudioInputStream(wavFile)来避免引用WaveFileReader。我不确定是否有WaveFileWriter的等效物。 - Adam

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。记得使用旧值进行计算,但输出新值。

0

不行...你可以尝试使用相邻样本的平均值计算出的新样本来编写新的wav文件。虽然粗糙,但也许对你的目的足够了。

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


0

是的,使用AudioInputStream可以工作。您可以在此处获取一些示例代码:

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

不用担心Tritonius,那些信息已经不适用于新版本的Java了。只要使用*.wav文件,你可以使用本地Java进行重新采样,而无需任何第三方库。

此外,大多数与Java相关的音频问题都可以在这个FAQ中找到答案。虽然它可能不是最新的,但大部分信息仍然适用。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接