6

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

也许使用AudioInputStream

编辑:因为似乎没有第三方库就不容易,所以存在哪些第三方库来完成重采样?

4

5 回答 5

4

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

有很多第三方库可以让你重新采样音频 wav 文件,对我来说,就我而言(我最近使用过),最用户友好的第三方库是Jave ,你需要做的就是包含 jar . 不再像其他库那样繁琐的安装

Jave 有一个名为的方法

public void setSamplingRate(java.lang.Integer bitRate)

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

于 2013-03-25T22:34:37.497 回答
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);
    }
}

}

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

于 2013-03-26T16:22:20.653 回答
1

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

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

令 z=(a+b)/2。现在将 b 替换为 (a + 2b + c)/4。请记住使用 b 的旧值计算 z!现在只将 a、z 和新的 b 写入输出。

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

您可以在 !EOF 中找出猜测、阅读和重复。请记住使用旧值进行计算,但要输出新值。

于 2013-03-22T15:59:41.133 回答
0

不...您可以尝试编写新的 wav 文件,其中的新样本计算为相邻样本的平均值。粗略,但也许它足以满足您的目的。

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

于 2013-03-14T13:37:36.997 回答
0

是的,使用 AudioInputstream 有效。您可以在此处捕获一些示例代码:

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

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

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

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

于 2014-08-14T12:39:32.273 回答