繁体   English   中英

AudioSystem.write(input, AudioFileFormat.Type.WAVE, file) 产生损坏的 WAVE 文件。 RIFF 长度无效

[英]AudioSystem.write(input, AudioFileFormat.Type.WAVE, file) produces a corrupt WAVE file. Invalid RIFF length

此代码生成的 WAV 文件在许多应用程序中都不起作用。

当我签入 RIFFVIEWER 应用程序时,它会抱怨无效的 RIFF 长度。 BWFMetaEdit 声称该文件已被截断。 一些宽容的应用程序,如 Audacity 会播放它们。

我在这里做错了什么还是java音频有问题?

// The essence data is PCM formatted, so convert it to a WAVE file
File extractPCM(WAVEPCMDescriptor descriptor, EssenceData data, String name) {
    try {
        Stream stream = data.getEssenceStream();
        URI uri = stream.getStreamURI();
        int hashCode = uri.hashCode();

        File file = new File(mediaDir, 
                name + "_" +
                String.format("%08X", hashCode)
                + ".wav"
                );

        if (file.exists()) {
            return file;
        }

        mediaDir.mkdir(); // Ensure exists

        log("Copying essence data stream"); 

        stream.setPosition(0);
        ByteBuffer buff = stream.read((int)stream.getLength());
        stream.close();
        buff.flip();

        AudioFormat format = new AudioFormat(
                Encoding.PCM_SIGNED,
                (float)descriptor.getSampleRate().doubleValue(),
                (int)descriptor.getQuantizationBits(),
                (int)descriptor.getChannelCount(),
                (int)descriptor.getBlockAlign(),
                (float)descriptor.getAverageBytesPerSecond(),
                false
                );
        AudioInputStream input = new AudioInputStream(
                new ByteArrayInputStream(buff.array()), format, buff.capacity());           
        AudioSystem.write(input,
                   AudioFileFormat.Type.WAVE, file);        
        log("Extracted file " + file);
        return file;
    } catch (EndOfDataException | IllegalArgumentException | IOException e1) {
        log(e1);
        return null;
    }
}

看起来我提供的长度是字节而不是样本帧。

当我将缓冲区大小除以帧大小时,非容忍应用程序停止抱怨。

AudioInputStream input = new AudioInputStream(
        new ByteArrayInputStream(buff.array()), format, buff.capacity() / format.getFrameSize());

暂无
暂无

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

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