我有一个AudioInputStream ,它不支持skip()。它得到了jflac的支持。
因此,我使用一个read ( byte[] )调用,并转储数据,以跳过文件。
不幸的是,需要大约1秒的时间通过17 my (大约.25秒来寻找一分钟),这对我来说太慢了。
我能做些什么来更快地找到一个文件吗?我需要一些大约20-30倍的速度,我现在有,以便有一个良好的用户体验。
这是我的代码:
private void openStreamsAtRequestedOffset ( ) {
encodedInput = AudioSystem.getAudioInputStream( file );
AudioFormat baseFormat = encodedInput.getFormat();
AudioFormat decoderFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(),
16, baseFormat.getChannels(), baseFormat.getChannels() * 2,
baseFormat.getSampleRate(), false );
decodedInput = AudioSystem.getAudioInputStream ( decoderFormat, encodedInput );
if ( seekRequestPercent != NO_SEEK_REQUESTED ) {
long seekPositionByte = getBytePosition ( file, seekRequestPercent );
int bytesRead = 0;
byte[] skippedData = new byte[ 256 ];
while ( bytesRead < seekPositionByte ) {
int bytesSkipped = decodedInput.read ( skippedData );
bytesRead += bytesSkipped;
}
}
DataLine.Info info = new DataLine.Info ( SourceDataLine.class, decoderFormat );
audioOutput = (SourceDataLine) AudioSystem.getLine(info);
audioOutput.open( decoderFormat );
}我试着读了256个字节,它似乎没有任何意义的影响。
我还尝试用BufferedInputStream打开文件,调用skip(),然后以几种不同的方式将BufferedInputStream传递给AudioSystem.getAudioInputStream(),但这些方法也失败了。每当我打电话给斯基普时,jflac就会说小溪已经关闭了。
有什么想法吗?
发布于 2017-05-19 09:50:22
当然,当AudioInputStream.skip()已经存在时,您不应该尝试使用自己的。如果你有一个人不支持它,就向卖主投诉。所有要做的事情就是调用底层流上的‘`skip()’,因为它是一个文件输入流,应该是瞬时的。
发布于 2017-05-19 09:29:23
首先,我想我并不奇怪它的速度有点慢。17MB /256个字节是一个相当慢的I/O操作的66406循环迭代。
你说过
我试着读了256个字节,它似乎没有任何意义的影响。
但是,从文档来看,每次读取的字节数似乎会发生变化。
公共int可用()抛出IOException 返回可以在不阻塞的情况下从此音频输入流读取(或跳过)的最大字节数。
即使以下内容没有更快的速度,至少也应该更正确:
long seekPositionByte = getBytePosition ( file, seekRequestPercent );
int bytesRead = 0;
byte[] skippedData = new byte[ decodedInput.available() ];
while ( bytesRead < seekPositionByte ) {
int bytesSkipped = decodedInput.read ( skippedData );
bytesRead += bytesSkipped;
}谨慎的做法可能也是为了确保它不会过高。
https://stackoverflow.com/questions/44065772
复制相似问题