改訂/要約:
プラグインを使用して 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
デコード プロセスに を提供する別の方法はありますか? 私の (不満な) フォールバックはビジー カーソルを表示しています。目標を達成するための他の方法に関する提案はありますか - 少なくともデコードを完了するまでの残り時間の見積もりをユーザーに視覚的なフィードバックを提供しますか?