9

InputStream圧縮形式(MP3やOGGなど)のオーディオデータを含むcalledが与えられた場合、入力データのWAV変換を含む配列をin作成したいと思います。byte残念ながら、これを実行しようとすると、JavaSoundから次のエラーが発生します。

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

問題は、OutputStream に書き込む場合、ほとんどの AudioFileWriter が事前にファイル サイズを知る必要があることです。これを提供できないため、常に失敗します。残念ながら、デフォルトの Java サウンド API 実装には代替手段がありません。

しかし、Tritonus プラグイン (Tritonus は Java サウンド API のオープン ソース実装です) から AudioOutputStream アーキテクチャを使用してみることができます: http://tritonus.org/plugins.html

于 2008-10-13T19:53:03.817 に答える
2

これはずっと前に尋ねられたことに気づきました。新しい人 (Java 7 以降を使用) がこのスレッドを見つけた場合は、Files.readAllBytes API を介してそれを行うより良い新しい方法があることに注意してください。参照: .wav ファイルをバイト配列に変換する方法

于 2014-07-02T17:34:46.210 に答える
-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 に答える