9

给定一个包含压缩格式(例如 MP3 或 OGG)的音频数据的调用,我希望创建一个InputStream包含输入数据的 WAV 转换的数组。不幸的是,如果您尝试这样做,JavaSound 会给您以下错误:inbyte

java.io.IOException: stream length not specified

我设法通过将 wav 写入临时文件,然后将其读回来使其工作,如下所示:

AudioInputStream source = AudioSystem.getAudioInputStream(new BufferedInputStream(in, 1024));
AudioInputStream pcm = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, source);
AudioInputStream ulaw = AudioSystem.getAudioInputStream(AudioFormat.Encoding.ULAW, pcm);
File tempFile = File.createTempFile("wav", "tmp");
AudioSystem.write(ulaw, AudioFileFormat.Type.WAVE, tempFile);
// The fileToByteArray() method reads the file
// into a byte array; omitted for brevity
byte[] bytes = fileToByteArray(tempFile);
tempFile.delete();
return bytes;

这显然不太理想。有没有更好的办法?

4

5 回答 5

7

问题是大多数 AudioFileWriter 在写入 OutputStream 时需要提前知道文件大小。因为你不能提供这个,所以它总是失败。不幸的是,默认的 Java 声音 API 实现没有任何替代方案。

但是您可以尝试使用 Tritonus 插件中的 AudioOutputStream 架构(Tritonus 是 Java 声音 API 的开源实现):http ://tritonus.org/plugins.html

于 2008-10-13T19:53:03.817 回答
2

我注意到很久以前有人问过这个问题。如果有任何新人(使用 Java 7 及更高版本)发现了这个线程,请注意通过 Files.readAllBytes API 有更好的新方法。请参阅: 如何将 .wav 文件转换为字节数组?

于 2014-07-02T17:34:46.210 回答
2

太晚了,我知道,但我需要这个,所以这是我在这个话题上的两分钱。

public void UploadFiles(String fileName, byte[] bFile)
{
    String uploadedFileLocation = "c:\\";

    AudioInputStream source;
    AudioInputStream pcm;
    InputStream b_in = new ByteArrayInputStream(bFile);
    source = AudioSystem.getAudioInputStream(new BufferedInputStream(b_in));
    pcm = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, source);
    File newFile = new File(uploadedFileLocation + fileName);
    AudioSystem.write(pcm, Type.WAVE, newFile);

    source.close();
    pcm.close();
}
于 2015-03-04T00:06:23.617 回答
-1

如果您准备将为您创建正确标题的课程,则该问题很容易解决。在我的示例示例中,如何读取 wav 缓冲区中的音频输入数据进入某个缓冲区,之后我创建标头并在缓冲区中有 wav 文件。不需要额外的库。只需从我的示例中复制代码即可。

示例如何使用在缓冲区数组中创建正确标头的类:

public void run() {    
    try {    
        writer = new NewWaveWriter(44100);  

        byte[]buffer = new byte[256];  
        int res = 0;  
        while((res = m_audioInputStream.read(buffer)) > 0) {  
            writer.write(buffer, 0, res);  
        }  
    } catch (IOException e) {  
        System.out.println("Error: " + e.getMessage());  
    }    
}    

public byte[]getResult() throws IOException {  
    return writer.getByteBuffer();  
}  

您可以在我的链接下找到 NewWaveWriter 类。

于 2016-08-30T16:18:23.787 回答
-2

这很简单...

File f = new File(exportFileName+".tmp");
File f2 = new File(exportFileName);
long l = f.length();
FileInputStream fi = new FileInputStream(f);
AudioInputStream ai = new AudioInputStream(fi,mainFormat,l/4);
AudioSystem.write(ai, Type.WAVE, f2);
fi.close();
f.delete();

.tmp 文件是一个 RAW 音频文件,结果是一个带有标题的 WAV 文件。

于 2011-06-28T10:36:52.290 回答