爪哇 - 下采样从22050到8000给予零个字节(Java - Downsampling from

2019-09-27 15:13发布

我想使用的AudioInputStream下采样一个.wav声音从22050到8000,但转换返回我0数据字节。 下面是代码:

AudioInputStream ais;
AudioInputStream eightKhzInputStream = null;
ais = AudioSystem.getAudioInputStream(file);
if (ais.getFormat().getSampleRate() == 22050f) {
    AudioFileFormat sourceFileFormat = AudioSystem.getAudioFileFormat(file);
    AudioFileFormat.Type targetFileType = sourceFileFormat.getType();
    AudioFormat sourceFormat = ais.getFormat();
    AudioFormat targetFormat = new AudioFormat(
        sourceFormat.getEncoding(),
        8000f,
        sourceFormat.getSampleSizeInBits(),
        sourceFormat.getChannels(),
        sourceFormat.getFrameSize(),
        8000f,
        sourceFormat.isBigEndian());
    eightKhzInputStream = AudioSystem.getAudioInputStream(targetFormat, ais);
    int nWrittenBytes = 0;
    nWrittenBytes = AudioSystem.write(eightKhzInputStream, targetFileType, file);

我已经检查AudioSystem.isConversionSupported(targetFormat, sourceFormat)和它返回true。 任何想法?

Answer 1:

我刚才测试了你的代码不同的音频文件,一切似乎工作得很好。 我只能猜测,你要么有一个空的音频文件测试代码(字节== 0),或者您尝试转换的文件不会被Java的音频系统的支持。

尝试使用其他输入文件和/或输入文件转换成兼容的文件,它应该工作。

这里是主要方法,为我工作:

public static void main(String[] args) throws InterruptedException, UnsupportedAudioFileException, IOException {
    File file = ...;
    File output = ...;

    AudioInputStream ais;
    AudioInputStream eightKhzInputStream = null;
    ais = AudioSystem.getAudioInputStream(file);
    AudioFormat sourceFormat = ais.getFormat();
    if (ais.getFormat().getSampleRate() == 22050f) {
        AudioFileFormat sourceFileFormat = AudioSystem.getAudioFileFormat(file);
        AudioFileFormat.Type targetFileType = sourceFileFormat.getType();

        AudioFormat targetFormat = new AudioFormat(
                sourceFormat.getEncoding(),
                8000f,
                sourceFormat.getSampleSizeInBits(),
                sourceFormat.getChannels(),
                sourceFormat.getFrameSize(),
                8000f,
                sourceFormat.isBigEndian());
        if (!AudioSystem.isFileTypeSupported(targetFileType) || ! AudioSystem.isConversionSupported(targetFormat, sourceFormat)) {
              throw new IllegalStateException("Conversion not supported!");
        }
        eightKhzInputStream = AudioSystem.getAudioInputStream(targetFormat, ais);
        int nWrittenBytes = 0;

        nWrittenBytes = AudioSystem.write(eightKhzInputStream, targetFileType, output);
        System.out.println("nWrittenBytes: " + nWrittenBytes);
    }
}


文章来源: Java - Downsampling from 22050 to 8000 gives zero bytes