2

JavaSound API を使用してオーディオ ファイルを読み書きするオーディオ フィルタを作成しようとしています。現在、私のコードは次のように構成されています。

        ByteArrayOutputStream b_out = new ByteArrayOutputStream();

        // Read a frame from the file.
        while (audioInputStream.read(audioBytes) != -1) {   
            //Do stuff here....
            b_out.write(outputvalue);
        }   

        // Hook output stream to output file
        ByteArrayInputStream b_in   = new ByteArrayInputStream(b_out.toByteArray());
        AudioInputStream     ais    = new AudioInputStream(b_in, format, length);
        AudioSystem.write(ais, inFileFormat.getType(), outputFile);

これは、入力ファイルをストリームとして読み取り、処理して bytearrayoutputstream に書き込みますが、ファイル全体が処理されるまで待ってからディスクに書き込みます。理想的には、処理中に各サンプルをディスクに書き込むようにしたいと考えています。ストリーム コンストラクトのいくつかの組み合わせを試しましたが、AudioSystem.write() が入力ストリームを受け取るため、それを行う方法が見つかりません。何か案は?

4

3 に答える 3

2

kasperjj の答えは正しいです。おそらく WAV ファイルを扱っていると思います。 ウェーブファイルのレイアウトはこちらをご覧ください。WAV ファイル全体のサイズは、そのヘッダーにエンコードされていることに注意してください。

これがあなたのケースに当てはまるかどうかはわかりませんが、説明したように WAV サンプルを処理するには、「通常の」非オーディオ Java 出力ストリームを使用できます。たとえば、FileOutputStream を使用して一時ファイルに書き込み、処理後に一時ファイルを有効な WAV ファイルに変換できます。

于 2008-12-26T21:01:25.497 に答える
1

一部のオーディオ形式では、ヘッダーにストリームの長さ(またはチャンクの数)を記述するメタデータが必要であるため、データセット全体が存在する前にデータの書き込みを開始することはできません。JavaサウンドAPIが同じAPIですべてのフォーマットを処理するためには、意図的にこの制限を課さなければならなかったのではないかと思います。

ただし、簡単にストリーミングできるオーディオ形式はたくさんあります。それらの多くはJava用のオープンライブラリ実装を持っているので、外部ライブラリを追加することをいとわないのであれば、それを達成するのはそれほど難しいことではありません。

于 2008-11-08T15:07:40.670 に答える