0

改訂/要約:

プラグインを使用して MP3 オーディオ ファイルをデコードしています。ProgressMonitorユーザーにフィードバックを提供するために を提供したいと思います。MP3 形式の AudioFile をデコードする AudioInputStream を構築するロジックは次のとおりです。

readAudioFile(File pAudioFile) throws UnsupportedAuioFileException, IOException {
    AudioInputStream nativeFormatStream = AudioSystem.getAudioInputStream(pAudioFile);
    AudioInputStream desiredFormatStream = AudioSystem.getAudioInputStream(AUDIO_OUTPUT_FORMAT,nativeFormatStream);
    int bytesRead, bufferLength;
    byte[] rawAudioBuffer[bufferLength=4096];
    bytesRead=desiredFormatStream.read(rawAudioBuffer,0,bufferLength));
   ...
}

最初の試みは、オーディオ ファイルを ProgressMontorInputStream でラップし、そこから AudioInputStream を取得することでした。

readAudioFile(File pAudioFile) throws UnsupportedAuioFileException, IOException {
    ProgressMonitorInputStream monitorStream = new ProgressMonitorInputStream(COMP,"Decoding",new FileInputStream(pAudioFile);
    AudioInputStream nativeFormatStream = AudioSystem.getAudioInputStream(monitorStream);
    AudioInputStream desiredFormatStream = AudioSystem.getAudioInputStream(AUDIO_OUTPUT_FORMAT,nativeFormatStream);
    int bytesRead, bufferLength;
    byte[] rawAudioBuffer[bufferLength=4096];
    bytesRead=desiredFormatStream.read(rawAudioBuffer,0,bufferLength));
   ...
}

ビルド中、実行時にAudioInputStreamからを構築すると、次のようになりProgressMonitorInputStreamます。

java.io.IOException: mark/reset not supported

以下のコメントは、 AudioInputStream が mark() および reset() メソッドをサポートするためにラップする InputStream を必要とすることを確認していますが、これは明らかに ProgressMonitorInputStream ではサポートされていません。

以下の別の提案は、ProgressMonitorInputStream を BufferedInputStream (マーク/リセットをサポートする) でラップすることです。だから私は持っています:

readAudioFile(File pAudioFile) throws UnsupportedAuioFileException, IOException {
    ProgressMonitorInputStream monitorStream = new ProgressMonitorInputStream(COMP,"Decoding",new FileInputStream(pAudioFile);
    AudioInputStream nativeFormatStream = AudioSystem.getAudioInputStream(new BufferedInputStream(monitorStream));
    AudioInputStream desiredFormatStream = AudioSystem.getAudioInputStream(AUDIO_OUTPUT_FORMAT,nativeFormatStream);
    int bytesRead, bufferLength;
    byte[] rawAudioBuffer[bufferLength=4096];
    bytesRead=desiredFormatStream.read(rawAudioBuffer,0,bufferLength));
   ...
}

これで、エラーなしでビルドおよび実行されます。ただし、setMillisToPopup(10) および setMillisToDecideToPopup(10); の積極的な設定にもかかわらず、ProgressMonitor は表示されません。私の理論では、デコードされていないオーディオを実際にメモリに読み込む時間は、まだ 10 ミリ秒よりも速いということです。実際には、ディスクから読み取った後、生のオーディオをデコードするのに時間がかかります。したがって、次のステップは、デコードされた AudioInputStream を構築する前に、デコードされていない AudioInputStream を ProgressMonitorInputStream でラップすることです。

readAudioFile(File pAudioFile) throws UnsupportedAuioFileException, IOException {
    AudioInputStream nativeFormatStream = AudioSystem.getAudioInputStream(pAudioFile);
    AudioInputStream desiredFormatStream = AudioSystem.getAudioInputStream(AUDIO_OUTPUT_FORMAT,new BufferedInputStream(new ProgressMonitorInputStream(COMP,"Decoding",nativeFormatStream);
    int bytesRead, bufferLength;
    byte[] rawAudioBuffer[bufferLength=4096];
    bytesRead=desiredFormatStream.read(rawAudioBuffer,0,bufferLength));
   ...
}

私は缶を蹴っているように見えますが、進歩していません。この問題の回避策はありますか? ProgressMonitorデコード プロセスに を提供する別の方法はありますか? 私の (不満な) フォールバックはビジー カーソルを表示しています。目標を達成するための他の方法に関する提案はありますか - 少なくともデコードを完了するまでの残り時間の見積もりをユーザーに視覚的なフィードバックを提供しますか?

4

0 に答える 0